Added first test code for new StructreFeature building

This commit is contained in:
Frank 2022-03-08 22:02:24 +01:00
parent 3c746a8dc4
commit 86a3480ce0
7 changed files with 74 additions and 15 deletions

View file

@ -1,6 +1,7 @@
package ru.bclib.api.biomes; package ru.bclib.api.biomes;
import net.fabricmc.fabric.api.biome.v1.BiomeModifications; import net.fabricmc.fabric.api.biome.v1.BiomeModifications;
import net.minecraft.core.Holder;
import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.data.BuiltinRegistries; import net.minecraft.data.BuiltinRegistries;
import net.minecraft.data.worldgen.BiomeDefaultFeatures; import net.minecraft.data.worldgen.BiomeDefaultFeatures;
@ -500,7 +501,7 @@ public class BCLBiomeBuilder {
* @param feature {@link PlacedFeature}. * @param feature {@link PlacedFeature}.
* @return same {@link BCLBiomeBuilder} instance. * @return same {@link BCLBiomeBuilder} instance.
*/ */
public BCLBiomeBuilder feature(Decoration decoration, PlacedFeature feature) { public BCLBiomeBuilder feature(Decoration decoration, Holder<PlacedFeature> feature) {
getGeneration().addFeature(decoration, feature); getGeneration().addFeature(decoration, feature);
return this; return this;
} }

View file

@ -11,6 +11,7 @@ import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
import net.minecraft.world.level.ItemLike; 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.Block;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Blocks;
import ru.bclib.mixin.common.DiggerItemAccessor; import ru.bclib.mixin.common.DiggerItemAccessor;
@ -38,6 +39,18 @@ public class TagAPI {
.findAny() .findAny()
.orElse(TagKey.create(registry.key(), id)); .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<Biome> 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. * Get or create {@link Block} {@link TagKey} with mod namespace.

View file

@ -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 extends StructureFeature<?>> F callRegister(String name, F structureFeature, GenerationStep.Decoration step) {
throw new RuntimeException("Unexpected call");
}
}

View file

@ -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 <FC extends FeatureConfiguration, F extends StructureFeature<FC>> Holder<ConfiguredStructureFeature<?, ?>> callRegister(ResourceKey<ConfiguredStructureFeature<?, ?>> resourceKey, ConfiguredStructureFeature<FC, F> configuredStructureFeature) {
throw new RuntimeException("Unexpected call");
}
}

View file

@ -1,5 +1,6 @@
package ru.bclib.world.features; package ru.bclib.world.features;
import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.data.BuiltinRegistries; import net.minecraft.data.BuiltinRegistries;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;

View file

@ -1,22 +1,27 @@
package ru.bclib.world.structures; package ru.bclib.world.structures;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import net.fabricmc.fabric.api.structure.v1.FabricStructureBuilder;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder;
import net.minecraft.core.QuartPos; import net.minecraft.core.QuartPos;
import net.minecraft.data.BuiltinRegistries; import net.minecraft.core.Registry;
import net.minecraft.data.worldgen.StructureFeatures;
import net.minecraft.data.worldgen.StructureSets; import net.minecraft.data.worldgen.StructureSets;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; 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.GenerationStep;
import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature;
import net.minecraft.world.level.levelgen.feature.StructureFeature; 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.FeatureConfiguration;
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; 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.pieces.PieceGeneratorSupplier;
import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadStructurePlacement; import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadStructurePlacement;
import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadType; 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.List;
import java.util.Random; import java.util.Random;
@ -24,11 +29,14 @@ import java.util.Random;
public class BCLStructureFeature { public class BCLStructureFeature {
private static final Random RANDOM = new Random(354); private static final Random RANDOM = new Random(354);
private final StructureFeature<NoneFeatureConfiguration> structure; private final StructureFeature<NoneFeatureConfiguration> structure;
private final ConfiguredStructureFeature<?, ?> featureConfigured; private final Holder<ConfiguredStructureFeature<?, ?>> featureConfigured;
private final GenerationStep.Decoration featureStep; private final GenerationStep.Decoration featureStep;
private final List<ResourceLocation> biomes = Lists.newArrayList(); private final List<ResourceLocation> biomes = Lists.newArrayList();
private final ResourceLocation id; private final ResourceLocation id;
public final TagKey<Biome> biomeTag;
public final ResourceKey<ConfiguredStructureFeature<?, ?>> structureKey;
public final ResourceKey<StructureSet> structureSetKey;
public BCLStructureFeature(ResourceLocation id, StructureFeature<NoneFeatureConfiguration> structure, GenerationStep.Decoration step, int spacing, int separation) { public BCLStructureFeature(ResourceLocation id, StructureFeature<NoneFeatureConfiguration> structure, GenerationStep.Decoration step, int spacing, int separation) {
this.id = id; this.id = id;
this.featureStep = step; this.featureStep = step;
@ -42,14 +50,15 @@ public class BCLStructureFeature {
//public static final StructureFeature<NoneFeatureConfiguration> JUNGLE_TEMPLE = //public static final StructureFeature<NoneFeatureConfiguration> JUNGLE_TEMPLE =
// StructureFeature.register("jungle_pyramid", new JunglePyramidFeature(NoneFeatureConfiguration.CODEC), GenerationStep.Decoration.SURFACE_STRUCTURES); // StructureFeature.register("jungle_pyramid", new JunglePyramidFeature(NoneFeatureConfiguration.CODEC), GenerationStep.Decoration.SURFACE_STRUCTURES);
// //
final RandomSpreadStructurePlacement spreadConfig = new RandomSpreadStructurePlacement(spacing, separation, RandomSpreadType.LINEAR, RANDOM.nextInt(8192)); final RandomSpreadStructurePlacement spreadConfig = new RandomSpreadStructurePlacement(spacing, separation, RandomSpreadType.LINEAR, RANDOM.nextInt(8192));
this.structure = FabricStructureBuilder this.structureKey = ResourceKey.create(Registry.CONFIGURED_STRUCTURE_FEATURE_REGISTRY, id);
.create(id, structure) this.structureSetKey = ResourceKey.create(Registry.STRUCTURE_SET_REGISTRY, id);
.step(step)
.defaultConfig(spacing, separation, RANDOM.nextInt(8192)) this.biomeTag = TagAPI.makeBiomeTag(id.getNamespace(), "has_structure/"+id.getPath());
.register(); this.structure = StructureFeatureAccessor.callRegister(id.toString(), structure, step);
this.featureConfigured = this.structure.configured(NoneFeatureConfiguration.NONE); this.featureConfigured = StructureFeaturesAccessor.callRegister(structureKey, this.structure.configured(NoneFeatureConfiguration.NONE, biomeTag));
BuiltinRegistries.register(BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE, id, this.featureConfigured); StructureSets.register(structureSetKey, featureConfigured, spreadConfig);
//TODO: 1.18 check if structures are added correctly //TODO: 1.18 check if structures are added correctly
//FlatChunkGeneratorConfigAccessor.getStructureToFeatures().put(this.structure, this.featureConfigured); //FlatChunkGeneratorConfigAccessor.getStructureToFeatures().put(this.structure, this.featureConfigured);
} }

View file

@ -42,7 +42,9 @@
"AnvilMenuMixin", "AnvilMenuMixin",
"TagLoaderMixin", "TagLoaderMixin",
"MainMixin", "MainMixin",
"BiomeAccessor" "BiomeAccessor",
"StructureFeatureAccessor",
"StructureFeaturesAccessor"
], ],
"injectors": { "injectors": {
"defaultRequire": 1 "defaultRequire": 1