diff --git a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java index 633f4330..756276ba 100644 --- a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java @@ -35,6 +35,7 @@ import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.levelgen.GenerationStep.Carving; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; @@ -496,24 +497,28 @@ public class BiomeAPI { } biomes.forEach(biome -> { - ResourceLocation biomeID = getBiomeID(biome); - boolean modify = isDatapackBiome(biomeID); - if (biome != BuiltinRegistries.BIOME.get(biomeID)) { - modify = true; - } - else if (!modify && !MODIFIED_BIOMES.contains(biomeID)) { - MODIFIED_BIOMES.add(biomeID); - modify = true; - } - if (modify) { - modifications.forEach(consumer -> { - consumer.accept(biomeID, biome); - }); - } - sortBiomeFeatures(biome); + applyModifications(modifications, biome); }); } - + + private static void applyModifications(List> modifications, Biome biome) { + ResourceLocation biomeID = getBiomeID(biome); + boolean modify = isDatapackBiome(biomeID); + if (biome != BuiltinRegistries.BIOME.get(biomeID)) { + modify = true; + } + else if (!modify && !MODIFIED_BIOMES.contains(biomeID)) { + MODIFIED_BIOMES.add(biomeID); + modify = true; + } + if (modify) { + modifications.forEach(consumer -> { + consumer.accept(biomeID, biome); + }); + } + sortBiomeFeatures(biome); + } + public static void sortBiomeFeatures(Biome biome) { BiomeGenerationSettings settings = biome.getGenerationSettings(); BiomeGenerationSettingsAccessor accessor = BiomeGenerationSettingsAccessor.class.cast(settings); @@ -787,25 +792,45 @@ public class BiomeAPI { public static void registerStructureEvents(){ DynamicRegistrySetupCallback.EVENT.register(registryManager -> { - Optional> v = registryManager.registry(Registry.NOISE_GENERATOR_SETTINGS_REGISTRY); - if (v.isPresent()) { + Optional> oGeneratorRegistry = registryManager.registry(Registry.NOISE_GENERATOR_SETTINGS_REGISTRY); + Optional> oBiomeRegistry = registryManager.registry(Registry.BIOME_REGISTRY); + + if (oGeneratorRegistry.isPresent()) { RegistryEntryAddedCallback - .event(v.get()) - .register((rawId, id, object) -> { + .event(oGeneratorRegistry.get()) + .register((rawId, id, settings) -> { //BCLib.LOGGER.info(" #### " + rawId + ", " + object + ", " + id); //add back modded structures - StructureSettingsAccessor a = (StructureSettingsAccessor)object.structureSettings(); + StructureSettingsAccessor a = (StructureSettingsAccessor)settings.structureSettings(); structureStarts.forEach(modifier -> changeStructureStarts(a, modifier)); //add surface rules if (biomeRegistry!=null) { List rules = getRuleSourcesFromIDs(biomeRegistry.keySet()); - SurfaceRuleProvider provider = SurfaceRuleProvider.class.cast(object); + SurfaceRuleProvider provider = SurfaceRuleProvider.class.cast(settings); changeSurfaceRules(rules, provider); } }); } + + if (oBiomeRegistry.isPresent()){ + RegistryEntryAddedCallback + .event(oBiomeRegistry.get()) + .register((rawId, id, biome)->{ + //BCLib.LOGGER.info(" #### " + rawId + ", " + biome + ", " + id); + + for (var dim : MODIFICATIONS.keySet()) { + List> modifications = MODIFICATIONS.get(dim); + if (modifications == null) { + sortBiomeFeatures(biome); + return; + } + + applyModifications(modifications, biome); + } + }); + } }); }