diff --git a/src/main/java/ru/bclib/api/biomes/SurfaceNoiseCondition.java b/src/main/java/ru/bclib/api/biomes/SurfaceNoiseCondition.java new file mode 100644 index 00000000..2b6b71ef --- /dev/null +++ b/src/main/java/ru/bclib/api/biomes/SurfaceNoiseCondition.java @@ -0,0 +1,39 @@ +package ru.bclib.api.biomes; + +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.LazyXZCondition; +import ru.bclib.mixin.common.SurfaceRulesContextAccessor; + + +public abstract class SurfaceNoiseCondition implements SurfaceRules.ConditionSource{ + @Override + public Codec codec() { + return SurfaceRules.ConditionSource.CODEC; + } + + @Override + public final Condition apply(Context context2) { + final SurfaceNoiseCondition self = this; + + class Generator extends LazyXZCondition { + Generator() { + super(context2); + } + + @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/api/biomes/SurfaceRuleBuilder.java b/src/main/java/ru/bclib/api/biomes/SurfaceRuleBuilder.java index 13082e90..fbb61683 100644 --- a/src/main/java/ru/bclib/api/biomes/SurfaceRuleBuilder.java +++ b/src/main/java/ru/bclib/api/biomes/SurfaceRuleBuilder.java @@ -2,16 +2,24 @@ package ru.bclib.api.biomes; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.levelgen.NoiseChunk; import net.minecraft.world.level.levelgen.SurfaceRules; +import net.minecraft.world.level.levelgen.SurfaceRules.Condition; import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource; +import net.minecraft.world.level.levelgen.SurfaceSystem; +import net.minecraft.world.level.levelgen.WorldGenerationContext; import net.minecraft.world.level.levelgen.placement.CaveSurface; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.function.Function; import java.util.function.Supplier; public class SurfaceRuleBuilder { diff --git a/src/main/java/ru/bclib/mixin/common/SurfaceRulesContextAccessor.java b/src/main/java/ru/bclib/mixin/common/SurfaceRulesContextAccessor.java new file mode 100644 index 00000000..60660d46 --- /dev/null +++ b/src/main/java/ru/bclib/mixin/common/SurfaceRulesContextAccessor.java @@ -0,0 +1,38 @@ +package ru.bclib.mixin.common; + +import java.util.function.Supplier; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.levelgen.NoiseChunk; +import net.minecraft.world.level.levelgen.SurfaceRules; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(SurfaceRules.Context.class) +public interface SurfaceRulesContextAccessor { + @Accessor("blockX") + int getBlockX(); + + @Accessor("blockY") + int getBlockY(); + + @Accessor("blockZ") + int getBlockZ(); + + @Accessor("surfaceDepth") + int getSurfaceDepth(); + + @Accessor("biome") + Supplier getBiome(); + + @Accessor("biomeKey") + Supplier> getBiomeKey(); + + @Accessor("chunk") + ChunkAccess getChunk(); + + @Accessor("noiseChunk") + NoiseChunk getNoiseChunk(); +} diff --git a/src/main/resources/bclib.accesswidener b/src/main/resources/bclib.accesswidener index 9883ec46..f29e3ed9 100644 --- a/src/main/resources/bclib.accesswidener +++ b/src/main/resources/bclib.accesswidener @@ -3,4 +3,6 @@ accessWidener v1 named # Classes 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 \ No newline at end of file +accessible class net/minecraft/world/level/levelgen/SurfaceRules$Condition +accessible class net/minecraft/world/level/levelgen/SurfaceRules$LazyXZCondition +accessible class net/minecraft/world/level/levelgen/SurfaceRules$LazyCondition \ No newline at end of file diff --git a/src/main/resources/bclib.mixins.common.json b/src/main/resources/bclib.mixins.common.json index b387bdb9..34b786a2 100644 --- a/src/main/resources/bclib.mixins.common.json +++ b/src/main/resources/bclib.mixins.common.json @@ -38,7 +38,8 @@ "AnvilBlockMixin", "AnvilMenuMixin", "TagLoaderMixin", - "MainMixin" + "MainMixin", + "SurfaceRulesContextAccessor" ], "injectors": { "defaultRequire": 1