From baebb7323ddb4f1b73a1c438aaca8e5198339258 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 5 Jun 2025 07:53:23 -0500 Subject: [PATCH] Close #776 (fix Polytone client biome colors) --- .../common/wrappers/block/BiomeWrapper.java | 141 ++++++++++------- .../block/ClientBlockStateColorCache.java | 7 +- .../block/TintWithoutLevelOverrider.java | 148 ++++++++++++------ versionProperties/1.16.5.properties | 6 +- versionProperties/1.17.1.properties | 6 +- versionProperties/1.18.2.properties | 4 +- versionProperties/1.19.2.properties | 4 +- versionProperties/1.19.4.properties | 4 +- versionProperties/1.20.1.properties | 4 +- versionProperties/1.20.2.properties | 4 +- versionProperties/1.20.4.properties | 4 +- versionProperties/1.20.6.properties | 4 +- versionProperties/1.21.1.properties | 4 +- versionProperties/1.21.3.properties | 4 +- versionProperties/1.21.4.properties | 4 +- versionProperties/1.21.5.properties | 4 +- 16 files changed, 202 insertions(+), 150 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BiomeWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BiomeWrapper.java index 81e7cb93b..972c16acd 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BiomeWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BiomeWrapper.java @@ -47,6 +47,7 @@ import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.biome.Biome; + #if MC_VER >= MC_1_18_2 import net.minecraft.world.level.biome.Biomes; #endif @@ -130,14 +131,6 @@ public class BiomeWrapper implements IBiomeWrapper //LOGGER.trace("Created BiomeWrapper ["+this.serialString+"] for ["+biome+"]"); } - /** should only be used to create {@link BiomeWrapper#EMPTY_WRAPPER} */ - private BiomeWrapper() - { - this.biome = null; - this.serialString = EMPTY_BIOME_STRING; - this.hashCode = Objects.hash(this.serialString); - } - //=========// @@ -286,64 +279,16 @@ public class BiomeWrapper implements IBiomeWrapper BiomeWrapper foundWrapper = EMPTY_WRAPPER; try { - // parse the resource location - int separatorIndex = resourceLocationString.indexOf(":"); - if (separatorIndex == -1) - { - throw new IOException("Unable to parse resource location string: [" + resourceLocationString + "]."); - } - - ResourceLocation resourceLocation; - try - { - #if MC_VER < MC_1_21_1 - resourceLocation = new ResourceLocation(resourceLocationString.substring(0, separatorIndex), resourceLocationString.substring(separatorIndex + 1)); - #else - resourceLocation = ResourceLocation.fromNamespaceAndPath(resourceLocationString.substring(0, separatorIndex), resourceLocationString.substring(separatorIndex + 1)); - #endif - } - catch (Exception e) - { - throw new IOException("No Resource Location found for the string: [" + resourceLocationString + "] Error: [" + e.getMessage() + "]."); - } - - try { Level level = (Level) levelWrapper.getWrappedMcObject(); net.minecraft.core.RegistryAccess registryAccess = level.registryAccess(); - boolean success; - #if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1 - Biome biome = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).get(resourceLocation); - success = (biome != null); - #elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2 - Biome unwrappedBiome = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).get(resourceLocation); - success = (unwrappedBiome != null); - Holder biome = new Holder.Direct<>(unwrappedBiome); - #elif MC_VER < MC_1_21_3 - Biome unwrappedBiome = registryAccess.registryOrThrow(Registries.BIOME).get(resourceLocation); - success = (unwrappedBiome != null); - Holder biome = new Holder.Direct<>(unwrappedBiome); - #else - Holder biome; - Optional> optionalBiomeHolder = registryAccess.lookupOrThrow(Registries.BIOME).get(resourceLocation); - if (optionalBiomeHolder.isPresent()) - { - Biome unwrappedBiome = optionalBiomeHolder.get().value(); - success = (unwrappedBiome != null); - biome = new Holder.Direct<>(unwrappedBiome); - } - else - { - success = false; - biome = null; - } - #endif + BiomeDeserializeResult deserializeResult = deserializeBiome(resourceLocationString, registryAccess); - if (!success) + if (!deserializeResult.success) { if (!brokenResourceLocationStrings.contains(resourceLocationString)) { @@ -354,7 +299,7 @@ public class BiomeWrapper implements IBiomeWrapper } - foundWrapper = (BiomeWrapper) getBiomeWrapper(biome, levelWrapper); + foundWrapper = (BiomeWrapper) getBiomeWrapper(deserializeResult.biome, levelWrapper); return foundWrapper; } catch (Exception e) @@ -368,4 +313,82 @@ public class BiomeWrapper implements IBiomeWrapper } } + public static BiomeDeserializeResult deserializeBiome(String resourceLocationString, net.minecraft.core.RegistryAccess registryAccess) throws IOException + { + // parse the resource location + int separatorIndex = resourceLocationString.indexOf(":"); + if (separatorIndex == -1) + { + throw new IOException("Unable to parse resource location string: [" + resourceLocationString + "]."); + } + + ResourceLocation resourceLocation; + try + { + #if MC_VER < MC_1_21_1 + resourceLocation = new ResourceLocation(resourceLocationString.substring(0, separatorIndex), resourceLocationString.substring(separatorIndex + 1)); + #else + resourceLocation = ResourceLocation.fromNamespaceAndPath(resourceLocationString.substring(0, separatorIndex), resourceLocationString.substring(separatorIndex + 1)); + #endif + } + catch (Exception e) + { + throw new IOException("No Resource Location found for the string: [" + resourceLocationString + "] Error: [" + e.getMessage() + "]."); + } + + + boolean success; + #if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1 + Biome biome = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).get(resourceLocation); + success = (biome != null); + #elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2 + Biome unwrappedBiome = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).get(resourceLocation); + success = (unwrappedBiome != null); + Holder biome = new Holder.Direct<>(unwrappedBiome); + #elif MC_VER < MC_1_21_3 + Biome unwrappedBiome = registryAccess.registryOrThrow(Registries.BIOME).get(resourceLocation); + success = (unwrappedBiome != null); + Holder biome = new Holder.Direct<>(unwrappedBiome); + #else + Holder biome; + Optional> optionalBiomeHolder = registryAccess.lookupOrThrow(Registries.BIOME).get(resourceLocation); + if (optionalBiomeHolder.isPresent()) + { + Biome unwrappedBiome = optionalBiomeHolder.get().value(); + success = (unwrappedBiome != null); + biome = new Holder.Direct<>(unwrappedBiome); + } + else + { + success = false; + biome = null; + } + #endif + + return new BiomeDeserializeResult(success, biome); + } + + + //================// + // helper classes // + //================// + + public static class BiomeDeserializeResult + { + public final boolean success; + + #if MC_VER < MC_1_18_2 + public final Biome biome; + #else + public final Holder biome; + #endif + + public BiomeDeserializeResult(boolean success, #if MC_VER < MC_1_18_2 Biome #else Holder #endif biome) + { + this.success = success; + this.biome = biome; + } + } + + } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/ClientBlockStateColorCache.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/ClientBlockStateColorCache.java index fce4c689f..bd97553d0 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/ClientBlockStateColorCache.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/ClientBlockStateColorCache.java @@ -42,7 +42,6 @@ import net.minecraft.world.level.block.state.BlockState; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.concurrent.locks.ReentrantLock; @@ -91,7 +90,7 @@ public class ClientBlockStateColorCache private static final RandomSource RANDOM = RandomSource.create(); #endif - private final IClientLevelWrapper levelWrapper; + private final IClientLevelWrapper clientLevelWrapper; private final BlockState blockState; private final LevelReader level; @@ -174,7 +173,7 @@ public class ClientBlockStateColorCache public ClientBlockStateColorCache(BlockState blockState, IClientLevelWrapper samplingLevel) { this.blockState = blockState; - this.levelWrapper = samplingLevel; + this.clientLevelWrapper = samplingLevel; this.level = (LevelReader) samplingLevel.getWrappedMcObject(); this.resolveColors(); } @@ -471,7 +470,7 @@ public class ClientBlockStateColorCache try { tintColor = Minecraft.getInstance().getBlockColors() - .getColor(this.blockState, new TintWithoutLevelOverrider(biome, this.levelWrapper), McObjectConverter.Convert(pos), this.tintIndex); + .getColor(this.blockState, new TintWithoutLevelOverrider(biome, this.clientLevelWrapper), McObjectConverter.Convert(pos), this.tintIndex); } catch (UnsupportedOperationException e) { diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintWithoutLevelOverrider.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintWithoutLevelOverrider.java index 56143aa6d..22abed47e 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintWithoutLevelOverrider.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintWithoutLevelOverrider.java @@ -19,8 +19,10 @@ package com.seibel.distanthorizons.common.wrappers.block; -import com.seibel.distanthorizons.core.util.ColorUtil; +import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.*; @@ -29,6 +31,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.lighting.LevelLightEngine; import net.minecraft.world.level.material.FluidState; +import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -36,22 +39,64 @@ import org.jetbrains.annotations.Nullable; import net.minecraft.core.Holder; #endif +import java.io.IOException; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + public class TintWithoutLevelOverrider implements BlockAndTintGetter { - /** - * This will only ever be null if there was an issue with {@link IClientLevelWrapper#getPlainsBiomeWrapper()} - * but {@link Nullable} is there just in case. - */ - @Nullable - #if MC_VER >= MC_1_18_2 - public final Holder biome; + private static final Logger LOGGER = DhLoggerBuilder.getLogger(); + + #if MC_VER < MC_1_18_2 + public static final ConcurrentMap BIOME_BY_RESOURCE_STRING = new ConcurrentHashMap<>(); #else - public final Biome biome; - #endif + public static final ConcurrentMap> BIOME_BY_RESOURCE_STRING = new ConcurrentHashMap<>(); + #endif + + + @NotNull + private final BiomeWrapper biomeWrapper; + + + + //=============// + // constructor // + //=============// + + public TintWithoutLevelOverrider(@NotNull BiomeWrapper biomeWrapper, IClientLevelWrapper clientLevelWrapper) + { this.biomeWrapper = biomeWrapper; } + + + + //=========// + // methods // + //=========// + + @Override + public int getBlockTint(@NotNull BlockPos blockPos, @NotNull ColorResolver colorResolver) + { + String biomeString = this.biomeWrapper.getSerialString(); + if (biomeString == null + || biomeString.isEmpty() + || biomeString.equals(BiomeWrapper.EMPTY_BIOME_STRING)) + { + // default to "plains" for empty/invalid biomes + biomeString = "minecraft:plains"; + } + + + return colorResolver.getColor(unwrap(getClientBiome(biomeString)), blockPos.getX(), blockPos.getZ()); + } + private static Biome unwrap(#if MC_VER >= MC_1_18_2 Holder #else Biome #endif biome) + { + #if MC_VER >= MC_1_18_2 + return biome.value(); + #else + return biome; + #endif + } /** - * Constructs the TintWithoutLevelOverrider, storing the provided Biome Holder for late-binding access. - * *

