From ae2fd8a3688e3cb97904bca9411e5de32c742cc7 Mon Sep 17 00:00:00 2001 From: sjcl Date: Thu, 15 Jun 2017 10:47:06 +0900 Subject: [PATCH] Fix TileEntityVisitor --- .../mc/signpic/asm/ASMDeobfNames.java | 1 + .../signpic/asm/SignPictureTransformer.java | 9 ++++ .../mc/signpic/asm/TileEntityVisitor.java | 54 +++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 src/main/java/com/kamesuta/mc/signpic/asm/TileEntityVisitor.java diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/ASMDeobfNames.java b/src/main/java/com/kamesuta/mc/signpic/asm/ASMDeobfNames.java index 37e4a4ef..02543a1a 100644 --- a/src/main/java/com/kamesuta/mc/signpic/asm/ASMDeobfNames.java +++ b/src/main/java/com/kamesuta/mc/signpic/asm/ASMDeobfNames.java @@ -5,6 +5,7 @@ import com.kamesuta.mc.signpic.asm.lib.RefName; public class ASMDeobfNames { + public static final @Nonnull RefName TileEntityGetRenderBoundingBox = RefName.deobName("getRenderBoundingBox", "func_184177_bl"); public static final @Nonnull RefName GuiNewChatDrawnChatLines = RefName.deobName("field_146253_i", "field_146253_i"); public static final @Nonnull RefName GuiScreenHandleInput = RefName.deobName("handleInput", "func_146269_k"); public static final @Nonnull RefName FontRendererDrawStringWithShadow = RefName.deobName("drawStringWithShadow", "func_78261_a"); diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureTransformer.java b/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureTransformer.java index 46dcfe9b..1d0e7384 100644 --- a/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureTransformer.java +++ b/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureTransformer.java @@ -18,6 +18,15 @@ public class SignPictureTransformer implements IClassTransformer { if (bytes==null||name==null||transformedName==null) return bytes; + if (transformedName.equals("net.minecraft.tileentity.TileEntity")) + return VisitorHelper.apply(bytes, name, new TransformProvider(ClassWriter.COMPUTE_FRAMES) { + @Override + public ClassVisitor createVisitor(final String name, final ClassVisitor cv) { + Log.log.info(String.format("Patching TileEntity.getRenderBoundingBox (class: %s)", name)); + return new TileEntityVisitor(name, cv); + } + }); + if (transformedName.equals("net.minecraft.client.gui.GuiScreenBook")) return VisitorHelper.apply(bytes, name, new TransformProvider(ClassWriter.COMPUTE_FRAMES) { @Override diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/TileEntityVisitor.java b/src/main/java/com/kamesuta/mc/signpic/asm/TileEntityVisitor.java new file mode 100644 index 00000000..ae076291 --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/asm/TileEntityVisitor.java @@ -0,0 +1,54 @@ +package com.kamesuta.mc.signpic.asm; + +import javax.annotation.Nullable; + +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.Label; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; + +import com.kamesuta.mc.signpic.asm.lib.DescHelper; +import com.kamesuta.mc.signpic.asm.lib.MethodMatcher; + +public class TileEntityVisitor extends ClassVisitor { + private static class HookMethodVisitor extends MethodVisitor { + public HookMethodVisitor(final @Nullable MethodVisitor mv) { + super(Opcodes.ASM5, mv); + } + + @Override + public void visitCode() { + super.visitCode(); + /* + * 0 aload_0 [this] + * 1 instanceof net.minecraft.tileentity.TileEntitySign [3] + * 4 ifeq 11 + * 7 getstatic net.minecraft.tileentity.TileEntity.INFINITE_EXTENT_AABB : net.minecraft.util.math.AxisAlignedBB [16] + * 10 areturn + * 11 aload_0 [this] + */ + visitVarInsn(Opcodes.ALOAD, 0); + visitTypeInsn(Opcodes.INSTANCEOF, "net/minecraft/tileentity/TileEntitySign"); + final Label skipReturn = new Label(); + visitJumpInsn(Opcodes.IFEQ, skipReturn); + visitFieldInsn(Opcodes.GETSTATIC, "net/minecraft/tileentity/TileEntity", "INFINITE_EXTENT_AABB", DescHelper.toDesc("net.minecraft.util.math.AxisAlignedBB")); + visitInsn(Opcodes.ARETURN); + visitLabel(skipReturn); + } + } + + private final MethodMatcher matcher; + + public TileEntityVisitor(final String obfClassName, final ClassVisitor cv) { + super(Opcodes.ASM5, cv); + this.matcher = new MethodMatcher(obfClassName, DescHelper.toDesc("net.minecraft.util.math.AxisAlignedBB", new Object[0]), ASMDeobfNames.TileEntityGetRenderBoundingBox); + } + + @Override + public @Nullable MethodVisitor visitMethod(final int access, final @Nullable String name, final @Nullable String desc, final @Nullable String signature, final @Nullable String[] exceptions) { + final MethodVisitor parent = super.visitMethod(access, name, desc, signature, exceptions); + if (name==null||desc==null) + return parent; + return this.matcher.match(name, desc) ? new HookMethodVisitor(parent) : parent; + } +} \ No newline at end of file