Replace camera roll CT with mixin magic
This commit is contained in:
@@ -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<AbstractInsnNode> 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<AbstractInsnNode> 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");
|
||||
}
|
||||
}
|
||||
@@ -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(),
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user