From 801f9e5a746c39ca64b35ef36675ebbd7dc11a58 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 1 Dec 2021 15:43:04 +0300 Subject: [PATCH] Possibility to change biome generator --- .../java/ru/bclib/interfaces/BiomeMap.java | 9 ++ .../world/generator/BCLibEndBiomeSource.java | 17 ++- .../generator/BCLibNetherBiomeSource.java | 12 +- .../world/generator/GeneratorOptions.java | 6 + .../world/generator/map/hex/HexBiomeMap.java | 5 +- .../map/square/SquareBiomeChunk.java | 3 +- .../generator/map/square/SquareBiomeMap.java | 108 +++++++++--------- 7 files changed, 96 insertions(+), 64 deletions(-) create mode 100644 src/main/java/ru/bclib/interfaces/BiomeMap.java diff --git a/src/main/java/ru/bclib/interfaces/BiomeMap.java b/src/main/java/ru/bclib/interfaces/BiomeMap.java new file mode 100644 index 00000000..89d79521 --- /dev/null +++ b/src/main/java/ru/bclib/interfaces/BiomeMap.java @@ -0,0 +1,9 @@ +package ru.bclib.interfaces; + +import ru.bclib.world.biomes.BCLBiome; + +public interface BiomeMap { + void clearCache(); + + BCLBiome getBiome(double x, 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 d100eb3a..1fb41e50 100644 --- a/src/main/java/ru/bclib/world/generator/BCLibEndBiomeSource.java +++ b/src/main/java/ru/bclib/world/generator/BCLibEndBiomeSource.java @@ -18,9 +18,11 @@ 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.noise.OpenSimplexNoise; import ru.bclib.world.biomes.BCLBiome; import ru.bclib.world.generator.map.hex.HexBiomeMap; +import ru.bclib.world.generator.map.square.SquareBiomeMap; import java.awt.Point; import java.util.List; @@ -40,8 +42,8 @@ public class BCLibEndBiomeSource extends BiomeSource { private final SimplexNoise noise; private final Biome centerBiome; private final Biome barrens; - private HexBiomeMap mapLand; - private HexBiomeMap mapVoid; + private BiomeMap mapLand; + private BiomeMap mapVoid; private final long seed; private final Point pos; @@ -75,8 +77,15 @@ public class BCLibEndBiomeSource extends BiomeSource { BiomeAPI.END_LAND_BIOME_PICKER.rebuild(); BiomeAPI.END_VOID_BIOME_PICKER.rebuild(); - this.mapLand = new HexBiomeMap(seed, GeneratorOptions.getBiomeSizeEndLand(), BiomeAPI.END_LAND_BIOME_PICKER); - this.mapVoid = new HexBiomeMap(seed, GeneratorOptions.getBiomeSizeEndVoid(), BiomeAPI.END_VOID_BIOME_PICKER); + if (GeneratorOptions.useOldBiomeGenerator()) { + this.mapLand = new SquareBiomeMap(seed, GeneratorOptions.getBiomeSizeEndLand(), BiomeAPI.END_LAND_BIOME_PICKER); + this.mapVoid = new SquareBiomeMap(seed, GeneratorOptions.getBiomeSizeEndVoid(), BiomeAPI.END_VOID_BIOME_PICKER); + } + else { + this.mapLand = new HexBiomeMap(seed, GeneratorOptions.getBiomeSizeEndLand(), BiomeAPI.END_LAND_BIOME_PICKER); + this.mapVoid = new HexBiomeMap(seed, GeneratorOptions.getBiomeSizeEndVoid(), BiomeAPI.END_VOID_BIOME_PICKER); + } + this.centerBiome = biomeRegistry.getOrThrow(Biomes.THE_END); this.barrens = biomeRegistry.getOrThrow(Biomes.END_BARRENS); this.biomeRegistry = biomeRegistry; diff --git a/src/main/java/ru/bclib/world/generator/BCLibNetherBiomeSource.java b/src/main/java/ru/bclib/world/generator/BCLibNetherBiomeSource.java index 5b8361f9..ad1f157a 100644 --- a/src/main/java/ru/bclib/world/generator/BCLibNetherBiomeSource.java +++ b/src/main/java/ru/bclib/world/generator/BCLibNetherBiomeSource.java @@ -13,8 +13,10 @@ 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.hex.HexBiomeMap; +import ru.bclib.world.generator.map.square.SquareBiomeMap; import java.util.LinkedList; import java.util.List; @@ -29,7 +31,7 @@ public class BCLibNetherBiomeSource extends BiomeSource { })).apply(instance, instance.stable(BCLibNetherBiomeSource::new)); }); private final Registry biomeRegistry; - private HexBiomeMap biomeMap; + private BiomeMap biomeMap; private final long seed; @Deprecated(forRemoval = true) @@ -60,7 +62,13 @@ public class BCLibNetherBiomeSource extends BiomeSource { BiomeAPI.NETHER_BIOME_PICKER.getBiomes().forEach(biome -> biome.updateActualBiomes(biomeRegistry)); BiomeAPI.NETHER_BIOME_PICKER.rebuild(); - this.biomeMap = new HexBiomeMap(seed, GeneratorOptions.getBiomeSizeNether(), BiomeAPI.NETHER_BIOME_PICKER); + if (GeneratorOptions.useOldBiomeGenerator()) { + this.biomeMap = new SquareBiomeMap(seed, GeneratorOptions.getBiomeSizeNether(), BiomeAPI.NETHER_BIOME_PICKER); + } + else { + this.biomeMap = new HexBiomeMap(seed, GeneratorOptions.getBiomeSizeNether(), BiomeAPI.NETHER_BIOME_PICKER); + } + this.biomeRegistry = biomeRegistry; this.seed = seed; diff --git a/src/main/java/ru/bclib/world/generator/GeneratorOptions.java b/src/main/java/ru/bclib/world/generator/GeneratorOptions.java index af5c084d..76032ab9 100644 --- a/src/main/java/ru/bclib/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/bclib/world/generator/GeneratorOptions.java @@ -16,6 +16,7 @@ public class GeneratorOptions { private static boolean customEndBiomeSource = true; private static boolean addNetherBiomesByCategory = false; private static boolean addEndBiomesByCategory = false; + private static boolean useOldBiomeGenerator = false; public static void init() { biomeSizeNether = Configs.GENERATOR_CONFIG.getInt("nether.biomeMap", "biomeSize", 256); @@ -25,6 +26,7 @@ public class GeneratorOptions { customEndBiomeSource = Configs.GENERATOR_CONFIG.getBoolean("options", "customEndBiomeSource", true); addNetherBiomesByCategory = Configs.GENERATOR_CONFIG.getBoolean("options", "addNetherBiomesByCategory", false); addEndBiomesByCategory = Configs.GENERATOR_CONFIG.getBoolean("options", "addEndBiomesByCategory", false); + useOldBiomeGenerator = Configs.GENERATOR_CONFIG.getBoolean("options", "useOldBiomeGenerator", false); } public static int getBiomeSizeNether() { @@ -70,4 +72,8 @@ public class GeneratorOptions { public static boolean addEndBiomesByCategory() { return addEndBiomesByCategory; } + + public static boolean useOldBiomeGenerator() { + return useOldBiomeGenerator; + } } 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 0eafcad3..704a3c89 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 @@ -1,5 +1,6 @@ package ru.bclib.world.generator.map.hex; +import ru.bclib.interfaces.BiomeMap; import ru.bclib.noise.OpenSimplexNoise; import ru.bclib.util.MHelper; import ru.bclib.world.biomes.BCLBiome; @@ -9,7 +10,7 @@ import java.awt.Point; import java.util.HashMap; import java.util.Random; -public class HexBiomeMap { +public class HexBiomeMap implements BiomeMap { private static final float RAD_INNER = (float) Math.sqrt(3.0) * 0.5F; private static final float COEF = 0.25F * (float) Math.sqrt(3.0); private static final float COEF_HALF = COEF * 0.5F; @@ -38,12 +39,14 @@ public class HexBiomeMap { this.seed = (int) (seed & 0xFFFFFFFF); } + @Override public void clearCache() { if (chunks.size() > 127) { chunks.clear(); } } + @Override public BCLBiome getBiome(double x, double z) { BCLBiome BCLBiome = getRawBiome(x, z); if (BCLBiome.getEdge() != null) { diff --git a/src/main/java/ru/bclib/world/generator/map/square/SquareBiomeChunk.java b/src/main/java/ru/bclib/world/generator/map/square/SquareBiomeChunk.java index 9b057ffd..c4d366b6 100644 --- a/src/main/java/ru/bclib/world/generator/map/square/SquareBiomeChunk.java +++ b/src/main/java/ru/bclib/world/generator/map/square/SquareBiomeChunk.java @@ -5,7 +5,6 @@ import ru.bclib.world.generator.BiomePicker; import java.util.Random; -@Deprecated public class SquareBiomeChunk { private static final int BIT_OFFSET = 4; protected static final int WIDTH = 1 << BIT_OFFSET; @@ -19,7 +18,7 @@ public class SquareBiomeChunk { private final BCLBiome[] biomes; - public SquareBiomeChunk(SquareBiomeMap map, Random random, BiomePicker picker) { + public SquareBiomeChunk(Random random, BiomePicker picker) { BCLBiome[] PreBio = new BCLBiome[SM_CAPACITY]; biomes = new BCLBiome[CAPACITY]; 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 022366c4..6c523db8 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 @@ -4,6 +4,7 @@ import com.google.common.collect.Maps; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.levelgen.LegacyRandomSource; import net.minecraft.world.level.levelgen.WorldgenRandom; +import ru.bclib.interfaces.BiomeMap; import ru.bclib.noise.OpenSimplexNoise; import ru.bclib.util.MHelper; import ru.bclib.world.biomes.BCLBiome; @@ -11,24 +12,23 @@ import ru.bclib.world.generator.BiomePicker; import java.util.Map; -@Deprecated -public class SquareBiomeMap { - private final WorldgenRandom RANDOM; - +public class SquareBiomeMap implements BiomeMap { private final Map maps = Maps.newHashMap(); - private final int size; - private final int sizeXZ; - private final int depth; private final OpenSimplexNoise noiseX; private final OpenSimplexNoise noiseZ; + private final WorldgenRandom random; private final BiomePicker picker; + private final long seed; + private final int sizeXZ; + private final int depth; + private final int size; public SquareBiomeMap(long seed, int size, BiomePicker picker) { maps.clear(); - RANDOM = new WorldgenRandom(new LegacyRandomSource(seed)); - noiseX = new OpenSimplexNoise(RANDOM.nextLong()); - noiseZ = new OpenSimplexNoise(RANDOM.nextLong()); + random = new WorldgenRandom(new LegacyRandomSource(seed)); + noiseX = new OpenSimplexNoise(random.nextLong()); + noiseZ = new OpenSimplexNoise(random.nextLong()); this.sizeXZ = size; depth = (int) Math.ceil(Math.log(size) / Math.log(2)) - 2; this.size = 1 << depth; @@ -36,57 +36,15 @@ public class SquareBiomeMap { this.seed = seed; } - public long getSeed() { - return seed; - } - + @Override public void clearCache() { if (maps.size() > 32) { maps.clear(); } } - private BCLBiome getRawBiome(int bx, int bz) { - double x = (double) bx * size / sizeXZ; - double z = (double) bz * size / sizeXZ; - double nx = x; - double nz = z; - - double px = bx * 0.2; - double pz = bz * 0.2; - - for (int i = 0; i < depth; i++) { - nx = (x + noiseX.eval(px, pz)) / 2F; - nz = (z + noiseZ.eval(px, pz)) / 2F; - - x = nx; - z = nz; - - px = px / 2 + i; - pz = pz / 2 + i; - } - - bx = MHelper.floor(x); - bz = MHelper.floor(z); - if ((bx & SquareBiomeChunk.MASK_WIDTH) == SquareBiomeChunk.MASK_WIDTH) { - x += (bz / 2) & 1; - } - if ((bz & SquareBiomeChunk.MASK_WIDTH) == SquareBiomeChunk.MASK_WIDTH) { - z += (bx / 2) & 1; - } - - ChunkPos cpos = new ChunkPos(MHelper.floor(x / SquareBiomeChunk.WIDTH), MHelper.floor(z / SquareBiomeChunk.WIDTH)); - SquareBiomeChunk chunk = maps.get(cpos); - if (chunk == null) { - RANDOM.setLargeFeatureWithSalt(0, cpos.x, cpos.z, 0); - chunk = new SquareBiomeChunk(this, RANDOM, picker); - maps.put(cpos, chunk); - } - - return chunk.getBiome(MHelper.floor(x), MHelper.floor(z)); - } - - public BCLBiome getBiome(int x, int z) { + @Override + public BCLBiome getBiome(double x, double z) { BCLBiome biome = getRawBiome(x, z); if (biome.getEdge() != null || (biome.getParentBiome() != null && biome.getParentBiome().getEdge() != null)) { @@ -112,4 +70,44 @@ public class SquareBiomeMap { return biome; } + + private BCLBiome getRawBiome(double bx, double bz) { + double x = bx * size / sizeXZ; + double z = bz * size / sizeXZ; + double nx = x; + double nz = z; + + double px = bx * 0.2; + double pz = bz * 0.2; + + for (int i = 0; i < depth; i++) { + nx = (x + noiseX.eval(px, pz)) / 2F; + nz = (z + noiseZ.eval(px, pz)) / 2F; + + x = nx; + z = nz; + + px = px / 2 + i; + pz = pz / 2 + i; + } + + int ix = MHelper.floor(x); + int iz = MHelper.floor(z); + if ((ix & SquareBiomeChunk.MASK_WIDTH) == SquareBiomeChunk.MASK_WIDTH) { + x += (iz / 2) & 1; + } + if ((iz & SquareBiomeChunk.MASK_WIDTH) == SquareBiomeChunk.MASK_WIDTH) { + z += (ix / 2) & 1; + } + + ChunkPos cpos = new ChunkPos(MHelper.floor(x / SquareBiomeChunk.WIDTH), MHelper.floor(z / SquareBiomeChunk.WIDTH)); + SquareBiomeChunk chunk = maps.get(cpos); + if (chunk == null) { + random.setLargeFeatureWithSalt(0, cpos.x, cpos.z, 0); + chunk = new SquareBiomeChunk(random, picker); + maps.put(cpos, chunk); + } + + return chunk.getBiome(MHelper.floor(x), MHelper.floor(z)); + } }