From 558bd7d3266b77dada7240b899ad6aafa8ce1120 Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 17 May 2022 20:17:19 +0200 Subject: [PATCH] Cave related changes --- .../java/ru/bclib/api/biomes/BiomeAPI.java | 77 ++++++++++--------- .../world/generator/BCLibEndBiomeSource.java | 5 +- .../ru/bclib/world/generator/BiomePicker.java | 2 +- 3 files changed, 46 insertions(+), 38 deletions(-) diff --git a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java index 58feb4f9..731b0ef5 100644 --- a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java @@ -81,7 +81,31 @@ import java.util.stream.Collectors; import java.util.stream.Stream; public class BiomeAPI { - enum Dimension {OVERWORLD, NETHER, END_LAND, END_VOID, UNDEFINED}; + public static class Dimension { + public static final Dimension NONE = new Dimension(); + public static final Dimension OVERWORLD = new Dimension(); + public static final Dimension NETHER = new Dimension(); + public static final Dimension END = new Dimension(); + public static final Dimension END_LAND = new Dimension(END); + public static final Dimension END_VOID = new Dimension(END); + + private static final Map DIMENSION_MAP = Maps.newHashMap(); + public final Dimension parentOrNull; + + public Dimension() { + this(null); + } + + public Dimension(Dimension parentOrNull) { + this.parentOrNull = parentOrNull; + } + + public boolean is(Dimension d){ + if (d==this) return true; + if (parentOrNull!=null) return parentOrNull.is(d); + return false; + } + } /** * Empty biome used as default value if requested biome doesn't exist or linked. Shouldn't be registered anywhere to prevent bugs. * Have {@code Biomes.THE_VOID} as the reference biome. @@ -89,7 +113,6 @@ public class BiomeAPI { public static final BCLBiome EMPTY_BIOME = new BCLBiome(Biomes.THE_VOID.location()); private static final Map ID_MAP = Maps.newHashMap(); - private static final Map DIMENSION_MAP = Maps.newHashMap(); private static final Map CLIENT = Maps.newHashMap(); public static Registry biomeRegistry; @@ -170,13 +193,12 @@ public class BiomeAPI { Registry.register(BuiltinRegistries.BIOME, loc, biome); } ID_MAP.put(bclbiome.getID(), bclbiome); - DIMENSION_MAP.put(bclbiome.getID(), dim); - - if (dim==Dimension.NETHER) { + Dimension.DIMENSION_MAP.put(bclbiome.getID(), dim); + if (dim.is(Dimension.NETHER)) { TagAPI.addBiomeTag(BiomeTags.IS_NETHER, bclbiome.getBiome()); TagAPI.addBiomeTag(CommonBiomeTags.IN_NETHER, bclbiome.getBiome()); - } else if (dim==Dimension.END_LAND || dim==Dimension.END_VOID) { + } else if (dim.is(Dimension.END)) { TagAPI.addBiomeTag(BiomeTags.IS_END, bclbiome.getBiome()); } @@ -186,7 +208,7 @@ public class BiomeAPI { } public static BCLBiome registerSubBiome(BCLBiome parent, BCLBiome subBiome) { - final Dimension dim = DIMENSION_MAP.getOrDefault(parent.getID(), Dimension.UNDEFINED); + final Dimension dim = Dimension.DIMENSION_MAP.getOrDefault(parent.getID(), Dimension.NONE); registerBiome(subBiome, dim); parent.addSubBiome(subBiome); @@ -458,19 +480,24 @@ public class BiomeAPI { return getFromRegistry(biomeID) == null; } + public static boolean wasRegisteredAs(ResourceLocation biomeID, Dimension dim) { + if (!Dimension.DIMENSION_MAP.containsKey(biomeID)) return false; + return Dimension.DIMENSION_MAP.get(biomeID).is(dim); + } public static boolean wasRegisteredAsNetherBiome(ResourceLocation biomeID) { - if (!DIMENSION_MAP.containsKey(biomeID)) return false; - return DIMENSION_MAP.get(biomeID)==Dimension.NETHER; + return wasRegisteredAs(biomeID, Dimension.NETHER); + } + + public static boolean wasRegisteredAsEndBiome(ResourceLocation biomeID) { + return wasRegisteredAs(biomeID, Dimension.END); } public static boolean wasRegisteredAsEndLandBiome(ResourceLocation biomeID) { - if (!DIMENSION_MAP.containsKey(biomeID)) return false; - return DIMENSION_MAP.get(biomeID)==Dimension.END_LAND; + return wasRegisteredAs(biomeID, Dimension.END_LAND); } public static boolean wasRegisteredAsEndVoidBiome(ResourceLocation biomeID) { - if (!DIMENSION_MAP.containsKey(biomeID)) return false; - return DIMENSION_MAP.get(biomeID)==Dimension.END_VOID; + return wasRegisteredAs(biomeID, Dimension.END_VOID); } /** @@ -513,8 +540,8 @@ public class BiomeAPI { public static void _runTagAdders(){ for (var mod:TAG_ADDERS.entrySet()) { Stream s = null; - if (mod.getKey()==Level.NETHER) s = DIMENSION_MAP.entrySet().stream().filter(e ->e.getValue() == Dimension.NETHER).map(e -> e.getKey()); - else if (mod.getKey()==Level.END) s = DIMENSION_MAP.entrySet().stream().filter(e ->e.getValue() == Dimension.END_VOID || e.getValue()==Dimension.END_LAND).map(e -> e.getKey()); + if (mod.getKey()==Level.NETHER) s = Dimension.DIMENSION_MAP.entrySet().stream().filter(e ->e.getValue().is(Dimension.NETHER)).map(e -> e.getKey()); + else if (mod.getKey()==Level.END) s = Dimension.DIMENSION_MAP.entrySet().stream().filter(e ->e.getValue().is(Dimension.END)).map(e -> e.getKey()); if (s!=null) { s.forEach(id -> { BCLBiome b = BiomeAPI.getBiome(id); @@ -565,26 +592,6 @@ public class BiomeAPI { if (chunkGenerator instanceof NoiseGeneratorSettingsProvider gen) noiseGeneratorSettings = gen.bclib_getNoiseGeneratorSettings(); - /*final Registry structureSetRegistry; - if (chunkGenerator instanceof ChunkGeneratorAccessor acc) { - structureSetRegistry = acc.bclib_getStructureSetsRegistry(); - } else { - structureSetRegistry = null; - } - - - noiseGeneratorSettings = level - .getServer() - .getWorldData() - .worldGenSettings() - .dimensions() - .stream() - .map(dim->dim.generator()) - .filter(gen-> structureSetRegistry!=null && (gen instanceof NoiseGeneratorSettingsProvider) && (gen instanceof ChunkGeneratorAccessor) && ((ChunkGeneratorAccessor)gen).bclib_getStructureSetsRegistry()==structureSetRegistry) - .map(gen->((NoiseGeneratorSettingsProvider)gen).bclib_getNoiseGeneratorSettings()) - .findFirst() - .orElse(null);*/ - // Datapacks (like Amplified Nether)will change the GeneratorSettings upon load, so we will // only use the default Setting for Nether/End if we were unable to find a settings object diff --git a/src/main/java/ru/bclib/world/generator/BCLibEndBiomeSource.java b/src/main/java/ru/bclib/world/generator/BCLibEndBiomeSource.java index f86cc63d..c3c6af39 100644 --- a/src/main/java/ru/bclib/world/generator/BCLibEndBiomeSource.java +++ b/src/main/java/ru/bclib/world/generator/BCLibEndBiomeSource.java @@ -126,8 +126,7 @@ public class BCLibEndBiomeSource extends BCLBiomeSource { } final boolean isEndBiome = biome.is(BiomeTags.IS_END) || - BiomeAPI.wasRegisteredAsEndVoidBiome(key) || - BiomeAPI.wasRegisteredAsEndLandBiome(key); + BiomeAPI.wasRegisteredAsEndBiome(key); if (GeneratorOptions.addEndBiomesByTag() && isEndBiome) { return true; } @@ -194,6 +193,8 @@ public class BCLibEndBiomeSource extends BCLBiomeSource { @Override public void setSeed(long seed) { + if (seed==currentSeed) return; + super.setSeed(seed); initMap(seed); } diff --git a/src/main/java/ru/bclib/world/generator/BiomePicker.java b/src/main/java/ru/bclib/world/generator/BiomePicker.java index 31ac4ade..92681944 100644 --- a/src/main/java/ru/bclib/world/generator/BiomePicker.java +++ b/src/main/java/ru/bclib/world/generator/BiomePicker.java @@ -80,7 +80,7 @@ public class BiomePicker { } private final List biomes = Lists.newArrayList(); - private final Registry biomeRegistry; + public final Registry biomeRegistry; private WeighTree tree; public BiomePicker(Registry biomeRegistry){