From af64cc57daa32cdc30f3ec34cbfedf4a765bc3b5 Mon Sep 17 00:00:00 2001 From: tyra314 Date: Thu, 30 Mar 2023 20:51:02 +0200 Subject: [PATCH] Add tile detection fallback At least in 1.18, we still have to rely on the BiomeCategory, as biomes do not fully support biome tags yet. While the current heuristic for tile detection is lack luster, there is no hope for fixing it beyond the current state, when custom biomes, like terralith do not have any meaningful biome tags yet. I really hope this changes with 1.19. Otherwise, I'm doomed. Fixes #460 --- .../mc/impl/atlas/client/TileTextureMap.java | 44 +++++++++++++++++++ .../client/fabric/TileTextureMapImpl.java | 3 +- .../client/forge/TileTextureMapImpl.java | 5 +-- 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/hunternif/mc/impl/atlas/client/TileTextureMap.java b/common/src/main/java/hunternif/mc/impl/atlas/client/TileTextureMap.java index 7ac8e23c4..514ff5770 100644 --- a/common/src/main/java/hunternif/mc/impl/atlas/client/TileTextureMap.java +++ b/common/src/main/java/hunternif/mc/impl/atlas/client/TileTextureMap.java @@ -8,8 +8,11 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.util.Identifier; +import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.util.registry.RegistryEntryList; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.feature.PlacedFeature; import java.util.*; import java.util.Map.Entry; @@ -93,6 +96,47 @@ static private Optional guessFittingTextureSet(RegistryKey bi throw new AssertionError("Not implemented"); } + static public Optional guessFittingTextureSetFallback(Biome biome) { + Identifier texture_set = switch (biome.getCategory()) { + case SWAMP -> AntiqueAtlasMod.id("swamp"); + case OCEAN, RIVER -> + biome.getPrecipitation() == Biome.Precipitation.SNOW ? AntiqueAtlasMod.id("ice") : AntiqueAtlasMod.id("water"); + case BEACH -> AntiqueAtlasMod.id("shore"); + case JUNGLE -> AntiqueAtlasMod.id("jungle"); + case SAVANNA -> AntiqueAtlasMod.id("savanna"); + case MESA -> AntiqueAtlasMod.id("plateau_mesa"); + case FOREST -> + biome.getPrecipitation() == Biome.Precipitation.SNOW ? AntiqueAtlasMod.id("snow_pines") : AntiqueAtlasMod.id("forest"); + case PLAINS -> + biome.getPrecipitation() == Biome.Precipitation.SNOW ? AntiqueAtlasMod.id("snow") : AntiqueAtlasMod.id("plains"); + case ICY -> AntiqueAtlasMod.id("ice_spikes"); + case DESERT -> AntiqueAtlasMod.id("desert"); + case TAIGA -> AntiqueAtlasMod.id("snow"); + case EXTREME_HILLS -> AntiqueAtlasMod.id("hills"); + case MOUNTAIN -> AntiqueAtlasMod.id("mountains"); + case THEEND -> { + List> features = biome.getGenerationSettings().getFeatures(); + PlacedFeature chorus_plant_feature = BuiltinRegistries.PLACED_FEATURE.get(new Identifier("chorus_plant")); + assert chorus_plant_feature != null; + boolean has_chorus_plant = features.stream().anyMatch(entries -> entries.stream().anyMatch(feature -> feature.value() == chorus_plant_feature)); + if (has_chorus_plant) { + yield AntiqueAtlasMod.id("end_island_plants"); + } else { + yield AntiqueAtlasMod.id("end_island"); + } + } + case MUSHROOM -> AntiqueAtlasMod.id("mushroom"); + case NETHER -> AntiqueAtlasMod.id("soul_sand_valley"); + case NONE -> AntiqueAtlasMod.id("end_void"); + case UNDERGROUND -> { + Log.warn("Underground biomes aren't supported yet."); + yield null; + } + }; + + return Optional.ofNullable(texture_set); + } + public boolean isRegistered(Identifier id) { return textureMap.containsKey(id); } diff --git a/fabric/src/main/java/hunternif/mc/impl/atlas/client/fabric/TileTextureMapImpl.java b/fabric/src/main/java/hunternif/mc/impl/atlas/client/fabric/TileTextureMapImpl.java index bd22d6a32..f44df09f1 100644 --- a/fabric/src/main/java/hunternif/mc/impl/atlas/client/fabric/TileTextureMapImpl.java +++ b/fabric/src/main/java/hunternif/mc/impl/atlas/client/fabric/TileTextureMapImpl.java @@ -1,6 +1,7 @@ package hunternif.mc.impl.atlas.client.fabric; import hunternif.mc.impl.atlas.AntiqueAtlasMod; +import hunternif.mc.impl.atlas.client.TileTextureMap; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.tag.convention.v1.ConventionalBiomeTags; @@ -156,6 +157,6 @@ static public Optional guessFittingTextureSet(RegistryKey bio return Optional.of(AntiqueAtlasMod.id("mesa")); } - return Optional.empty(); + return TileTextureMap.guessFittingTextureSetFallback(biomeTag.value()); } } diff --git a/forge/src/main/java/hunternif/mc/impl/atlas/client/forge/TileTextureMapImpl.java b/forge/src/main/java/hunternif/mc/impl/atlas/client/forge/TileTextureMapImpl.java index bf7ac030a..45746be8b 100644 --- a/forge/src/main/java/hunternif/mc/impl/atlas/client/forge/TileTextureMapImpl.java +++ b/forge/src/main/java/hunternif/mc/impl/atlas/client/forge/TileTextureMapImpl.java @@ -1,6 +1,7 @@ package hunternif.mc.impl.atlas.client.forge; import hunternif.mc.impl.atlas.AntiqueAtlasMod; +import hunternif.mc.impl.atlas.client.TileTextureMap; import net.minecraft.client.MinecraftClient; import net.minecraft.tag.BiomeTags; import net.minecraft.util.Identifier; @@ -149,8 +150,6 @@ static public Optional guessFittingTextureSet(RegistryKey bio return Optional.of(AntiqueAtlasMod.id("mushroom")); } - - if (biomeTag.isIn(BiomeTags.IS_BADLANDS)) { return Optional.of(AntiqueAtlasMod.id("mesa")); } @@ -163,6 +162,6 @@ static public Optional guessFittingTextureSet(RegistryKey bio AntiqueAtlasMod.LOG.warn("Underground biomes aren't supported yet."); } - return Optional.empty(); + return TileTextureMap.guessFittingTextureSetFallback(biomeTag.value()); } }