[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 b5dc593d9a
commit 1fe494798c
3 changed files with 24 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

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