From 60ee68d8d17828a7ff268617f1a3c76b32a12e92 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 9 Dec 2021 11:37:05 +0300 Subject: [PATCH] Map stack --- .../java/ru/bclib/interfaces/BiomeMap.java | 2 +- .../world/generator/BCLibEndBiomeSource.java | 12 ++-- .../generator/BCLibNetherBiomeSource.java | 21 +++++-- .../world/generator/GeneratorOptions.java | 16 ++++-- .../bclib/world/generator/map/MapStack.java | 55 +++++++++++++++++++ .../world/generator/map/hex/HexBiomeMap.java | 2 +- .../generator/map/square/SquareBiomeMap.java | 4 +- 7 files changed, 91 insertions(+), 21 deletions(-) create mode 100644 src/main/java/ru/bclib/world/generator/map/MapStack.java diff --git a/src/main/java/ru/bclib/interfaces/BiomeMap.java b/src/main/java/ru/bclib/interfaces/BiomeMap.java index 89d79521..a30a3f64 100644 --- a/src/main/java/ru/bclib/interfaces/BiomeMap.java +++ b/src/main/java/ru/bclib/interfaces/BiomeMap.java @@ -5,5 +5,5 @@ import ru.bclib.world.biomes.BCLBiome; public interface BiomeMap { void clearCache(); - BCLBiome getBiome(double x, double z); + BCLBiome getBiome(double x, double y, double z); } diff --git a/src/main/java/ru/bclib/world/generator/BCLibEndBiomeSource.java b/src/main/java/ru/bclib/world/generator/BCLibEndBiomeSource.java index bfae3eed..5dc09c50 100644 --- a/src/main/java/ru/bclib/world/generator/BCLibEndBiomeSource.java +++ b/src/main/java/ru/bclib/world/generator/BCLibEndBiomeSource.java @@ -144,7 +144,7 @@ public class BCLibEndBiomeSource extends BiomeSource { public Biome getNoiseBiome(int biomeX, int biomeY, int biomeZ, Climate.Sampler sampler) { long i = (long) biomeX * (long) biomeX; long j = (long) biomeZ * (long) biomeZ; - long check = GeneratorOptions.isFarEndBiomes() ? 65536L : 625L; + long farEndBiomes = GeneratorOptions.getFarEndBiomes(); long dist = i + j; if ((biomeX & 63) == 0 && (biomeZ & 63) == 0) { @@ -153,7 +153,7 @@ public class BCLibEndBiomeSource extends BiomeSource { } if (endLandFunction == null) { - if (dist <= check) return centerBiome; + if (dist <= farEndBiomes) return centerBiome; float height = TheEndBiomeSource.getHeightValue( noise, (biomeX >> 1) + 1, @@ -165,19 +165,19 @@ public class BCLibEndBiomeSource extends BiomeSource { } if (height < -10F) { - return mapVoid.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); + return mapVoid.getBiome(biomeX << 2, biomeY << 2, biomeZ << 2).getActualBiome(); } else { - return mapLand.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); + return mapLand.getBiome(biomeX << 2, biomeY << 2, biomeZ << 2).getActualBiome(); } } else { pos.setLocation(biomeX, biomeZ); if (endLandFunction.apply(pos)) { - return dist <= check ? centerBiome : mapLand.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); + return dist <= farEndBiomes ? centerBiome : mapLand.getBiome(biomeX << 2, biomeY << 2, biomeZ << 2).getActualBiome(); } else { - return dist <= check ? barrens : mapVoid.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); + return dist <= farEndBiomes ? barrens : mapVoid.getBiome(biomeX << 2, biomeY << 2, biomeZ << 2).getActualBiome(); } } } diff --git a/src/main/java/ru/bclib/world/generator/BCLibNetherBiomeSource.java b/src/main/java/ru/bclib/world/generator/BCLibNetherBiomeSource.java index 11625350..ade35ef6 100644 --- a/src/main/java/ru/bclib/world/generator/BCLibNetherBiomeSource.java +++ b/src/main/java/ru/bclib/world/generator/BCLibNetherBiomeSource.java @@ -9,12 +9,14 @@ import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome.BiomeCategory; import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.biome.Climate; +import org.apache.commons.lang3.function.TriFunction; import ru.bclib.BCLib; import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.config.ConfigKeeper.StringArrayEntry; import ru.bclib.config.Configs; import ru.bclib.interfaces.BiomeMap; import ru.bclib.world.biomes.BCLBiome; +import ru.bclib.world.generator.map.MapStack; import ru.bclib.world.generator.map.hex.HexBiomeMap; import ru.bclib.world.generator.map.square.SquareBiomeMap; @@ -32,6 +34,7 @@ public class BCLibNetherBiomeSource extends BiomeSource { private BiomeMap biomeMap; private final long seed; private static boolean forceLegacyGenerator = false; + private static int worldHeight; /** * When true, the older square generator is used for the nether. @@ -44,6 +47,14 @@ public class BCLibNetherBiomeSource extends BiomeSource { forceLegacyGenerator = val; } + /** + * Set world height, used when Nether is larger than vanilla 128 blocks tall. + * @param worldHeight height of the Nether ceiling. + */ + public static void setWorldHeight(int worldHeight) { + BCLibNetherBiomeSource.worldHeight = worldHeight; + } + public BCLibNetherBiomeSource(Registry biomeRegistry, long seed) { super(getBiomes(biomeRegistry)); @@ -73,11 +84,13 @@ public class BCLibNetherBiomeSource extends BiomeSource { BiomeAPI.NETHER_BIOME_PICKER.getBiomes().forEach(biome -> biome.updateActualBiomes(biomeRegistry)); BiomeAPI.NETHER_BIOME_PICKER.rebuild(); - if (GeneratorOptions.useOldBiomeGenerator() || forceLegacyGenerator) { - this.biomeMap = new SquareBiomeMap(seed, GeneratorOptions.getBiomeSizeNether(), BiomeAPI.NETHER_BIOME_PICKER); + boolean useLegacy = GeneratorOptions.useOldBiomeGenerator() || forceLegacyGenerator; + TriFunction mapConstructor = useLegacy ? SquareBiomeMap::new : HexBiomeMap::new; + if (worldHeight > 128) { + this.biomeMap = new MapStack(seed, GeneratorOptions.getBiomeSizeNether(), BiomeAPI.NETHER_BIOME_PICKER, 86, worldHeight, mapConstructor); } else { - this.biomeMap = new HexBiomeMap(seed, GeneratorOptions.getBiomeSizeNether(), BiomeAPI.NETHER_BIOME_PICKER); + this.biomeMap = mapConstructor.apply(seed, GeneratorOptions.getBiomeSizeNether(), BiomeAPI.NETHER_BIOME_PICKER); } this.biomeRegistry = biomeRegistry; @@ -114,7 +127,7 @@ public class BCLibNetherBiomeSource extends BiomeSource { if ((biomeX & 63) == 0 && (biomeZ & 63) == 0) { biomeMap.clearCache(); } - return biomeMap.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); + return biomeMap.getBiome(biomeX << 2, biomeY << 2, biomeZ << 2).getActualBiome(); } @Override diff --git a/src/main/java/ru/bclib/world/generator/GeneratorOptions.java b/src/main/java/ru/bclib/world/generator/GeneratorOptions.java index 8cdf8911..bf79b60e 100644 --- a/src/main/java/ru/bclib/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/bclib/world/generator/GeneratorOptions.java @@ -11,12 +11,12 @@ public class GeneratorOptions { private static int biomeSizeEndLand; private static int biomeSizeEndVoid; private static Function endLandFunction; - private static boolean farEndBiomes = true; private static boolean customNetherBiomeSource = true; private static boolean customEndBiomeSource = true; private static boolean addNetherBiomesByCategory = false; private static boolean addEndBiomesByCategory = false; - private static boolean useOldBiomeGenerator = false; + private static boolean useOldBiomeGenerator = false; + private static long farEndBiomesSqr = 1000000; public static void init() { biomeSizeNether = Configs.GENERATOR_CONFIG.getInt("nether.biomeMap", "biomeSize", 256); @@ -49,12 +49,16 @@ public class GeneratorOptions { return endLandFunction; } - public static boolean isFarEndBiomes() { - return farEndBiomes; + public static long getFarEndBiomes() { + return farEndBiomesSqr; } - public static void setFarEndBiomes(boolean farEndBiomes) { - GeneratorOptions.farEndBiomes = farEndBiomes; + /** + * Set distance of far End biomes generation, in blocks + * @param distance + */ + public static void setFarEndBiomes(int distance) { + GeneratorOptions.farEndBiomesSqr = (long) distance * (long) distance; } public static boolean customNetherBiomeSource() { diff --git a/src/main/java/ru/bclib/world/generator/map/MapStack.java b/src/main/java/ru/bclib/world/generator/map/MapStack.java new file mode 100644 index 00000000..48dd7472 --- /dev/null +++ b/src/main/java/ru/bclib/world/generator/map/MapStack.java @@ -0,0 +1,55 @@ +package ru.bclib.world.generator.map; + +import net.minecraft.util.Mth; +import org.apache.commons.lang3.function.TriFunction; +import ru.bclib.interfaces.BiomeMap; +import ru.bclib.noise.OpenSimplexNoise; +import ru.bclib.world.biomes.BCLBiome; +import ru.bclib.world.generator.BiomePicker; + +import java.util.Random; + +public class MapStack implements BiomeMap { + private final OpenSimplexNoise noise; + private final BiomeMap[] maps; + private final int worldHeight; + private final int minValue; + private final int maxValue; + + public MapStack(long seed, int size, BiomePicker picker, int mapHeight, int worldHeight, TriFunction mapConstructor) { + final int mapCount = Mth.ceil((float) worldHeight / mapHeight); + this.worldHeight = worldHeight; + minValue = Mth.floor(mapHeight * 0.5F + 0.5F); + maxValue = Mth.floor(worldHeight - mapHeight * 0.5F + 0.5F); + maps = new BiomeMap[mapCount]; + Random random = new Random(seed); + for (int i = 0; i < mapCount; i++) { + maps[i] = mapConstructor.apply(random.nextLong(), size, picker); + } + noise = new OpenSimplexNoise(random.nextInt()); + } + + @Override + public void clearCache() { + for (BiomeMap map: maps) { + map.clearCache(); + } + } + + @Override + public BCLBiome getBiome(double x, double y, double z) { + int mapIndex; + + if (y < minValue) { + mapIndex = 0; + } + else if (y > maxValue) { + mapIndex = maps.length - 1; + } + else { + mapIndex = Mth.floor((y + noise.eval(x * 0.03, z * 0.03) * 8) / worldHeight * maps.length + 0.5F); + } + + return maps[mapIndex].getBiome(x, y, z); + } +} diff --git a/src/main/java/ru/bclib/world/generator/map/hex/HexBiomeMap.java b/src/main/java/ru/bclib/world/generator/map/hex/HexBiomeMap.java index c082b051..216663e4 100644 --- a/src/main/java/ru/bclib/world/generator/map/hex/HexBiomeMap.java +++ b/src/main/java/ru/bclib/world/generator/map/hex/HexBiomeMap.java @@ -47,7 +47,7 @@ public class HexBiomeMap implements BiomeMap { } @Override - public BCLBiome getBiome(double x, double z) { + public BCLBiome getBiome(double x, double y, double z) { BCLBiome biome = getRawBiome(x, z); BCLBiome edge = biome.getEdge(); float offset = biome.getEdgeSize(); diff --git a/src/main/java/ru/bclib/world/generator/map/square/SquareBiomeMap.java b/src/main/java/ru/bclib/world/generator/map/square/SquareBiomeMap.java index d5322705..5441c8aa 100644 --- a/src/main/java/ru/bclib/world/generator/map/square/SquareBiomeMap.java +++ b/src/main/java/ru/bclib/world/generator/map/square/SquareBiomeMap.java @@ -19,7 +19,6 @@ public class SquareBiomeMap implements BiomeMap { private final WorldgenRandom random; private final BiomePicker picker; - private final long seed; private final int sizeXZ; private final int depth; private final int size; @@ -33,7 +32,6 @@ public class SquareBiomeMap implements BiomeMap { depth = (int) Math.ceil(Math.log(size) / Math.log(2)) - 2; this.size = 1 << depth; this.picker = picker; - this.seed = seed; } @Override @@ -44,7 +42,7 @@ public class SquareBiomeMap implements BiomeMap { } @Override - public BCLBiome getBiome(double x, double z) { + public BCLBiome getBiome(double x, double y, double z) { BCLBiome biome = getRawBiome(x, z); if (biome.getEdge() != null || (biome.getParentBiome() != null && biome.getParentBiome().getEdge() != null)) {