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