diff --git a/src/main/java/org/betterx/worlds/together/mixin/common/NoiseGeneratorSettingsMixin.java b/src/main/java/org/betterx/worlds/together/mixin/common/NoiseGeneratorSettingsMixin.java index 3ddaec14..d4489d94 100644 --- a/src/main/java/org/betterx/worlds/together/mixin/common/NoiseGeneratorSettingsMixin.java +++ b/src/main/java/org/betterx/worlds/together/mixin/common/NoiseGeneratorSettingsMixin.java @@ -12,14 +12,14 @@ import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Shadow; @Mixin(NoiseGeneratorSettings.class) -public class NoiseGeneratorSettingsMixin implements SurfaceRuleProvider { +public abstract class NoiseGeneratorSettingsMixin implements SurfaceRuleProvider { @Mutable @Final @Shadow private SurfaceRules.RuleSource surfaceRule; - public void bclib_overwrite(SurfaceRules.RuleSource surfaceRule) { - if (surfaceRule == this.surfaceRule) return; + public void bclib_overwriteSurfaceRules(SurfaceRules.RuleSource surfaceRule) { + if (surfaceRule == null || surfaceRule == this.surfaceRule) return; if (this.bcl_containsOverride) { WorldsTogether.LOGGER.warning("Overwriting an overwritten set of Surface Rules."); } @@ -27,6 +27,10 @@ public class NoiseGeneratorSettingsMixin implements SurfaceRuleProvider { this.surfaceRule = surfaceRule; } + public SurfaceRules.RuleSource bclib_getOriginalSurfaceRules() { + return this.surfaceRule; + } + private boolean bcl_containsOverride = false; } diff --git a/src/main/java/org/betterx/worlds/together/surfaceRules/SurfaceRuleProvider.java b/src/main/java/org/betterx/worlds/together/surfaceRules/SurfaceRuleProvider.java index 0f7d51af..5b2dec78 100644 --- a/src/main/java/org/betterx/worlds/together/surfaceRules/SurfaceRuleProvider.java +++ b/src/main/java/org/betterx/worlds/together/surfaceRules/SurfaceRuleProvider.java @@ -3,5 +3,6 @@ package org.betterx.worlds.together.surfaceRules; import net.minecraft.world.level.levelgen.SurfaceRules; public interface SurfaceRuleProvider { - void bclib_overwrite(SurfaceRules.RuleSource surfaceRule); + void bclib_overwriteSurfaceRules(SurfaceRules.RuleSource surfaceRule); + SurfaceRules.RuleSource bclib_getOriginalSurfaceRules(); } diff --git a/src/main/java/org/betterx/worlds/together/surfaceRules/SurfaceRuleUtil.java b/src/main/java/org/betterx/worlds/together/surfaceRules/SurfaceRuleUtil.java index 2002bd12..cdb35089 100644 --- a/src/main/java/org/betterx/worlds/together/surfaceRules/SurfaceRuleUtil.java +++ b/src/main/java/org/betterx/worlds/together/surfaceRules/SurfaceRuleUtil.java @@ -1,5 +1,7 @@ package org.betterx.worlds.together.surfaceRules; +import org.betterx.bclib.BCLib; +import org.betterx.bclib.config.Configs; import org.betterx.worlds.together.chunkgenerator.InjectableSurfaceRules; import org.betterx.worlds.together.world.event.WorldBootstrap; @@ -44,42 +46,40 @@ public class SurfaceRuleUtil { .collect(Collectors.toCollection(LinkedList::new)); } - private static SurfaceRules.RuleSource mergeSurfaceRulesFromBiomes( - SurfaceRules.RuleSource org, - BiomeSource source - ) { - return mergeSurfaceRules( - org, - getRulesForBiomes(source.possibleBiomes().stream().map(h -> h.value()).toList()) - ); - } - private static SurfaceRules.RuleSource mergeSurfaceRules( SurfaceRules.RuleSource org, + BiomeSource source, List additionalRules ) { - if (additionalRules == null || additionalRules.isEmpty()) return org; - + if (additionalRules == null || additionalRules.isEmpty()) return null; + final int count = additionalRules.size(); if (org instanceof SurfaceRules.SequenceRuleSource sequenceRule) { List existingSequence = sequenceRule.sequence(); additionalRules = additionalRules .stream() .filter(r -> existingSequence.indexOf(r) < 0) .collect(Collectors.toList()); - if (additionalRules.size() == 0) return org; + if (additionalRules.size() == 0) return null; additionalRules.addAll(existingSequence); } else { if (!additionalRules.contains(org)) additionalRules.add(org); } + if (Configs.MAIN_CONFIG.verboseLogging()) { + BCLib.LOGGER.info("Merged " + count + " additional Surface Rules for " + source + " => " + additionalRules.size()); + } return new SurfaceRules.SequenceRuleSource(additionalRules); } public static void injectSurfaceRules(NoiseGeneratorSettings noiseSettings, BiomeSource loadedBiomeSource) { if (((Object) noiseSettings) instanceof SurfaceRuleProvider srp) { - SurfaceRules.RuleSource originalRules = noiseSettings.surfaceRule(); - srp.bclib_overwrite(mergeSurfaceRulesFromBiomes(originalRules, loadedBiomeSource)); + SurfaceRules.RuleSource originalRules = srp.bclib_getOriginalSurfaceRules(); + srp.bclib_overwriteSurfaceRules(mergeSurfaceRules( + originalRules, + loadedBiomeSource, + getRulesForBiomes(loadedBiomeSource.possibleBiomes().stream().map(h -> h.value()).toList()) + )); } }