[Fix] Default world gen did not use our Surface Rules when Terrablender is present (#103)

This commit is contained in:
Frank 2023-06-20 22:05:04 +02:00
parent 7aadf42741
commit c59e482108
3 changed files with 17 additions and 19 deletions

View file

@ -12,14 +12,14 @@ import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
@Mixin(NoiseGeneratorSettings.class) @Mixin(NoiseGeneratorSettings.class)
public class NoiseGeneratorSettingsMixin implements SurfaceRuleProvider { public abstract class NoiseGeneratorSettingsMixin implements SurfaceRuleProvider {
@Mutable @Mutable
@Final @Final
@Shadow @Shadow
private SurfaceRules.RuleSource surfaceRule; private SurfaceRules.RuleSource surfaceRule;
public void bclib_overwrite(SurfaceRules.RuleSource surfaceRule) { public void bclib_overwriteSurfaceRules(SurfaceRules.RuleSource surfaceRule) {
if (surfaceRule == this.surfaceRule) return; if (surfaceRule == null || surfaceRule == this.surfaceRule) return;
if (this.bcl_containsOverride) { if (this.bcl_containsOverride) {
WorldsTogether.LOGGER.warning("Overwriting an overwritten set of Surface Rules."); WorldsTogether.LOGGER.warning("Overwriting an overwritten set of Surface Rules.");
} }
@ -27,6 +27,10 @@ public class NoiseGeneratorSettingsMixin implements SurfaceRuleProvider {
this.surfaceRule = surfaceRule; this.surfaceRule = surfaceRule;
} }
public SurfaceRules.RuleSource bclib_getOriginalSurfaceRules() {
return this.surfaceRule;
}
private boolean bcl_containsOverride = false; private boolean bcl_containsOverride = false;
} }

View file

@ -3,5 +3,6 @@ package org.betterx.worlds.together.surfaceRules;
import net.minecraft.world.level.levelgen.SurfaceRules; import net.minecraft.world.level.levelgen.SurfaceRules;
public interface SurfaceRuleProvider { public interface SurfaceRuleProvider {
void bclib_overwrite(SurfaceRules.RuleSource surfaceRule); void bclib_overwriteSurfaceRules(SurfaceRules.RuleSource surfaceRule);
SurfaceRules.RuleSource bclib_getOriginalSurfaceRules();
} }

View file

@ -49,23 +49,12 @@ public class SurfaceRuleUtil {
.collect(Collectors.toCollection(LinkedList::new)); .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( private static SurfaceRules.RuleSource mergeSurfaceRules(
SurfaceRules.RuleSource org, SurfaceRules.RuleSource org,
BiomeSource source, BiomeSource source,
List<SurfaceRules.RuleSource> additionalRules List<SurfaceRules.RuleSource> additionalRules
) { ) {
if (additionalRules == null || additionalRules.isEmpty()) return org; if (additionalRules == null || additionalRules.isEmpty()) return null;
final int count = additionalRules.size(); final int count = additionalRules.size();
if (org instanceof SurfaceRules.SequenceRuleSource sequenceRule) { if (org instanceof SurfaceRules.SequenceRuleSource sequenceRule) {
List<SurfaceRules.RuleSource> existingSequence = sequenceRule.sequence(); List<SurfaceRules.RuleSource> existingSequence = sequenceRule.sequence();
@ -73,7 +62,7 @@ public class SurfaceRuleUtil {
.stream() .stream()
.filter(r -> existingSequence.indexOf(r) < 0) .filter(r -> existingSequence.indexOf(r) < 0)
.collect(Collectors.toList()); .collect(Collectors.toList());
if (additionalRules.size() == 0) return org; if (additionalRules.size() == 0) return null;
additionalRules.addAll(existingSequence); additionalRules.addAll(existingSequence);
} else { } else {
if (!additionalRules.contains(org)) if (!additionalRules.contains(org))
@ -88,8 +77,12 @@ public class SurfaceRuleUtil {
public static void injectSurfaceRules(NoiseGeneratorSettings noiseSettings, BiomeSource loadedBiomeSource) { public static void injectSurfaceRules(NoiseGeneratorSettings noiseSettings, BiomeSource loadedBiomeSource) {
if (((Object) noiseSettings) instanceof SurfaceRuleProvider srp) { if (((Object) noiseSettings) instanceof SurfaceRuleProvider srp) {
SurfaceRules.RuleSource originalRules = noiseSettings.surfaceRule(); SurfaceRules.RuleSource originalRules = srp.bclib_getOriginalSurfaceRules();
srp.bclib_overwrite(mergeSurfaceRulesFromBiomes(originalRules, loadedBiomeSource)); srp.bclib_overwriteSurfaceRules(mergeSurfaceRules(
originalRules,
loadedBiomeSource,
getRulesForBiomes(loadedBiomeSource.possibleBiomes().stream().map(h -> h.value()).toList())
));
} }
} }