From 97473004a8822f268b00f4e98fad58935fd71238 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 2 Dec 2021 12:45:35 +0300 Subject: [PATCH] Biome Builder structure features --- .../ru/bclib/api/biomes/BCLBiomeBuilder.java | 25 +++++++++++- .../world/structures/BCLStructureFeature.java | 39 +++++++++++++++++-- 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java b/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java index 80d28aae..1932bbe6 100644 --- a/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java +++ b/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java @@ -1,6 +1,9 @@ package ru.bclib.api.biomes; +import net.fabricmc.fabric.api.biome.v1.BiomeModifications; +import net.minecraft.core.Registry; import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.data.BuiltinRegistries; import net.minecraft.data.worldgen.BiomeDefaultFeatures; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.Music; @@ -20,6 +23,7 @@ import net.minecraft.world.level.biome.BiomeSpecialEffects; import net.minecraft.world.level.biome.MobSpawnSettings; import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.placement.PlacedFeature; import ru.bclib.util.ColorUtil; import ru.bclib.world.biomes.BCLBiome; @@ -441,11 +445,28 @@ public class BCLBiomeBuilder { return feature(feature.getDecoration(), feature.getPlacedFeature()); } - // TODO Make feature registration - public BCLBiomeBuilder structure(BCLStructureFeature structure) { + /** + * Adds new structure feature into thr biome. + * @param structure {@link ConfiguredStructureFeature} to add. + * @return same {@link BCLBiomeBuilder} instance. + */ + public BCLBiomeBuilder structure(ConfiguredStructureFeature structure) { + BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE + .getResourceKey(structure) + .ifPresent(key -> BiomeModifications.addStructure(ctx -> ctx.getBiomeKey().location().equals(biomeID), key)); return this; } + /** + * Adds new structure feature into thr biome. Will add building biome into the structure list. + * @param structure {@link BCLStructureFeature} to add. + * @return same {@link BCLBiomeBuilder} instance. + */ + public BCLBiomeBuilder structure(BCLStructureFeature structure) { + structure.addInternalBiome(biomeID); + return structure(structure.getFeatureConfigured()); + } + /** * Finalize biome creation. * @return created {@link BCLBiome} instance. diff --git a/src/main/java/ru/bclib/world/structures/BCLStructureFeature.java b/src/main/java/ru/bclib/world/structures/BCLStructureFeature.java index f171d945..5688a59d 100644 --- a/src/main/java/ru/bclib/world/structures/BCLStructureFeature.java +++ b/src/main/java/ru/bclib/world/structures/BCLStructureFeature.java @@ -1,5 +1,6 @@ package ru.bclib.world.structures; +import com.google.common.collect.Lists; import net.fabricmc.fabric.api.structure.v1.FabricStructureBuilder; import net.minecraft.data.BuiltinRegistries; import net.minecraft.resources.ResourceLocation; @@ -8,6 +9,7 @@ import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import java.util.List; import java.util.Random; public class BCLStructureFeature { @@ -15,13 +17,17 @@ public class BCLStructureFeature { private final StructureFeature structure; private final ConfiguredStructureFeature featureConfigured; private final GenerationStep.Decoration featureStep; + private final List biomes = Lists.newArrayList(); + private final ResourceLocation id; public BCLStructureFeature(ResourceLocation id, StructureFeature structure, GenerationStep.Decoration step, int spacing, int separation) { + this.id = id; this.featureStep = step; - this.structure = FabricStructureBuilder.create(id, structure) - .step(step) - .defaultConfig(spacing, separation, RANDOM.nextInt(8192)) - .register(); + 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); //TODO: 1.18 check if structures are added correctly @@ -39,4 +45,29 @@ public class BCLStructureFeature { public GenerationStep.Decoration getFeatureStep() { return featureStep; } + + /** + * Get the structure ID; + * @return {@link ResourceLocation} id. + */ + public ResourceLocation getID() { + return id; + } + + /** + * Adds biome into internal biome list, used in {@link ru.bclib.api.biomes.BCLBiomeBuilder}. + * @param biome {@link ResourceLocation} biome ID. + */ + public void addInternalBiome(ResourceLocation biome) { + biomes.add(biome); + } + + /** + * Get biome list where this structure feature can generate. Only represents biomes made with {@link ru.bclib.api.biomes.BCLBiomeBuilder} and only + * if structure was added during building process. Modification of this list will not affect structure generation. + * @return {@link List} of biome {@link ResourceLocation}. + */ + public List getBiomes() { + return biomes; + } }