diff --git a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java index 934ced83..cad8cfb0 100644 --- a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java @@ -5,6 +5,7 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.biome.v1.BiomeModificationContext.GenerationSettingsContext; import net.fabricmc.fabric.api.biome.v1.BiomeModifications; import net.fabricmc.fabric.impl.biome.NetherBiomeData; import net.fabricmc.fabric.impl.biome.TheEndBiomeData; @@ -30,6 +31,7 @@ import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.placement.PlacedFeature; import org.jetbrains.annotations.Nullable; import ru.bclib.config.Configs; +import ru.bclib.mixin.common.BiomeGenerationSettingsAccessor; import ru.bclib.util.MHelper; import ru.bclib.world.biomes.BCLBiome; import ru.bclib.world.biomes.FabricBiomesData; @@ -37,12 +39,14 @@ import ru.bclib.world.features.BCLFeature; import ru.bclib.world.generator.BiomePicker; import ru.bclib.world.structures.BCLStructureFeature; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; import java.util.function.BiConsumer; +import java.util.function.Supplier; import java.util.stream.Collectors; public class BiomeAPI { @@ -401,7 +405,7 @@ public class BiomeAPI { Set biomes = source.possibleBiomes(); biomes.forEach(biome -> { - ResourceLocation biomeID = getBiomeID(biome); + ResourceLocation biomeID = getBiomeID(biome); boolean modify = isDatapackBiome(biomeID); if (biome != BuiltinRegistries.BIOME.get(biomeID)) { modify = true; @@ -445,7 +449,10 @@ public class BiomeAPI { * @param step a {@link Decoration} step for the feature. */ public static void addBiomeFeature(Biome biome, PlacedFeature feature, Decoration step) { - addBiomeFeature(getBiomeID(biome), feature, step); + BiomeGenerationSettingsAccessor accessor = (BiomeGenerationSettingsAccessor) biome.getGenerationSettings(); + List>> allFeatures = getMutable(accessor.bclib_getFeatures()); + List> features = getFeaturesList(allFeatures, step); + features.add(() -> feature); } /** @@ -455,9 +462,7 @@ public class BiomeAPI { * @param step a {@link Decoration} step for the feature. */ private static void addBiomeFeature(ResourceLocation biomeID, PlacedFeature feature, Decoration step) { - BuiltinRegistries.PLACED_FEATURE - .getResourceKey(feature) - .ifPresent(key -> BiomeModifications.addFeature(ctx -> ctx.getBiomeKey().location().equals(biomeID), step, key)); + addBiomeFeature(BuiltinRegistries.BIOME.get(biomeID), feature, step); } /** @@ -553,4 +558,21 @@ public class BiomeAPI { fog = Configs.BIOMES_CONFIG.getFloat(group, "fog_density", fog); biome.setGenChance(chance).setFogDensity(fog); } + + private static List getMutable(List list) { + if (list instanceof ArrayList) { + return list; + } + return new ArrayList<>(list); + } + + private static List> getFeaturesList(List>> features, Decoration step) { + int index = step.ordinal(); + while (features.size() <= index) { + features.add(Lists.newArrayList()); + } + List> mutable = getMutable(features.get(index)); + features.set(index, mutable); + return mutable; + } } diff --git a/src/main/java/ru/bclib/mixin/common/BiomeGenerationSettingsAccessor.java b/src/main/java/ru/bclib/mixin/common/BiomeGenerationSettingsAccessor.java new file mode 100644 index 00000000..ac100c07 --- /dev/null +++ b/src/main/java/ru/bclib/mixin/common/BiomeGenerationSettingsAccessor.java @@ -0,0 +1,25 @@ +package ru.bclib.mixin.common; + +import net.minecraft.world.level.biome.BiomeGenerationSettings; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; +import java.util.Set; +import java.util.function.Supplier; + +@Mixin(BiomeGenerationSettings.class) +public interface BiomeGenerationSettingsAccessor { + @Accessor("features") + List>> bclib_getFeatures(); + + @Accessor("features") + void bclib_setFeatures(List>> features); + + @Accessor("featureSet") + Set bclib_getFeatureSet(); + + @Accessor("featureSet") + void bclib_setFeatureSet(Set features); +}