diff --git a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java index a0165bee..891edf72 100644 --- a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java @@ -73,6 +73,7 @@ import ru.bclib.world.structures.BCLStructureFeature; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -183,6 +184,7 @@ public class BiomeAPI { public static void prepareWorldData(){ structureStarts.clear(); worldSources.clear(); + knownNoiseGenerators.clear(); } /** @@ -609,6 +611,14 @@ public class BiomeAPI { .collect(Collectors.toSet()); return getRuleSourcesFromIDs(biomeIDs); } + + private static List getAllRuleSources() { + List rules = Lists.newArrayList(); + SURFACE_RULES.forEach((biomeID, rule) -> { + rules.add(rule); + }); + return rules; + } private static List getRuleSourcesFromIDs(Set biomeIDs) { List rules = Lists.newArrayList(); @@ -788,6 +798,7 @@ public class BiomeAPI { */ public static void addSurfaceRule(ResourceLocation biomeID, SurfaceRules.RuleSource source) { SURFACE_RULES.put(biomeID, source); + knownNoiseGenerators.forEach(BiomeAPI::changeSurfaceRulesForGenerator); } /** @@ -907,7 +918,11 @@ public class BiomeAPI { } private final static Map, Multimap, ResourceKey>>, Map, StructureFeatureConfiguration>>> structureStarts = new HashMap<>(); - + + private static void registerNoiseGeneratorAndChangeSurfaceRules(NoiseGeneratorSettings settings){ + knownNoiseGenerators.add(settings); + changeSurfaceRulesForGenerator(settings); + } public static void registerStructureEvents(){ DynamicRegistrySetupCallback.EVENT.register(registryManager -> { Optional> oGeneratorRegistry = registryManager.registry(Registry.NOISE_GENERATOR_SETTINGS_REGISTRY); @@ -915,6 +930,7 @@ public class BiomeAPI { if (oGeneratorRegistry.isPresent()) { + oGeneratorRegistry.get().forEach(BiomeAPI::registerNoiseGeneratorAndChangeSurfaceRules); RegistryEntryAddedCallback .event(oGeneratorRegistry.get()) .register((rawId, id, settings) -> { @@ -925,17 +941,24 @@ public class BiomeAPI { structureStarts.entrySet().forEach(entry -> changeStructureStarts(a, entry.getValue())); //add surface rules - if (biomeRegistry!=null) { - List rules = getRuleSourcesFromIDs(biomeRegistry.keySet()); - SurfaceRuleProvider provider = SurfaceRuleProvider.class.cast(settings); - changeSurfaceRules(rules, provider); - } + registerNoiseGeneratorAndChangeSurfaceRules(settings); }); } }); } + private static final Set knownNoiseGenerators = new HashSet<>(); + private static void changeSurfaceRulesForGenerator(NoiseGeneratorSettings settings){ + List rules; + if (biomeRegistry!=null) { + rules = getRuleSourcesFromIDs(biomeRegistry.keySet()); + } else { + rules = getAllRuleSources(); + } + SurfaceRuleProvider provider = SurfaceRuleProvider.class.cast(settings); + changeSurfaceRules(rules, provider); + } private static void changeSurfaceRules(List rules, SurfaceRuleProvider provider) { if (rules.size() > 0) {