From 83e534444893be7cde5675ab0f48c037444a47a2 Mon Sep 17 00:00:00 2001 From: johni0702 Date: Wed, 5 Aug 2015 11:42:43 +0200 Subject: [PATCH] Replace camera roll CT with mixin magic --- .../replaymod/coremod/CameraRollCT.java | 82 ------------------- .../replaymod/coremod/LoadingPlugin.java | 1 - .../replaymod/mixin/MixinEntityRenderer.java | 13 +++ 3 files changed, 13 insertions(+), 83 deletions(-) delete mode 100644 src/main/java/eu/crushedpixel/replaymod/coremod/CameraRollCT.java diff --git a/src/main/java/eu/crushedpixel/replaymod/coremod/CameraRollCT.java b/src/main/java/eu/crushedpixel/replaymod/coremod/CameraRollCT.java deleted file mode 100644 index b09310fe..00000000 --- a/src/main/java/eu/crushedpixel/replaymod/coremod/CameraRollCT.java +++ /dev/null @@ -1,82 +0,0 @@ -package eu.crushedpixel.replaymod.coremod; - -import net.minecraft.launchwrapper.IClassTransformer; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.tree.*; - -import java.util.ListIterator; - -import static org.objectweb.asm.Opcodes.*; - -public class CameraRollCT implements IClassTransformer { - - private static final String REPLAY_HANDLER = "eu/crushedpixel/replaymod/replay/ReplayHandler"; - private static final String CLASS_NAME = "net.minecraft.client.renderer.EntityRenderer"; - - @Override - public byte[] transform(String name, String transformedName, byte[] bytes) { - if (CLASS_NAME.equals(transformedName)) { - return transform(bytes, name.equals(transformedName) ? "orientCamera" : "g"); - } - return bytes; - } - - private byte[] transform(byte[] bytes, String name_orientCamera) { - ClassReader classReader = new ClassReader(bytes); - ClassNode classNode = new ClassNode(); - classReader.accept(classNode, 0); - - boolean success = false; - for (MethodNode m : classNode.methods) { - if ("(F)V".equals(m.desc) && name_orientCamera.equals(m.name)) { - ListIterator iter = m.instructions.iterator(); - int f = 0; - while (iter.hasNext()) { - AbstractInsnNode node = iter.next(); - if ((f == 0 || f == 1) && node.getOpcode() == FCONST_0) { - f++; - } else if ((f == 2) && node instanceof LdcInsnNode && ((LdcInsnNode) node).cst.equals(-0.1f)) { - f++; - } else if (f == 3) { - inject(iter); - success = true; - break; - } else { - f = 0; - } - } - } - } - if (!success) { - throw new NoSuchMethodError(); - } - - ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS); - classNode.accept(classWriter); - return classWriter.toByteArray(); - } - - /** - * public void orientCamera(float f) { - * ... - * if (ReplayHandler.isInReplay()) { - * GL11.glRotated(ReplayHandler.getCameraTilt(), 0, 0, 1); - * } - * ... - * } - */ - private void inject(ListIterator iter) { - LabelNode l = new LabelNode(); - iter.add(new MethodInsnNode(INVOKESTATIC, REPLAY_HANDLER, "isInReplay", "()Z", false)); - iter.add(new JumpInsnNode(IFEQ, l)); - iter.add(new MethodInsnNode(INVOKESTATIC, REPLAY_HANDLER, "getCameraTilt", "()F", false)); - iter.add(new InsnNode(F2D)); - iter.add(new LdcInsnNode(0D)); - iter.add(new LdcInsnNode(0D)); - iter.add(new LdcInsnNode(1D)); - iter.add(new MethodInsnNode(INVOKESTATIC, "org/lwjgl/opengl/GL11", "glRotated", "(DDDD)V", false)); - iter.add(l); - System.out.println("REPLAY MOD CORE PATCHER: Patched EntityRenderer.orientCamera(F) method"); - } -} diff --git a/src/main/java/eu/crushedpixel/replaymod/coremod/LoadingPlugin.java b/src/main/java/eu/crushedpixel/replaymod/coremod/LoadingPlugin.java index cb3d61b8..abc48483 100755 --- a/src/main/java/eu/crushedpixel/replaymod/coremod/LoadingPlugin.java +++ b/src/main/java/eu/crushedpixel/replaymod/coremod/LoadingPlugin.java @@ -40,7 +40,6 @@ public class LoadingPlugin implements IFMLLoadingPlugin { @Override public String[] getASMTransformerClass() { return new String[]{ - CameraRollCT.class.getName(), ForceChunkLoadingCT.class.getName(), NoNameTagCT.class.getName(), SoundManagerCT.class.getName(), diff --git a/src/main/java/eu/crushedpixel/replaymod/mixin/MixinEntityRenderer.java b/src/main/java/eu/crushedpixel/replaymod/mixin/MixinEntityRenderer.java index 6a8072e9..61431e5e 100644 --- a/src/main/java/eu/crushedpixel/replaymod/mixin/MixinEntityRenderer.java +++ b/src/main/java/eu/crushedpixel/replaymod/mixin/MixinEntityRenderer.java @@ -234,4 +234,17 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti GlStateManager.translate(0.0F, 0.0F, 0.1F); } } + + + /* + * Misc + */ + + + @Inject(method = "orientCamera", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/GlStateManager;translate(FFF)V", shift = At.Shift.AFTER, ordinal = 3)) + private void setupCameraRoll(float partialTicks, CallbackInfo ci) { + if (ReplayHandler.isInReplay()) { + GL11.glRotated(ReplayHandler.getCameraTilt(), 0D, 0D, 1D); + } + } }