[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;
@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;
}

View file

@ -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();
}

View file

@ -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<SurfaceRules.RuleSource> 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<SurfaceRules.RuleSource> 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())
));
}
}