diff --git a/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java b/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java index aaf042ec..0e8c74a7 100644 --- a/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java +++ b/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java @@ -30,6 +30,7 @@ import net.minecraft.world.level.levelgen.SurfaceRules; import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import ru.bclib.api.surface.SurfaceRuleBuilder; import ru.bclib.entity.BCLEntityWrapper; import ru.bclib.util.ColorUtil; import ru.bclib.world.biomes.BCLBiome; diff --git a/src/main/java/ru/bclib/api/biomes/SurfaceRuleBuilder.java b/src/main/java/ru/bclib/api/surface/SurfaceRuleBuilder.java similarity index 99% rename from src/main/java/ru/bclib/api/biomes/SurfaceRuleBuilder.java rename to src/main/java/ru/bclib/api/surface/SurfaceRuleBuilder.java index 13082e90..97698d1a 100644 --- a/src/main/java/ru/bclib/api/biomes/SurfaceRuleBuilder.java +++ b/src/main/java/ru/bclib/api/surface/SurfaceRuleBuilder.java @@ -1,4 +1,4 @@ -package ru.bclib.api.biomes; +package ru.bclib.api.surface; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -8,6 +8,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.SurfaceRules; import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource; import net.minecraft.world.level.levelgen.placement.CaveSurface; +import ru.bclib.api.biomes.BiomeAPI; import java.util.Collections; import java.util.List; diff --git a/src/main/java/ru/bclib/api/biomes/SurfaceRuleEntry.java b/src/main/java/ru/bclib/api/surface/SurfaceRuleEntry.java similarity index 95% rename from src/main/java/ru/bclib/api/biomes/SurfaceRuleEntry.java rename to src/main/java/ru/bclib/api/surface/SurfaceRuleEntry.java index 348dbbfb..7255631c 100644 --- a/src/main/java/ru/bclib/api/biomes/SurfaceRuleEntry.java +++ b/src/main/java/ru/bclib/api/surface/SurfaceRuleEntry.java @@ -1,4 +1,4 @@ -package ru.bclib.api.biomes; +package ru.bclib.api.surface; import net.minecraft.world.entity.Mob; import net.minecraft.world.level.levelgen.SurfaceRules; diff --git a/src/main/java/ru/bclib/api/surface/rules/RandomIntProvider.java b/src/main/java/ru/bclib/api/surface/rules/RandomIntProvider.java new file mode 100644 index 00000000..14c1dffb --- /dev/null +++ b/src/main/java/ru/bclib/api/surface/rules/RandomIntProvider.java @@ -0,0 +1,12 @@ +package ru.bclib.api.surface.rules; + +import ru.bclib.interfaces.NumericProvider; +import ru.bclib.mixin.common.SurfaceRulesContextAccessor; +import ru.bclib.util.MHelper; + +public record RandomIntProvider(int range) implements NumericProvider { + @Override + public int getNumber(SurfaceRulesContextAccessor context) { + return MHelper.RANDOM.nextInt(range); + } +} diff --git a/src/main/java/ru/bclib/api/biomes/SurfaceNoiseCondition.java b/src/main/java/ru/bclib/api/surface/rules/SurfaceNoiseCondition.java similarity index 96% rename from src/main/java/ru/bclib/api/biomes/SurfaceNoiseCondition.java rename to src/main/java/ru/bclib/api/surface/rules/SurfaceNoiseCondition.java index 2b6b71ef..8efd4f92 100644 --- a/src/main/java/ru/bclib/api/biomes/SurfaceNoiseCondition.java +++ b/src/main/java/ru/bclib/api/surface/rules/SurfaceNoiseCondition.java @@ -1,4 +1,4 @@ -package ru.bclib.api.biomes; +package ru.bclib.api.surface.rules; import com.mojang.serialization.Codec; import net.minecraft.world.level.levelgen.SurfaceRules; @@ -8,7 +8,6 @@ import net.minecraft.world.level.levelgen.SurfaceRules.Context; import net.minecraft.world.level.levelgen.SurfaceRules.LazyXZCondition; import ru.bclib.mixin.common.SurfaceRulesContextAccessor; - public abstract class SurfaceNoiseCondition implements SurfaceRules.ConditionSource{ @Override public Codec codec() { diff --git a/src/main/java/ru/bclib/api/surface/rules/SwitchRuleSource.java b/src/main/java/ru/bclib/api/surface/rules/SwitchRuleSource.java new file mode 100644 index 00000000..3feaca12 --- /dev/null +++ b/src/main/java/ru/bclib/api/surface/rules/SwitchRuleSource.java @@ -0,0 +1,35 @@ +package ru.bclib.api.surface.rules; + +import com.mojang.serialization.Codec; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.SurfaceRules.Context; +import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource; +import net.minecraft.world.level.levelgen.SurfaceRules.SurfaceRule; +import org.jetbrains.annotations.Nullable; +import ru.bclib.interfaces.NumericProvider; +import ru.bclib.mixin.common.SurfaceRulesContextAccessor; + +import java.util.List; + +public record SwitchRuleSource(NumericProvider selector, List collection) implements RuleSource { + @Override + public Codec codec() { + return RuleSource.CODEC; + } + + @Override + public SurfaceRule apply(Context context) { + + return new SurfaceRule() { + @Nullable + @Override + public BlockState tryApply(int x, int y, int z) { + final SurfaceRulesContextAccessor ctx = SurfaceRulesContextAccessor.class.cast(context); + int nr = Math.max(0, selector.getNumber(ctx)) % collection.size(); + + return collection.get(nr).apply(context).tryApply(x, y, z); + } + }; + + } +} diff --git a/src/main/java/ru/bclib/interfaces/NumericProvider.java b/src/main/java/ru/bclib/interfaces/NumericProvider.java new file mode 100644 index 00000000..6d647f81 --- /dev/null +++ b/src/main/java/ru/bclib/interfaces/NumericProvider.java @@ -0,0 +1,7 @@ +package ru.bclib.interfaces; + +import ru.bclib.mixin.common.SurfaceRulesContextAccessor; + +public interface NumericProvider { + int getNumber(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 021d23bd..99b653a5 100644 --- a/src/main/java/ru/bclib/mixin/common/SurfaceRulesContextAccessor.java +++ b/src/main/java/ru/bclib/mixin/common/SurfaceRulesContextAccessor.java @@ -35,4 +35,10 @@ public interface SurfaceRulesContextAccessor { @Accessor("noiseChunk") NoiseChunk getNoiseChunk(); + + @Accessor("stoneDepthAbove") + int getStoneDepthAbove(); + + @Accessor("stoneDepthBelow") + int getStoneDepthBelow(); } diff --git a/src/main/java/ru/bclib/world/surface/DoubleBlockSurfaceNoiseCondition.java b/src/main/java/ru/bclib/world/surface/DoubleBlockSurfaceNoiseCondition.java index e6f01c13..e7405c35 100644 --- a/src/main/java/ru/bclib/world/surface/DoubleBlockSurfaceNoiseCondition.java +++ b/src/main/java/ru/bclib/world/surface/DoubleBlockSurfaceNoiseCondition.java @@ -1,6 +1,6 @@ package ru.bclib.world.surface; -import ru.bclib.api.biomes.SurfaceNoiseCondition; +import ru.bclib.api.surface.rules.SurfaceNoiseCondition; import ru.bclib.mixin.common.SurfaceRulesContextAccessor; import ru.bclib.noise.OpenSimplexNoise; import ru.bclib.util.MHelper; diff --git a/src/main/resources/bclib.accesswidener b/src/main/resources/bclib.accesswidener index 26921210..851b44f6 100644 --- a/src/main/resources/bclib.accesswidener +++ b/src/main/resources/bclib.accesswidener @@ -4,6 +4,7 @@ accessWidener v1 named accessible class net/minecraft/client/Minecraft$ExperimentalDialogType accessible class net/minecraft/world/level/levelgen/SurfaceRules$Context accessible class net/minecraft/world/level/levelgen/SurfaceRules$Condition +accessible class net/minecraft/world/level/levelgen/SurfaceRules$SurfaceRule accessible class net/minecraft/world/level/levelgen/SurfaceRules$LazyXZCondition accessible class net/minecraft/world/level/levelgen/SurfaceRules$LazyCondition accessible class net/minecraft/world/level/levelgen/SurfaceRules$SequenceRuleSource \ No newline at end of file