diff --git a/build.gradle b/build.gradle index 2188e0c..55a3824 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ apply plugin: "net.minecraftforge.gradle.forge" apply plugin: 'kotlin' group = 'com.github.octarine-noise' -version = "2.0.11" +version = "2.0.12" archivesBaseName = rootProject.name + '-MC1.8' buildscript { diff --git a/src/main/kotlin/mods/betterfoliage/client/integration/OptifineCTM.kt b/src/main/kotlin/mods/betterfoliage/client/integration/OptifineCTM.kt index dca2352..3e9c035 100644 --- a/src/main/kotlin/mods/betterfoliage/client/integration/OptifineCTM.kt +++ b/src/main/kotlin/mods/betterfoliage/client/integration/OptifineCTM.kt @@ -23,8 +23,13 @@ import org.apache.logging.log4j.Level.INFO @SideOnly(Side.CLIENT) object OptifineCTM { - val isAvailable = allAvailable(Refs.ConnectedTextures, Refs.ConnectedProperties, Refs.getConnectedTexture, - Refs.CTblockProperties, Refs.CTtileProperties, Refs.CPtileIcons, Refs.CPmatchesBlock, Refs.CPmatchesIcon) + val isAvailable = allAvailable( + Refs.ConnectedTextures, Refs.ConnectedProperties, + Refs.getConnectedTexture, + Refs.CTblockProperties, Refs.CTtileProperties, + Refs.CPMatchBlocks, Refs.CPtileIcons, + Refs.matchesBlock, Refs.CPmatchesIcon + ) init { Client.log(INFO, "Optifine CTM support is ${if (isAvailable) "enabled" else "disabled" }") @@ -46,11 +51,15 @@ object OptifineCTM { /** Get all the CTM [TextureAtlasSprite]s that could possibly be used for this block. */ fun getAllCTM(state: IBlockState, icon: TextureAtlasSprite): Collection { val result = hashSetOf() - if (state !is BlockStateBase) return result + if (state !is BlockStateBase || !isAvailable) return result connectedProperties.forEach { cp -> - if (Refs.CPmatchesBlock.invoke(cp, state) as Boolean && - Refs.CPmatchesIcon.invoke(cp, icon) as Boolean) { + val matchesIcon = Refs.CPmatchesIcon.invoke(cp, icon) as Boolean + val matchesBlock = Refs.CPMatchBlocks.get(cp)?.let { matchBlocks -> + Refs.matchesBlock.invokeStatic(state, matchBlocks) as Boolean + } ?: false + + if (matchesBlock && matchesIcon) { Client.log(INFO, "Match for block: ${state.toString()}, icon: ${icon.iconName} -> CP: ${cp.toString()}") result.addAll(Refs.CPtileIcons.get(cp) as Array) } diff --git a/src/main/kotlin/mods/betterfoliage/loader/BetterFoliageCore.kt b/src/main/kotlin/mods/betterfoliage/loader/BetterFoliageCore.kt index a4c14f7..c55ac53 100644 --- a/src/main/kotlin/mods/betterfoliage/loader/BetterFoliageCore.kt +++ b/src/main/kotlin/mods/betterfoliage/loader/BetterFoliageCore.kt @@ -93,15 +93,15 @@ class BetterFoliageTransformer : Transformer() { transformMethod(Refs.rebuildChunk) { find(invokeRef(Refs.renderBlock))?.replace { log.info("Applying RenderChunk block render override") - varinsn(ALOAD, if (isOptifinePresent) 21 else 18) + varinsn(ALOAD, if (isOptifinePresent) 20 else 18) invokeStatic(Refs.renderWorldBlock) } if (isOptifinePresent) { - find(varinsn(ISTORE, 22))?.insertBefore { + find(varinsn(ISTORE, 21))?.insertBefore { log.info("Applying RenderChunk block layer override") insn(POP) varinsn(ALOAD, 17) - varinsn(ALOAD, 21) + varinsn(ALOAD, 20) invokeStatic(Refs.canRenderBlockInLayer) } } else { diff --git a/src/main/kotlin/mods/betterfoliage/loader/Refs.kt b/src/main/kotlin/mods/betterfoliage/loader/Refs.kt index 8ca3a3c..e59ae07 100644 --- a/src/main/kotlin/mods/betterfoliage/loader/Refs.kt +++ b/src/main/kotlin/mods/betterfoliage/loader/Refs.kt @@ -3,6 +3,7 @@ package mods.betterfoliage.loader import mods.octarinecore.metaprog.ClassRef import mods.octarinecore.metaprog.FieldRef import mods.octarinecore.metaprog.MethodRef +import mods.octarinecore.metaprog.array import net.minecraftforge.fml.relauncher.FMLInjectionData /** Singleton object holding references to foreign code elements. */ @@ -88,8 +89,11 @@ object Refs { val CTtileProperties = FieldRef(ConnectedTextures, "tileProperties", null) val ConnectedProperties = ClassRef("ConnectedProperties") + val MatchBlock = ClassRef("MatchBlock") val CPtileIcons = FieldRef(ConnectedProperties, "tileIcons", null) - val CPmatchesBlock = MethodRef(ConnectedProperties, "matchesBlock", ClassRef.boolean, BlockStateBase) + val CPMatchBlocks = FieldRef(ConnectedProperties, "matchBlocks", MatchBlock.array()) + val Matches = ClassRef("Matches") + val matchesBlock = MethodRef(Matches, "block", ClassRef.boolean, BlockStateBase, MatchBlock.array()) val CPmatchesIcon = MethodRef(ConnectedProperties, "matchesIcon", ClassRef.boolean, TextureAtlasSprite) // ShadersMod diff --git a/src/main/kotlin/mods/octarinecore/metaprog/Reflection.kt b/src/main/kotlin/mods/octarinecore/metaprog/Reflection.kt index 293306b..b744ae9 100644 --- a/src/main/kotlin/mods/octarinecore/metaprog/Reflection.kt +++ b/src/main/kotlin/mods/octarinecore/metaprog/Reflection.kt @@ -89,6 +89,14 @@ class ClassRefPrimitive(name: String, val clazz: Class<*>?) : ClassRef(name) { override fun resolve() = clazz } +class ClassRefArray(mcpName: String, obfName: String) : ClassRef(mcpName, obfName) { + constructor(mcpName: String) : this(mcpName, mcpName) + override fun asmDescriptor(namespace: Namespace) = "[" + super.asmDescriptor(namespace) + override fun resolve() = listOf(mcpName, obfName).map { getJavaClass("[L$it;") }.filterNotNull().firstOrNull() +} + +fun ClassRef.array() = ClassRefArray(mcpName, obfName) + /** * Reference to a method. *