Make sure we do not force our TerrainBuilder when BCLEndBiomeSource is not in use!
This commit is contained in:
parent
a5ea5f5989
commit
4003fb98bc
3 changed files with 86 additions and 53 deletions
|
@ -61,22 +61,7 @@ public class NoiseChunkMixin implements BETargetChecker {
|
||||||
NoiseChunkAccessor accessor = (NoiseChunkAccessor) this;
|
NoiseChunkAccessor accessor = (NoiseChunkAccessor) this;
|
||||||
NoiseSettings noiseSettings = accessor.bnv_getNoiseSettings();
|
NoiseSettings noiseSettings = accessor.bnv_getNoiseSettings();
|
||||||
|
|
||||||
final int sizeY = noiseSettings.getCellHeight();
|
TerrainGenerator.fillSlice(primarySlice, x, interpolators, accessor, noiseSettings);
|
||||||
final int sizeXZ = noiseSettings.getCellWidth();
|
|
||||||
final int cellSizeXZ = accessor.bnv_getCellCountXZ() + 1;
|
|
||||||
final int firstCellZ = accessor.bnv_getFirstCellZ();
|
|
||||||
|
|
||||||
x *= sizeXZ;
|
|
||||||
for (int cellXZ = 0; cellXZ < cellSizeXZ; ++cellXZ) {
|
|
||||||
int z = (firstCellZ + cellXZ) * sizeXZ;
|
|
||||||
for (NoiseChunk.NoiseInterpolator noiseInterpolator : this.interpolators) {
|
|
||||||
if (noiseInterpolator instanceof NoiseInterpolatorAccessor interpolator) {
|
|
||||||
final double[] ds = (primarySlice
|
|
||||||
? interpolator.be_getSlice0()
|
|
||||||
: interpolator.be_getSlice1())[cellXZ];
|
|
||||||
TerrainGenerator.fillTerrainDensity(ds, x, z, sizeXZ, sizeY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,6 @@ package org.betterx.betterend.mixin.common;
|
||||||
|
|
||||||
import org.betterx.bclib.api.v2.levelgen.biomes.BiomeAPI;
|
import org.betterx.bclib.api.v2.levelgen.biomes.BiomeAPI;
|
||||||
import org.betterx.betterend.BetterEnd;
|
import org.betterx.betterend.BetterEnd;
|
||||||
import org.betterx.betterend.interfaces.BETargetChecker;
|
|
||||||
import org.betterx.betterend.registry.EndBlocks;
|
import org.betterx.betterend.registry.EndBlocks;
|
||||||
import org.betterx.betterend.world.generator.GeneratorOptions;
|
import org.betterx.betterend.world.generator.GeneratorOptions;
|
||||||
import org.betterx.betterend.world.generator.TerrainGenerator;
|
import org.betterx.betterend.world.generator.TerrainGenerator;
|
||||||
|
@ -18,12 +17,9 @@ import net.minecraft.util.profiling.ProfilerFiller;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.block.Blocks;
|
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.dimension.BuiltinDimensionTypes;
|
import net.minecraft.world.level.dimension.BuiltinDimensionTypes;
|
||||||
import net.minecraft.world.level.dimension.DimensionType;
|
import net.minecraft.world.level.dimension.DimensionType;
|
||||||
import net.minecraft.world.level.dimension.LevelStem;
|
import net.minecraft.world.level.dimension.LevelStem;
|
||||||
import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator;
|
|
||||||
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
|
|
||||||
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;
|
||||||
import net.minecraft.world.level.storage.WritableLevelData;
|
import net.minecraft.world.level.storage.WritableLevelData;
|
||||||
|
@ -83,41 +79,13 @@ public abstract class ServerLevelMixin extends Level {
|
||||||
boolean bl2,
|
boolean bl2,
|
||||||
CallbackInfo ci
|
CallbackInfo ci
|
||||||
) {
|
) {
|
||||||
ServerLevel level = ServerLevel.class.cast(this);
|
TerrainGenerator.onServerLevelInit(ServerLevel.class.cast(this), levelStem, seed);
|
||||||
if (level.dimension() == Level.END) {
|
|
||||||
final ChunkGenerator chunkGenerator = levelStem.generator();
|
|
||||||
if (chunkGenerator instanceof NoiseBasedChunkGenerator) {
|
|
||||||
Holder<NoiseGeneratorSettings> sHolder = ((NoiseBasedChunkGeneratorAccessor) chunkGenerator)
|
|
||||||
.be_getSettings();
|
|
||||||
BETargetChecker.class.cast(sHolder.value()).be_setTarget(true);
|
|
||||||
|
|
||||||
}
|
|
||||||
TerrainGenerator.initNoise(
|
|
||||||
seed,
|
|
||||||
chunkGenerator.getBiomeSource(),
|
|
||||||
level.getChunkSource().randomState().sampler()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Inject(method = "makeObsidianPlatform", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "makeObsidianPlatform", at = @At("HEAD"), cancellable = true)
|
||||||
private static void be_createObsidianPlatform(ServerLevel serverLevel, CallbackInfo info) {
|
private static void be_createObsidianPlatform(ServerLevel serverLevel, CallbackInfo info) {
|
||||||
if (!GeneratorOptions.generateObsidianPlatform()) {
|
TerrainGenerator.makeObsidianPlatform(serverLevel, info);
|
||||||
info.cancel();
|
|
||||||
} else if (GeneratorOptions.changeSpawn()) {
|
|
||||||
BlockPos blockPos = GeneratorOptions.getSpawn();
|
|
||||||
int i = blockPos.getX();
|
|
||||||
int j = blockPos.getY() - 2;
|
|
||||||
int k = blockPos.getZ();
|
|
||||||
BlockPos.betweenClosed(i - 2, j + 1, k - 2, i + 2, j + 3, k + 2).forEach((blockPosx) -> {
|
|
||||||
serverLevel.setBlockAndUpdate(blockPosx, Blocks.AIR.defaultBlockState());
|
|
||||||
});
|
|
||||||
BlockPos.betweenClosed(i - 2, j, k - 2, i + 2, j, k + 2).forEach((blockPosx) -> {
|
|
||||||
serverLevel.setBlockAndUpdate(blockPosx, Blocks.OBSIDIAN.defaultBlockState());
|
|
||||||
});
|
|
||||||
info.cancel();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ModifyArg(method = "tickChunk", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z"))
|
@ModifyArg(method = "tickChunk", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z"))
|
||||||
|
|
|
@ -1,18 +1,33 @@
|
||||||
package org.betterx.betterend.world.generator;
|
package org.betterx.betterend.world.generator;
|
||||||
|
|
||||||
|
import org.betterx.bclib.api.v2.generator.BCLibEndBiomeSource;
|
||||||
|
import org.betterx.bclib.api.v2.levelgen.LevelGenUtil;
|
||||||
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiome;
|
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiome;
|
||||||
import org.betterx.bclib.api.v2.levelgen.biomes.BiomeAPI;
|
import org.betterx.bclib.api.v2.levelgen.biomes.BiomeAPI;
|
||||||
|
import org.betterx.bclib.presets.worldgen.BCLWorldPresetSettings;
|
||||||
import org.betterx.bclib.util.MHelper;
|
import org.betterx.bclib.util.MHelper;
|
||||||
|
import org.betterx.betterend.interfaces.BETargetChecker;
|
||||||
|
import org.betterx.betterend.mixin.common.NoiseBasedChunkGeneratorAccessor;
|
||||||
|
import org.betterx.betterend.mixin.common.NoiseChunkAccessor;
|
||||||
|
import org.betterx.betterend.mixin.common.NoiseInterpolatorAccessor;
|
||||||
import org.betterx.betterend.noise.OpenSimplexNoise;
|
import org.betterx.betterend.noise.OpenSimplexNoise;
|
||||||
|
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.core.Holder;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.util.Mth;
|
import net.minecraft.util.Mth;
|
||||||
import net.minecraft.util.RandomSource;
|
import net.minecraft.util.RandomSource;
|
||||||
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.biome.BiomeSource;
|
import net.minecraft.world.level.biome.BiomeSource;
|
||||||
import net.minecraft.world.level.biome.Climate.Sampler;
|
import net.minecraft.world.level.biome.Climate.Sampler;
|
||||||
import net.minecraft.world.level.levelgen.LegacyRandomSource;
|
import net.minecraft.world.level.block.Blocks;
|
||||||
|
import net.minecraft.world.level.chunk.ChunkGenerator;
|
||||||
|
import net.minecraft.world.level.dimension.LevelStem;
|
||||||
|
import net.minecraft.world.level.levelgen.*;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -48,7 +63,7 @@ public class TerrainGenerator {
|
||||||
TerrainGenerator.sampler = sampler;
|
TerrainGenerator.sampler = sampler;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void fillTerrainDensity(double[] buffer, int posX, int posZ, int scaleXZ, int scaleY) {
|
public static void fillTerrainDensity(double[] buffer, int posX, int posZ, int scaleXZ, int scaleY, int maxHeight) {
|
||||||
LOCKER.lock();
|
LOCKER.lock();
|
||||||
|
|
||||||
largeIslands.clearCache();
|
largeIslands.clearCache();
|
||||||
|
@ -195,4 +210,69 @@ public class TerrainGenerator {
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void onServerLevelInit(ServerLevel level, LevelStem levelStem, long seed) {
|
||||||
|
if (level.dimension() == Level.END) {
|
||||||
|
final ChunkGenerator chunkGenerator = levelStem.generator();
|
||||||
|
if (chunkGenerator instanceof NoiseBasedChunkGenerator) {
|
||||||
|
Holder<NoiseGeneratorSettings> sHolder = ((NoiseBasedChunkGeneratorAccessor) chunkGenerator)
|
||||||
|
.be_getSettings();
|
||||||
|
if (LevelGenUtil.getWorldSettings() instanceof BCLWorldPresetSettings bset) {
|
||||||
|
if (bset.endVersion != BCLibEndBiomeSource.BIOME_SOURCE_VERSION_VANILLA) {
|
||||||
|
BETargetChecker.class.cast(sHolder.value()).be_setTarget(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
initNoise(
|
||||||
|
seed,
|
||||||
|
chunkGenerator.getBiomeSource(),
|
||||||
|
level.getChunkSource().randomState().sampler()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void makeObsidianPlatform(ServerLevel serverLevel, CallbackInfo info) {
|
||||||
|
if (!GeneratorOptions.generateObsidianPlatform()) {
|
||||||
|
info.cancel();
|
||||||
|
} else if (GeneratorOptions.changeSpawn()) {
|
||||||
|
BlockPos blockPos = GeneratorOptions.getSpawn();
|
||||||
|
int i = blockPos.getX();
|
||||||
|
int j = blockPos.getY() - 2;
|
||||||
|
int k = blockPos.getZ();
|
||||||
|
BlockPos.betweenClosed(i - 2, j + 1, k - 2, i + 2, j + 3, k + 2).forEach((blockPosx) -> {
|
||||||
|
serverLevel.setBlockAndUpdate(blockPosx, Blocks.AIR.defaultBlockState());
|
||||||
|
});
|
||||||
|
BlockPos.betweenClosed(i - 2, j, k - 2, i + 2, j, k + 2).forEach((blockPosx) -> {
|
||||||
|
serverLevel.setBlockAndUpdate(blockPosx, Blocks.OBSIDIAN.defaultBlockState());
|
||||||
|
});
|
||||||
|
info.cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void fillSlice(
|
||||||
|
boolean primarySlice,
|
||||||
|
int x,
|
||||||
|
List<NoiseChunk.NoiseInterpolator> interpolators,
|
||||||
|
NoiseChunkAccessor accessor,
|
||||||
|
NoiseSettings noiseSettings
|
||||||
|
) {
|
||||||
|
final int sizeY = noiseSettings.getCellHeight();
|
||||||
|
final int sizeXZ = noiseSettings.getCellWidth();
|
||||||
|
final int cellSizeXZ = accessor.bnv_getCellCountXZ() + 1;
|
||||||
|
final int firstCellZ = accessor.bnv_getFirstCellZ();
|
||||||
|
|
||||||
|
x *= sizeXZ;
|
||||||
|
for (int cellXZ = 0; cellXZ < cellSizeXZ; ++cellXZ) {
|
||||||
|
int z = (firstCellZ + cellXZ) * sizeXZ;
|
||||||
|
for (NoiseChunk.NoiseInterpolator noiseInterpolator : interpolators) {
|
||||||
|
if (noiseInterpolator instanceof NoiseInterpolatorAccessor interpolator) {
|
||||||
|
final double[] ds = (primarySlice
|
||||||
|
? interpolator.be_getSlice0()
|
||||||
|
: interpolator.be_getSlice1())[cellXZ];
|
||||||
|
fillTerrainDensity(ds, x, z, sizeXZ, sizeY, noiseSettings.height());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue