[Change] BiomeSource merging checks Biome Tags to find modded or datapack biomes

This commit is contained in:
Frank 2023-06-19 22:35:04 +02:00
parent 00cb2ea0a7
commit c2a520e846
5 changed files with 95 additions and 20 deletions

View file

@ -6,6 +6,7 @@ import org.betterx.worlds.together.world.event.WorldBootstrap;
import com.mojang.serialization.Codec;
import com.mojang.serialization.Lifecycle;
import net.minecraft.core.Holder;
import net.minecraft.core.MappedRegistry;
import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess;
@ -28,6 +29,7 @@ import java.util.Optional;
import java.util.Set;
import java.util.stream.Stream;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class BCLBiomeRegistry {
@ -101,6 +103,25 @@ public class BCLBiomeRegistry {
registerForDatagen(biome);
}
public static BCLBiome registerIfUnknown(Holder<Biome> biomeHolder, @NotNull BiomeAPI.BiomeType intendedType) {
if (biomeHolder == null) return null;
return registerIfUnknown(biomeHolder.unwrapKey().orElse(null), intendedType);
}
public static BCLBiome registerIfUnknown(ResourceKey<Biome> biomeKey, @NotNull BiomeAPI.BiomeType intendedType) {
if (biomeKey != null) {
if (!hasBiome(biomeKey, BCLBiomeRegistry.registryOrNull())) {
final var bclBiome = new BCLBiome(
biomeKey.location(),
intendedType
);
BCLBiomeRegistry.register(bclBiome);
return bclBiome;
}
}
return null;
}
public static boolean hasBiome(ResourceKey<Biome> key, Registry<BCLBiome> bclBiomes) {
return hasBiome(key.location(), bclBiomes);
}

View file

@ -6,6 +6,7 @@ import org.betterx.bclib.interfaces.SurfaceMaterialProvider;
import org.betterx.bclib.mixin.common.BiomeGenerationSettingsAccessor;
import org.betterx.bclib.mixin.common.MobSpawnSettingsAccessor;
import org.betterx.bclib.util.CollectionsUtil;
import org.betterx.worlds.together.tag.v3.CommonBiomeTags;
import org.betterx.worlds.together.tag.v3.TagManager;
import org.betterx.worlds.together.world.event.WorldBootstrap;
@ -301,8 +302,19 @@ public class BiomeAPI {
TagManager.BIOMES.add(BiomeTags.IS_NETHER, bclbiome.getBiomeKey());
} else if (dim != null && dim.is(BiomeType.END)) {
TagManager.BIOMES.add(BiomeTags.IS_END, bclbiome.getBiomeKey());
if (dim.is(BiomeType.END_VOID)) {
TagManager.BIOMES.add(CommonBiomeTags.IS_SMALL_END_ISLAND, bclbiome.getBiomeKey());
} else if (dim.is(BiomeType.END_BARRENS)) {
TagManager.BIOMES.add(CommonBiomeTags.IS_END_BARRENS, bclbiome.getBiomeKey());
} else if (dim.is(BiomeType.END_LAND)) {
TagManager.BIOMES.add(CommonBiomeTags.IS_END_HIGHLAND, bclbiome.getBiomeKey());
} else if (dim.is(BiomeType.END_CENTER)) {
TagManager.BIOMES.add(CommonBiomeTags.IS_END_CENTER, bclbiome.getBiomeKey());
}
}
bclbiome.afterRegistration();
return bclbiome;

View file

@ -1,16 +1,20 @@
package org.betterx.worlds.together.levelgen;
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiome;
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeRegistry;
import org.betterx.bclib.api.v2.levelgen.biomes.BiomeAPI;
import org.betterx.worlds.together.biomesource.BiomeSourceWithConfig;
import org.betterx.worlds.together.biomesource.ReloadableBiomeSource;
import org.betterx.worlds.together.chunkgenerator.EnforceableChunkGenerator;
import org.betterx.worlds.together.tag.v3.CommonBiomeTags;
import org.betterx.worlds.together.world.event.WorldBootstrap;
import org.betterx.worlds.together.worldPreset.TogetherWorldPreset;
import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess;
import net.minecraft.resources.ResourceKey;
import net.minecraft.tags.BiomeTags;
import net.minecraft.tags.TagKey;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.dimension.LevelStem;
@ -24,7 +28,6 @@ class BiomeRepairHelper {
RegistryAccess registryAccess,
Registry<LevelStem> dimensionRegistry
) {
Map<ResourceKey<LevelStem>, ChunkGenerator> dimensions = TogetherWorldPreset.loadWorldDimensions();
for (var entry : dimensionRegistry.entrySet()) {
boolean didRepair = false;
@ -35,6 +38,10 @@ class BiomeRepairHelper {
if (referenceGenerator instanceof EnforceableChunkGenerator enforcer) {
final ChunkGenerator loadedChunkGenerator = loadedStem.generator();
// we ensure that all biomes with a dimensional Tag are properly added to the correct biome source
// using the correct type
processBiomeTagsForDimension(key);
// if the loaded ChunkGenerator is not the one we expect from vanilla, we will load the vanilla
// ones and mark all modded biomes with the respective dimension
registerAllBiomesFromVanillaDimension(key);
@ -72,6 +79,33 @@ class BiomeRepairHelper {
return dimensionRegistry;
}
private void processBiomeTagsForDimension(ResourceKey<LevelStem> key) {
if (key.equals(LevelStem.NETHER)) {
preprocessBiomeTags(BiomeTags.IS_NETHER, BiomeAPI.BiomeType.NETHER);
} else if (key.equals(LevelStem.END)) {
preprocessBiomeTags(CommonBiomeTags.IS_END_HIGHLAND, BiomeAPI.BiomeType.END_LAND);
preprocessBiomeTags(CommonBiomeTags.IS_END_MIDLAND, BiomeAPI.BiomeType.END_LAND);
preprocessBiomeTags(CommonBiomeTags.IS_END_BARRENS, BiomeAPI.BiomeType.END_BARRENS);
preprocessBiomeTags(CommonBiomeTags.IS_SMALL_END_ISLAND, BiomeAPI.BiomeType.END_VOID);
preprocessBiomeTags(CommonBiomeTags.IS_END_CENTER, BiomeAPI.BiomeType.END_CENTER);
preprocessBiomeTags(BiomeTags.IS_END, BiomeAPI.BiomeType.END_LAND);
}
}
private void preprocessBiomeTags(TagKey<Biome> tag, BiomeAPI.BiomeType targetType) {
if (WorldBootstrap.getLastRegistryAccess() != null) {
WorldBootstrap.getLastRegistryAccess()
.registry(tag.registry())
.map(r -> r.getTagOrEmpty(tag))
.ifPresent(iter -> {
for (Holder<Biome> biomeHolder : iter) {
BCLBiomeRegistry.registerIfUnknown(biomeHolder, targetType);
}
});
;
}
}
private void registerAllBiomesFromVanillaDimension(
ResourceKey<LevelStem> key
) {
@ -81,25 +115,11 @@ class BiomeRepairHelper {
if (vanillaDimensions == null) {
vanillaDimensions = TogetherWorldPreset.getDimensionsMap(net.minecraft.world.level.levelgen.presets.WorldPresets.NORMAL);
}
var vanillaDim = vanillaDimensions.getOrDefault(key, null);
if (vanillaDim != null && vanillaDim.getBiomeSource() != null) {
var vanillaBiomes = vanillaDim
.getBiomeSource()
.possibleBiomes();
for (var holder : vanillaBiomes) {
ResourceKey<Biome> biomeKey = holder.unwrapKey().orElse(null);
if (biomeKey != null) {
if (!BCLBiomeRegistry.hasBiome(
holder.unwrapKey().get(),
BCLBiomeRegistry.registryOrNull()
)) {
BCLBiomeRegistry.register(new BCLBiome(
biomeKey.location(),
type
));
}
}
final ChunkGenerator vanillaDim = vanillaDimensions.getOrDefault(key, null);
if (vanillaDim != null && vanillaDim.getBiomeSource() != null) {
for (Holder<Biome> biomeHolder : vanillaDim.getBiomeSource().possibleBiomes()) {
BCLBiomeRegistry.registerIfUnknown(biomeHolder, type);
}
}
}

View file

@ -0,0 +1,21 @@
package org.betterx.worlds.together.tag.v3;
import net.minecraft.tags.TagKey;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.Biomes;
public class CommonBiomeTags {
public static final TagKey<Biome> IS_END_CENTER = TagManager.BIOMES.makeCommonTag("is_end_center");
public static final TagKey<Biome> IS_END_HIGHLAND = TagManager.BIOMES.makeCommonTag("is_end_highland");
public static final TagKey<Biome> IS_END_MIDLAND = TagManager.BIOMES.makeCommonTag("is_end_midland");
public static final TagKey<Biome> IS_END_BARRENS = TagManager.BIOMES.makeCommonTag("is_end_barrens");
public static final TagKey<Biome> IS_SMALL_END_ISLAND = TagManager.BIOMES.makeCommonTag("is_small_end_island");
static void prepareTags() {
TagManager.BIOMES.add(IS_END_CENTER, Biomes.THE_END);
TagManager.BIOMES.add(IS_END_HIGHLAND, Biomes.END_HIGHLANDS);
TagManager.BIOMES.add(IS_END_MIDLAND, Biomes.END_MIDLANDS);
TagManager.BIOMES.add(IS_END_BARRENS, Biomes.END_BARRENS);
TagManager.BIOMES.add(IS_SMALL_END_ISLAND, Biomes.SMALL_END_ISLANDS);
}
}

View file

@ -85,6 +85,7 @@ public class TagManager {
public static void ensureStaticallyLoaded() {
CommonItemTags.prepareTags();
CommonBlockTags.prepareTags();
CommonBiomeTags.prepareTags();
MineableTags.prepareTags();
ToolTags.prepareTags();
}