From b0da1d244a126da6ef85b0a894923cc9dd6d4ffe Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 25 Apr 2022 12:01:22 +0300 Subject: [PATCH] Working terrain generator --- gradle.properties | 2 +- .../betterend/interfaces/BETargetChecker.java | 6 ++++ .../betterend/interfaces/TargetChecker.java | 5 --- .../NoiseBasedChunkGeneratorAccessor.java | 13 +++++++ .../mixin/common/NoiseChunkMixin.java | 35 ++++++++----------- .../common/NoiseGeneratorSettingsMixin.java | 20 +++++++++++ .../common/NoiseInterpolatorAccessor.java | 14 ++++++++ .../mixin/common/NoiseInterpolatorMixin.java | 25 ------------- .../mixin/common/ServerLevelMixin.java | 8 +++++ .../resources/betterend.mixins.common.json | 4 ++- 10 files changed, 79 insertions(+), 53 deletions(-) create mode 100644 src/main/java/ru/betterend/interfaces/BETargetChecker.java delete mode 100644 src/main/java/ru/betterend/interfaces/TargetChecker.java create mode 100644 src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorAccessor.java create mode 100644 src/main/java/ru/betterend/mixin/common/NoiseGeneratorSettingsMixin.java create mode 100644 src/main/java/ru/betterend/mixin/common/NoiseInterpolatorAccessor.java delete mode 100644 src/main/java/ru/betterend/mixin/common/NoiseInterpolatorMixin.java diff --git a/gradle.properties b/gradle.properties index 93745e35..fbbeee5d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,6 +19,6 @@ archives_base_name=better-end # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api patchouli_version = 55-FABRIC-SNAPSHOT -bclib_version = 1.4.0 +bclib_version = 1.4.3 rei_version = 8.0.442 canvas_version = 1.0.+ diff --git a/src/main/java/ru/betterend/interfaces/BETargetChecker.java b/src/main/java/ru/betterend/interfaces/BETargetChecker.java new file mode 100644 index 00000000..304c4dc2 --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/BETargetChecker.java @@ -0,0 +1,6 @@ +package ru.betterend.interfaces; + +public interface BETargetChecker { + boolean be_isTarget(); + void be_setTarget(boolean target); +} diff --git a/src/main/java/ru/betterend/interfaces/TargetChecker.java b/src/main/java/ru/betterend/interfaces/TargetChecker.java deleted file mode 100644 index 3d33d804..00000000 --- a/src/main/java/ru/betterend/interfaces/TargetChecker.java +++ /dev/null @@ -1,5 +0,0 @@ -package ru.betterend.interfaces; - -public interface TargetChecker { - boolean be_isTarget(); -} diff --git a/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorAccessor.java b/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorAccessor.java new file mode 100644 index 00000000..ed2963d1 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorAccessor.java @@ -0,0 +1,13 @@ +package ru.betterend.mixin.common; + +import net.minecraft.core.Holder; +import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; +import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(NoiseBasedChunkGenerator.class) +public interface NoiseBasedChunkGeneratorAccessor { + @Accessor("settings") + Holder be_getSettings(); +} diff --git a/src/main/java/ru/betterend/mixin/common/NoiseChunkMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseChunkMixin.java index a0de131c..03bfd035 100644 --- a/src/main/java/ru/betterend/mixin/common/NoiseChunkMixin.java +++ b/src/main/java/ru/betterend/mixin/common/NoiseChunkMixin.java @@ -10,39 +10,37 @@ 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.CallbackInfo; -import ru.betterend.interfaces.TargetChecker; +import ru.betterend.interfaces.BETargetChecker; import ru.betterend.world.generator.TerrainGenerator; import java.util.List; import java.util.Objects; @Mixin(NoiseChunk.class) -public class NoiseChunkMixin implements TargetChecker { +public class NoiseChunkMixin implements BETargetChecker { private boolean be_isEndGenerator; - private static boolean be_is(NoiseGeneratorSettings gen, ResourceKey resourceKey) { - return Objects.equals(gen, BuiltinRegistries.NOISE_GENERATOR_SETTINGS.get(resourceKey)); - } - @Inject(method = "*", at = @At("TAIL")) private void be_onNoiseChunkInit(int i, int j, int k, NoiseRouter noiseRouter, int l, int m, DensityFunctions.BeardifierOrMarker beardifierOrMarker, NoiseGeneratorSettings noiseGeneratorSettings, Aquifer.FluidPicker fluidPicker, Blender blender, CallbackInfo ci) { - //be_isEndGenerator = noiseGeneratorSettings.is(NoiseGeneratorSettings.END); - be_isEndGenerator = be_is(noiseGeneratorSettings, NoiseGeneratorSettings.END); + be_isEndGenerator = BETargetChecker.class.cast(noiseGeneratorSettings).be_isTarget(); } @Override public boolean be_isTarget() { return be_isEndGenerator; } + + @Override + public void be_setTarget(boolean target) { + be_isEndGenerator = target; + } @Shadow @Final private List interpolators; @Inject(method = "fillSlice", at = @At("HEAD"), cancellable = true) private void be_fillSlice(boolean primarySlice, int x, CallbackInfo info) { - if (!TargetChecker.class.cast(this).be_isTarget()) { - return; - } - + if (!be_isTarget()) return; + info.cancel(); NoiseChunkAccessor accessor = NoiseChunkAccessor.class.cast(this); @@ -50,21 +48,16 @@ public class NoiseChunkMixin implements TargetChecker { final int sizeY = noiseSettings.getCellHeight(); final int sizeXZ = noiseSettings.getCellWidth(); - //final int cellsY = accessor.bnv_getCellCountY() + 1; final int cellSizeXZ = accessor.bnv_getCellCountXZ() + 1; final int firstCellZ = accessor.bnv_getFirstCellZ(); - //final int cellNoiseMinY = accessor.bnv_getCellNoiseMinY(); - + x *= sizeXZ; - for (int cellXZ = 0; cellXZ < cellSizeXZ; ++cellXZ) { int z = (firstCellZ + cellXZ) * sizeXZ; for (NoiseChunk.NoiseInterpolator noiseInterpolator : this.interpolators) { - if (noiseInterpolator instanceof NoiseInterpolatorMixin ni) { - //TODO: 1.18.2 Check this implementation - final double[] ds = (primarySlice ? ni.be_getSlice0() : ni.be_getSlice1())[cellXZ]; - TerrainGenerator.fillTerrainDensity(ds, x, z, sizeXZ, sizeY); - } + NoiseInterpolatorAccessor interpolator = (NoiseInterpolatorAccessor) noiseInterpolator; + final double[] ds = (primarySlice ? interpolator.be_getSlice0() : interpolator.be_getSlice1())[cellXZ]; + TerrainGenerator.fillTerrainDensity(ds, x, z, sizeXZ, sizeY); } } } diff --git a/src/main/java/ru/betterend/mixin/common/NoiseGeneratorSettingsMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseGeneratorSettingsMixin.java new file mode 100644 index 00000000..8f3eca58 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/NoiseGeneratorSettingsMixin.java @@ -0,0 +1,20 @@ +package ru.betterend.mixin.common; + +import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; +import org.spongepowered.asm.mixin.Mixin; +import ru.betterend.interfaces.BETargetChecker; + +@Mixin(NoiseGeneratorSettings.class) +public class NoiseGeneratorSettingsMixin implements BETargetChecker { + private boolean be_isTargetGenerator; + + @Override + public boolean be_isTarget() { + return be_isTargetGenerator; + } + + @Override + public void be_setTarget(boolean target) { + be_isTargetGenerator = target; + } +} diff --git a/src/main/java/ru/betterend/mixin/common/NoiseInterpolatorAccessor.java b/src/main/java/ru/betterend/mixin/common/NoiseInterpolatorAccessor.java new file mode 100644 index 00000000..c630b42a --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/NoiseInterpolatorAccessor.java @@ -0,0 +1,14 @@ +package ru.betterend.mixin.common; + +import net.minecraft.world.level.levelgen.NoiseChunk; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(NoiseChunk.NoiseInterpolator.class) +public interface NoiseInterpolatorAccessor { + @Accessor("slice0") + double[][] be_getSlice0(); + + @Accessor("slice1") + double[][] be_getSlice1(); +} diff --git a/src/main/java/ru/betterend/mixin/common/NoiseInterpolatorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseInterpolatorMixin.java deleted file mode 100644 index 38e399b8..00000000 --- a/src/main/java/ru/betterend/mixin/common/NoiseInterpolatorMixin.java +++ /dev/null @@ -1,25 +0,0 @@ -package ru.betterend.mixin.common; - -import net.minecraft.world.level.levelgen.DensityFunction; -import net.minecraft.world.level.levelgen.NoiseChunk; -import net.minecraft.world.level.levelgen.NoiseSettings; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.gen.Accessor; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import ru.betterend.interfaces.TargetChecker; -import ru.betterend.world.generator.TerrainGenerator; - -import java.util.List; - -@Mixin(NoiseChunk.NoiseInterpolator.class) -public interface NoiseInterpolatorMixin { - @Accessor("slice0") - public double[][] be_getSlice0(); - - @Accessor("slice1") - public double[][] be_getSlice1(); -} diff --git a/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java b/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java index 5fbc41e1..d4aa24ac 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java @@ -14,6 +14,8 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.dimension.DimensionType; +import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; +import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import net.minecraft.world.level.storage.LevelStorageSource; import net.minecraft.world.level.storage.LevelStorageSource.LevelStorageAccess; import net.minecraft.world.level.storage.ServerLevelData; @@ -26,6 +28,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.bclib.api.biomes.BiomeAPI; import ru.betterend.BetterEnd; +import ru.betterend.interfaces.BETargetChecker; import ru.betterend.registry.EndBlocks; import ru.betterend.world.generator.GeneratorOptions; import ru.betterend.world.generator.TerrainGenerator; @@ -57,6 +60,11 @@ public abstract class ServerLevelMixin extends Level { private void be_onServerWorldInit(MinecraftServer minecraftServer, Executor executor, LevelStorageAccess levelStorageAccess, ServerLevelData serverLevelData, ResourceKey resourceKey, Holder holder, ChunkProgressListener chunkProgressListener, ChunkGenerator chunkGenerator, boolean bl, long seed, List list, boolean bl2, CallbackInfo ci) { ServerLevel level = ServerLevel.class.cast(this); if (level.dimension() == Level.END) { + if (chunkGenerator instanceof NoiseBasedChunkGenerator) { + Holder sHolder = NoiseBasedChunkGeneratorAccessor.class.cast(chunkGenerator).be_getSettings(); + BETargetChecker.class.cast(sHolder.value()).be_setTarget(true); + + } TerrainGenerator.initNoise(seed, chunkGenerator.getBiomeSource(), chunkGenerator.climateSampler()); } } diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 70fe2e58..f1bfc80b 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -4,10 +4,12 @@ "package": "ru.betterend.mixin.common", "compatibilityLevel": "JAVA_16", "mixins": [ + "NoiseBasedChunkGeneratorAccessor", + "NoiseGeneratorSettingsMixin", + "NoiseInterpolatorAccessor", "ChorusPlantFeatureMixin", "PlayerAdvancementsMixin", "ChorusFlowerBlockMixin", - "NoiseInterpolatorMixin", "ChorusPlantBlockMixin", "EndPodiumFeatureMixin", "EndDragonFightMixin",