diff --git a/src/main/java/com/falsepattern/falsetweaks/asm/CoreLoadingPlugin.java b/src/main/java/com/falsepattern/falsetweaks/asm/CoreLoadingPlugin.java index f484d045..3c3d64fb 100644 --- a/src/main/java/com/falsepattern/falsetweaks/asm/CoreLoadingPlugin.java +++ b/src/main/java/com/falsepattern/falsetweaks/asm/CoreLoadingPlugin.java @@ -21,6 +21,7 @@ import com.falsepattern.falsetweaks.config.ModuleConfig; import com.falsepattern.falsetweaks.modules.animfix.AnimFixCompat; import com.falsepattern.falsetweaks.modules.occlusion.OcclusionCompat; +import lombok.Getter; import cpw.mods.fml.relauncher.IFMLLoadingPlugin; @@ -28,6 +29,9 @@ @IFMLLoadingPlugin.TransformerExclusions(Tags.GROUPNAME + ".asm") public class CoreLoadingPlugin implements IFMLLoadingPlugin { + @Getter + private static boolean obfuscated; + static { ModuleConfig.init(); @@ -55,6 +59,7 @@ public String getSetupClass() { @Override public void injectData(Map data) { + obfuscated = (Boolean) data.get("runtimeDeobfuscationEnabled"); //Doing this here because this runs after coremod init, but before minecraft classes start loading and mixins start colliding and crashing. if (ModuleConfig.OCCLUSION_TWEAKS) OcclusionCompat.ArchaicFixCompat.crashIfUnsupportedConfigsAreActive(); diff --git a/src/main/java/com/falsepattern/falsetweaks/asm/FalseTweaksTransformer.java b/src/main/java/com/falsepattern/falsetweaks/asm/FalseTweaksTransformer.java index 9d0f7b7f..4ae89290 100644 --- a/src/main/java/com/falsepattern/falsetweaks/asm/FalseTweaksTransformer.java +++ b/src/main/java/com/falsepattern/falsetweaks/asm/FalseTweaksTransformer.java @@ -21,16 +21,21 @@ import com.falsepattern.falsetweaks.asm.modules.occlusion.optifine.RenderGlobalDeOptimizer; import com.falsepattern.falsetweaks.asm.modules.threadedupdates.Threading_RenderBlocksASM; import com.falsepattern.falsetweaks.config.ModuleConfig; +import com.falsepattern.lib.asm.ASMUtil; import com.falsepattern.lib.asm.IClassNodeTransformer; import com.falsepattern.lib.asm.SmartTransformer; import com.falsepattern.lib.optifine.OptiFineTransformerHooks; import lombok.Getter; import lombok.experimental.Accessors; +import lombok.val; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassWriter; import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; import java.util.List; @Getter @@ -47,5 +52,39 @@ public class FalseTweaksTransformer implements SmartTransformer { } } + @Override + public byte[] transform(String name, String transformedName, byte[] bytes) { + if (bytes == null) { + return null; + } + val transformers = new ArrayList(); + val cn = ASMUtil.parseClass(bytes, 0); + for (val transformer : transformers()) { + if (transformer.shouldTransform(cn, transformedName, CoreLoadingPlugin.isObfuscated())) { + transformers.add(transformer); + } + } + if (transformers.isEmpty()) { + return bytes; + } + transformers.sort(Comparator.comparingInt(IClassNodeTransformer::internalSortingOrder)); + val log = logger(); + for (val transformer : transformers) { + log.debug("Patching {} with {}...", transformedName, transformer.getName()); + try { + transformer.transform(cn, transformedName, CoreLoadingPlugin.isObfuscated()); + } catch (RuntimeException | Error t) { + log.error("Error transforming {} with {}: {}", transformedName, transformer.getName(), t.getMessage()); + throw t; + } catch (Throwable t) { + log.error("Error transforming {} with {}: {}", transformedName, transformer.getName(), t.getMessage()); + throw new RuntimeException(t); + } + } + val result = ASMUtil.serializeClass(cn, 0); + log.debug("Patched {} successfully.", transformedName); + return result; + } + private final List transformers = TRANSFORMERS; } diff --git a/src/main/java/com/falsepattern/falsetweaks/asm/modules/threadedupdates/Threading_RenderBlocksASM.java b/src/main/java/com/falsepattern/falsetweaks/asm/modules/threadedupdates/Threading_RenderBlocksASM.java index 34a1b18a..f514e2ca 100644 --- a/src/main/java/com/falsepattern/falsetweaks/asm/modules/threadedupdates/Threading_RenderBlocksASM.java +++ b/src/main/java/com/falsepattern/falsetweaks/asm/modules/threadedupdates/Threading_RenderBlocksASM.java @@ -61,6 +61,7 @@ private void transformRenderBlockByRenderType(ClassNode cn) { list.add(new InsnNode(Opcodes.ISUB)); list.add(new InsnNode(Opcodes.IRETURN)); list.add(lbl); + list.add(new FrameNode(Opcodes.F_SAME1, 0, null, 1, new Object[]{"I"})); list.add(new InsnNode(Opcodes.POP)); } }