Possible fix for missing SurfaceRules in Datapack worlds

This commit is contained in:
Frank 2021-12-13 16:33:18 +01:00
parent ff49e1325c
commit 835f4895b3
4 changed files with 82 additions and 32 deletions

View file

@ -3,36 +3,65 @@ package ru.bclib.mixin.common;
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
import net.minecraft.world.level.levelgen.SurfaceRules;
import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource;
import org.apache.commons.codec.language.bm.Rule;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import ru.bclib.interfaces.SurfaceRuleProvider;
import java.util.List;
import java.util.stream.Collectors;
@Mixin(NoiseGeneratorSettings.class)
public class NoiseGeneratorSettingsMixin implements SurfaceRuleProvider {
@Mutable
@Final
@Shadow
private SurfaceRules.RuleSource surfaceRule;
private SurfaceRules.RuleSource bclib_surfaceRule;
private SurfaceRules.RuleSource bclib_originalSurfaceRule;
@Override
public void setSurfaceRule(SurfaceRules.RuleSource surfaceRule) {
bclib_surfaceRule = surfaceRule;
}
@Override
public RuleSource getSurfaceRule() {
return surfaceRule;
}
@Inject(method = "surfaceRule", at = @At("HEAD"), cancellable = true)
private void bclib_surfaceRule(CallbackInfoReturnable<SurfaceRules.RuleSource> info) {
if (bclib_surfaceRule != null) {
info.setReturnValue(bclib_surfaceRule);
public void clearCustomRules() {
if (bclib_originalSurfaceRule != null){
this.surfaceRule = bclib_originalSurfaceRule;
bclib_originalSurfaceRule = null;
}
}
@Override
public void addCustomRules(List<RuleSource> rules) {
RuleSource org = getOriginalSurfaceRule();
if (org instanceof SurfaceRules.SequenceRuleSource sequenceRule){
List<RuleSource> currentSequence = sequenceRule.sequence();
rules = rules.stream().filter(r -> currentSequence.indexOf(r)<0).collect(Collectors.toList());
rules.addAll(sequenceRule.sequence());
} else {
rules.add(org);
}
setSurfaceRule(SurfaceRules.sequence(rules.toArray(new RuleSource[rules.size()])));
}
void setSurfaceRule(SurfaceRules.RuleSource surfaceRule) {
if (bclib_originalSurfaceRule == null){
bclib_originalSurfaceRule = this.surfaceRule;
}
this.surfaceRule = surfaceRule;
}
RuleSource getOriginalSurfaceRule() {
if (bclib_originalSurfaceRule ==null) {
return surfaceRule;
}
return bclib_originalSurfaceRule;
}
// @Inject(method = "surfaceRule", at = @At("HEAD"), cancellable = true)
// private void bclib_surfaceRule(CallbackInfoReturnable<SurfaceRules.RuleSource> info) {
// if (bclib_surfaceRule != null) {
// info.setReturnValue(bclib_surfaceRule);
// }
// }
}