Previously, this class might have immediately unwrapped the Holder like this:

*
{@code
 	 * // Inside constructor (OLD WAY - PROBLEMATIC):
@@ -85,41 +130,52 @@ public class TintWithoutLevelOverrider implements BlockAndTintGetter
 	 * whenever the biome information is needed, ensuring it always retrieves the most current {@code Biome}
 	 * instance associated with the holder at that time.

*/ - public TintWithoutLevelOverrider(BiomeWrapper biomeWrapper, IClientLevelWrapper clientLevelWrapper) + private static #if MC_VER < MC_1_18_2 Biome #else Holder #endif getClientBiome(String biomeResourceString) { - #if MC_VER >= MC_1_18_2 Holder #else Biome #endif biome = biomeWrapper.biome; - if (biome == null) // We are looking at the empty biome wrapper - { - BiomeWrapper plainsBiomeWrapper = ((BiomeWrapper) clientLevelWrapper.getPlainsBiomeWrapper()); - if (plainsBiomeWrapper != null) - { - biome = plainsBiomeWrapper.biome; - } - } - - this.biome = biome; - } - - - - @Override - public int getBlockTint(@NotNull BlockPos blockPos, @NotNull ColorResolver colorResolver) - { - if (this.biome == null) - { - // hopefully unneeded debug color - return ColorUtil.CYAN; - } - return colorResolver.getColor(unwrap(biome), blockPos.getX(), blockPos.getZ()); - } - - private static Biome unwrap(#if MC_VER >= MC_1_18_2 Holder #else Biome #endif biome) - { - #if MC_VER >= MC_1_18_2 - return biome.value(); - #else - return biome; - #endif + // cache the client biomes so we don't have to re-parse the resource location every time + return BIOME_BY_RESOURCE_STRING.compute(biomeResourceString, + (resourceString, existingBiome) -> + { + if (existingBiome != null) + { + return existingBiome; + } + + ClientLevel clientLevel = Minecraft.getInstance().level; + if (clientLevel == null) + { + // shouldn't happen, but just in case + throw new IllegalStateException("Attempted to get client biome when no client level was loaded."); + } + + BiomeWrapper.BiomeDeserializeResult result; + try + { + result = BiomeWrapper.deserializeBiome(resourceString, clientLevel.registryAccess()); + } + catch (Exception e) + { + LOGGER.warn("Unable to deserialize client biome ["+resourceString+"], using fallback..."); + + try + { + result = BiomeWrapper.deserializeBiome("minecraft:plains", clientLevel.registryAccess()); + } + catch (IOException ex) + { + // should never happen, if it does this log will explode, but just in case + LOGGER.error("Unable to deserialize fallback client biome [minecraft:plains], returning NULL."); + return null; + } + } + + if (result.success) + { + existingBiome = result.biome; + } + + return existingBiome; + }); } diff --git a/versionProperties/1.16.5.properties b/versionProperties/1.16.5.properties index bd1078c27..1516d1aca 100644 --- a/versionProperties/1.16.5.properties +++ b/versionProperties/1.16.5.properties @@ -24,10 +24,8 @@ fabric_api_version=0.42.0+1.16 immersive_portals_version= canvas_version= - # iris - needs 1.7.4+ to support the DH API - # polytone - sometimes has biomes that aren't synced between server/client - # so it doesn't accept DH provided biomes, resulting in gray blocks and log spam - fabric_incompatibility_list={ "iris": "*", "polytone": "*" } + # iris - needs 1.7.4+ to support the DH API + fabric_incompatibility_list={ "iris": "*" } fabric_recommend_list={} # Fabric mod run diff --git a/versionProperties/1.17.1.properties b/versionProperties/1.17.1.properties index a8a914a4b..60f8a4138 100644 --- a/versionProperties/1.17.1.properties +++ b/versionProperties/1.17.1.properties @@ -24,10 +24,8 @@ fabric_api_version=0.46.1+1.17 immersive_portals_version= canvas_version= - # iris - needs 1.7.4+ to support the DH API - # polytone - sometimes has biomes that aren't synced between server/client - # so it doesn't accept DH provided biomes, resulting in gray blocks and log spam - fabric_incompatibility_list={ "iris": "*", "polytone": "*" } + # iris - needs 1.7.4+ to support the DH API + fabric_incompatibility_list={ "iris": "*" } fabric_recommend_list={} # Fabric mod run diff --git a/versionProperties/1.18.2.properties b/versionProperties/1.18.2.properties index 5f0d76517..e4a5c001b 100644 --- a/versionProperties/1.18.2.properties +++ b/versionProperties/1.18.2.properties @@ -26,9 +26,7 @@ fabric_api_version=0.76.0+1.18.2 canvas_version=mc118:1.0.2616 # iris - needs 1.7.4+ to support the DH API - # polytone - sometimes has biomes that aren't synced between server/client - # so it doesn't accept DH provided biomes, resulting in gray blocks and log spam - fabric_incompatibility_list={ "iris": "*", "polytone": "*" } + fabric_incompatibility_list={ "iris": "*" } fabric_recommend_list={} # Fabric mod run diff --git a/versionProperties/1.19.2.properties b/versionProperties/1.19.2.properties index cf517f21e..948b8e9f7 100644 --- a/versionProperties/1.19.2.properties +++ b/versionProperties/1.19.2.properties @@ -25,9 +25,7 @@ fabric_api_version=0.76.1+1.19.2 canvas_version=mc119-1.0.2480 # iris - needs 1.7.4+ to support the DH API - # polytone - sometimes has biomes that aren't synced between server/client - # so it doesn't accept DH provided biomes, resulting in gray blocks and log spam - fabric_incompatibility_list={ "iris": "*", "polytone": "*" } + fabric_incompatibility_list={ "iris": "*" } fabric_recommend_list={} # Fabric mod run diff --git a/versionProperties/1.19.4.properties b/versionProperties/1.19.4.properties index 39dd2c919..45332cdee 100644 --- a/versionProperties/1.19.4.properties +++ b/versionProperties/1.19.4.properties @@ -24,9 +24,7 @@ fabric_api_version=0.87.1+1.19.4 canvas_version= # iris - needs 1.7.4+ to support the DH API - # polytone - sometimes has biomes that aren't synced between server/client - # so it doesn't accept DH provided biomes, resulting in gray blocks and log spam - fabric_incompatibility_list={ "iris": "*", "polytone": "*" } + fabric_incompatibility_list={ "iris": "*" } fabric_recommend_list={} # Fabric mod run diff --git a/versionProperties/1.20.1.properties b/versionProperties/1.20.1.properties index 494519656..93f2be3d0 100644 --- a/versionProperties/1.20.1.properties +++ b/versionProperties/1.20.1.properties @@ -24,9 +24,7 @@ fabric_api_version=0.90.4+1.20.1 canvas_version= # iris - needs 1.7.4+ to support the DH API - # polytone - sometimes has biomes that aren't synced between server/client - # so it doesn't accept DH provided biomes, resulting in gray blocks and log spam - fabric_incompatibility_list={ "iris": "<=1.7.4", "polytone": "*" } + fabric_incompatibility_list={ "iris": "<=1.7.4" } fabric_recommend_list={} # Fabric mod run diff --git a/versionProperties/1.20.2.properties b/versionProperties/1.20.2.properties index 05a120b13..97dae64dc 100644 --- a/versionProperties/1.20.2.properties +++ b/versionProperties/1.20.2.properties @@ -24,9 +24,7 @@ fabric_api_version=0.90.4+1.20.2 canvas_version= # iris - needs 1.7.4+ to support the DH API - # polytone - sometimes has biomes that aren't synced between server/client - # so it doesn't accept DH provided biomes, resulting in gray blocks and log spam - fabric_incompatibility_list={ "iris": "<=1.7.4", "polytone": "*" } + fabric_incompatibility_list={ "iris": "<=1.7.4" } fabric_recommend_list={} # Fabric mod run diff --git a/versionProperties/1.20.4.properties b/versionProperties/1.20.4.properties index 9681ecc19..d9d4f0108 100644 --- a/versionProperties/1.20.4.properties +++ b/versionProperties/1.20.4.properties @@ -25,9 +25,7 @@ fabric_api_version=0.91.2+1.20.4 canvas_version= # iris - needs 1.7.4+ to support the DH API - # polytone - sometimes has biomes that aren't synced between server/client - # so it doesn't accept DH provided biomes, resulting in gray blocks and log spam - fabric_incompatibility_list={ "iris": "<=1.7.4", "polytone": "*" } + fabric_incompatibility_list={ "iris": "<=1.7.4" } fabric_recommend_list={} # Fabric mod run diff --git a/versionProperties/1.20.6.properties b/versionProperties/1.20.6.properties index 52a6d62dd..bd69eb44c 100644 --- a/versionProperties/1.20.6.properties +++ b/versionProperties/1.20.6.properties @@ -25,9 +25,7 @@ fabric_api_version=0.97.8+1.20.6 canvas_version= # iris - needs 1.7.4+ to support the DH API - # polytone - sometimes has biomes that aren't synced between server/client - # so it doesn't accept DH provided biomes, resulting in gray blocks and log spam - fabric_incompatibility_list={ "iris": "<=1.7.4", "polytone": "*" } + fabric_incompatibility_list={ "iris": "<=1.7.4" } fabric_recommend_list={} # Fabric mod run diff --git a/versionProperties/1.21.1.properties b/versionProperties/1.21.1.properties index e77ee0c36..92b5c1efd 100644 --- a/versionProperties/1.21.1.properties +++ b/versionProperties/1.21.1.properties @@ -25,9 +25,7 @@ fabric_api_version=0.115.0+1.21.1 canvas_version= # iris - needs 1.7.4+ to support the DH API - # polytone - sometimes has biomes that aren't synced between server/client - # so it doesn't accept DH provided biomes, resulting in gray blocks and log spam - fabric_incompatibility_list={ "iris": "<=1.7.4", "polytone": "*" } + fabric_incompatibility_list={ "iris": "<=1.7.4" } fabric_recommend_list={} # Fabric mod run diff --git a/versionProperties/1.21.3.properties b/versionProperties/1.21.3.properties index ce85075e7..ae8fc88ce 100644 --- a/versionProperties/1.21.3.properties +++ b/versionProperties/1.21.3.properties @@ -25,9 +25,7 @@ fabric_api_version=0.110.0+1.21.3 canvas_version= # fabric-api 0.110.0 fixed a bug in MC 1.21.3 with the rendering API DH relied on - # polytone - sometimes has biomes that aren't synced between server/client - # so it doesn't accept DH provided biomes, resulting in gray blocks and log spam - fabric_incompatibility_list={ "fabric-api": "<0.110.0", "polytone": "*" } + fabric_incompatibility_list={ "fabric-api": "<0.110.0" } fabric_recommend_list={} # Fabric mod run diff --git a/versionProperties/1.21.4.properties b/versionProperties/1.21.4.properties index 2c73e6a50..03f484b58 100644 --- a/versionProperties/1.21.4.properties +++ b/versionProperties/1.21.4.properties @@ -24,9 +24,7 @@ fabric_api_version=0.110.5+1.21.4 immersive_portals_version= canvas_version= - # polytone - sometimes has biomes that aren't synced between server/client - # so it doesn't accept DH provided biomes, resulting in gray blocks and log spam - fabric_incompatibility_list={ "polytone": "*" } + fabric_incompatibility_list={ } fabric_recommend_list={} # Fabric mod run diff --git a/versionProperties/1.21.5.properties b/versionProperties/1.21.5.properties index 19cc0e43a..28e2712e3 100644 --- a/versionProperties/1.21.5.properties +++ b/versionProperties/1.21.5.properties @@ -24,9 +24,7 @@ fabric_api_version=0.119.5+1.21.5 canvas_version= # Iris - some versions of 1.8.11 nightly builds may not work, but the ones after 2025-03-30 should - # polytone - sometimes has biomes that aren't synced between server/client - # so it doesn't accept DH provided biomes, resulting in gray blocks and log spam - fabric_incompatibility_list={ "iris": "<=1.8.10", "polytone": "*" } + fabric_incompatibility_list={ "iris": "<=1.8.10" } fabric_recommend_list={} # Fabric mod run