aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me/djtheredstoner/perspectivemod/asm/transformers/MinecraftTransformer.java
blob: ca1874bcaf838d1e7187ecf5101dc65346d76712 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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;
    }
}