diff --git a/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java b/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java index f29a4b14..e251cd89 100644 --- a/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java +++ b/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.function.BiFunction; import java.util.function.Consumer; +import java.util.function.Supplier; import net.fabricmc.fabric.api.biome.v1.BiomeModifications; import net.minecraft.core.particles.ParticleOptions; @@ -34,6 +35,8 @@ import net.minecraft.world.level.levelgen.SurfaceRules; import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import ru.bclib.mixin.common.BiomeGenerationSettingsAccessor; +import ru.bclib.util.CollectionsUtil; import ru.bclib.util.ColorUtil; import ru.bclib.world.biomes.BCLBiome; import ru.bclib.world.features.BCLFeature; @@ -576,7 +579,17 @@ public class BCLBiomeBuilder { } if (generationSettings != null) { - builder.generationSettings(generationSettings.build()); + BiomeGenerationSettings settings = generationSettings.build(); + BiomeGenerationSettingsAccessor accessor = BiomeGenerationSettingsAccessor.class.cast(settings); + List>> featureLists = CollectionsUtil.getMutable(accessor.bclib_getFeatures()); + final int size = featureLists.size(); + for (int i = 0; i < size; i++) { + List> list = CollectionsUtil.getMutable(featureLists.get(i)); + BiomeAPI.sortFeatures(list); + featureLists.add(i, list); + } + accessor.bclib_setFeatures(featureLists); + builder.generationSettings(settings); } final T res = biomeConstructor.apply(biomeID, builder.build()); diff --git a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java index 83f180c0..87aaa0df 100644 --- a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java @@ -41,6 +41,7 @@ import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import org.apache.commons.lang3.mutable.MutableInt; import org.jetbrains.annotations.Nullable; import ru.bclib.BCLib; import ru.bclib.config.Configs; @@ -83,6 +84,8 @@ public class BiomeAPI { private static final Map CLIENT = Maps.newHashMap(); private static Registry biomeRegistry; + private static final Map FEATURE_ORDER = Maps.newHashMap(); + private static final Map>> MODIFICATIONS = Maps.newHashMap(); private static final Map SURFACE_RULES = Maps.newHashMap(); private static final Set MODIFIED_BIOMES = Sets.newHashSet(); @@ -100,6 +103,21 @@ public class BiomeAPI { public static final BCLBiome END_BARRENS = registerEndVoidBiome(getFromRegistry(new ResourceLocation("end_barrens"))); public static final BCLBiome SMALL_END_ISLANDS = registerEndVoidBiome(getFromRegistry(new ResourceLocation("small_end_islands"))); + public static void init() { + MutableInt integer = new MutableInt(0); + BuiltinRegistries.BIOME.entrySet().forEach(entry -> { + Biome biome = entry.getValue(); + BiomeGenerationSettingsAccessor accessor = BiomeGenerationSettingsAccessor.class.cast(biome.getGenerationSettings()); + List>> features = accessor.bclib_getFeatures(); + features.forEach(step -> { + step.forEach(provider -> { + PlacedFeature feature = provider.get(); + FEATURE_ORDER.computeIfAbsent(feature, f -> integer.getAndIncrement()); + }); + }); + }); + } + /** * Initialize registry for current server. * @param biomeRegistry - {@link Registry} for {@link Biome}. @@ -688,6 +706,14 @@ public class BiomeAPI { return Blocks.AIR.defaultBlockState(); } + public static void sortFeatures(List> features) { + features.sort((f1, f2) -> { + int v1 = FEATURE_ORDER.getOrDefault(f1.get(), 0); + int v2 = FEATURE_ORDER.getOrDefault(f2.get(), 0); + return Integer.compare(v1, v2); + }); + } + private static void configureBiome(BCLBiome biome) { String group = biome.getID().getNamespace() + "." + biome.getID().getPath(); float chance = Configs.BIOMES_CONFIG.getFloat(group, "generation_chance", biome.getGenChance());