Some changes to surface processing

This commit is contained in:
Frank 2021-12-13 21:22:47 +01:00
parent 4c41bb1764
commit 7f5e27397c
3 changed files with 67 additions and 3 deletions

View file

@ -27,6 +27,7 @@ import net.minecraft.world.level.levelgen.GenerationStep;
import net.minecraft.world.level.levelgen.GenerationStep.Decoration;
import net.minecraft.world.level.levelgen.Noises;
import net.minecraft.world.level.levelgen.SurfaceRules;
import net.minecraft.world.level.levelgen.SurfaceRules.SequenceRuleSource;
import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver;
import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature;
import net.minecraft.world.level.levelgen.placement.PlacedFeature;
@ -568,11 +569,24 @@ public class BCLBiomeBuilder {
/**
* Adds surface rule to this biome.
* @param surfaceRule {link SurfaceRules.RuleSource} surface rule.
* @param newSurfaceRule {link SurfaceRules.RuleSource} surface rule.
* @return same {@link BCLBiomeBuilder} instance.
*/
public BCLBiomeBuilder surface(SurfaceRules.RuleSource surfaceRule) {
this.surfaceRule = surfaceRule;
public BCLBiomeBuilder surface(SurfaceRules.RuleSource newSurfaceRule) {
if (this.surfaceRule==null) {
this.surfaceRule = newSurfaceRule;
} else {
this.surfaceRule = SurfaceRules.sequence(this.surfaceRule, newSurfaceRule);
}
return this;
}
/**
* clear all surface rules
* @return same {@link BCLBiomeBuilder} instance.
*/
public BCLBiomeBuilder clearSurface() {
this.surfaceRule = null;
return this;
}

View file

@ -0,0 +1,44 @@
package ru.bclib.api.surface.rules;
import com.mojang.serialization.Codec;
import net.minecraft.world.level.levelgen.SurfaceRules;
import net.minecraft.world.level.levelgen.SurfaceRules.Condition;
import net.minecraft.world.level.levelgen.SurfaceRules.ConditionSource;
import net.minecraft.world.level.levelgen.SurfaceRules.Context;
import net.minecraft.world.level.levelgen.SurfaceRules.LazyCondition;
import ru.bclib.mixin.common.SurfaceRulesContextAccessor;
public abstract class VolumeNoiseCondition implements SurfaceRules.ConditionSource{
@Override
public Codec<? extends ConditionSource> codec() {
return SurfaceRules.ConditionSource.CODEC;
}
@Override
public final Condition apply(Context context2) {
final VolumeNoiseCondition self = this;
class Generator extends LazyCondition {
Generator() {
super(context2);
}
@Override
protected long getContextLastUpdate() {
final SurfaceRulesContextAccessor ctx = SurfaceRulesContextAccessor.class.cast(this.context);
return ctx.getLastUpdateY() + ctx.getLastUpdateXZ();
}
@Override
protected boolean compute() {
final SurfaceRulesContextAccessor context = SurfaceRulesContextAccessor.class.cast(this.context);
if (context==null) return false;
return self.test(context);
}
}
return new Generator();
}
public abstract boolean test(SurfaceRulesContextAccessor context);
}

View file

@ -41,4 +41,10 @@ public interface SurfaceRulesContextAccessor {
@Accessor("stoneDepthBelow")
int getStoneDepthBelow();
@Accessor("lastUpdateY")
long getLastUpdateY();
@Accessor("lastUpdateXZ")
long getLastUpdateXZ();
}