From 86a3480ce036a72ee1f7a4ce6268e2da597cdb64 Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 8 Mar 2022 22:02:24 +0100 Subject: [PATCH] Added first test code for new StructreFeature building --- .../ru/bclib/api/biomes/BCLBiomeBuilder.java | 3 +- src/main/java/ru/bclib/api/tag/TagAPI.java | 13 +++++++ .../common/StructureFeatureAccessor.java | 14 ++++++++ .../common/StructureFeaturesAccessor.java | 19 ++++++++++ .../ru/bclib/world/features/BCLFeature.java | 1 + .../world/structures/BCLStructureFeature.java | 35 ++++++++++++------- src/main/resources/bclib.mixins.common.json | 4 ++- 7 files changed, 74 insertions(+), 15 deletions(-) create mode 100644 src/main/java/ru/bclib/mixin/common/StructureFeatureAccessor.java create mode 100644 src/main/java/ru/bclib/mixin/common/StructureFeaturesAccessor.java diff --git a/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java b/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java index a2ac6d70..034d2a65 100644 --- a/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java +++ b/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java @@ -1,6 +1,7 @@ package ru.bclib.api.biomes; import net.fabricmc.fabric.api.biome.v1.BiomeModifications; +import net.minecraft.core.Holder; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.data.BuiltinRegistries; import net.minecraft.data.worldgen.BiomeDefaultFeatures; @@ -500,7 +501,7 @@ public class BCLBiomeBuilder { * @param feature {@link PlacedFeature}. * @return same {@link BCLBiomeBuilder} instance. */ - public BCLBiomeBuilder feature(Decoration decoration, PlacedFeature feature) { + public BCLBiomeBuilder feature(Decoration decoration, Holder feature) { getGeneration().addFeature(decoration, feature); return this; } diff --git a/src/main/java/ru/bclib/api/tag/TagAPI.java b/src/main/java/ru/bclib/api/tag/TagAPI.java index f5312f20..a3b0da16 100644 --- a/src/main/java/ru/bclib/api/tag/TagAPI.java +++ b/src/main/java/ru/bclib/api/tag/TagAPI.java @@ -11,6 +11,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import ru.bclib.mixin.common.DiggerItemAccessor; @@ -38,6 +39,18 @@ public class TagAPI { .findAny() .orElse(TagKey.create(registry.key(), id)); } + + /** + * Get or create {@link Block} {@link TagKey} with mod namespace. + * + * @param modID - {@link String} mod namespace (mod id); + * @param name - {@link String} tag name. + * @return {@link Block} {@link TagKey}. + */ + public static TagKey makeBiomeTag(String modID, String name) { + return TagKey.create(Registry.BIOME_REGISTRY, new ResourceLocation(modID, name)); + } + /** * Get or create {@link Block} {@link TagKey} with mod namespace. diff --git a/src/main/java/ru/bclib/mixin/common/StructureFeatureAccessor.java b/src/main/java/ru/bclib/mixin/common/StructureFeatureAccessor.java new file mode 100644 index 00000000..03a5a498 --- /dev/null +++ b/src/main/java/ru/bclib/mixin/common/StructureFeatureAccessor.java @@ -0,0 +1,14 @@ +package ru.bclib.mixin.common; + +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.feature.StructureFeature; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(StructureFeature.class) +public interface StructureFeatureAccessor { + @Invoker + static > F callRegister(String name, F structureFeature, GenerationStep.Decoration step) { + throw new RuntimeException("Unexpected call"); + } +} diff --git a/src/main/java/ru/bclib/mixin/common/StructureFeaturesAccessor.java b/src/main/java/ru/bclib/mixin/common/StructureFeaturesAccessor.java new file mode 100644 index 00000000..5ba97fdd --- /dev/null +++ b/src/main/java/ru/bclib/mixin/common/StructureFeaturesAccessor.java @@ -0,0 +1,19 @@ +package ru.bclib.mixin.common; + +import net.minecraft.core.Holder; +import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; +import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(StructureFeatures.class) +public interface StructureFeaturesAccessor { + @Invoker + static > Holder> callRegister(ResourceKey> resourceKey, ConfiguredStructureFeature configuredStructureFeature) { + throw new RuntimeException("Unexpected call"); + } +} diff --git a/src/main/java/ru/bclib/world/features/BCLFeature.java b/src/main/java/ru/bclib/world/features/BCLFeature.java index fef17cda..8c649c43 100644 --- a/src/main/java/ru/bclib/world/features/BCLFeature.java +++ b/src/main/java/ru/bclib/world/features/BCLFeature.java @@ -1,5 +1,6 @@ package ru.bclib.world.features; +import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.data.BuiltinRegistries; import net.minecraft.resources.ResourceKey; diff --git a/src/main/java/ru/bclib/world/structures/BCLStructureFeature.java b/src/main/java/ru/bclib/world/structures/BCLStructureFeature.java index b00608f2..983bd44c 100644 --- a/src/main/java/ru/bclib/world/structures/BCLStructureFeature.java +++ b/src/main/java/ru/bclib/world/structures/BCLStructureFeature.java @@ -1,22 +1,27 @@ package ru.bclib.world.structures; import com.google.common.collect.Lists; -import net.fabricmc.fabric.api.structure.v1.FabricStructureBuilder; import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; import net.minecraft.core.QuartPos; -import net.minecraft.data.BuiltinRegistries; -import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.core.Registry; import net.minecraft.data.worldgen.StructureSets; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.BuiltinStructures; +import net.minecraft.world.level.levelgen.structure.StructureSet; import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadStructurePlacement; import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadType; +import ru.bclib.api.tag.TagAPI; +import ru.bclib.mixin.common.StructureFeatureAccessor; +import ru.bclib.mixin.common.StructureFeaturesAccessor; import java.util.List; import java.util.Random; @@ -24,11 +29,14 @@ import java.util.Random; public class BCLStructureFeature { private static final Random RANDOM = new Random(354); private final StructureFeature structure; - private final ConfiguredStructureFeature featureConfigured; + private final Holder> featureConfigured; private final GenerationStep.Decoration featureStep; private final List biomes = Lists.newArrayList(); private final ResourceLocation id; - + public final TagKey biomeTag; + public final ResourceKey> structureKey; + public final ResourceKey structureSetKey; + public BCLStructureFeature(ResourceLocation id, StructureFeature structure, GenerationStep.Decoration step, int spacing, int separation) { this.id = id; this.featureStep = step; @@ -42,14 +50,15 @@ public class BCLStructureFeature { //public static final StructureFeature JUNGLE_TEMPLE = // StructureFeature.register("jungle_pyramid", new JunglePyramidFeature(NoneFeatureConfiguration.CODEC), GenerationStep.Decoration.SURFACE_STRUCTURES); // + final RandomSpreadStructurePlacement spreadConfig = new RandomSpreadStructurePlacement(spacing, separation, RandomSpreadType.LINEAR, RANDOM.nextInt(8192)); - this.structure = FabricStructureBuilder - .create(id, structure) - .step(step) - .defaultConfig(spacing, separation, RANDOM.nextInt(8192)) - .register(); - this.featureConfigured = this.structure.configured(NoneFeatureConfiguration.NONE); - BuiltinRegistries.register(BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE, id, this.featureConfigured); + this.structureKey = ResourceKey.create(Registry.CONFIGURED_STRUCTURE_FEATURE_REGISTRY, id); + this.structureSetKey = ResourceKey.create(Registry.STRUCTURE_SET_REGISTRY, id); + + this.biomeTag = TagAPI.makeBiomeTag(id.getNamespace(), "has_structure/"+id.getPath()); + this.structure = StructureFeatureAccessor.callRegister(id.toString(), structure, step); + this.featureConfigured = StructureFeaturesAccessor.callRegister(structureKey, this.structure.configured(NoneFeatureConfiguration.NONE, biomeTag)); + StructureSets.register(structureSetKey, featureConfigured, spreadConfig); //TODO: 1.18 check if structures are added correctly //FlatChunkGeneratorConfigAccessor.getStructureToFeatures().put(this.structure, this.featureConfigured); } diff --git a/src/main/resources/bclib.mixins.common.json b/src/main/resources/bclib.mixins.common.json index ecb56164..50f21ce8 100644 --- a/src/main/resources/bclib.mixins.common.json +++ b/src/main/resources/bclib.mixins.common.json @@ -42,7 +42,9 @@ "AnvilMenuMixin", "TagLoaderMixin", "MainMixin", - "BiomeAccessor" + "BiomeAccessor", + "StructureFeatureAccessor", + "StructureFeaturesAccessor" ], "injectors": { "defaultRequire": 1