From 1ff5d4584028668ce39c0d71cfc064ca9716fa1d Mon Sep 17 00:00:00 2001 From: octarine-noise Date: Tue, 29 Mar 2016 22:28:49 +0200 Subject: [PATCH] fixed X-ray glitch caused by Round Logs being reported as opaqe blocks --- .../mods/betterfoliage/BetterFoliageMod.kt | 4 ++-- .../kotlin/mods/betterfoliage/client/Hooks.kt | 9 ++++++++- .../betterfoliage/loader/BetterFoliageCore.kt | 19 ++++++++++++++----- .../kotlin/mods/betterfoliage/loader/Refs.kt | 5 +++-- 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/mods/betterfoliage/BetterFoliageMod.kt b/src/main/kotlin/mods/betterfoliage/BetterFoliageMod.kt index 9af5bc9..2c230d1 100644 --- a/src/main/kotlin/mods/betterfoliage/BetterFoliageMod.kt +++ b/src/main/kotlin/mods/betterfoliage/BetterFoliageMod.kt @@ -28,7 +28,7 @@ object BetterFoliageMod { const val GUI_FACTORY = "mods.betterfoliage.client.gui.ConfigGuiFactory" lateinit var log: Logger - lateinit var config: Configuration + var config: Configuration? = null @JvmStatic @Mod.InstanceFactory @@ -45,7 +45,7 @@ object BetterFoliageMod { @Mod.EventHandler fun postInit(event: FMLPostInitializationEvent) { if (FMLCommonHandler.instance().effectiveSide == Side.CLIENT) { - Config.attach(config) + Config.attach(config!!) Client.log(INFO, "BetterFoliage initialized") } } diff --git a/src/main/kotlin/mods/betterfoliage/client/Hooks.kt b/src/main/kotlin/mods/betterfoliage/client/Hooks.kt index 3f34d9e..f9ffe29 100644 --- a/src/main/kotlin/mods/betterfoliage/client/Hooks.kt +++ b/src/main/kotlin/mods/betterfoliage/client/Hooks.kt @@ -2,6 +2,7 @@ @file:SideOnly(Side.CLIENT) package mods.betterfoliage.client +import mods.betterfoliage.BetterFoliageMod import mods.betterfoliage.client.config.Config import mods.betterfoliage.client.render.EntityFallingLeavesFX import mods.betterfoliage.client.render.EntityRisingSoulFX @@ -26,10 +27,16 @@ import net.minecraftforge.common.MinecraftForge import net.minecraftforge.fml.relauncher.Side import net.minecraftforge.fml.relauncher.SideOnly -fun shouldRenderBlockSideOverride(original: Boolean, blockAccess: IBlockAccess, pos: BlockPos, side: EnumFacing): Boolean { +fun doesSideBlockRenderingOverride(original: Boolean, blockAccess: IBlockAccess, pos: BlockPos, side: EnumFacing): Boolean { return original && !(Config.enabled && Config.roundLogs.enabled && Config.blocks.logs.matchesID(blockAccess.getBlockState(pos).block)); } +fun isOpaqueCubeOverride(original: Boolean, state: IBlockState): Boolean { + // caution: blocks are initialized and the method called before any mods are loaded + if (BetterFoliageMod.config == null) return original + return original && !(Config.enabled && Config.roundLogs.enabled && Config.blocks.logs.matchesID(state.block)) +} + fun getAmbientOcclusionLightValueOverride(original: Float, state: IBlockState): Float { if (Config.enabled && Config.roundLogs.enabled && Config.blocks.logs.matchesID(state.block)) return Config.roundLogs.dimming; return original; diff --git a/src/main/kotlin/mods/betterfoliage/loader/BetterFoliageCore.kt b/src/main/kotlin/mods/betterfoliage/loader/BetterFoliageCore.kt index 664a5df..cce1927 100644 --- a/src/main/kotlin/mods/betterfoliage/loader/BetterFoliageCore.kt +++ b/src/main/kotlin/mods/betterfoliage/loader/BetterFoliageCore.kt @@ -40,8 +40,7 @@ class BetterFoliageTransformer : Transformer() { // where: BlockStateContainer$StateImplementation.getAmbientOcclusionLightValue() // what: invoke BF code to overrule AO transparency value - // why: allows us to have light behave properly on non-solid log blocks without - // messing with isOpaqueBlock(), which could have gameplay effects + // why: allows us to have light behave properly on non-solid log blocks transformMethod(Refs.getAmbientOcclusionLightValue) { find(FRETURN)?.insertBefore { log.info("Applying getAmbientOcclusionLightValue() override") @@ -63,18 +62,28 @@ class BetterFoliageTransformer : Transformer() { // where: BlockStateContainer$StateImplementation.doesSideBlockRendering() // what: invoke BF code to overrule condition - // why: allows us to make log blocks non-solid without - // messing with isOpaqueBlock(), which could have gameplay effects + // why: allows us to make log blocks non-solid transformMethod(Refs.doesSideBlockRendering) { find(IRETURN)?.insertBefore { log.info("Applying doesSideBlockRendering() override") varinsn(ALOAD, 1) varinsn(ALOAD, 2) varinsn(ALOAD, 3) - invokeStatic(Refs.shouldRenderBlockSideOverride) + invokeStatic(Refs.doesSideBlockRenderingOverride) } ?: log.warn("Failed to apply doesSideBlockRendering() override!") } + // where: BlockStateContainer$StateImplementation.isOpaqueCube() + // what: invoke BF code to overrule condition + // why: allows us to make log blocks non-solid + transformMethod(Refs.isOpaqueCube) { + find(IRETURN)?.insertBefore { + log.info("Applying isOpaqueCube() override") + varinsn(ALOAD, 0) + invokeStatic(Refs.isOpaqueCubeOverride) + } ?: log.warn("Failed to apply isOpaqueCube() override!") + } + // where: ModelLoader.setupModelRegistry(), right before the textures are loaded // what: invoke handler code with ModelLoader instance // why: allows us to iterate the unbaked models in ModelLoader in time to register textures diff --git a/src/main/kotlin/mods/betterfoliage/loader/Refs.kt b/src/main/kotlin/mods/betterfoliage/loader/Refs.kt index 77a7478..f2f9047 100644 --- a/src/main/kotlin/mods/betterfoliage/loader/Refs.kt +++ b/src/main/kotlin/mods/betterfoliage/loader/Refs.kt @@ -32,8 +32,8 @@ object Refs { val canRenderInLayer = MethodRef(Block, "canRenderInLayer", ClassRef.boolean, BlockRenderLayer) val getAmbientOcclusionLightValue = MethodRef(StateImplementation, "getAmbientOcclusionLightValue", "func_185892_j", "j", ClassRef.float) val useNeighborBrightness = MethodRef(StateImplementation, "useNeighborBrightness", "func_185916_f", "f", ClassRef.boolean) - val shouldSideBeRendered = MethodRef(StateImplementation, "shouldSideBeRendered", "func_185894_c", "c", ClassRef.boolean, IBlockAccess, BlockPos, EnumFacing) val doesSideBlockRendering = MethodRef(StateImplementation, "doesSideBlockRendering", ClassRef.boolean, IBlockAccess, BlockPos, EnumFacing) + val isOpaqueCube = MethodRef(StateImplementation, "isOpaqueCube", "", "p", ClassRef.boolean) val randomDisplayTick = MethodRef(Block, "randomDisplayTick", "func_180655_c", "c", ClassRef.void, World, BlockPos, IBlockState, Random) val BlockModelRenderer = ClassRef("net.minecraft.client.renderer.BlockModelRenderer", "boe") @@ -70,7 +70,8 @@ object Refs { val BetterFoliageHooks = ClassRef("mods.betterfoliage.client.Hooks") val getAmbientOcclusionLightValueOverride = MethodRef(BetterFoliageHooks, "getAmbientOcclusionLightValueOverride", ClassRef.float, ClassRef.float, IBlockState) val useNeighborBrightnessOverride = MethodRef(BetterFoliageHooks, "getUseNeighborBrightnessOverride", ClassRef.boolean, ClassRef.boolean, IBlockState) - val shouldRenderBlockSideOverride = MethodRef(BetterFoliageHooks, "shouldRenderBlockSideOverride", ClassRef.boolean, ClassRef.boolean, IBlockAccess, BlockPos, EnumFacing) + val doesSideBlockRenderingOverride = MethodRef(BetterFoliageHooks, "doesSideBlockRenderingOverride", ClassRef.boolean, ClassRef.boolean, IBlockAccess, BlockPos, EnumFacing) + val isOpaqueCubeOverride = MethodRef(BetterFoliageHooks, "isOpaqueCubeOverride", ClassRef.boolean, ClassRef.boolean, IBlockState) val onRandomDisplayTick = MethodRef(BetterFoliageHooks, "onRandomDisplayTick", ClassRef.void, World, IBlockState, BlockPos) val onAfterLoadModelDefinitions = MethodRef(BetterFoliageHooks, "onAfterLoadModelDefinitions", ClassRef.void, ModelLoader) val renderWorldBlock = MethodRef(BetterFoliageHooks, "renderWorldBlock", ClassRef.boolean, BlockRendererDispatcher, IBlockState, BlockPos, IBlockAccess, VertexBuffer, BlockRenderLayer)