Working terrain generator

This commit is contained in:
paulevsGitch 2022-04-25 12:01:22 +03:00
parent f59cf8bad2
commit b0da1d244a
10 changed files with 79 additions and 53 deletions

View file

@ -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 # 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 patchouli_version = 55-FABRIC-SNAPSHOT
bclib_version = 1.4.0 bclib_version = 1.4.3
rei_version = 8.0.442 rei_version = 8.0.442
canvas_version = 1.0.+ canvas_version = 1.0.+

View file

@ -0,0 +1,6 @@
package ru.betterend.interfaces;
public interface BETargetChecker {
boolean be_isTarget();
void be_setTarget(boolean target);
}

View file

@ -1,5 +0,0 @@
package ru.betterend.interfaces;
public interface TargetChecker {
boolean be_isTarget();
}

View file

@ -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<NoiseGeneratorSettings> be_getSettings();
}

View file

@ -10,24 +10,19 @@ import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 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 ru.betterend.world.generator.TerrainGenerator;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@Mixin(NoiseChunk.class) @Mixin(NoiseChunk.class)
public class NoiseChunkMixin implements TargetChecker { public class NoiseChunkMixin implements BETargetChecker {
private boolean be_isEndGenerator; private boolean be_isEndGenerator;
private static boolean be_is(NoiseGeneratorSettings gen, ResourceKey<NoiseGeneratorSettings> resourceKey) {
return Objects.equals(gen, BuiltinRegistries.NOISE_GENERATOR_SETTINGS.get(resourceKey));
}
@Inject(method = "<init>*", at = @At("TAIL")) @Inject(method = "<init>*", 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) { 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 = BETargetChecker.class.cast(noiseGeneratorSettings).be_isTarget();
be_isEndGenerator = be_is(noiseGeneratorSettings, NoiseGeneratorSettings.END);
} }
@Override @Override
@ -35,13 +30,16 @@ public class NoiseChunkMixin implements TargetChecker {
return be_isEndGenerator; return be_isEndGenerator;
} }
@Override
public void be_setTarget(boolean target) {
be_isEndGenerator = target;
}
@Shadow @Final private List<NoiseChunk.NoiseInterpolator> interpolators; @Shadow @Final private List<NoiseChunk.NoiseInterpolator> interpolators;
@Inject(method = "fillSlice", at = @At("HEAD"), cancellable = true) @Inject(method = "fillSlice", at = @At("HEAD"), cancellable = true)
private void be_fillSlice(boolean primarySlice, int x, CallbackInfo info) { private void be_fillSlice(boolean primarySlice, int x, CallbackInfo info) {
if (!TargetChecker.class.cast(this).be_isTarget()) { if (!be_isTarget()) return;
return;
}
info.cancel(); info.cancel();
@ -50,22 +48,17 @@ public class NoiseChunkMixin implements TargetChecker {
final int sizeY = noiseSettings.getCellHeight(); final int sizeY = noiseSettings.getCellHeight();
final int sizeXZ = noiseSettings.getCellWidth(); final int sizeXZ = noiseSettings.getCellWidth();
//final int cellsY = accessor.bnv_getCellCountY() + 1;
final int cellSizeXZ = accessor.bnv_getCellCountXZ() + 1; final int cellSizeXZ = accessor.bnv_getCellCountXZ() + 1;
final int firstCellZ = accessor.bnv_getFirstCellZ(); final int firstCellZ = accessor.bnv_getFirstCellZ();
//final int cellNoiseMinY = accessor.bnv_getCellNoiseMinY();
x *= sizeXZ; x *= sizeXZ;
for (int cellXZ = 0; cellXZ < cellSizeXZ; ++cellXZ) { for (int cellXZ = 0; cellXZ < cellSizeXZ; ++cellXZ) {
int z = (firstCellZ + cellXZ) * sizeXZ; int z = (firstCellZ + cellXZ) * sizeXZ;
for (NoiseChunk.NoiseInterpolator noiseInterpolator : this.interpolators) { for (NoiseChunk.NoiseInterpolator noiseInterpolator : this.interpolators) {
if (noiseInterpolator instanceof NoiseInterpolatorMixin ni) { NoiseInterpolatorAccessor interpolator = (NoiseInterpolatorAccessor) noiseInterpolator;
//TODO: 1.18.2 Check this implementation final double[] ds = (primarySlice ? interpolator.be_getSlice0() : interpolator.be_getSlice1())[cellXZ];
final double[] ds = (primarySlice ? ni.be_getSlice0() : ni.be_getSlice1())[cellXZ];
TerrainGenerator.fillTerrainDensity(ds, x, z, sizeXZ, sizeY); TerrainGenerator.fillTerrainDensity(ds, x, z, sizeXZ, sizeY);
} }
} }
} }
} }
}

View file

@ -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;
}
}

View file

@ -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();
}

View file

@ -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();
}

View file

@ -14,6 +14,8 @@ import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.dimension.DimensionType; 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;
import net.minecraft.world.level.storage.LevelStorageSource.LevelStorageAccess; import net.minecraft.world.level.storage.LevelStorageSource.LevelStorageAccess;
import net.minecraft.world.level.storage.ServerLevelData; 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 org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.api.biomes.BiomeAPI;
import ru.betterend.BetterEnd; import ru.betterend.BetterEnd;
import ru.betterend.interfaces.BETargetChecker;
import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndBlocks;
import ru.betterend.world.generator.GeneratorOptions; import ru.betterend.world.generator.GeneratorOptions;
import ru.betterend.world.generator.TerrainGenerator; 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) { 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); ServerLevel level = ServerLevel.class.cast(this);
if (level.dimension() == Level.END) { if (level.dimension() == Level.END) {
if (chunkGenerator instanceof NoiseBasedChunkGenerator) {
Holder<NoiseGeneratorSettings> sHolder = NoiseBasedChunkGeneratorAccessor.class.cast(chunkGenerator).be_getSettings();
BETargetChecker.class.cast(sHolder.value()).be_setTarget(true);
}
TerrainGenerator.initNoise(seed, chunkGenerator.getBiomeSource(), chunkGenerator.climateSampler()); TerrainGenerator.initNoise(seed, chunkGenerator.getBiomeSource(), chunkGenerator.climateSampler());
} }
} }

View file

@ -4,10 +4,12 @@
"package": "ru.betterend.mixin.common", "package": "ru.betterend.mixin.common",
"compatibilityLevel": "JAVA_16", "compatibilityLevel": "JAVA_16",
"mixins": [ "mixins": [
"NoiseBasedChunkGeneratorAccessor",
"NoiseGeneratorSettingsMixin",
"NoiseInterpolatorAccessor",
"ChorusPlantFeatureMixin", "ChorusPlantFeatureMixin",
"PlayerAdvancementsMixin", "PlayerAdvancementsMixin",
"ChorusFlowerBlockMixin", "ChorusFlowerBlockMixin",
"NoiseInterpolatorMixin",
"ChorusPlantBlockMixin", "ChorusPlantBlockMixin",
"EndPodiumFeatureMixin", "EndPodiumFeatureMixin",
"EndDragonFightMixin", "EndDragonFightMixin",