From c59e482108869befb38a52f91d28dd9210490d1f Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 20 Jun 2023 22:05:04 +0200 Subject: [PATCH] [Fix] Default world gen did not use our Surface Rules when Terrablender is present (#103) --- .../common/NoiseGeneratorSettingsMixin.java | 10 +++++--- .../surfaceRules/SurfaceRuleProvider.java | 3 ++- .../surfaceRules/SurfaceRuleUtil.java | 23 +++++++------------ 3 files changed, 17 insertions(+), 19 deletions(-) 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 32a2df9e..7e196e74 100644 --- a/src/main/java/org/betterx/worlds/together/surfaceRules/SurfaceRuleUtil.java +++ b/src/main/java/org/betterx/worlds/together/surfaceRules/SurfaceRuleUtil.java @@ -49,23 +49,12 @@ public class SurfaceRuleUtil { .collect(Collectors.toCollection(LinkedList::new)); } - private static SurfaceRules.RuleSource mergeSurfaceRulesFromBiomes( - SurfaceRules.RuleSource org, - BiomeSource source - ) { - return mergeSurfaceRules( - org, - source, - 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(); @@ -73,7 +62,7 @@ public class SurfaceRuleUtil { .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)) @@ -88,8 +77,12 @@ public class SurfaceRuleUtil { 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()) + )); } }