From 070d7e23d57788d593e1d9f4b0bc86a322ba37da Mon Sep 17 00:00:00 2001 From: James Seibel Date: Mon, 23 Oct 2023 20:32:05 -0500 Subject: [PATCH] Fix broken LOD building when the Aether is installed --- .../block/cache/ClientBlockStateCache.java | 44 ++++++++++++++++--- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/cache/ClientBlockStateCache.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/cache/ClientBlockStateCache.java index c5b5b349a..a7966b73d 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/cache/ClientBlockStateCache.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/cache/ClientBlockStateCache.java @@ -21,7 +21,6 @@ package com.seibel.distanthorizons.common.wrappers.block.cache; import com.seibel.distanthorizons.common.wrappers.block.BiomeWrapper; import com.seibel.distanthorizons.common.wrappers.block.TextureAtlasSpriteWrapper; -import com.seibel.distanthorizons.common.wrappers.block.TintWithoutLevelOverrider; import com.seibel.distanthorizons.common.wrappers.McObjectConverter; import com.seibel.distanthorizons.common.wrappers.block.*; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; @@ -44,8 +43,8 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.level.block.state.BlockState; import org.apache.logging.log4j.Logger; +import java.util.HashSet; import java.util.List; -import java.util.Random; /** * @version 2022-9-16 @@ -55,6 +54,8 @@ public class ClientBlockStateCache private static final Logger LOGGER = DhLoggerBuilder.getLogger(); + private static final HashSet BROKEN_BLOCK_STATES = new HashSet<>(); + #if PRE_MC_1_19_2 public static final Random random = new Random(0); #else @@ -230,14 +231,43 @@ public class ClientBlockStateCache isColorResolved = true; } + /** + * {@link TintWithoutLevelOverrider} was originally used here, but it broke when the Aether was installed, + * so now we are using {@link TintGetterOverrideFast} instead. + */ public int getAndResolveFaceColor(BiomeWrapper biome, DhBlockPos pos) { // FIXME: impl per-face colors - if (!needPostTinting) return baseColor; - int tintColor = Minecraft.getInstance().getBlockColors() - .getColor(state, new TintWithoutLevelOverrider(biome), McObjectConverter.Convert(pos), tintIndex); - if (tintColor == -1) return baseColor; - return ColorUtil.multiplyARGBwithRGB(baseColor, tintColor); + if (!this.needPostTinting) + { + return this.baseColor; + } + + + int tintColor = -1; + try + { + tintColor = Minecraft.getInstance().getBlockColors() + .getColor(this.state, new TintGetterOverrideFast(this.level), McObjectConverter.Convert(pos), this.tintIndex); + } + catch (Exception e) + { + // only display the error once per block/biome type to reduce log spam + if (!BROKEN_BLOCK_STATES.contains(this.state)) + { + LOGGER.warn("Failed to get block color for block: [" + this.state + "] and biome: [" + biome + "] at pos: " + pos + ". Error: ["+e.getMessage() + "]. Note: future errors for this block/biome will be ignored.", e); + BROKEN_BLOCK_STATES.add(this.state); + } + } + + if (tintColor == -1) + { + return this.baseColor; + } + else + { + return ColorUtil.multiplyARGBwithRGB(this.baseColor, tintColor); + } } }