aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me/djtheredstoner/perspectivemod/asm/transformers
diff options
context:
space:
mode:
authorDJtheRedstoner <52044242+DJtheRedstoner@users.noreply.github.com>2020-09-09 10:15:38 -0400
committerDJtheRedstoner <52044242+DJtheRedstoner@users.noreply.github.com>2020-09-09 10:16:13 -0400
commitbed926539ae75971011a44a7022b215ab9ffcf29 (patch)
treea9610603db6f4df60a86f1fb81cf0ecc53b2b552 /src/main/java/me/djtheredstoner/perspectivemod/asm/transformers
parent07c0bb61e381293fc85ecf9ad01ab727e00efb00 (diff)
downloadPerspectiveModv4-bed926539ae75971011a44a7022b215ab9ffcf29.tar.gz
PerspectiveModv4-bed926539ae75971011a44a7022b215ab9ffcf29.tar.bz2
PerspectiveModv4-bed926539ae75971011a44a7022b215ab9ffcf29.zip
Did someone say ASM Rewrite???!!!
Diffstat (limited to 'src/main/java/me/djtheredstoner/perspectivemod/asm/transformers')
-rw-r--r--src/main/java/me/djtheredstoner/perspectivemod/asm/transformers/EntityRendererTransformer.java110
-rw-r--r--src/main/java/me/djtheredstoner/perspectivemod/asm/transformers/MinecraftTransformer.java56
-rw-r--r--src/main/java/me/djtheredstoner/perspectivemod/asm/transformers/RenderManagerTransformer.java72
3 files changed, 238 insertions, 0 deletions
diff --git a/src/main/java/me/djtheredstoner/perspectivemod/asm/transformers/EntityRendererTransformer.java b/src/main/java/me/djtheredstoner/perspectivemod/asm/transformers/EntityRendererTransformer.java
new file mode 100644
index 0000000..dadb1e0
--- /dev/null
+++ b/src/main/java/me/djtheredstoner/perspectivemod/asm/transformers/EntityRendererTransformer.java
@@ -0,0 +1,110 @@
+package me.djtheredstoner.perspectivemod.asm.transformers;
+
+import me.djtheredstoner.perspectivemod.asm.ITransformer;
+import org.objectweb.asm.tree.*;
+
+import java.util.Iterator;
+
+import static org.objectweb.asm.Opcodes.*;
+
+/**
+ * @see net.minecraft.client.renderer.EntityRenderer
+ */
+public class EntityRendererTransformer implements ITransformer {
+
+ private static final String HOOK_CLASS = "me/djtheredstoner/perspectivemod/asm/hooks/EntityRendererHook";
+
+ @Override
+ public String[] getClassName() {
+ return new String[]{"net.minecraft.client.renderer.EntityRenderer"};
+ }
+
+ @Override
+ public void transform(ClassNode classNode, String name) {
+ for (MethodNode method : classNode.methods) {
+ String methodName = mapMethodName(classNode, method);
+
+ if (methodName.equals("orientCamera") || methodName.equals("func_78467_g")) {
+
+ Iterator<AbstractInsnNode> iterator = method.instructions.iterator();
+
+ while (iterator.hasNext()) {
+ AbstractInsnNode next = iterator.next();
+
+ if(next.getOpcode() == GETFIELD) {
+ FieldInsnNode insn = (FieldInsnNode)next;
+
+ String ownerName = mapClassName(insn.owner);
+ String fieldName = mapFieldNameFromNode(insn);
+
+ if(ownerName.equals("net/minecraft/entity/Entity" )&& insn.desc.equals("F")) {
+
+ InsnList insnList = null;
+
+ switch (fieldName) {
+ case "rotationYaw":
+ case "field_70177_z":
+ insnList = insertRotationHook("rotationYaw");
+ break;
+ case "prevRotationYaw":
+ case "field_70126_B":
+ insnList = insertRotationHook("prevRotationYaw");
+ break;
+ case "rotationPitch":
+ case "field_70125_A":
+ insnList = insertRotationHook("rotationPitch");
+ break;
+ case "prevRotationPitch":
+ case "field_70127_C":
+ insnList = insertRotationHook("prevRotationPitch");
+ break;
+ }
+
+ if(insnList != null) {
+ method.instructions.insertBefore(insn, insnList);
+ method.instructions.remove(insn);
+ }
+ }
+ }
+ }
+
+ } else if (methodName.equals("updateCameraAndRender") || methodName.equals("func_181560_a")) {
+
+ Iterator<AbstractInsnNode> iterator = method.instructions.iterator();
+
+ while (iterator.hasNext()) {
+ AbstractInsnNode next = iterator.next();
+
+ if(next.getOpcode() == GETFIELD) {
+ FieldInsnNode insn = (FieldInsnNode)next;
+
+ String ownerName = mapClassName(insn.owner);
+ String fieldName = mapFieldNameFromNode(insn);
+
+ if(ownerName.equals("net/minecraft/client/Minecraft") && (fieldName.equals("inGameHasFocus") || fieldName.equals("field_71415_G")) && insn.desc.equals("Z")
+ && insn.getNext().getNext().getNext().getOpcode() == IFEQ) {
+ method.instructions.insertBefore(insn, insertMouseHook());
+ method.instructions.remove(insn);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public InsnList insertRotationHook(String field) {
+ InsnList list = new InsnList();
+
+ list.add(new MethodInsnNode(INVOKESTATIC, HOOK_CLASS, field + "Hook", "(Lnet/minecraft/entity/Entity;)F", false));
+
+ return list;
+ }
+
+ public InsnList insertMouseHook() {
+ InsnList list = new InsnList();
+
+ list.add(new MethodInsnNode(INVOKESTATIC, HOOK_CLASS, "mouseHook", "(Lnet/minecraft/client/Minecraft;)Z", false));
+
+ return list;
+ }
+}
diff --git a/src/main/java/me/djtheredstoner/perspectivemod/asm/transformers/MinecraftTransformer.java b/src/main/java/me/djtheredstoner/perspectivemod/asm/transformers/MinecraftTransformer.java
new file mode 100644
index 0000000..2a98619
--- /dev/null
+++ b/src/main/java/me/djtheredstoner/perspectivemod/asm/transformers/MinecraftTransformer.java
@@ -0,0 +1,56 @@
+package me.djtheredstoner.perspectivemod.asm.transformers;
+
+import me.djtheredstoner.perspectivemod.asm.ITransformer;
+import org.objectweb.asm.tree.*;
+
+import java.util.Iterator;
+
+import static org.objectweb.asm.Opcodes.*;
+
+/**
+ * @see net.minecraft.client.Minecraft
+ */
+public class MinecraftTransformer implements ITransformer {
+
+ private static final String HOOK_CLASS = "me/djtheredstoner/perspectivemod/asm/hooks/MinecraftHook";
+
+ @Override
+ public String[] getClassName() {
+ return new String[]{"net.minecraft.client.Minecraft"};
+ }
+
+ @Override
+ public void transform(ClassNode classNode, String name) {
+ for (MethodNode method : classNode.methods) {
+ String methodName = mapMethodName(classNode, method);
+
+ if (methodName.equals("runTick") || methodName.equals("func_71407_l")) {
+ Iterator<AbstractInsnNode> iterator = method.instructions.iterator();
+
+ while (iterator.hasNext()) {
+ AbstractInsnNode next = iterator.next();
+
+ if (next.getOpcode() == PUTFIELD) {
+ FieldInsnNode insn = (FieldInsnNode) next;
+
+ String ownerName = mapClassName(insn.owner);
+ String fieldName = mapFieldNameFromNode(insn);
+
+ if (ownerName.equals("net/minecraft/client/settings/GameSettings") && (fieldName.equals("thirdPersonView") || fieldName.equals("field_74320_O")) && insn.desc.equals("I")) {
+ method.instructions.insertBefore(insn, insertThirdPersonHook());
+ method.instructions.remove(insn);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public InsnList insertThirdPersonHook() {
+ InsnList list = new InsnList();
+
+ list.add(new MethodInsnNode(INVOKESTATIC, HOOK_CLASS, "thirdPersonHook", "(Lnet/minecraft/client/settings/GameSettings;I)V", false));
+
+ return list;
+ }
+}
diff --git a/src/main/java/me/djtheredstoner/perspectivemod/asm/transformers/RenderManagerTransformer.java b/src/main/java/me/djtheredstoner/perspectivemod/asm/transformers/RenderManagerTransformer.java
new file mode 100644
index 0000000..fee214a
--- /dev/null
+++ b/src/main/java/me/djtheredstoner/perspectivemod/asm/transformers/RenderManagerTransformer.java
@@ -0,0 +1,72 @@
+package me.djtheredstoner.perspectivemod.asm.transformers;
+
+import me.djtheredstoner.perspectivemod.asm.ITransformer;
+import net.minecraftforge.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper;
+import org.objectweb.asm.tree.*;
+
+import java.util.Iterator;
+
+import static org.objectweb.asm.Opcodes.*;
+
+/**
+ * @see net.minecraft.client.renderer.entity.RenderManager
+ */
+public class RenderManagerTransformer implements ITransformer {
+ private static final String HOOK_CLASS = "me/djtheredstoner/perspectivemod/asm/hooks/RenderManagerHook";
+
+ @Override
+ public String[] getClassName() {
+ return new String[]{"net.minecraft.client.renderer.entity.RenderManager"};
+ }
+
+ @Override
+ public void transform(ClassNode classNode, String name) {
+ for (MethodNode method : classNode.methods) {
+ String methodName = mapMethodName(classNode, method);
+
+ if (methodName.equals("cacheActiveRenderInfo") || methodName.equals("func_180597_a")) {
+ Iterator<AbstractInsnNode> iterator = method.instructions.iterator();
+
+ while (iterator.hasNext()) {
+ AbstractInsnNode next = iterator.next();
+
+ if (next.getOpcode() == PUTFIELD) {
+ FieldInsnNode insn = (FieldInsnNode)next;
+
+ String ownerName = mapClassName(insn.owner);
+ String fieldName = mapFieldNameFromNode(insn);
+
+ if (ownerName.equals("net/minecraft/client/renderer/entity/RenderManager") && insn.desc.equals("F")) {
+
+ InsnList insnList = null;
+
+ switch (fieldName) {
+ case "playerViewX":
+ case "field_78732_j":
+ insnList = insertRotationHook("playerViewX");
+ break;
+ case "playerViewY":
+ case "field_78735_i":
+ insnList = insertRotationHook("playerViewY");
+ break;
+ }
+
+ if(insnList != null) {
+ method.instructions.insertBefore(insn, insnList);
+ method.instructions.remove(insn);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public InsnList insertRotationHook(String field) {
+ InsnList list = new InsnList();
+
+ list.add(new MethodInsnNode(INVOKESTATIC, HOOK_CLASS, field + "Hook", "(Lnet/minecraft/client/renderer/entity/RenderManager;F)V", false));
+
+ return list;
+ }
+}