From 3e81071b96053d4935ed93ec6e1fe3f12b2ea8ff Mon Sep 17 00:00:00 2001 From: Frank Date: Sun, 3 Jul 2022 12:42:30 +0200 Subject: [PATCH] [Change] BCLBiome is no longer a wrapper around a Biome-Instance but references the Biome by ResourceKey [Fix] Crash with Promenade (#15) --- .../api/v2/generator/BCLibEndBiomeSource.java | 5 +- .../v2/generator/BCLibNetherBiomeSource.java | 13 +- .../api/v2/generator/TheEndBiomesHelper.java | 2 +- .../api/v2/levelgen/biomes/BCLBiome.java | 83 ++++++++--- .../v2/levelgen/biomes/BCLBiomeBuilder.java | 134 ++++++++++-------- .../api/v2/levelgen/biomes/BiomeAPI.java | 116 ++++++++++----- .../v2/levelgen/biomes/InternalBiomeAPI.java | 42 +++--- .../worlds/together/tag/v3/TagRegistry.java | 18 +++ 8 files changed, 274 insertions(+), 139 deletions(-) diff --git a/src/main/java/org/betterx/bclib/api/v2/generator/BCLibEndBiomeSource.java b/src/main/java/org/betterx/bclib/api/v2/generator/BCLibEndBiomeSource.java index 5d00d744..6520216e 100644 --- a/src/main/java/org/betterx/bclib/api/v2/generator/BCLibEndBiomeSource.java +++ b/src/main/java/org/betterx/bclib/api/v2/generator/BCLibEndBiomeSource.java @@ -114,7 +114,10 @@ public class BCLibEndBiomeSource extends BCLBiomeSource implements BiomeSourceWi String biomeStr = biomeID.toString(); //exclude everything that was listed if (excludeList != null && excludeList.contains(biomeStr)) return; - + if (!biome.isBound()) { + BCLib.LOGGER.warning("Biome " + biomeStr + " is requested but not yet bound."); + return; + } final BCLBiome bclBiome; if (!BiomeAPI.hasBiome(biomeID)) { bclBiome = new BCLBiome(biomeID, biome.value()); diff --git a/src/main/java/org/betterx/bclib/api/v2/generator/BCLibNetherBiomeSource.java b/src/main/java/org/betterx/bclib/api/v2/generator/BCLibNetherBiomeSource.java index 834d1706..bdf504b4 100644 --- a/src/main/java/org/betterx/bclib/api/v2/generator/BCLibNetherBiomeSource.java +++ b/src/main/java/org/betterx/bclib/api/v2/generator/BCLibNetherBiomeSource.java @@ -81,13 +81,16 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource implements BiomeSourc biomePicker = new BiomePicker(biomeRegistry); this.possibleBiomes().forEach(biome -> { - ResourceLocation key = biome.unwrapKey().orElseThrow().location(); - - if (!BiomeAPI.hasBiome(key)) { - BCLBiome bclBiome = new BCLBiome(key, biome.value()); + ResourceLocation biomeID = biome.unwrapKey().orElseThrow().location(); + if (!biome.isBound()) { + BCLib.LOGGER.warning("Biome " + biomeID.toString() + " is requested but not yet bound."); + return; + } + if (!BiomeAPI.hasBiome(biomeID)) { + BCLBiome bclBiome = new BCLBiome(biomeID, biome.value()); biomePicker.addBiome(bclBiome); } else { - BCLBiome bclBiome = BiomeAPI.getBiome(key); + BCLBiome bclBiome = BiomeAPI.getBiome(biomeID); if (bclBiome != BiomeAPI.EMPTY_BIOME) { if (bclBiome.getParentBiome() == null) { diff --git a/src/main/java/org/betterx/bclib/api/v2/generator/TheEndBiomesHelper.java b/src/main/java/org/betterx/bclib/api/v2/generator/TheEndBiomesHelper.java index 07dffc7a..93fe1d91 100644 --- a/src/main/java/org/betterx/bclib/api/v2/generator/TheEndBiomesHelper.java +++ b/src/main/java/org/betterx/bclib/api/v2/generator/TheEndBiomesHelper.java @@ -17,7 +17,7 @@ import org.jetbrains.annotations.ApiStatus; */ public class TheEndBiomesHelper { @ApiStatus.Internal - public static Map>> END_BIOMES = new HashMap<>(); + private static Map>> END_BIOMES = new HashMap<>(); @ApiStatus.Internal public static void add(BiomeAPI.BiomeType type, ResourceKey biome) { diff --git a/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/BCLBiome.java b/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/BCLBiome.java index ddaabf10..6d99d2a6 100644 --- a/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/BCLBiome.java +++ b/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/BCLBiome.java @@ -3,6 +3,7 @@ package org.betterx.bclib.api.v2.levelgen.biomes; import org.betterx.bclib.util.WeightedList; import org.betterx.worlds.together.tag.v3.TagManager; +import net.minecraft.core.Registry; import net.minecraft.data.BuiltinRegistries; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; @@ -28,7 +29,8 @@ public class BCLBiome extends BCLBiomeSettings { private final WeightedList subbiomes = new WeightedList<>(); private final Map customData = Maps.newHashMap(); private final ResourceLocation biomeID; - private final Biome biome; + private final ResourceKey biomeKey; + final Biome biomeToRegister; private final List parameterPoints = Lists.newArrayList(); @@ -49,43 +51,74 @@ public class BCLBiome extends BCLBiomeSettings { * @param biomeID {@link ResourceLocation} biome ID. */ protected BCLBiome(ResourceLocation biomeID) { - this(biomeID, BuiltinRegistries.BIOME.get(biomeID), null); + this(ResourceKey.create(Registry.BIOME_REGISTRY, biomeID), null); } /** * Create wrapper for existing biome using biome instance from {@link BuiltinRegistries}. * - * @param biome {@link Biome} to wrap. + * @param biomeToRegister {@link Biome} to wrap. */ - protected BCLBiome(Biome biome) { - this(biome, null); + @Deprecated(forRemoval = true) + protected BCLBiome(Biome biomeToRegister) { + this(biomeToRegister, null); } /** * Create wrapper for existing biome using biome instance from {@link BuiltinRegistries}. * - * @param biome {@link Biome} to wrap. - * @param settings The Settings for this Biome or {@code null} if you want to apply default settings + * @param biomeToRegister {@link Biome} to wrap. + * @param settings The Settings for this Biome or {@code null} if you want to apply default settings */ - protected BCLBiome(Biome biome, VanillaBiomeSettings settings) { - this(BiomeAPI.getBiomeID(biome), biome, settings); + @Deprecated(forRemoval = true) + protected BCLBiome(Biome biomeToRegister, VanillaBiomeSettings settings) { + this(BiomeAPI.getBiomeID(biomeToRegister), biomeToRegister, settings); } - public BCLBiome(ResourceLocation biomeID, Biome biome) { - this(biomeID, biome, null); + /** + * Create wrapper for existing biome using biome instance from {@link BuiltinRegistries}. + * + * @param biomeToRegister {@link Biome} to wrap. + * @param biomeID Teh ResoureLocation for this Biome + */ + @Deprecated(forRemoval = true) + public BCLBiome(ResourceLocation biomeID, Biome biomeToRegister) { + this(biomeID, biomeToRegister, null); } /** * Create a new Biome * - * @param biomeID {@link ResourceLocation} biome ID. - * @param biome {@link Biome} to wrap. + * @param biomeID {@link ResourceLocation} biome ID. + * @param biomeToRegister {@link Biome} to wrap. + * @param defaults The Settings for this Biome or null if you want to apply the defaults + */ + protected BCLBiome(ResourceLocation biomeID, Biome biomeToRegister, BCLBiomeSettings defaults) { + this(ResourceKey.create(Registry.BIOME_REGISTRY, biomeID), biomeToRegister, defaults); + } + + /** + * Create a new Biome + * + * @param biomeKey {@link ResourceKey} of the wrapped Biome * @param defaults The Settings for this Biome or null if you want to apply the defaults */ - protected BCLBiome(ResourceLocation biomeID, Biome biome, BCLBiomeSettings defaults) { + protected BCLBiome(ResourceKey biomeKey, BCLBiomeSettings defaults) { + this(biomeKey, null, defaults); + } + + /** + * Create a new Biome + * + * @param biomeKey {@link ResourceKey} of the wrapped Biome + * @param biomeToRegister The biome you want to use when this instance gets registered through the {@link BiomeAPI} + * @param defaults The Settings for this Biome or null if you want to apply the defaults + */ + protected BCLBiome(ResourceKey biomeKey, Biome biomeToRegister, BCLBiomeSettings defaults) { + this.biomeToRegister = biomeToRegister; this.subbiomes.add(this, 1.0F); - this.biomeID = biomeID; - this.biome = biome; + this.biomeID = biomeKey.location(); + this.biomeKey = biomeKey; if (defaults != null) { defaults.applyWithDefaults(this); @@ -203,16 +236,26 @@ public class BCLBiome extends BCLBiomeSettings { * * @return {@link Biome}. */ - public Biome getBiome() { - return biome; + @Deprecated(forRemoval = true) + public Biome getBiomeOld() { + if (biomeToRegister != null) return biomeToRegister; + return BiomeAPI.getFromBuiltinRegistry(biomeKey).value(); + } + + /** + * Getter for biomeKey + * + * @return {@link ResourceKey}. + */ + public ResourceKey getBiomeKey() { + return biomeKey; } /** * For internal use from BiomeAPI only */ void afterRegistration() { - ResourceKey key = BuiltinRegistries.BIOME.getResourceKey(getBiome()).orElseThrow(); - this.biomeTags.forEach(tagKey -> TagManager.BIOMES.add(tagKey, biome)); + this.biomeTags.forEach(tagKey -> TagManager.BIOMES.add(tagKey, this)); } diff --git a/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/BCLBiomeBuilder.java b/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/BCLBiomeBuilder.java index 8de19f94..ba395cfb 100644 --- a/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/BCLBiomeBuilder.java +++ b/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/BCLBiomeBuilder.java @@ -10,6 +10,7 @@ import org.betterx.bclib.util.ColorUtil; import org.betterx.bclib.util.Pair; import org.betterx.bclib.util.TriFunction; import org.betterx.worlds.together.surfaceRules.SurfaceRuleRegistry; +import org.betterx.worlds.together.tag.v3.TagManager; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; @@ -72,7 +73,6 @@ public class BCLBiomeBuilder { private final List parameters = Lists.newArrayList(); - //BiomeTags.IS_NETHER private float temperature; private float fogDensity; private float genChance; @@ -82,6 +82,8 @@ public class BCLBiomeBuilder { private BCLBiome edge; private boolean vertical; + private BiomeAPI.BiomeType biomeType; + /** * Starts new biome building process. @@ -106,6 +108,7 @@ public class BCLBiomeBuilder { INSTANCE.carvers.clear(); INSTANCE.parameters.clear(); INSTANCE.tags.clear(); + INSTANCE.biomeType = null; return INSTANCE; } @@ -114,6 +117,17 @@ public class BCLBiomeBuilder { return this; } + /** + * Set the type for this Biome. If the type was set, the Biome can be registered. + * + * @param type selected Type + * @return same {@link BCLBiomeBuilder} instance. + */ + public BCLBiomeBuilder type(BiomeAPI.BiomeType type) { + this.biomeType = type; + return this; + } + /** * Set biome {@link Precipitation}. Affect biome visual effects (rain, snow, none). * @@ -724,26 +738,6 @@ public class BCLBiomeBuilder { return this; } - /** - * Finalize biome creation. - * - * @return created {@link BCLBiome} instance. - */ - public BCLBiome build() { - return build((BiomeSupplier) BCLBiome::new); - } - - /** - * Finalize biome creation. - * - * @param biomeConstructor {@link BiFunction} biome constructor. - * @return created {@link BCLBiome} instance. - * @deprecated Replaced with {@link #build(BiomeSupplier)} - */ - @Deprecated(forRemoval = true) - public T build(BiFunction biomeConstructor) { - return build((id, biome, settings) -> biomeConstructor.apply(id, biome)); - } private static BiomeGenerationSettings fixGenerationSettings(BiomeGenerationSettings settings) { //Fabric Biome Modification API can not handle an empty carver map, thus we will create one with @@ -760,43 +754,6 @@ public class BCLBiomeBuilder { return settings; } - /** - * Finalize biome creation. - * - * @param biomeConstructor {@link BiomeSupplier} biome constructor. - * @return created {@link BCLBiome} instance. - */ - public T build(BiomeSupplier biomeConstructor) { - BiomeBuilder builder = new BiomeBuilder() - .precipitation(precipitation) - .temperature(temperature) - .downfall(downfall); - - builder.mobSpawnSettings(getSpawns().build()); - builder.specialEffects(getEffects().build()); - - builder.generationSettings(fixGenerationSettings(getGeneration().build())); - - BCLBiomeSettings settings = BCLBiomeSettings.createBCL() - .setTerrainHeight(height) - .setFogDensity(fogDensity) - .setGenChance(genChance) - .setEdgeSize(edgeSize) - .setEdge(edge) - .setVertical(vertical) - .build(); - - final Biome biome = builder.build(); - final T res = biomeConstructor.apply(biomeID, biome, settings); - res.addBiomeTags(tags); - //res.setSurface(surfaceRule); - SurfaceRuleRegistry.registerRule(biomeID, surfaceRule, biomeID); - res.addClimateParameters(parameters); - - - //carvers.forEach(cfg -> BiomeAPI.addBiomeCarver(biome, cfg.second, cfg.first)); - return res; - } /** * Get or create {@link BiomeSpecialEffects.Builder} for biome visual effects. @@ -837,4 +794,65 @@ public class BCLBiomeBuilder { } return generationSettings; } + + /** + * Finalize biome creation. + * + * @return created {@link BCLBiome} instance. + */ + public BCLBiome build() { + return build((BiomeSupplier) BCLBiome::new); + } + + /** + * Finalize biome creation. + * + * @param biomeConstructor {@link BiFunction} biome constructor. + * @return created {@link BCLBiome} instance. + * @deprecated Replaced with {@link #build(BiomeSupplier)} + */ + @Deprecated(forRemoval = true) + public T build(BiFunction biomeConstructor) { + return build((id, biome, settings) -> biomeConstructor.apply(id, biome)); + } + + /** + * Finalize biome creation. + * + * @param biomeConstructor {@link BiomeSupplier} biome constructor. + * @return created {@link BCLBiome} instance. + */ + public T build(BiomeSupplier biomeConstructor) { + BiomeBuilder builder = new BiomeBuilder() + .precipitation(precipitation) + .temperature(temperature) + .downfall(downfall); + + builder.mobSpawnSettings(getSpawns().build()); + builder.specialEffects(getEffects().build()); + + builder.generationSettings(fixGenerationSettings(getGeneration().build())); + + BCLBiomeSettings settings = BCLBiomeSettings.createBCL() + .setTerrainHeight(height) + .setFogDensity(fogDensity) + .setGenChance(genChance) + .setEdgeSize(edgeSize) + .setEdge(edge) + .setVertical(vertical) + .build(); + + final Biome biome = builder.build(); + final T res = biomeConstructor.apply(biomeID, biome, settings); + tags.forEach(tagKey -> TagManager.BIOMES.add(tagKey, res)); + + //res.addBiomeTags(tags); + //res.setSurface(surfaceRule); + SurfaceRuleRegistry.registerRule(biomeID, surfaceRule, biomeID); + res.addClimateParameters(parameters); + + + //carvers.forEach(cfg -> BiomeAPI.addBiomeCarver(biome, cfg.second, cfg.first)); + return res; + } } diff --git a/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/BiomeAPI.java b/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/BiomeAPI.java index 543be1d3..4f072fc8 100644 --- a/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/BiomeAPI.java +++ b/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/BiomeAPI.java @@ -26,7 +26,6 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeGenerationSettings; import net.minecraft.world.level.biome.Biomes; import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; import net.minecraft.world.level.block.state.BlockState; @@ -174,19 +173,29 @@ public class BiomeAPI { * @return {@link BCLBiome} */ public static BCLBiome registerBiome(BCLBiome bclbiome, BiomeType dim) { - if (BuiltinRegistries.BIOME.get(bclbiome.getID()) == null) { - final Biome biome = bclbiome.getBiome(); - ResourceLocation loc = bclbiome.getID(); - Registry.register(BuiltinRegistries.BIOME, loc, biome); + return registerBiome(bclbiome, dim, BuiltinRegistries.BIOME); + } + + /** + * Register {@link BCLBiome} instance and its {@link Biome} if necessary. + * + * @param bclbiome {@link BCLBiome} + * @param dim The Dimension fo rthis Biome + * @return {@link BCLBiome} + */ + static BCLBiome registerBiome(BCLBiome bclbiome, BiomeType dim, Registry registryOrNull) { + if (registryOrNull != null && bclbiome.biomeToRegister != null && registryOrNull.get(bclbiome.getID()) == null) { + Registry.register(registryOrNull, bclbiome.getBiomeKey(), bclbiome.biomeToRegister); } + ID_MAP.put(bclbiome.getID(), bclbiome); BiomeType.BIOME_TYPE_MAP.put(bclbiome.getID(), dim); if (dim != null && dim.is(BiomeType.NETHER)) { - TagManager.BIOMES.add(BiomeTags.IS_NETHER, bclbiome.getBiome()); - TagManager.BIOMES.add(CommonBiomeTags.IN_NETHER, bclbiome.getBiome()); + TagManager.BIOMES.add(BiomeTags.IS_NETHER, bclbiome); + TagManager.BIOMES.add(CommonBiomeTags.IN_NETHER, bclbiome); } else if (dim != null && dim.is(BiomeType.END)) { - TagManager.BIOMES.add(BiomeTags.IS_END, bclbiome.getBiome()); + TagManager.BIOMES.add(BiomeTags.IS_END, bclbiome); } bclbiome.afterRegistration(); @@ -234,10 +243,10 @@ public class BiomeAPI { registerBiome(biome, BiomeType.BCL_END_LAND); float weight = biome.getGenChance(); - ResourceKey key = getBiomeKey(biome.getBiome()); + ResourceKey key = biome.getBiomeKey(); if (biome.allowFabricRegistration()) { if (biome.isEdgeBiome()) { - ResourceKey parentKey = getBiomeKey(biome.getParentBiome().getBiome()); + ResourceKey parentKey = biome.getParentBiome().getBiomeKey(); TheEndBiomes.addMidlandsBiome(parentKey, key, weight); } else { TheEndBiomes.addHighlandsBiome(key, weight); @@ -258,7 +267,7 @@ public class BiomeAPI { registerBiome(biome, BiomeType.BCL_END_VOID); float weight = biome.getGenChance(); - ResourceKey key = getBiomeKey(biome.getBiome()); + ResourceKey key = biome.getBiomeKey(); if (biome.allowFabricRegistration()) { TheEndBiomes.addSmallIslandsBiome(key, weight); } @@ -277,7 +286,7 @@ public class BiomeAPI { registerBiome(biome, BiomeType.BCL_END_CENTER); float weight = biome.getGenChance(); - ResourceKey key = getBiomeKey(biome.getBiome()); + ResourceKey key = biome.getBiomeKey(); if (biome.allowFabricRegistration()) { TheEndBiomes.addMainIslandBiome(key, weight); } @@ -296,9 +305,9 @@ public class BiomeAPI { registerBiome(biome, BiomeType.BCL_END_BARRENS); float weight = biome.getGenChance(); - ResourceKey key = getBiomeKey(biome.getBiome()); + ResourceKey key = biome.getBiomeKey(); if (biome.allowFabricRegistration()) { - ResourceKey parentKey = getBiomeKey(highlandBiome.getBiome()); + ResourceKey parentKey = highlandBiome.getBiomeKey(); TheEndBiomes.addBarrensBiome(parentKey, key, weight); } return biome; @@ -416,23 +425,29 @@ public class BiomeAPI { } public static Holder getBiomeHolder(BCLBiome biome) { - return getBiomeHolder(biome.getBiome()); + return getBiomeHolder(biome.getBiomeKey()); } public static Holder getBiomeHolder(Biome biome) { + Optional> key = Optional.empty(); if (InternalBiomeAPI.biomeRegistry != null) { - Optional> key = InternalBiomeAPI.biomeRegistry.getResourceKey(biome); - if (key.isPresent()) return InternalBiomeAPI.biomeRegistry.getOrCreateHolderOrThrow(key.get()); + key = InternalBiomeAPI.biomeRegistry.getResourceKey(biome); + } else { + key = BuiltinRegistries.BIOME.getResourceKey(biome); } - return BuiltinRegistries.BIOME.getOrCreateHolderOrThrow(BiomeAPI.getBiomeKey(biome)); + return getBiomeHolder(key.orElseThrow()); + } + + public static Holder getBiomeHolder(ResourceKey biomeKey) { + if (InternalBiomeAPI.biomeRegistry != null) { + return InternalBiomeAPI.biomeRegistry.getOrCreateHolderOrThrow(biomeKey); + } + return BuiltinRegistries.BIOME.getOrCreateHolderOrThrow(biomeKey); } public static Holder getBiomeHolder(ResourceLocation biome) { - if (InternalBiomeAPI.biomeRegistry != null) { - return getBiomeHolder(InternalBiomeAPI.biomeRegistry.get(biome)); - } - return getBiomeHolder(BuiltinRegistries.BIOME.get(biome)); + return getBiomeHolder(ResourceKey.create(Registry.BIOME_REGISTRY, biome)); } /** @@ -475,18 +490,45 @@ public class BiomeAPI { return ID_MAP.containsKey(biomeID); } - @Nullable - public static Holder getFromRegistry(ResourceLocation key) { - return BuiltinRegistries.BIOME.getHolder(ResourceKey.create(Registry.BIOME_REGISTRY, key)).orElseThrow(); + public static Holder getFromRegistry(ResourceLocation biomeID) { + if (InternalBiomeAPI.biomeRegistry != null) + return InternalBiomeAPI.biomeRegistry.getHolder(ResourceKey.create(Registry.BIOME_REGISTRY, biomeID)) + .orElseThrow(); + return getFromBuiltinRegistry(biomeID); } @Nullable public static Holder getFromRegistry(ResourceKey key) { + if (InternalBiomeAPI.biomeRegistry != null) + return InternalBiomeAPI.biomeRegistry.getHolder(key).orElseThrow(); + return getFromBuiltinRegistry(key); + } + + @Nullable + public static Holder getFromBuiltinRegistry(ResourceLocation biomeID) { + return BuiltinRegistries.BIOME.getHolder(ResourceKey.create(Registry.BIOME_REGISTRY, biomeID)).orElseThrow(); + } + + @Nullable + public static Holder getFromBuiltinRegistry(ResourceKey key) { return BuiltinRegistries.BIOME.getOrCreateHolderOrThrow(key); } + @Deprecated(forRemoval = true) + public static boolean registryContains(ResourceKey key) { + if (InternalBiomeAPI.biomeRegistry != null) + return InternalBiomeAPI.biomeRegistry.containsKey(key); + return builtinRegistryContains(key); + } + + @Nullable + @Deprecated(forRemoval = true) + public static boolean builtinRegistryContains(ResourceKey key) { + return BuiltinRegistries.BIOME.containsKey(key); + } + public static boolean isDatapackBiome(ResourceLocation biomeID) { - return getFromRegistry(biomeID) == null; + return getFromBuiltinRegistry(biomeID) == null; } public static boolean wasRegisteredAs(ResourceLocation biomeID, BiomeType dim) { @@ -619,16 +661,16 @@ public class BiomeAPI { } static void sortBiomeFeatures(Biome biome) { - BiomeGenerationSettings settings = biome.getGenerationSettings(); - BiomeGenerationSettingsAccessor accessor = (BiomeGenerationSettingsAccessor) settings; - List> featureList = CollectionsUtil.getMutable(accessor.bclib_getFeatures()); - final int size = featureList.size(); - for (int i = 0; i < size; i++) { - List> features = getFeaturesListCopy(featureList, i); - sortFeatures(features); - featureList.set(i, HolderSet.direct(features)); - } - accessor.bclib_setFeatures(featureList); +// BiomeGenerationSettings settings = biome.getGenerationSettings(); +// BiomeGenerationSettingsAccessor accessor = (BiomeGenerationSettingsAccessor) settings; +// List> featureList = CollectionsUtil.getMutable(accessor.bclib_getFeatures()); +// final int size = featureList.size(); +// for (int i = 0; i < size; i++) { +// List> features = getFeaturesListCopy(featureList, i); +// sortFeatures(features); +// featureList.set(i, HolderSet.direct(features)); +// } +// accessor.bclib_setFeatures(featureList); } /** @@ -846,7 +888,7 @@ public class BiomeAPI { public static BCLBiome registerNetherBiome(BCLBiome bclBiome) { registerBiome(bclBiome, BiomeType.BCL_NETHER); - ResourceKey key = getBiomeKey(bclBiome.getBiome()); + ResourceKey key = bclBiome.getBiomeKey(); if (bclBiome.allowFabricRegistration()) { bclBiome.forEachClimateParameter(p -> NetherBiomes.addNetherBiome(key, p)); } diff --git a/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/InternalBiomeAPI.java b/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/InternalBiomeAPI.java index 61bf9d75..f381955c 100644 --- a/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/InternalBiomeAPI.java +++ b/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/InternalBiomeAPI.java @@ -273,31 +273,31 @@ public class InternalBiomeAPI { * Register {@link BCLBiome} wrapper for {@link Biome}. * After that biome will be added to BCLib End Biome Generator and into Fabric Biome API as a land biome (will generate only on islands). * - * @param biome The source biome to wrap + * @param biomeKey The source biome to wrap * @return {@link BCLBiome} */ - public static BCLBiome wrapNativeBiome(ResourceKey biome, BiomeAPI.BiomeType type) { - return wrapNativeBiome(biome, -1, type); + public static BCLBiome wrapNativeBiome(ResourceKey biomeKey, BiomeAPI.BiomeType type) { + return wrapNativeBiome(biomeKey, -1, type); } /** * Register {@link BCLBiome} wrapper for {@link Biome}. * After that biome will be added to BCLib End Biome Generator and into Fabric Biome API as a land biome (will generate only on islands). * - * @param biome The source biome to wrap + * @param biomeKey The source biome to wrap * @param genChance generation chance. If <0 the default genChance is used * @return {@link BCLBiome} */ - public static BCLBiome wrapNativeBiome(ResourceKey biome, float genChance, BiomeAPI.BiomeType type) { + public static BCLBiome wrapNativeBiome(ResourceKey biomeKey, float genChance, BiomeAPI.BiomeType type) { return wrapNativeBiome( - biome, + biomeKey, genChance < 0 ? null : VanillaBiomeSettings.createVanilla().setGenChance(genChance).build(), type ); } public static BCLBiome wrapNativeBiome( - ResourceKey biome, + ResourceKey biomeKey, BCLBiome edgeBiome, int edgeBiomeSize, float genChance, @@ -307,28 +307,25 @@ public class InternalBiomeAPI { if (genChance >= 0) settings.setGenChance(genChance); settings.setEdge(edgeBiome); settings.setEdgeSize(edgeBiomeSize); - return wrapNativeBiome(biome, settings.build(), type); + return wrapNativeBiome(biomeKey, settings.build(), type); } /** * Register {@link BCLBiome} wrapper for {@link Biome}. * After that biome will be added to BCLib End Biome Generator and into Fabric Biome API as a land biome (will generate only on islands). * - * @param biome The source biome to wrap - * @param setings the {@link VanillaBiomeSettings} to use + * @param biomeKey The source biome to wrap + * @param setings the {@link VanillaBiomeSettings} to use * @return {@link BCLBiome} */ private static BCLBiome wrapNativeBiome( - ResourceKey biome, + ResourceKey biomeKey, VanillaBiomeSettings setings, BiomeAPI.BiomeType type ) { - BCLBiome bclBiome = BiomeAPI.getBiome(biome.location()); + BCLBiome bclBiome = BiomeAPI.getBiome(biomeKey.location()); if (bclBiome == BiomeAPI.EMPTY_BIOME) { - bclBiome = new BCLBiome( - BiomeAPI.getFromRegistry(biome).value(), - setings - ); + bclBiome = new BCLBiome(biomeKey, setings); } BiomeAPI.registerBiome(bclBiome, type); @@ -343,6 +340,7 @@ public class InternalBiomeAPI { * @param genChance generation chance. * @return {@link BCLBiome} */ + @Deprecated(forRemoval = true) static BCLBiome wrapNativeBiome(Biome biome, float genChance, BiomeAPI.BiomeType type) { BCLBiome bclBiome = BiomeAPI.getBiome(biome); if (bclBiome == BiomeAPI.EMPTY_BIOME) { @@ -352,7 +350,7 @@ public class InternalBiomeAPI { ); } - BiomeAPI.registerBiome(bclBiome, type); + BiomeAPI.registerBiome(bclBiome, type, null); return bclBiome; } @@ -370,4 +368,14 @@ public class InternalBiomeAPI { }); }); } + + public static boolean registryContainsBound(ResourceKey key) { + Registry reg = biomeRegistry; + if (reg == null) reg = BuiltinRegistries.BIOME; + + if (reg.containsKey(key)) { + return reg.getOrCreateHolderOrThrow(key).isBound(); + } + return false; + } } diff --git a/src/main/java/org/betterx/worlds/together/tag/v3/TagRegistry.java b/src/main/java/org/betterx/worlds/together/tag/v3/TagRegistry.java index 54472d83..1c5bb2da 100644 --- a/src/main/java/org/betterx/worlds/together/tag/v3/TagRegistry.java +++ b/src/main/java/org/betterx/worlds/together/tag/v3/TagRegistry.java @@ -1,6 +1,7 @@ package org.betterx.worlds.together.tag.v3; import org.betterx.bclib.BCLib; +import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiome; import org.betterx.bclib.api.v2.levelgen.biomes.InternalBiomeAPI; import net.minecraft.core.DefaultedRegistry; @@ -83,6 +84,23 @@ public class TagRegistry { super(Registry.BIOME_REGISTRY, directory, locationProvider); } + /** + * Adds one Tag to multiple Elements. + * + * @param tagID {@link TagKey< Biome >} tag ID. + * @param elements array of Elements to add into tag. + */ + public void add(TagKey tagID, BCLBiome... elements) { + if (isFrozen) BCLib.LOGGER.warning("Adding Tag " + tagID + " after the API was frozen."); + Set set = getSetForTag(tagID); + for (BCLBiome element : elements) { + ResourceLocation id = element.getID(); + if (id != null) { + set.add(TagEntry.element(id)); + } + } + } + public TagKey makeStructureTag(String modID, String name) { return makeTag(modID, "has_structure/" + name); }