diff --git a/src/main/kotlin/mods/betterfoliage/client/Client.kt b/src/main/kotlin/mods/betterfoliage/client/Client.kt index 8510e74..61e95af 100644 --- a/src/main/kotlin/mods/betterfoliage/client/Client.kt +++ b/src/main/kotlin/mods/betterfoliage/client/Client.kt @@ -6,9 +6,16 @@ import mods.betterfoliage.client.integration.* import mods.betterfoliage.client.render.* import mods.betterfoliage.client.texture.* import mods.octarinecore.client.KeyHandler +import mods.octarinecore.client.gui.textComponent import mods.octarinecore.client.resource.CenteringTextureGenerator import mods.octarinecore.client.resource.GeneratorPack +import net.minecraft.block.Block +import net.minecraft.block.state.IBlockState import net.minecraft.client.Minecraft +import net.minecraft.util.math.BlockPos +import net.minecraft.util.text.TextComponentString +import net.minecraft.util.text.TextComponentTranslation +import net.minecraft.util.text.TextFormatting import net.minecraftforge.fml.client.FMLClientHandler import net.minecraftforge.fml.relauncher.Side import net.minecraftforge.fml.relauncher.SideOnly @@ -71,6 +78,8 @@ object Client { StandardLogSupport // add _after_ all other log registries ) + val suppressRenderErrors = mutableSetOf() + fun log(level: Level, msg: String) { BetterFoliageMod.log.log(level, "[BetterFoliage] $msg") BetterFoliageMod.logDetail.log(level, msg) @@ -79,5 +88,19 @@ object Client { fun logDetail(msg: String) { BetterFoliageMod.logDetail.log(Level.DEBUG, msg) } + + fun logRenderError(state: IBlockState, location: BlockPos) { + if (state in suppressRenderErrors) return + suppressRenderErrors.add(state) + + val blockName = Block.REGISTRY.getNameForObject(state.block).toString() + val blockLoc = "${location.x},${location.y},${location.z}" + Minecraft.getMinecraft().thePlayer.addChatMessage(TextComponentTranslation( + "betterfoliage.rendererror", + textComponent(blockName, TextFormatting.GOLD), + textComponent(blockLoc, TextFormatting.GOLD) + )) + logDetail("Error rendering block $state at $blockLoc") + } } diff --git a/src/main/kotlin/mods/betterfoliage/client/render/AbstractRenderColumn.kt b/src/main/kotlin/mods/betterfoliage/client/render/AbstractRenderColumn.kt index aac2086..0ea7e7a 100644 --- a/src/main/kotlin/mods/betterfoliage/client/render/AbstractRenderColumn.kt +++ b/src/main/kotlin/mods/betterfoliage/client/render/AbstractRenderColumn.kt @@ -1,5 +1,6 @@ package mods.betterfoliage.client.render +import mods.betterfoliage.client.Client import mods.betterfoliage.client.config.Config import mods.betterfoliage.client.integration.OptifineCTM import mods.betterfoliage.client.integration.ShadersModIntegration @@ -140,7 +141,11 @@ abstract class AbstractRenderColumn(modId: String) : AbstractBlockRenderingHandl override fun render(ctx: BlockContext, dispatcher: BlockRendererDispatcher, renderer: VertexBuffer, layer: BlockRenderLayer): Boolean { if (ctx.isSurroundedBy(surroundPredicate) ) return false - val columnTextures = registry[ctx.blockState(Int3.zero)] ?: return false + val columnTextures = registry[ctx.blockState(Int3.zero)] + if (columnTextures == null) { + Client.logRenderError(ctx.blockState(Int3.zero), ctx.pos) + return renderWorldBlockBase(ctx, dispatcher, renderer, null) + } // get AO data modelRenderer.updateShading(Int3.zero, allFaces) diff --git a/src/main/kotlin/mods/betterfoliage/client/render/RenderGrass.kt b/src/main/kotlin/mods/betterfoliage/client/render/RenderGrass.kt index 887d491..3909c9d 100644 --- a/src/main/kotlin/mods/betterfoliage/client/render/RenderGrass.kt +++ b/src/main/kotlin/mods/betterfoliage/client/render/RenderGrass.kt @@ -57,7 +57,12 @@ class RenderGrass : AbstractBlockRenderingHandler(BetterFoliageMod.MOD_ID) { val isSnowed = ctx.blockState(up1).isSnow val connectedGrass = isConnected && Config.connectedGrass.enabled && (!isSnowed || Config.connectedGrass.snowEnabled) - val grassInfo = GrassRegistry[ctx, UP]!! + val grassInfo = GrassRegistry[ctx, UP] + if (grassInfo == null) { + // shouldn't happen + Client.logRenderError(ctx.blockState(Int3.zero), ctx.pos) + return renderWorldBlockBase(ctx, dispatcher, renderer, null) + } val blockColor = ctx.blockData(Int3.zero).color if (connectedGrass) { diff --git a/src/main/kotlin/mods/betterfoliage/client/render/RenderLeaves.kt b/src/main/kotlin/mods/betterfoliage/client/render/RenderLeaves.kt index 5fe8baf..a10da6b 100644 --- a/src/main/kotlin/mods/betterfoliage/client/render/RenderLeaves.kt +++ b/src/main/kotlin/mods/betterfoliage/client/render/RenderLeaves.kt @@ -1,6 +1,7 @@ package mods.betterfoliage.client.render import mods.betterfoliage.BetterFoliageMod +import mods.betterfoliage.client.Client import mods.betterfoliage.client.config.Config import mods.betterfoliage.client.integration.ShadersModIntegration import mods.betterfoliage.client.texture.LeafRegistry @@ -50,7 +51,12 @@ class RenderLeaves : AbstractBlockRenderingHandler(BetterFoliageMod.MOD_ID) { val isSnowed = ctx.blockState(up1).material.let { it == Material.SNOW || it == Material.CRAFTED_SNOW } - val leafInfo = LeafRegistry[ctx, DOWN] ?: return false + val leafInfo = LeafRegistry[ctx, DOWN] + if (leafInfo == null) { + // shouldn't happen + Client.logRenderError(ctx.blockState(Int3.zero), ctx.pos) + return renderWorldBlockBase(ctx, dispatcher, renderer, null) + } val blockColor = ctx.blockData(Int3.zero).color renderWorldBlockBase(ctx, dispatcher, renderer, null) diff --git a/src/main/kotlin/mods/octarinecore/client/gui/Utils.kt b/src/main/kotlin/mods/octarinecore/client/gui/Utils.kt index c823738..b001332 100644 --- a/src/main/kotlin/mods/octarinecore/client/gui/Utils.kt +++ b/src/main/kotlin/mods/octarinecore/client/gui/Utils.kt @@ -1,7 +1,11 @@ @file:JvmName("Utils") package mods.octarinecore.client.gui -import net.minecraft.util.text.TextFormatting.* +import net.minecraft.util.text.Style +import net.minecraft.util.text.TextComponentString +import net.minecraft.util.text.TextFormatting +import net.minecraft.util.text.TextFormatting.AQUA +import net.minecraft.util.text.TextFormatting.GRAY fun stripTooltipDefaultText(tooltip: MutableList) { var defaultRows = false @@ -10,4 +14,9 @@ fun stripTooltipDefaultText(tooltip: MutableList) { if (iter.next().startsWith(AQUA.toString())) defaultRows = true if (defaultRows) iter.remove() } +} + +fun textComponent(msg: String, color: TextFormatting = GRAY): TextComponentString { + val style = Style().apply { this.color = color } + return TextComponentString(msg).apply { this.style = style } } \ No newline at end of file diff --git a/src/main/resources/assets/betterfoliage/lang/en_US.lang b/src/main/resources/assets/betterfoliage/lang/en_US.lang index cbbded9..580050b 100644 --- a/src/main/resources/assets/betterfoliage/lang/en_US.lang +++ b/src/main/resources/assets/betterfoliage/lang/en_US.lang @@ -20,7 +20,9 @@ betterfoliage.population.tooltip=Chance (N in 64) that an eligible block will ha betterfoliage.shaderWind=Shader wind effects betterfoliage.shaderWind.tooltip=Apply wind effects from ShaderMod shaders to this element? betterfoliage.distance=Distance limit -betterfoliage.distance.tooltip=Maximum distance from player at which to render this feature +betterfoliage.distance.tooltip=Maximum distance from player at which to render this feature + +betterfoliage.rendererror=§a[BetterFoliage]§f Error rendering block %s at position %s betterfoliage.blocks=Block Types betterfoliage.blocks.tooltip=Configure lists of block classes that will have specific features applied to them