Possible fix for missing SurfaceRules in Datapack worlds
This commit is contained in:
parent
ff49e1325c
commit
835f4895b3
4 changed files with 82 additions and 32 deletions
|
@ -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);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue