Working terrain generator
This commit is contained in:
parent
f59cf8bad2
commit
b0da1d244a
10 changed files with 79 additions and 53 deletions
|
@ -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.+
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
package ru.betterend.interfaces;
|
||||
|
||||
public interface BETargetChecker {
|
||||
boolean be_isTarget();
|
||||
void be_setTarget(boolean target);
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
package ru.betterend.interfaces;
|
||||
|
||||
public interface TargetChecker {
|
||||
boolean be_isTarget();
|
||||
}
|
|
@ -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();
|
||||
}
|
|
@ -10,24 +10,19 @@ 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<NoiseGeneratorSettings> resourceKey) {
|
||||
return Objects.equals(gen, BuiltinRegistries.NOISE_GENERATOR_SETTINGS.get(resourceKey));
|
||||
}
|
||||
|
||||
@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) {
|
||||
//be_isEndGenerator = noiseGeneratorSettings.is(NoiseGeneratorSettings.END);
|
||||
be_isEndGenerator = be_is(noiseGeneratorSettings, NoiseGeneratorSettings.END);
|
||||
be_isEndGenerator = BETargetChecker.class.cast(noiseGeneratorSettings).be_isTarget();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -35,13 +30,16 @@ public class NoiseChunkMixin implements TargetChecker {
|
|||
return be_isEndGenerator;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void be_setTarget(boolean target) {
|
||||
be_isEndGenerator = target;
|
||||
}
|
||||
|
||||
@Shadow @Final private List<NoiseChunk.NoiseInterpolator> 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();
|
||||
|
||||
|
@ -50,22 +48,17 @@ 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];
|
||||
NoiseInterpolatorAccessor interpolator = (NoiseInterpolatorAccessor) noiseInterpolator;
|
||||
final double[] ds = (primarySlice ? interpolator.be_getSlice0() : interpolator.be_getSlice1())[cellXZ];
|
||||
TerrainGenerator.fillTerrainDensity(ds, x, z, sizeXZ, sizeY);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
|
@ -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();
|
||||
}
|
|
@ -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<NoiseGeneratorSettings> sHolder = NoiseBasedChunkGeneratorAccessor.class.cast(chunkGenerator).be_getSettings();
|
||||
BETargetChecker.class.cast(sHolder.value()).be_setTarget(true);
|
||||
|
||||
}
|
||||
TerrainGenerator.initNoise(seed, chunkGenerator.getBiomeSource(), chunkGenerator.climateSampler());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,10 +4,12 @@
|
|||
"package": "ru.betterend.mixin.common",
|
||||
"compatibilityLevel": "JAVA_16",
|
||||
"mixins": [
|
||||
"NoiseBasedChunkGeneratorAccessor",
|
||||
"NoiseGeneratorSettingsMixin",
|
||||
"NoiseInterpolatorAccessor",
|
||||
"ChorusPlantFeatureMixin",
|
||||
"PlayerAdvancementsMixin",
|
||||
"ChorusFlowerBlockMixin",
|
||||
"NoiseInterpolatorMixin",
|
||||
"ChorusPlantBlockMixin",
|
||||
"EndPodiumFeatureMixin",
|
||||
"EndDragonFightMixin",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue