diff --git a/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java b/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java index 0e8c74a7..5633b161 100644 --- a/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java +++ b/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java @@ -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; } diff --git a/src/main/java/ru/bclib/api/surface/rules/VolumeNoiseCondition.java b/src/main/java/ru/bclib/api/surface/rules/VolumeNoiseCondition.java new file mode 100644 index 00000000..bda81e8b --- /dev/null +++ b/src/main/java/ru/bclib/api/surface/rules/VolumeNoiseCondition.java @@ -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 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); +} diff --git a/src/main/java/ru/bclib/mixin/common/SurfaceRulesContextAccessor.java b/src/main/java/ru/bclib/mixin/common/SurfaceRulesContextAccessor.java index 99b653a5..59886394 100644 --- a/src/main/java/ru/bclib/mixin/common/SurfaceRulesContextAccessor.java +++ b/src/main/java/ru/bclib/mixin/common/SurfaceRulesContextAccessor.java @@ -41,4 +41,10 @@ public interface SurfaceRulesContextAccessor { @Accessor("stoneDepthBelow") int getStoneDepthBelow(); + + @Accessor("lastUpdateY") + long getLastUpdateY(); + + @Accessor("lastUpdateXZ") + long getLastUpdateXZ(); }