net.cazzar.corelib.asm.transformers.PositionedSoundRecord.java Source code

Java tutorial

Introduction

Here is the source code for net.cazzar.corelib.asm.transformers.PositionedSoundRecord.java

Source

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2014 Cayde Dixon
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package net.cazzar.corelib.asm.transformers;

import net.cazzar.corelib.asm.MethodTransformer;
import org.objectweb.asm.Label;
import org.objectweb.asm.tree.*;

import static org.objectweb.asm.Opcodes.*;

@SuppressWarnings("UnusedDeclaration")
public class PositionedSoundRecord extends MethodTransformer {
    static {
        addMapping("volume", "field_147662_b");
        addMapping("pitch", "field_147663_c");
        addMapping("xPosF", "field_147660_d");
        addMapping("yPosF", "field_147661_e");
        addMapping("zPosF", "field_147658_f");
        addMapping("field_147665_h", "field_147665_h");
        addMapping("field_147666_i", "field_147666_i");
    }

    public PositionedSoundRecord() {
        addClass("net.minecraft.client.audio.PositionedSound");
    }

    @SuppressWarnings("OverlyLongMethod")
    @Override
    public void transform(ClassNode node, String transformedName) {
        MethodNode mtd = new MethodNode(ACC_PUBLIC, "hashCode", "()I", null, new String[0]);
        //        mtd.name = "hashCode";
        //        mtd.desc = "()I";

        InsnList insns = new InsnList();
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "volume", "F"));
        insns.add(new InsnNode(FCONST_0));
        insns.add(new InsnNode(FCMPL));
        LabelNode l1 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(IFEQ, l1));
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "volume", "F"));
        insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "floatToIntBits", "(F)I", false));
        LabelNode l2 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(GOTO, l2));
        insns.add(l1);
        insns.add(new FrameNode(F_SAME, 0, null, 0, null));
        insns.add(new InsnNode(ICONST_0));
        insns.add(l2);
        insns.add(new VarInsnNode(ISTORE, 1));
        insns.add(new IntInsnNode(BIPUSH, 31));
        insns.add(new VarInsnNode(ILOAD, 1));
        insns.add(new InsnNode(IMUL));
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147663_c", "F"));
        insns.add(new InsnNode(FCONST_0));
        insns.add(new InsnNode(FCMPL));
        LabelNode l5 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(IFEQ, l5));
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147663_c", "F"));
        insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "floatToIntBits", "(F)I", false));
        LabelNode l6 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(GOTO, l6));
        insns.add(l5);
        insns.add(new FrameNode(F_SAME1, 0, null, 1, new Object[] { INTEGER }));
        insns.add(new InsnNode(ICONST_0));
        insns.add(l6);
        insns.add(new FrameNode(F_FULL, 2, new Object[] { "net/minecraft/client/audio/PositionedSound", INTEGER },
                2, new Object[] { INTEGER, INTEGER }));
        insns.add(new InsnNode(IADD));
        insns.add(new VarInsnNode(ISTORE, 1));
        insns.add(new IntInsnNode(BIPUSH, 31));
        insns.add(new VarInsnNode(ILOAD, 1));
        insns.add(new InsnNode(IMUL));
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "xPosF", "F"));
        insns.add(new InsnNode(FCONST_0));
        insns.add(new InsnNode(FCMPL));
        LabelNode l8 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(IFEQ, l8));
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "xPosF", "F"));
        insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "floatToIntBits", "(F)I", false));
        LabelNode l9 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(GOTO, l9));
        insns.add(l8);
        insns.add(new FrameNode(F_SAME1, 0, null, 1, new Object[] { INTEGER }));
        insns.add(new InsnNode(ICONST_0));
        insns.add(l9);
        insns.add(new FrameNode(F_FULL, 2, new Object[] { "net/minecraft/client/audio/PositionedSound", INTEGER },
                2, new Object[] { INTEGER, INTEGER }));
        insns.add(new InsnNode(IADD));
        insns.add(new VarInsnNode(ISTORE, 1));
        insns.add(new IntInsnNode(BIPUSH, 31));
        insns.add(new VarInsnNode(ILOAD, 1));
        insns.add(new InsnNode(IMUL));
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "yPosF", "F"));
        insns.add(new InsnNode(FCONST_0));
        insns.add(new InsnNode(FCMPL));
        LabelNode l11 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(IFEQ, l11));
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "yPosF", "F"));
        insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "floatToIntBits", "(F)I", false));
        LabelNode l12 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(GOTO, l12));
        insns.add(l11);
        insns.add(new FrameNode(F_SAME1, 0, null, 1, new Object[] { INTEGER }));
        insns.add(new InsnNode(ICONST_0));
        insns.add(l12);
        insns.add(new FrameNode(F_FULL, 2, new Object[] { "net/minecraft/client/audio/PositionedSound", INTEGER },
                2, new Object[] { INTEGER, INTEGER }));
        insns.add(new InsnNode(IADD));
        insns.add(new VarInsnNode(ISTORE, 1));
        insns.add(new IntInsnNode(BIPUSH, 31));
        insns.add(new VarInsnNode(ILOAD, 1));
        insns.add(new InsnNode(IMUL));
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "zPosF", "F"));
        insns.add(new InsnNode(FCONST_0));
        insns.add(new InsnNode(FCMPL));
        LabelNode l14 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(IFEQ, l14));
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "zPosF", "F"));
        insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "floatToIntBits", "(F)I", false));
        LabelNode l15 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(GOTO, l15));
        insns.add(l14);
        insns.add(new FrameNode(F_SAME1, 0, null, 1, new Object[] { INTEGER }));
        insns.add(new InsnNode(ICONST_0));
        insns.add(l15);
        insns.add(new FrameNode(F_FULL, 2, new Object[] { "net/minecraft/client/audio/PositionedSound", INTEGER },
                2, new Object[] { INTEGER, INTEGER }));
        insns.add(new InsnNode(IADD));
        insns.add(new VarInsnNode(ISTORE, 1));
        insns.add(new IntInsnNode(BIPUSH, 31));
        insns.add(new VarInsnNode(ILOAD, 1));
        insns.add(new InsnNode(IMUL));
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "repeat", "Z"));
        LabelNode l17 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(IFEQ, l17));
        insns.add(new InsnNode(ICONST_1));
        LabelNode l18 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(GOTO, l18));
        insns.add(l17);
        insns.add(new FrameNode(F_SAME1, 0, null, 1, new Object[] { INTEGER }));
        insns.add(new InsnNode(ICONST_0));
        insns.add(l18);
        insns.add(new FrameNode(F_FULL, 2, new Object[] { "net/minecraft/client/audio/PositionedSound", INTEGER },
                2, new Object[] { INTEGER, INTEGER }));
        insns.add(new InsnNode(IADD));
        insns.add(new VarInsnNode(ISTORE, 1));
        insns.add(new IntInsnNode(BIPUSH, 31));
        insns.add(new VarInsnNode(ILOAD, 1));
        insns.add(new InsnNode(IMUL));
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147665_h", "I"));
        insns.add(new InsnNode(IADD));
        insns.add(new VarInsnNode(ISTORE, 1));
        insns.add(new IntInsnNode(BIPUSH, 31));
        insns.add(new VarInsnNode(ILOAD, 1));
        insns.add(new InsnNode(IMUL));
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147666_i",
                "Lnet/minecraft/client/audio/ISound$AttenuationType;"));
        insns.add(new MethodInsnNode(INVOKEVIRTUAL, "net/minecraft/client/audio/ISound$AttenuationType", "hashCode",
                "()I", false));
        insns.add(new InsnNode(IADD));
        insns.add(new VarInsnNode(ISTORE, 1));
        insns.add(new VarInsnNode(ILOAD, 1));
        insns.add(new InsnNode(IRETURN));
        mtd.instructions.add(transformInsns(insns));

        node.methods.add(mtd);

        mtd = new MethodNode(ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, new String[0]);

        insns = new InsnList();
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new VarInsnNode(ALOAD, 1));
        l1 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(IF_ACMPNE, l1));
        insns.add(new InsnNode(ICONST_1));
        insns.add(new InsnNode(IRETURN));
        insns.add(l1);
        insns.add(new FrameNode(F_SAME, 0, null, 0, null));
        insns.add(new VarInsnNode(ALOAD, 1));
        insns.add(new TypeInsnNode(INSTANCEOF, "net/minecraft/client/audio/PositionedSound"));
        l2 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(IFNE, l2));
        insns.add(new InsnNode(ICONST_0));
        insns.add(new InsnNode(IRETURN));
        insns.add(l2);
        insns.add(new FrameNode(F_SAME, 0, null, 0, null));
        insns.add(new VarInsnNode(ALOAD, 1));
        insns.add(new TypeInsnNode(CHECKCAST, "net/minecraft/client/audio/PositionedSound"));
        insns.add(new VarInsnNode(ASTORE, 2));
        insns.add(new VarInsnNode(ALOAD, 2));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147663_c", "F"));
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147663_c", "F"));
        insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "compare", "(FF)I", false));
        LabelNode l4 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(IFEQ, l4));
        insns.add(new InsnNode(ICONST_0));
        insns.add(new InsnNode(IRETURN));
        insns.add(
                new FrameNode(F_APPEND, 1, new Object[] { "net/minecraft/client/audio/PositionedSound" }, 0, null));
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147665_h", "I"));
        insns.add(new VarInsnNode(ALOAD, 2));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147665_h", "I"));
        l5 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(IF_ICMPEQ, l5));
        insns.add(new InsnNode(ICONST_0));
        insns.add(new InsnNode(IRETURN));
        insns.add(l5);
        insns.add(new FrameNode(F_SAME, 0, null, 0, null));
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "volume", "F"));
        insns.add(new VarInsnNode(ALOAD, 2));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "volume", "F"));
        insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "compare", "(FF)I", false));
        LabelNode l7 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(IFEQ, l7));
        insns.add(new InsnNode(ICONST_0));
        insns.add(new InsnNode(IRETURN));
        insns.add(l7);
        insns.add(new FrameNode(F_SAME, 0, null, 0, null));
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "xPosF", "F"));
        insns.add(new VarInsnNode(ALOAD, 2));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "xPosF", "F"));
        insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "compare", "(FF)I", false));
        l7 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(IFEQ, l7));
        insns.add(new InsnNode(ICONST_0));
        insns.add(new InsnNode(IRETURN));
        insns.add(l7);
        insns.add(new FrameNode(F_SAME, 0, null, 0, null));
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "yPosF", "F"));
        insns.add(new VarInsnNode(ALOAD, 2));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "yPosF", "F"));
        insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "compare", "(FF)I", false));
        l7 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(IFEQ, l7));
        insns.add(new InsnNode(ICONST_0));
        insns.add(new InsnNode(IRETURN));
        insns.add(l7);
        insns.add(new FrameNode(F_SAME, 0, null, 0, null));
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "zPosF", "F"));
        insns.add(new VarInsnNode(ALOAD, 2));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "zPosF", "F"));
        insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "compare", "(FF)I", false));
        l7 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(IFEQ, l7));
        insns.add(new InsnNode(ICONST_0));
        insns.add(new InsnNode(IRETURN));
        insns.add(l7);

        //        insns.add(new FrameNode(F_SAME, 0, null, 0, null));
        //        insns.add(new VarInsnNode(ALOAD, 0));
        //        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147664_a", "Lnet/minecraft/util/ResourceLocation;"));
        //        insns.add(new VarInsnNode(ALOAD, 2));
        //        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147664_a", "Lnet/minecraft/util/ResourceLocation;"));
        //        insns.add(new MethodInsnNode(INVOKEVIRTUAL, "net/minecraft/util/ResourceLocation", "equals", "(Ljava/lang/Object;)Z"));
        //        l7 = new LabelNode(new Label());
        //        insns.add(new JumpInsnNode(IFNE, l7));
        //        insns.add(new InsnNode(ICONST_0));
        //        insns.add(new InsnNode(IRETURN));
        //        insns.add(l7 );

        insns.add(new FrameNode(F_SAME, 0, null, 0, null));
        insns.add(new VarInsnNode(ALOAD, 0));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147666_i",
                "Lnet/minecraft/client/audio/ISound$AttenuationType;"));
        insns.add(new VarInsnNode(ALOAD, 2));
        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147666_i",
                "Lnet/minecraft/client/audio/ISound$AttenuationType;"));
        l7 = new LabelNode(new Label());
        insns.add(new JumpInsnNode(IF_ACMPEQ, l7));
        insns.add(new InsnNode(ICONST_0));
        insns.add(new InsnNode(IRETURN));
        insns.add(l7);
        insns.add(new InsnNode(ICONST_1));
        insns.add(new InsnNode(IRETURN));

        mtd.instructions.add(transformInsns(insns));
    }
}