Close #776 (fix Polytone client biome colors)
This commit is contained in:
+82
-59
@@ -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> 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> biome = new Holder.Direct<>(unwrappedBiome);
|
||||
#else
|
||||
Holder<Biome> biome;
|
||||
Optional<Holder.Reference<Biome>> 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> 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> biome = new Holder.Direct<>(unwrappedBiome);
|
||||
#else
|
||||
Holder<Biome> biome;
|
||||
Optional<Holder.Reference<Biome>> 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> biome;
|
||||
#endif
|
||||
|
||||
public BiomeDeserializeResult(boolean success, #if MC_VER < MC_1_18_2 Biome #else Holder<Biome> #endif biome)
|
||||
{
|
||||
this.success = success;
|
||||
this.biome = biome;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
+3
-4
@@ -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)
|
||||
{
|
||||
|
||||
+96
-40
@@ -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> biome;
|
||||
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
|
||||
|
||||
#if MC_VER < MC_1_18_2
|
||||
public static final ConcurrentMap<String, Biome> BIOME_BY_RESOURCE_STRING = new ConcurrentHashMap<>();
|
||||
#else
|
||||
public final Biome biome;
|
||||
#endif
|
||||
public static final ConcurrentMap<String, Holder<Biome>> 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<Biome> #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.
|
||||
*
|
||||
* <p>Previously, this class might have immediately unwrapped the Holder like this:</p>
|
||||
* <pre>{@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.</p>
|
||||
*/
|
||||
public TintWithoutLevelOverrider(BiomeWrapper biomeWrapper, IClientLevelWrapper clientLevelWrapper)
|
||||
private static #if MC_VER < MC_1_18_2 Biome #else Holder<Biome> #endif getClientBiome(String biomeResourceString)
|
||||
{
|
||||
#if MC_VER >= MC_1_18_2 Holder<Biome> #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)
|
||||
// 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) ->
|
||||
{
|
||||
biome = plainsBiomeWrapper.biome;
|
||||
}
|
||||
}
|
||||
if (existingBiome != null)
|
||||
{
|
||||
return existingBiome;
|
||||
}
|
||||
|
||||
this.biome = biome;
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@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());
|
||||
}
|
||||
if (result.success)
|
||||
{
|
||||
existingBiome = result.biome;
|
||||
}
|
||||
|
||||
private static Biome unwrap(#if MC_VER >= MC_1_18_2 Holder<Biome> #else Biome #endif biome)
|
||||
{
|
||||
#if MC_VER >= MC_1_18_2
|
||||
return biome.value();
|
||||
#else
|
||||
return biome;
|
||||
#endif
|
||||
return existingBiome;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -25,9 +25,7 @@ fabric_api_version=0.42.0+1.16
|
||||
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
|
||||
|
||||
@@ -25,9 +25,7 @@ fabric_api_version=0.46.1+1.17
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user