From a16a8a5a38f943c77309f6ecbdce30281acb375a Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 28 Feb 2016 19:39:16 -0500 Subject: [PATCH] Begin moving code to do mapping to core. Write out annotation mapper. --- .../runelite/deob/attributes/Attributes.java | 5 + .../rename/AnnotationMapper.java | 119 + .../deob/deobfuscators/rename/Mapper.java | 199 ++ .../deob/deobfuscators/rename/Rename.java | 173 -- .../java/net/runelite/deob/pool/Class.java | 6 + .../java/net/runelite/deob/pool/Double.java | 6 + .../java/net/runelite/deob/pool/Field.java | 6 + .../java/net/runelite/deob/pool/Float.java | 6 + .../java/net/runelite/deob/pool/Integer.java | 6 + .../runelite/deob/pool/InterfaceMethod.java | 6 + .../java/net/runelite/deob/pool/Long.java | 6 + .../java/net/runelite/deob/pool/Method.java | 6 + .../net/runelite/deob/pool/NameAndType.java | 18 + .../net/runelite/deob/pool/PoolEntry.java | 2 + .../java/net/runelite/deob/pool/String.java | 6 + .../java/net/runelite/deob/pool/UTF8.java | 6 + .../rename/AnnotationMapperTest.java | 28 + .../deobfuscators/rename/MapStaticTest.java | 623 ++--- .../deob/runeloader/MappingImporter.java | 7 +- src/test/resources/injection_v16.json | 2288 +++++++++++++++++ 20 files changed, 3036 insertions(+), 486 deletions(-) create mode 100644 src/main/java/net/runelite/deob/deobfuscators/rename/AnnotationMapper.java create mode 100644 src/main/java/net/runelite/deob/deobfuscators/rename/Mapper.java delete mode 100644 src/main/java/net/runelite/deob/deobfuscators/rename/Rename.java create mode 100644 src/test/java/net/runelite/deob/deobfuscators/rename/AnnotationMapperTest.java create mode 100644 src/test/resources/injection_v16.json diff --git a/src/main/java/net/runelite/deob/attributes/Attributes.java b/src/main/java/net/runelite/deob/attributes/Attributes.java index 158762728d..1411fe5730 100644 --- a/src/main/java/net/runelite/deob/attributes/Attributes.java +++ b/src/main/java/net/runelite/deob/attributes/Attributes.java @@ -146,4 +146,9 @@ public class Attributes element.setValue(value); annotation.addElement(element); } + + public Annotations getAnnotations() + { + return (Annotations) findType(AttributeType.RUNTIMEVISIBLEANNOTATIONS); + } } diff --git a/src/main/java/net/runelite/deob/deobfuscators/rename/AnnotationMapper.java b/src/main/java/net/runelite/deob/deobfuscators/rename/AnnotationMapper.java new file mode 100644 index 0000000000..68e8b51644 --- /dev/null +++ b/src/main/java/net/runelite/deob/deobfuscators/rename/AnnotationMapper.java @@ -0,0 +1,119 @@ +package net.runelite.deob.deobfuscators.rename; + +import net.runelite.deob.ClassFile; +import net.runelite.deob.ClassGroup; +import net.runelite.deob.Field; +import net.runelite.deob.Method; +import net.runelite.deob.attributes.Attributes; +import net.runelite.deob.attributes.annotation.Annotation; +import net.runelite.deob.attributes.annotation.Element; +import net.runelite.deob.signature.Type; + +public class AnnotationMapper +{ + private static final Type EXPORT = new Type("Lnet/runelite/mapping/Export;"); + private static final Type IMPLEMENTS = new Type("Lnet/runelite/mapping/Implements;"); + + private final ClassGroup source, target; + private final ParallelExecutorMapping mapping; + + public AnnotationMapper(ClassGroup source, ClassGroup target, ParallelExecutorMapping mapping) + { + this.source = source; + this.target = target; + this.mapping = mapping; + } + + public void run() + { + int count = 0; + + for (ClassFile c : source.getClasses()) + { + ClassFile other = target.findClass(c.getName()); + + if (other == null) + continue; + + count += run(c, other); + } + + System.out.println("Copied " + count + " annotations"); + } + + private int run(ClassFile from, ClassFile to) + { + int count = 0; + + count += copyAnnotations(from.getAttributes(), to.getAttributes()); + + for (Field f : from.getFields().getFields()) + { + if (!hasCopyableAnnotation(f.getAttributes())) + continue; + + Field other = (Field) mapping.get(f); + if (other == null) + { + assert false; + } + + count += copyAnnotations(f.getAttributes(), other.getAttributes()); + } + + for (Method m : to.getMethods().getMethods()) + { + if (!hasCopyableAnnotation(m.getAttributes())) + continue; + + Method other = (Method) mapping.get(m); + if (other == null) + { + assert false; + } + + count += copyAnnotations(m.getAttributes(), other.getAttributes()); + } + + return count; + } + + private int copyAnnotations(Attributes from, Attributes to) + { + int count = 0; + + if (from.getAnnotations() == null) + return count; + + for (Annotation a : from.getAnnotations().getAnnotations()) + { + if (isCopyable(a)) + { + assert a.getElements().size() == 1; + Element e = a.getElements().get(0); + + to.addAnnotation(a.getType(), e.getType().toString(), e.getValue().copy()); + ++count; + } + } + + return count; + } + + private boolean hasCopyableAnnotation(Attributes a) + { + if (a.getAnnotations() == null) + return false; + + for (Annotation an : a.getAnnotations().getAnnotations()) + if (isCopyable(an)) + return true; + + return false; + } + + private boolean isCopyable(Annotation a) + { + return a.getType().equals(EXPORT) || a.getType().equals(IMPLEMENTS); + } +} diff --git a/src/main/java/net/runelite/deob/deobfuscators/rename/Mapper.java b/src/main/java/net/runelite/deob/deobfuscators/rename/Mapper.java new file mode 100644 index 0000000000..091fe811a1 --- /dev/null +++ b/src/main/java/net/runelite/deob/deobfuscators/rename/Mapper.java @@ -0,0 +1,199 @@ +package net.runelite.deob.deobfuscators.rename; + +import com.google.common.collect.Multimap; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import net.runelite.deob.ClassFile; +import net.runelite.deob.ClassGroup; +import net.runelite.deob.Method; +import net.runelite.deob.attributes.code.Instruction; +import net.runelite.deob.execution.ParallellMappingExecutor; + +public class Mapper +{ + private static final int MAX_CLASSES = 250; + + private final ClassGroup source, target; + private ParallelExecutorMapping mapping; + + public Mapper(ClassGroup source, ClassGroup target) + { + this.source = source; + this.target = target; + } + + public ParallelExecutorMapping getMapping() + { + return mapping; + } + + public void run() + { + ParallelExecutorMapping finalm = new ParallelExecutorMapping(source, target); + + finalm.merge(mapStaticMethods(source, target)); + finalm.merge(mapMethods(source, target)); + finalm.merge(mapPackets(source, target)); + + mapping = finalm; + } + + private ParallelExecutorMapping mapMethods(ClassGroup one, ClassGroup two) + { + List pmes = new ArrayList<>(); + for (int i = -1; i < MAX_CLASSES; ++i) + { + ClassFile c1, c2; + + if (i == -1) + { + c1 = one.findClass("client"); + c2 = two.findClass("client"); + } + else + { + c1 = one.findClass("class" + i); + c2 = two.findClass("class" + i); + } + + if (c1 == null || c2 == null) + continue; + + MethodSignatureMapper msm = new MethodSignatureMapper(); + msm.map(c1, c2); + + Multimap map = msm.getMap(); + for (Method m : map.keySet()) + { + Collection methods = map.get(m); + + for (Method other : methods) + { + HashMap all = new HashMap(); + map(all, pmes, m, other); + } + } + } + + ParallelExecutorMapping finalm = new ParallelExecutorMapping(one, two); + for (ParallelExecutorMapping pme : pmes) + finalm.merge(pme); + + return finalm; + } + + private ParallelExecutorMapping mapStaticMethods(ClassGroup one, ClassGroup two) + { + StaticMethodSignatureMapper smsm = new StaticMethodSignatureMapper(); + smsm.map(one, two); + + List pmes = new ArrayList<>(); + + for (Method m : smsm.getMap().keySet()) + { + Collection methods = smsm.getMap().get(m); + + for (Method other : methods) + { + HashMap all = new HashMap(); + map(all, pmes, m, other); + } + } + + ParallelExecutorMapping finalm = new ParallelExecutorMapping(one, two); + for (ParallelExecutorMapping pme : pmes) + finalm.merge(pme); + + return finalm; + } + + private void map(Map all, List result, Method m1, Method m2) + { + if (all.containsKey(m1)) + return; + all.put(m1, m2); + + assert (m1.getCode() == null) == (m2.getCode() == null); + + if (m1.getCode() == null) + return; + + ParallelExecutorMapping mappings = MappingExecutorUtil.map(m1, m2); + + if (mappings.getMap().isEmpty() && mappings.crashed) + return; + + mappings.map(m1, m2); + result.add(mappings); + + for (Map.Entry e : mappings.getMap().entrySet()) + { + if (e.getKey() instanceof Method) + { + Method n1 = (Method) e.getKey(), + n2 = (Method) e.getValue(); + + map(all, result, n1, n2); + } + else + { + all.put(e.getKey(), e.getValue()); + } + } + } + + private ParallelExecutorMapping mapPackets(ClassGroup group1, ClassGroup group2) + { + // XXX PULL THESE FROM PREVIOUS MAPPINGS + group1.findClass("client").findField("field446").packetHandler = true; + group2.findClass("client").findField("field324").packetHandler = true; + + Method m1 = group1.findClass("client").findMethod("vmethod3096"); + Method m2 = group2.findClass("client").findMethod("vmethod2975"); + + ParallelExecutorMapping mappings = MappingExecutorUtil.map(m1, m2); + + System.out.println(mappings.packetHandler1.size() + " vs " + mappings.packetHandler2.size() + " handlers"); + + assert mappings.packetHandler1.size() == mappings.packetHandler2.size(); + + ParallellMappingExecutor.enable = true; + ParallelExecutorMapping all = new ParallelExecutorMapping(group1, group2); + + for (int i = 0; i < mappings.packetHandler1.size(); ++i) + { + PacketHandler if1 = mappings.packetHandler1.get(i); + + PacketHandler highestHandler = null; + ParallelExecutorMapping highest = null; + + for (int j = 0; j < mappings.packetHandler2.size(); ++j) + { + PacketHandler if2 = mappings.packetHandler2.get(j); + + Instruction i1 = if1.getFirstInsOfHandler(), + i2 = if2.getFirstInsOfHandler(); + + ParallelExecutorMapping mapping = MappingExecutorUtil.mapFrame(group1, group2, i1, i2); + + if (mapping.getMap().isEmpty()) + continue; + + if (highest == null || mapping.getMap().size() > highest.getMap().size()) + { + highest = mapping; + highestHandler = if2; + } + } + + System.out.println(if1 + " <-> " + highestHandler + " <-> " + highest.getMap().size() + " " + highest.crashed); + all.merge(highest); + } + + ParallellMappingExecutor.enable = false; + return all; + } +} diff --git a/src/main/java/net/runelite/deob/deobfuscators/rename/Rename.java b/src/main/java/net/runelite/deob/deobfuscators/rename/Rename.java deleted file mode 100644 index 4884b5dadf..0000000000 --- a/src/main/java/net/runelite/deob/deobfuscators/rename/Rename.java +++ /dev/null @@ -1,173 +0,0 @@ -package net.runelite.deob.deobfuscators.rename; - -import com.google.common.collect.Multimap; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import net.runelite.deob.ClassFile; -import net.runelite.deob.ClassGroup; -import net.runelite.deob.Field; -import net.runelite.deob.Method; -import net.runelite.deob.util.JarUtil; - -public class Rename -{ - private static final int MAX_CLASSES = 250; - - private ClassGroup source, target; - private ParallelExecutorMapping mapping; - - public Rename(ClassGroup source, ClassGroup target) - { - this.source = source; - this.target = target; - } - - public ParallelExecutorMapping getMapping() - { - return mapping; - } - - public void run() - { - ParallelExecutorMapping finalm = new ParallelExecutorMapping(source, target); - - finalm.merge(staticMethodSignatureMapper()); - finalm.merge(methodSignatureMapper()); - - for (int i = -1; i < MAX_CLASSES; ++i) - { - ClassFile c1; - - if (i == -1) - { - c1 = source.findClass("client"); - } - else - { - c1 = source.findClass("class" + i); - } - - if (c1 == null) - continue; - - for (Method m : c1.getMethods().getMethods()) - { - if (!finalm.getMap().containsKey(m)) - System.out.println("missing " + m); - } - for (Field m : c1.getFields().getFields()) - { - if (!finalm.getMap().containsKey(m)) - System.out.println("missing " + m); - } - } - - mapping = finalm; - } - - private ParallelExecutorMapping methodSignatureMapper() - { - List pmes = new ArrayList<>(); - - for (int i = -1; i < MAX_CLASSES; ++i) - { - ClassFile c1, c2; - - if (i == -1) - { - c1 = source.findClass("client"); - c2 = target.findClass("client"); - } - else - { - c1 = source.findClass("class" + i); - c2 = target.findClass("class" + i); - } - - if (c1 == null || c2 == null) - continue; - - MethodSignatureMapper msm = new MethodSignatureMapper(); - msm.map(c1, c2); - - Multimap map = msm.getMap(); - for (Method m : map.keySet()) - { - Collection methods = map.get(m); - - for (Method other : methods) - { - HashMap all = new HashMap(); - map(all, pmes, m, other); - } - } - } - - ParallelExecutorMapping finalm = new ParallelExecutorMapping(source, target); - for (ParallelExecutorMapping pme : pmes) - finalm.merge(pme); - - return finalm; - } - - private ParallelExecutorMapping staticMethodSignatureMapper() - { - StaticMethodSignatureMapper smsm = new StaticMethodSignatureMapper(); - smsm.map(source, target); - - List pmes = new ArrayList<>(); - - for (Method m : smsm.getMap().keySet()) - { - Collection methods = smsm.getMap().get(m); - - for (Method other : methods) - { - HashMap all = new HashMap(); - map(all, pmes, m, other); - } - } - - ParallelExecutorMapping finalm = new ParallelExecutorMapping(source, target); - for (ParallelExecutorMapping pme : pmes) - finalm.merge(pme); - - return finalm; - } - - private void map(Map all, List result, Method m1, Method m2) - { - if (all.containsKey(m1)) - return; - all.put(m1, m2); - - assert (m1.getCode() == null) == (m2.getCode() == null); - - if (m1.getCode() == null) - return; - - ParallelExecutorMapping mappings = MappingExecutorUtil.map(m1, m2); - - if (mappings.getMap().isEmpty() && mappings.crashed) - return; - - mappings.map(m1, m2); - result.add(mappings); - - for (Map.Entry e : mappings.getMap().entrySet()) - { - if (e.getKey() instanceof Method) - { - Method n1 = (Method) e.getKey(), - n2 = (Method) e.getValue(); - - map(all, result, n1, n2); - } - } - } -} diff --git a/src/main/java/net/runelite/deob/pool/Class.java b/src/main/java/net/runelite/deob/pool/Class.java index 6cf2b25b4a..dc173474ab 100644 --- a/src/main/java/net/runelite/deob/pool/Class.java +++ b/src/main/java/net/runelite/deob/pool/Class.java @@ -35,6 +35,12 @@ public class Class extends PoolEntry this.name = name; } + + @Override + public Class copy() + { + return new Class(name); + } @Override public void resolve(ConstantPool pool) diff --git a/src/main/java/net/runelite/deob/pool/Double.java b/src/main/java/net/runelite/deob/pool/Double.java index e489ad4f3b..0d47d7cfaf 100644 --- a/src/main/java/net/runelite/deob/pool/Double.java +++ b/src/main/java/net/runelite/deob/pool/Double.java @@ -24,6 +24,12 @@ public class Double extends PoolEntry value = d; } + + @Override + public Double copy() + { + return new Double(value); + } @Override public boolean equals(Object other) diff --git a/src/main/java/net/runelite/deob/pool/Field.java b/src/main/java/net/runelite/deob/pool/Field.java index 87b569e7f3..4c226d2e3a 100644 --- a/src/main/java/net/runelite/deob/pool/Field.java +++ b/src/main/java/net/runelite/deob/pool/Field.java @@ -27,6 +27,12 @@ public class Field extends PoolEntry this.clazz = clazz; this.nat = nat; } + + @Override + public Field copy() + { + return new Field(clazz.copy(), nat.copy()); + } @Override public void resolve(ConstantPool pool) diff --git a/src/main/java/net/runelite/deob/pool/Float.java b/src/main/java/net/runelite/deob/pool/Float.java index 68f0512675..25fb7af5ea 100644 --- a/src/main/java/net/runelite/deob/pool/Float.java +++ b/src/main/java/net/runelite/deob/pool/Float.java @@ -24,6 +24,12 @@ public class Float extends PoolEntry value = f; } + + @Override + public Float copy() + { + return new Float(value); + } @Override public boolean equals(Object other) diff --git a/src/main/java/net/runelite/deob/pool/Integer.java b/src/main/java/net/runelite/deob/pool/Integer.java index f4851f210f..d0329e43e5 100644 --- a/src/main/java/net/runelite/deob/pool/Integer.java +++ b/src/main/java/net/runelite/deob/pool/Integer.java @@ -24,6 +24,12 @@ public class Integer extends PoolEntry value = i; } + + @Override + public Integer copy() + { + return new Integer(value); + } @Override public boolean equals(Object other) diff --git a/src/main/java/net/runelite/deob/pool/InterfaceMethod.java b/src/main/java/net/runelite/deob/pool/InterfaceMethod.java index 7e80537b19..562c35540f 100644 --- a/src/main/java/net/runelite/deob/pool/InterfaceMethod.java +++ b/src/main/java/net/runelite/deob/pool/InterfaceMethod.java @@ -28,6 +28,12 @@ public class InterfaceMethod extends PoolEntry classIndex = is.readUnsignedShort(); natIndex = is.readUnsignedShort(); } + + @Override + public InterfaceMethod copy() + { + return new InterfaceMethod(clazz.copy(), nat.copy()); + } @Override public void resolve(ConstantPool pool) diff --git a/src/main/java/net/runelite/deob/pool/Long.java b/src/main/java/net/runelite/deob/pool/Long.java index becf785789..9960bcc33b 100644 --- a/src/main/java/net/runelite/deob/pool/Long.java +++ b/src/main/java/net/runelite/deob/pool/Long.java @@ -24,6 +24,12 @@ public class Long extends PoolEntry value = l; } + + @Override + public Long copy() + { + return new Long(value); + } @Override public boolean equals(Object other) diff --git a/src/main/java/net/runelite/deob/pool/Method.java b/src/main/java/net/runelite/deob/pool/Method.java index 64b34cc392..091e547fd7 100644 --- a/src/main/java/net/runelite/deob/pool/Method.java +++ b/src/main/java/net/runelite/deob/pool/Method.java @@ -29,6 +29,12 @@ public class Method extends PoolEntry natIndex = is.readUnsignedShort(); } + @Override + public Method copy() + { + return new Method(clazz.copy(), nat.copy()); + } + @Override public java.lang.String toString() { diff --git a/src/main/java/net/runelite/deob/pool/NameAndType.java b/src/main/java/net/runelite/deob/pool/NameAndType.java index 7c4828c1f7..204fcd3da7 100644 --- a/src/main/java/net/runelite/deob/pool/NameAndType.java +++ b/src/main/java/net/runelite/deob/pool/NameAndType.java @@ -41,6 +41,24 @@ public class NameAndType extends PoolEntry this.name = name; this.type = type; } + + @Override + public NameAndType copy() + { + if (signature != null) + { + return new NameAndType(name, new Signature(signature)); + } + else if (type != null) + { + return new NameAndType(name, new Type(type)); + } + else + { + assert false; + return null; + } + } @Override public void resolve(ConstantPool pool) diff --git a/src/main/java/net/runelite/deob/pool/PoolEntry.java b/src/main/java/net/runelite/deob/pool/PoolEntry.java index 18c1ed93a5..889920338c 100644 --- a/src/main/java/net/runelite/deob/pool/PoolEntry.java +++ b/src/main/java/net/runelite/deob/pool/PoolEntry.java @@ -31,6 +31,8 @@ public abstract class PoolEntry @Override public abstract int hashCode(); + + public abstract PoolEntry copy(); public abstract void write(DataOutputStream out) throws IOException; diff --git a/src/main/java/net/runelite/deob/pool/String.java b/src/main/java/net/runelite/deob/pool/String.java index 60406f0710..78898aef49 100644 --- a/src/main/java/net/runelite/deob/pool/String.java +++ b/src/main/java/net/runelite/deob/pool/String.java @@ -26,6 +26,12 @@ public class String extends PoolEntry string = str; } + + @Override + public String copy() + { + return new String(string); + } @Override public void resolve(ConstantPool pool) diff --git a/src/main/java/net/runelite/deob/pool/UTF8.java b/src/main/java/net/runelite/deob/pool/UTF8.java index 13ddba0f98..73b3da1768 100644 --- a/src/main/java/net/runelite/deob/pool/UTF8.java +++ b/src/main/java/net/runelite/deob/pool/UTF8.java @@ -24,6 +24,12 @@ public class UTF8 extends PoolEntry string = value; } + + @Override + public UTF8 copy() + { + return new UTF8(string); + } @Override public boolean equals(Object other) diff --git a/src/test/java/net/runelite/deob/deobfuscators/rename/AnnotationMapperTest.java b/src/test/java/net/runelite/deob/deobfuscators/rename/AnnotationMapperTest.java new file mode 100644 index 0000000000..5a32095e8c --- /dev/null +++ b/src/test/java/net/runelite/deob/deobfuscators/rename/AnnotationMapperTest.java @@ -0,0 +1,28 @@ +package net.runelite.deob.deobfuscators.rename; + +import java.io.File; +import java.io.IOException; +import net.runelite.deob.ClassGroup; +import net.runelite.deob.util.JarUtil; +import org.junit.Test; + +public class AnnotationMapperTest +{ + private static final String JAR1 = MapStaticTest.class.getResource("/adamin1.jar").getFile(), + JAR2 = MapStaticTest.class.getResource("/adamin2.jar").getFile(); + + @Test + public void testRun() throws IOException + { + ClassGroup group1 = JarUtil.loadJar(new File(JAR1)); + ClassGroup group2 = JarUtil.loadJar(new File(JAR2)); + + Mapper mapper = new Mapper(group1, group2); + mapper.run(); + ParallelExecutorMapping mapping = mapper.getMapping(); + + AnnotationMapper amapper = new AnnotationMapper(group1, group2, mapping); + amapper.run(); + } + +} diff --git a/src/test/java/net/runelite/deob/deobfuscators/rename/MapStaticTest.java b/src/test/java/net/runelite/deob/deobfuscators/rename/MapStaticTest.java index 2d8a151068..fec8908d9f 100644 --- a/src/test/java/net/runelite/deob/deobfuscators/rename/MapStaticTest.java +++ b/src/test/java/net/runelite/deob/deobfuscators/rename/MapStaticTest.java @@ -197,210 +197,210 @@ public class MapStaticTest System.out.println("Total " + total + ". " + fields + " fields, " + staticMethod + " static methods, " + method + " methods"); } - @Test - public void testAllMap() throws Exception - { - ClassGroup group1 = JarUtil.loadJar(new File(JAR1)); - ClassGroup group2 = JarUtil.loadJar(new File(JAR2)); - - List m1s = getInitialMethods(group1), m2s = getInitialMethods(group2); - //Method m1 = group1.findClass("client").findMethod("init"); - //Method m2 = group2.findClass("client").findMethod("init"); - - assert m1s.size() == m2s.size(); - - List pmes = new ArrayList<>(); -// for (int i = 0; i < m1s.size(); ++i) +// @Test +// public void testAllMap() throws Exception +// { +// ClassGroup group1 = JarUtil.loadJar(new File(JAR1)); +// ClassGroup group2 = JarUtil.loadJar(new File(JAR2)); +// +// List m1s = getInitialMethods(group1), m2s = getInitialMethods(group2); +// //Method m1 = group1.findClass("client").findMethod("init"); +// //Method m2 = group2.findClass("client").findMethod("init"); +// +// assert m1s.size() == m2s.size(); +// +// List pmes = new ArrayList<>(); +//// for (int i = 0; i < m1s.size(); ++i) +//// { +//// Method m1 = m1s.get(i), m2 = m2s.get(i); +//// +//// assert m1.getPoolMethod().equals(m2.getPoolMethod()); +//// +//// HashMap all = new HashMap(); +//// map(all, pmes, m1, m2);/fil +//// } +// +// ParallelExecutorMapping finalm = new ParallelExecutorMapping(group1, group2); +// for (ParallelExecutorMapping pme : pmes) +// finalm.merge(pme); +// +// +// finalm.merge(testStaticMapperMap(group1, group2)); +// finalm.merge(testMapperMap(group1, group2)); +// finalm.merge(this.testPackets(group1, group2)); +// +// for (int i = -1; i < 250; ++i) // { -// Method m1 = m1s.get(i), m2 = m2s.get(i); -// -// assert m1.getPoolMethod().equals(m2.getPoolMethod()); -// -// HashMap all = new HashMap(); -// map(all, pmes, m1, m2);/fil +// ClassFile c1; +// +// if (i == -1) +// { +// c1 = group1.findClass("client"); +// } +// else +// { +// c1 = group1.findClass("class" + i); +// } +// +// if (c1 == null) +// continue; +// +// for (Method m : c1.getMethods().getMethods()) +// { +// if (!finalm.getMap().containsKey(m)) +// System.out.println("missing " + m); +// } +// for (Field m : c1.getFields().getFields()) +// { +// if (!finalm.getMap().containsKey(m)) +// System.out.println("missing " + m); +// } // } - - ParallelExecutorMapping finalm = new ParallelExecutorMapping(group1, group2); - for (ParallelExecutorMapping pme : pmes) - finalm.merge(pme); - - - finalm.merge(testStaticMapperMap(group1, group2)); - finalm.merge(testMapperMap(group1, group2)); - finalm.merge(this.testPackets(group1, group2)); - - for (int i = -1; i < 250; ++i) - { - ClassFile c1; - - if (i == -1) - { - c1 = group1.findClass("client"); - } - else - { - c1 = group1.findClass("class" + i); - } - - if (c1 == null) - continue; - - for (Method m : c1.getMethods().getMethods()) - { - if (!finalm.getMap().containsKey(m)) - System.out.println("missing " + m); - } - for (Field m : c1.getFields().getFields()) - { - if (!finalm.getMap().containsKey(m)) - System.out.println("missing " + m); - } - } - - summary(finalm, group1); - - String sg1 = print(group1), - sg2 = print(group2); - - System.out.println("GROUP 1 " + sg1); - System.out.println("GROUP 2 " + sg2); - } +// +// summary(finalm, group1); +// +// String sg1 = print(group1), +// sg2 = print(group2); +// +// System.out.println("GROUP 1 " + sg1); +// System.out.println("GROUP 2 " + sg2); +// } //@Test - public ParallelExecutorMapping testMapperMap(ClassGroup one, ClassGroup two) throws IOException - { -// ClassGroup one = JarUtil.loadJar(new File(JAR1)); -// ClassGroup two = JarUtil.loadJar(new File(JAR2)); - - List pmes = new ArrayList<>(); - for (int i = -1; i < 250; ++i) - { - ClassFile c1, c2; - - if (i == -1) - { - c1 = one.findClass("client"); - c2 = two.findClass("client"); - } - else - { - c1 = one.findClass("class" + i); - c2 = two.findClass("class" + i); - } - - if (c1 == null || c2 == null) - continue; - - MethodSignatureMapper msm = new MethodSignatureMapper(); - msm.map(c1, c2); - - Multimap map = msm.getMap(); - for (Method m : map.keySet()) - { - Collection methods = map.get(m); - - for (Method other : methods) - { - HashMap all = new HashMap(); - map(all, pmes, m, other); -// ParallelExecutorMapping pme = MappingExecutorUtil.map(m, other); -// -// if (pme.getMap().isEmpty()) -// continue; -// -// pme.map(m, other); -// -// pmes.add(pme); - } - //HashMap all = new HashMap(); - //map(all, pmes, e.getKey(), e.getValue()); - } - } - ParallelExecutorMapping finalm = new ParallelExecutorMapping(one, two); - for (ParallelExecutorMapping pme : pmes) - finalm.merge(pme); - - return finalm; -// summary(finalm); -// print(one); - } +// public ParallelExecutorMapping testMapperMap(ClassGroup one, ClassGroup two) throws IOException +// { +//// ClassGroup one = JarUtil.loadJar(new File(JAR1)); +//// ClassGroup two = JarUtil.loadJar(new File(JAR2)); +// +// List pmes = new ArrayList<>(); +// for (int i = -1; i < 250; ++i) +// { +// ClassFile c1, c2; +// +// if (i == -1) +// { +// c1 = one.findClass("client"); +// c2 = two.findClass("client"); +// } +// else +// { +// c1 = one.findClass("class" + i); +// c2 = two.findClass("class" + i); +// } +// +// if (c1 == null || c2 == null) +// continue; +// +// MethodSignatureMapper msm = new MethodSignatureMapper(); +// msm.map(c1, c2); +// +// Multimap map = msm.getMap(); +// for (Method m : map.keySet()) +// { +// Collection methods = map.get(m); +// +// for (Method other : methods) +// { +// HashMap all = new HashMap(); +// map(all, pmes, m, other); +//// ParallelExecutorMapping pme = MappingExecutorUtil.map(m, other); +//// +//// if (pme.getMap().isEmpty()) +//// continue; +//// +//// pme.map(m, other); +//// +//// pmes.add(pme); +// } +// //HashMap all = new HashMap(); +// //map(all, pmes, e.getKey(), e.getValue()); +// } +// } +// ParallelExecutorMapping finalm = new ParallelExecutorMapping(one, two); +// for (ParallelExecutorMapping pme : pmes) +// finalm.merge(pme); +// +// return finalm; +//// summary(finalm); +//// print(one); +// } //@Test - public ParallelExecutorMapping testStaticMapperMap(ClassGroup one, ClassGroup two) throws IOException - { -// ClassGroup one = JarUtil.loadJar(new File(JAR1)); -// ClassGroup two = JarUtil.loadJar(new File(JAR2)); - - StaticMethodSignatureMapper smsm = new StaticMethodSignatureMapper(); - smsm.map(one, two); - - List pmes = new ArrayList<>(); - - for (Method m : smsm.getMap().keySet()) - { - Collection methods = smsm.getMap().get(m); - - //if (methods.size() >= 1) - { - for (Method other : methods) - { - HashMap all = new HashMap(); - map(all, pmes, m, other); - -// ParallelExecutorMapping pme = MappingExecutorUtil.map(m, other); -// -// if (pme.getMap().isEmpty()) -// continue; -// -// pme.map(m, other); -// -// pmes.add(pme); - } - } - } - - ParallelExecutorMapping finalm = new ParallelExecutorMapping(one, two); - for (ParallelExecutorMapping pme : pmes) - finalm.merge(pme); - - return finalm; -// summary(finalm); -// print(one); - } +// public ParallelExecutorMapping testStaticMapperMap(ClassGroup one, ClassGroup two) throws IOException +// { +//// ClassGroup one = JarUtil.loadJar(new File(JAR1)); +//// ClassGroup two = JarUtil.loadJar(new File(JAR2)); +// +// StaticMethodSignatureMapper smsm = new StaticMethodSignatureMapper(); +// smsm.map(one, two); +// +// List pmes = new ArrayList<>(); +// +// for (Method m : smsm.getMap().keySet()) +// { +// Collection methods = smsm.getMap().get(m); +// +// //if (methods.size() >= 1) +// { +// for (Method other : methods) +// { +// HashMap all = new HashMap(); +// map(all, pmes, m, other); +// +//// ParallelExecutorMapping pme = MappingExecutorUtil.map(m, other); +//// +//// if (pme.getMap().isEmpty()) +//// continue; +//// +//// pme.map(m, other); +//// +//// pmes.add(pme); +// } +// } +// } +// +// ParallelExecutorMapping finalm = new ParallelExecutorMapping(one, two); +// for (ParallelExecutorMapping pme : pmes) +// finalm.merge(pme); +// +// return finalm; +//// summary(finalm); +//// print(one); +// } - public List getInitialMethods(ClassGroup group) - { - List methods = new ArrayList<>(); - - group.buildClassGraph(); // required when looking up methods - group.lookup(); // lookup methods - - for (ClassFile cf : group.getClasses()) - { - List cmethods = new ArrayList<>(); - - for (Method m : cf.getMethods().getMethods()) - { - if (!Deob.isObfuscated(m.getName()) && !m.getName().startsWith("<")) - { - if (m.getCode() == null) - { - methods.add(m); - continue; - } - - cmethods.add(m); // I guess this method name is overriding a jre interface (init, run, ?). - } - } - - // cmethods are scrambled randomally, so sort by name - cmethods = cmethods.stream().sorted((m1, m2) -> m1.getName().compareTo(m2.getName())).collect(Collectors.toList()); - - methods.addAll(cmethods); - } - - return methods; - } +// public List getInitialMethods(ClassGroup group) +// { +// List methods = new ArrayList<>(); +// +// group.buildClassGraph(); // required when looking up methods +// group.lookup(); // lookup methods +// +// for (ClassFile cf : group.getClasses()) +// { +// List cmethods = new ArrayList<>(); +// +// for (Method m : cf.getMethods().getMethods()) +// { +// if (!Deob.isObfuscated(m.getName()) && !m.getName().startsWith("<")) +// { +// if (m.getCode() == null) +// { +// methods.add(m); +// continue; +// } +// +// cmethods.add(m); // I guess this method name is overriding a jre interface (init, run, ?). +// } +// } +// +// // cmethods are scrambled randomally, so sort by name +// cmethods = cmethods.stream().sorted((m1, m2) -> m1.getName().compareTo(m2.getName())).collect(Collectors.toList()); +// +// methods.addAll(cmethods); +// } +// +// return methods; +// } private void map(Map all, List result, Method m1, Method m2) { @@ -454,48 +454,40 @@ public class MapStaticTest return "total methods/fields: " + total + ", " + methods + " methods, " + fields + " fields"; } - @Test - public void printTotalObjects() throws Exception - { - ClassGroup group1 = JarUtil.loadJar(new File(JAR1)); - ClassGroup group2 = JarUtil.loadJar(new File(JAR2)); - //print(group1); - } - - @Test - public void testCore() throws Exception - { - ClassGroup group1 = JarUtil.loadJar(new File(JAR1)); - ClassGroup group2 = JarUtil.loadJar(new File(JAR2)); - - Rename rename = new Rename(group1, group2); - rename.run(); - - ParallelExecutorMapping mapping = rename.getMapping(); - - mapping.merge(this.testPackets(group1, group2)); - - summary(rename.getMapping(), group1); - - String sg1 = print(group1), - sg2 = print(group2); - - System.out.println("GROUP 1 " + sg1); - System.out.println("GROUP 2 " + sg2); - - List exported = getExportedFields(group1); - int mapped = 0, not = 0; - for (Field f : exported) - { - Field other = (Field) mapping.get(f); - if (other == null) - System.out.println("missing " + f + " " + other); - if (other != null) ++mapped; - else ++not; - } - System.out.println("Mapped " + mapped + " total " + (mapped+not)); - - } +// @Test +// public void testCore() throws Exception +// { +// ClassGroup group1 = JarUtil.loadJar(new File(JAR1)); +// ClassGroup group2 = JarUtil.loadJar(new File(JAR2)); +// +// Mapper rename = new Mapper(group1, group2); +// rename.run(); +// +// ParallelExecutorMapping mapping = rename.getMapping(); +// +// mapping.merge(this.testPackets(group1, group2)); +// +// summary(rename.getMapping(), group1); +// +// String sg1 = print(group1), +// sg2 = print(group2); +// +// System.out.println("GROUP 1 " + sg1); +// System.out.println("GROUP 2 " + sg2); +// +// List exported = getExportedFields(group1); +// int mapped = 0, not = 0; +// for (Field f : exported) +// { +// Field other = (Field) mapping.get(f); +// if (other == null) +// System.out.println("missing " + f + " " + other); +// if (other != null) ++mapped; +// else ++not; +// } +// System.out.println("Mapped " + mapped + " total " + (mapped+not)); +// +// } private static final Type OBFUSCATED_NAME = new Type("Lnet/runelite/mapping/ObfuscatedName;"); private static final Type EXPORT = new Type("Lnet/runelite/mapping/Export;"); @@ -528,81 +520,92 @@ public class MapStaticTest { ClassGroup group1 = JarUtil.loadJar(new File(JAR1)); ClassGroup group2 = JarUtil.loadJar(new File(JAR2)); - testPackets(group1, group2); + + Mapper mapper = new Mapper(group1, group2); + mapper.run(); + ParallelExecutorMapping mapping = mapper.getMapping(); + + summary(mapping, group1); + + String sg1 = print(group1), + sg2 = print(group2); + + System.out.println("GROUP 1 " + sg1); + System.out.println("GROUP 2 " + sg2); } //@Test - public ParallelExecutorMapping testPackets(ClassGroup group1, ClassGroup group2) throws IOException - { - //ClassGroup group1 = JarUtil.loadJar(new File(JAR1)); - //ClassGroup group2 = JarUtil.loadJar(new File(JAR2)); - - group1.findClass("client").findField("field446").packetHandler = true; - group2.findClass("client").findField("field324").packetHandler = true; - - Method m1 = group1.findClass("client").findMethod("vmethod3096"); - Method m2 = group2.findClass("client").findMethod("vmethod2975"); - - ParallelExecutorMapping mappings = MappingExecutorUtil.map(m1, m2); - - System.out.println("BEGIN OF MAPPING"); - for (Object o : mappings.getMap().keySet()) - { - Object value = mappings.get(o); - System.out.println(o + " <-> " + value); - } - System.out.println("END OF MAPPINGS " + mappings.getMap().size()); - - System.out.println(mappings.packetHandler1.size() + " vs " + mappings.packetHandler2.size() + " handlers"); - - assert mappings.packetHandler1.size() == mappings.packetHandler2.size(); - - ParallellMappingExecutor.enable = true; - ParallelExecutorMapping all = new ParallelExecutorMapping(group1, group2); - - for (int i = 0; i < mappings.packetHandler1.size(); ++i) - { - PacketHandler if1 = mappings.packetHandler1.get(i); - - PacketHandler highestHandler = null; - ParallelExecutorMapping highest = null; - - for (int j = 0; j < mappings.packetHandler2.size(); ++j) - { - PacketHandler if2 = mappings.packetHandler2.get(j); - - Instruction i1 = if1.getFirstInsOfHandler(), - i2 = if2.getFirstInsOfHandler(); - - ParallelExecutorMapping mapping = MappingExecutorUtil.mapFrame(group1, group2, i1, i2); - - if (mapping.getMap().isEmpty()) - continue; - - if (highest == null || mapping.getMap().size() > highest.getMap().size()) - { - highest = mapping; - highestHandler = if2; - } - - -// Execution e1 = new Execution(group1); -// Execution e2 = new Execution(group2); +// public ParallelExecutorMapping testPackets(ClassGroup group1, ClassGroup group2) throws IOException +// { +// //ClassGroup group1 = JarUtil.loadJar(new File(JAR1)); +// //ClassGroup group2 = JarUtil.loadJar(new File(JAR2)); // -// Frame f1 = new Frame(e1, i1.getInstructions().getCode().getAttributes().getMethod(), i1); -// Frame f2 = new Frame(e2, i2.getInstructions().getCode().getAttributes().getMethod(), i2); - - //e1.frames.add(f1); - //e2.frames.add(f2); - } - - System.out.println(if1 + " <-> " + highestHandler + " <-> " + highest.getMap().size() + " " + highest.crashed); - all.merge(highest); - } - - ParallellMappingExecutor.enable = false; - return all; - } +// group1.findClass("client").findField("field446").packetHandler = true; +// group2.findClass("client").findField("field324").packetHandler = true; +// +// Method m1 = group1.findClass("client").findMethod("vmethod3096"); +// Method m2 = group2.findClass("client").findMethod("vmethod2975"); +// +// ParallelExecutorMapping mappings = MappingExecutorUtil.map(m1, m2); +// +// System.out.println("BEGIN OF MAPPING"); +// for (Object o : mappings.getMap().keySet()) +// { +// Object value = mappings.get(o); +// System.out.println(o + " <-> " + value); +// } +// System.out.println("END OF MAPPINGS " + mappings.getMap().size()); +// +// System.out.println(mappings.packetHandler1.size() + " vs " + mappings.packetHandler2.size() + " handlers"); +// +// assert mappings.packetHandler1.size() == mappings.packetHandler2.size(); +// +// ParallellMappingExecutor.enable = true; +// ParallelExecutorMapping all = new ParallelExecutorMapping(group1, group2); +// +// for (int i = 0; i < mappings.packetHandler1.size(); ++i) +// { +// PacketHandler if1 = mappings.packetHandler1.get(i); +// +// PacketHandler highestHandler = null; +// ParallelExecutorMapping highest = null; +// +// for (int j = 0; j < mappings.packetHandler2.size(); ++j) +// { +// PacketHandler if2 = mappings.packetHandler2.get(j); +// +// Instruction i1 = if1.getFirstInsOfHandler(), +// i2 = if2.getFirstInsOfHandler(); +// +// ParallelExecutorMapping mapping = MappingExecutorUtil.mapFrame(group1, group2, i1, i2); +// +// if (mapping.getMap().isEmpty()) +// continue; +// +// if (highest == null || mapping.getMap().size() > highest.getMap().size()) +// { +// highest = mapping; +// highestHandler = if2; +// } +// +// +//// Execution e1 = new Execution(group1); +//// Execution e2 = new Execution(group2); +//// +//// Frame f1 = new Frame(e1, i1.getInstructions().getCode().getAttributes().getMethod(), i1); +//// Frame f2 = new Frame(e2, i2.getInstructions().getCode().getAttributes().getMethod(), i2); +// +// //e1.frames.add(f1); +// //e2.frames.add(f2); +// } +// +// System.out.println(if1 + " <-> " + highestHandler + " <-> " + highest.getMap().size() + " " + highest.crashed); +// all.merge(highest); +// } +// +// ParallellMappingExecutor.enable = false; +// return all; +// } private static int handlers[][] = { { 74, 187 } diff --git a/src/test/java/net/runelite/deob/runeloader/MappingImporter.java b/src/test/java/net/runelite/deob/runeloader/MappingImporter.java index 007b2a4da9..aaf555b004 100644 --- a/src/test/java/net/runelite/deob/runeloader/MappingImporter.java +++ b/src/test/java/net/runelite/deob/runeloader/MappingImporter.java @@ -2,6 +2,7 @@ package net.runelite.deob.runeloader; import java.io.File; import java.io.IOException; +import java.net.URL; import net.runelite.deob.ClassFile; import net.runelite.deob.ClassGroup; import net.runelite.deob.Field; @@ -23,9 +24,9 @@ import org.junit.Test; public class MappingImporter { - private static final File IN = new File("/Users/adam/w/rs/07/adamin.jar"); - private static final File OUT = new File("/Users/adam/w/rs/07/adamout.jar"); - private static final File RL_INJECTION = new File("/Users/adam/w/rs/07/rl/injection.json"); + private static final File IN = new File("d:/rs/07/adamin.jar"); + private static final File OUT = new File("d:/rs/07/adamout.jar"); + private static final File RL_INJECTION = new File("C:\\Users\\Adam\\git\\jbytecode\\src\\test\\resources\\injection_v16.json"); private static final Type OBFUSCATED_NAME = new Type("Lnet/runelite/mapping/ObfuscatedName;"); private static final Type EXPORT = new Type("Lnet/runelite/mapping/Export;"); diff --git a/src/test/resources/injection_v16.json b/src/test/resources/injection_v16.json new file mode 100644 index 0000000000..c0e405e3b2 --- /dev/null +++ b/src/test/resources/injection_v16.json @@ -0,0 +1,2288 @@ +{ + "getterInjects": [ + { + "className": "hi", + "getterMethodDesc": "()[Ljava/lang/reflect/Field;", + "getterName": "getFields", + "getterClassName": "hi", + "getterFieldName": "o", + "staticField": false + }, + { + "className": "hi", + "getterMethodDesc": "()[Ljava/lang/reflect/Method;", + "getterName": "getMethods", + "getterClassName": "hi", + "getterFieldName": "h", + "staticField": false + }, + { + "className": "hi", + "getterMethodDesc": "()[[[B", + "getterName": "getArgs", + "getterClassName": "hi", + "getterFieldName": "m", + "staticField": false + }, + { + "className": "hk", + "getterMethodDesc": "()Ljava/io/RandomAccessFile;", + "getterName": "getFile", + "getterClassName": "hk", + "getterFieldName": "j", + "staticField": false + }, + { + "className": "hk", + "getterMethodDesc": "()J", + "getterName": "getPosition", + "getterClassName": "hk", + "getterFieldName": "a", + "staticField": false + }, + { + "className": "hk", + "getterMethodDesc": "()J", + "getterName": "getLength", + "getterClassName": "hk", + "getterFieldName": "l", + "staticField": false + }, + { + "className": "d", + "getterMethodDesc": "()I", + "getterName": "getWorld", + "getterClassName": "d", + "getterFieldName": "a", + "multiplier": 1035471415, + "staticField": false + }, + { + "className": "d", + "getterMethodDesc": "()Ljava/lang/String;", + "getterName": "getName", + "getterClassName": "d", + "getterFieldName": "j", + "staticField": false + }, + { + "className": "d", + "getterMethodDesc": "()Ljava/lang/String;", + "getterName": "getPreviousName", + "getterClassName": "d", + "getterFieldName": "l", + "staticField": false + }, + { + "className": "hz", + "getterMethodDesc": "()I", + "getterName": "getItemId", + "getterClassName": "hz", + "getterFieldName": "l", + "multiplier": -2103275065, + "staticField": false + }, + { + "className": "hz", + "getterMethodDesc": "()I", + "getterName": "getPrice", + "getterClassName": "hz", + "getterFieldName": "a", + "multiplier": 705812243, + "staticField": false + }, + { + "className": "hz", + "getterMethodDesc": "()I", + "getterName": "getTotalQuantity", + "getterClassName": "hz", + "getterFieldName": "i", + "multiplier": -369177729, + "staticField": false + }, + { + "className": "hz", + "getterMethodDesc": "()I", + "getterName": "getQuantitySold", + "getterClassName": "hz", + "getterFieldName": "f", + "multiplier": -2124224939, + "staticField": false + }, + { + "className": "hz", + "getterMethodDesc": "()I", + "getterName": "getSpent", + "getterClassName": "hz", + "getterFieldName": "m", + "multiplier": 64102983, + "staticField": false + }, + { + "className": "hz", + "getterMethodDesc": "()B", + "getterName": "getProgress", + "getterClassName": "hz", + "getterFieldName": "j", + "staticField": false + }, + { + "className": "h", + "getterMethodDesc": "()Ljava/lang/String;", + "getterName": "getName", + "getterClassName": "h", + "getterFieldName": "j", + "staticField": false + }, + { + "className": "h", + "getterMethodDesc": "()Ljava/lang/String;", + "getterName": "getPreviousName", + "getterClassName": "h", + "getterFieldName": "l", + "staticField": false + }, + { + "className": "gu", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/Node;", + "getterName": "getPrevious", + "getterClassName": "gu", + "getterFieldName": "ew", + "staticField": false + }, + { + "className": "gu", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/Node;", + "getterName": "getNext", + "getterClassName": "gu", + "getterFieldName": "eo", + "staticField": false + }, + { + "className": "gu", + "getterMethodDesc": "()J", + "getterName": "getHash", + "getterClassName": "gu", + "getterFieldName": "ez", + "staticField": false + }, + { + "className": "o", + "getterMethodDesc": "()Z", + "getterName": "isMoving", + "getterClassName": "o", + "getterFieldName": "b", + "staticField": false + }, + { + "className": "o", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/Sequence;", + "getterName": "getAnimationSequence", + "getterClassName": "o", + "getterFieldName": "c", + "staticField": false + }, + { + "className": "o", + "getterMethodDesc": "()D", + "getterName": "getVelocityY", + "getterClassName": "o", + "getterFieldName": "d", + "staticField": false + }, + { + "className": "o", + "getterMethodDesc": "()D", + "getterName": "getVelocityX", + "getterClassName": "o", + "getterFieldName": "z", + "staticField": false + }, + { + "className": "o", + "getterMethodDesc": "()D", + "getterName": "getVelocityZ", + "getterClassName": "o", + "getterFieldName": "u", + "staticField": false + }, + { + "className": "o", + "getterMethodDesc": "()D", + "getterName": "getScalar", + "getterClassName": "o", + "getterFieldName": "s", + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()Z", + "getterName": "isHidden", + "getterClassName": "fv", + "getterFieldName": "ax", + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/Widget;", + "getterName": "getParent", + "getterClassName": "fv", + "getterFieldName": "cq", + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()[[I", + "getterName": "getDynamicValues", + "getterClassName": "fv", + "getterFieldName": "dw", + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()[Lcom/runeloader/api/bridge/os/accessor/Widget;", + "getterName": "getChildren", + "getterClassName": "fv", + "getterFieldName": "en", + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getId", + "getterClassName": "fv", + "getterFieldName": "q", + "multiplier": -327674437, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getParentId", + "getterClassName": "fv", + "getterFieldName": "ac", + "multiplier": 919377675, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getBoundsIndex", + "getterClassName": "fv", + "getterFieldName": "ey", + "multiplier": 1206843229, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getModelId", + "getterClassName": "fv", + "getterFieldName": "bw", + "multiplier": 387130445, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()[I", + "getterName": "getItemIds", + "getterClassName": "fv", + "getterFieldName": "ds", + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()[I", + "getterName": "getItemQuantities", + "getterClassName": "fv", + "getterFieldName": "dx", + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getModelType", + "getterClassName": "fv", + "getterFieldName": "bv", + "multiplier": -1218084675, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()[Ljava/lang/String;", + "getterName": "getActions", + "getterClassName": "fv", + "getterFieldName": "ce", + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()Ljava/lang/String;", + "getterName": "getText", + "getterClassName": "fv", + "getterFieldName": "bt", + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()Ljava/lang/String;", + "getterName": "getName", + "getterClassName": "fv", + "getterFieldName": "cn", + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getTextColor", + "getterClassName": "fv", + "getterFieldName": "ag", + "multiplier": -2139505109, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getOpacity", + "getterClassName": "fv", + "getterFieldName": "al", + "multiplier": -1263251699, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getRelativeX", + "getterClassName": "fv", + "getterFieldName": "v", + "multiplier": 601602425, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getRelativeY", + "getterClassName": "fv", + "getterFieldName": "ab", + "multiplier": 1233782341, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getWidth", + "getterClassName": "fv", + "getterFieldName": "ak", + "multiplier": -1143241963, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getHeight", + "getterClassName": "fv", + "getterFieldName": "am", + "multiplier": -659847977, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getIndex", + "getterClassName": "fv", + "getterFieldName": "u", + "multiplier": 1683615059, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getRotationX", + "getterClassName": "fv", + "getterFieldName": "bc", + "multiplier": 1522695491, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getRotationY", + "getterClassName": "fv", + "getterFieldName": "bi", + "multiplier": 1181515935, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getRotationZ", + "getterClassName": "fv", + "getterFieldName": "bj", + "multiplier": -604443023, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getContentType", + "getterClassName": "fv", + "getterFieldName": "s", + "multiplier": -1197159853, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getType", + "getterClassName": "fv", + "getterFieldName": "ee", + "multiplier": 452421613, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getScrollX", + "getterClassName": "fv", + "getterFieldName": "v", + "multiplier": 601602425, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getScrollY", + "getterClassName": "fv", + "getterFieldName": "ar", + "multiplier": -1728218901, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getTextureId", + "getterClassName": "fv", + "getterFieldName": "ap", + "multiplier": -340656097, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getBorderThickness", + "getterClassName": "fv", + "getterFieldName": "av", + "multiplier": -959326805, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getItemId", + "getterClassName": "fv", + "getterFieldName": "ai", + "multiplier": -1079716829, + "staticField": false + }, + { + "className": "fv", + "getterMethodDesc": "()I", + "getterName": "getItemQuantity", + "getterClassName": "fv", + "getterFieldName": "ee", + "multiplier": 452421613, + "staticField": false + }, + { + "className": "v", + "getterMethodDesc": "()I", + "getterName": "getId", + "getterClassName": "v", + "getterFieldName": "r", + "multiplier": 2144203281, + "staticField": false + }, + { + "className": "v", + "getterMethodDesc": "()I", + "getterName": "getMask", + "getterClassName": "v", + "getterFieldName": "b", + "multiplier": 1353840845, + "staticField": false + }, + { + "className": "v", + "getterMethodDesc": "()Ljava/lang/String;", + "getterName": "getAddress", + "getterClassName": "v", + "getterFieldName": "u", + "staticField": false + }, + { + "className": "v", + "getterMethodDesc": "()Ljava/lang/String;", + "getterName": "getActivity", + "getterClassName": "v", + "getterFieldName": "g", + "staticField": false + }, + { + "className": "v", + "getterMethodDesc": "()I", + "getterName": "getLocation", + "getterClassName": "v", + "getterFieldName": "y", + "multiplier": 606681477, + "staticField": false + }, + { + "className": "v", + "getterMethodDesc": "()I", + "getterName": "getPlayerCount", + "getterClassName": "v", + "getterFieldName": "q", + "multiplier": -943097539, + "staticField": false + }, + { + "className": "v", + "getterMethodDesc": "()I", + "getterName": "getIndex", + "getterClassName": "v", + "getterFieldName": "s", + "multiplier": -310972441, + "staticField": false + }, + { + "className": "dc", + "getterMethodDesc": "()[B", + "getterName": "getPayload", + "getterClassName": "dc", + "getterFieldName": "j", + "staticField": false + }, + { + "className": "dc", + "getterMethodDesc": "()I", + "getterName": "getOffset", + "getterClassName": "dc", + "getterFieldName": "l", + "multiplier": 1800101407, + "staticField": false + }, + { + "className": "gj", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/CacheableNode;", + "getterName": "getNext", + "getterClassName": "gj", + "getterFieldName": "cd", + "staticField": false + }, + { + "className": "gj", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/CacheableNode;", + "getterName": "getPrevious", + "getterClassName": "gj", + "getterFieldName": "co", + "staticField": false + }, + { + "className": "e", + "getterMethodDesc": "()Ljava/lang/String;", + "getterName": "getUsername", + "getterClassName": "e", + "getterFieldName": "j", + "staticField": false + }, + { + "className": "e", + "getterMethodDesc": "()I", + "getterName": "getWorld", + "getterClassName": "e", + "getterFieldName": "a", + "multiplier": -715910007, + "staticField": false + }, + { + "className": "e", + "getterMethodDesc": "()B", + "getterName": "getRank", + "getterClassName": "e", + "getterFieldName": "i", + "staticField": false + }, + { + "className": "dt", + "getterMethodDesc": "()[[I", + "getterName": "getFlags", + "getterClassName": "dt", + "getterFieldName": "ag", + "staticField": false + }, + { + "className": "gr", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/Node;", + "getterName": "getCurrent", + "getterClassName": "gr", + "getterFieldName": "l", + "staticField": false + }, + { + "className": "gr", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/Node;", + "getterName": "getHead", + "getterClassName": "gr", + "getterFieldName": "j", + "staticField": false + }, + { + "className": "aj", + "getterMethodDesc": "()Z", + "getterName": "isMembers", + "getterClassName": "aj", + "getterFieldName": "ab", + "staticField": false + }, + { + "className": "aj", + "getterMethodDesc": "()Ljava/lang/String;", + "getterName": "getName", + "getterClassName": "aj", + "getterFieldName": "u", + "staticField": false + }, + { + "className": "aj", + "getterMethodDesc": "()I", + "getterName": "getMaleModel", + "getterClassName": "aj", + "getterFieldName": "ag", + "multiplier": -601334475, + "staticField": false + }, + { + "className": "y", + "getterMethodDesc": "()[I", + "getterName": "getItemIds", + "getterClassName": "y", + "getterFieldName": "l", + "staticField": false + }, + { + "className": "y", + "getterMethodDesc": "()[I", + "getterName": "getStackSizes", + "getterClassName": "y", + "getterFieldName": "a", + "staticField": false + }, + { + "className": "aa", + "getterMethodDesc": "()I", + "getterName": "getType", + "getterClassName": "aa", + "getterFieldName": "a", + "multiplier": 381982765, + "staticField": false + }, + { + "className": "aa", + "getterMethodDesc": "()Ljava/lang/String;", + "getterName": "getSender", + "getterClassName": "aa", + "getterFieldName": "f", + "staticField": false + }, + { + "className": "aa", + "getterMethodDesc": "()Ljava/lang/String;", + "getterName": "getValue", + "getterClassName": "aa", + "getterFieldName": "m", + "staticField": false + }, + { + "className": "ao", + "getterMethodDesc": "()Ljava/lang/String;", + "getterName": "getName", + "getterClassName": "ao", + "getterFieldName": "m", + "staticField": false + }, + { + "className": "ao", + "getterMethodDesc": "()[I", + "getterName": "getModels", + "getterClassName": "ao", + "getterFieldName": "h", + "staticField": false + }, + { + "className": "ao", + "getterMethodDesc": "()[Ljava/lang/String;", + "getterName": "getActions", + "getterClassName": "ao", + "getterFieldName": "w", + "staticField": false + }, + { + "className": "ao", + "getterMethodDesc": "()Z", + "getterName": "isClickable", + "getterClassName": "ao", + "getterFieldName": "ar", + "staticField": false + }, + { + "className": "ao", + "getterMethodDesc": "()Z", + "getterName": "isMinimapVisible", + "getterClassName": "ao", + "getterFieldName": "t", + "staticField": false + }, + { + "className": "ao", + "getterMethodDesc": "()Z", + "getterName": "isVisible", + "getterClassName": "ao", + "getterFieldName": "v", + "staticField": false + }, + { + "className": "ao", + "getterMethodDesc": "()I", + "getterName": "getId", + "getterClassName": "ao", + "getterFieldName": "f", + "multiplier": -843801049, + "staticField": false + }, + { + "className": "ao", + "getterMethodDesc": "()I", + "getterName": "getCombatLevel", + "getterClassName": "ao", + "getterFieldName": "c", + "multiplier": 2120085835, + "staticField": false + }, + { + "className": "an", + "getterMethodDesc": "()Ljava/lang/String;", + "getterName": "getName", + "getterClassName": "an", + "getterFieldName": "b", + "staticField": false + }, + { + "className": "an", + "getterMethodDesc": "()[Ljava/lang/String;", + "getterName": "getActions", + "getterClassName": "an", + "getterFieldName": "am", + "staticField": false + }, + { + "className": "ce", + "getterMethodDesc": "()I", + "getterName": "getModelHeight", + "getterClassName": "ce", + "getterFieldName": "cp", + "multiplier": 1911097579, + "staticField": false + }, + { + "className": "al", + "getterMethodDesc": "()I", + "getterName": "getReplyMode", + "getterClassName": "al", + "getterFieldName": "z", + "multiplier": -1389588877, + "staticField": false + }, + { + "className": "al", + "getterMethodDesc": "()[I", + "getterName": "getInterleaveLeave", + "getterClassName": "al", + "getterFieldName": "r", + "staticField": false + }, + { + "className": "al", + "getterMethodDesc": "()Z", + "getterName": "getStretches", + "getterClassName": "al", + "getterFieldName": "b", + "staticField": false + }, + { + "className": "al", + "getterMethodDesc": "()I", + "getterName": "getMaxLoops", + "getterClassName": "al", + "getterFieldName": "y", + "multiplier": -2119768037, + "staticField": false + }, + { + "className": "al", + "getterMethodDesc": "()I", + "getterName": "getPrecedenceAnimating", + "getterClassName": "al", + "getterFieldName": "s", + "multiplier": -663257967, + "staticField": false + }, + { + "className": "ck", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/ItemLayer;", + "getterName": "getItemLayer", + "getterClassName": "ck", + "getterFieldName": "k", + "staticField": false + }, + { + "className": "ck", + "getterMethodDesc": "()[Lcom/runeloader/api/bridge/os/accessor/GameObject;", + "getterName": "getObjects", + "getterClassName": "ck", + "getterFieldName": "b", + "staticField": false + }, + { + "className": "ck", + "getterMethodDesc": "()I", + "getterName": "getX", + "getterClassName": "ck", + "getterFieldName": "l", + "multiplier": -1664312453, + "staticField": false + }, + { + "className": "ck", + "getterMethodDesc": "()I", + "getterName": "getY", + "getterClassName": "ck", + "getterFieldName": "a", + "multiplier": -1393601341, + "staticField": false + }, + { + "className": "ck", + "getterMethodDesc": "()I", + "getterName": "getPlane", + "getterClassName": "ck", + "getterFieldName": "j", + "multiplier": -178836619, + "staticField": false + }, + { + "className": "i", + "getterMethodDesc": "()I", + "getterName": "getId", + "getterClassName": "i", + "getterFieldName": "j", + "multiplier": 615686255, + "staticField": false + }, + { + "className": "ag", + "getterMethodDesc": "()[I", + "getterName": "getHitSplats", + "getterClassName": "ag", + "getterFieldName": "av", + "staticField": false + }, + { + "className": "ag", + "getterMethodDesc": "()Ljava/lang/String;", + "getterName": "getOverhead", + "getterClassName": "ag", + "getterFieldName": "an", + "staticField": false + }, + { + "className": "ag", + "getterMethodDesc": "()I", + "getterName": "getLoopCycle", + "getterClassName": "ag", + "getterFieldName": "ah", + "multiplier": -337203589, + "staticField": false + }, + { + "className": "ag", + "getterMethodDesc": "()Z", + "getterName": "inSequence", + "getterClassName": "ag", + "getterFieldName": "al", + "staticField": false + }, + { + "className": "ag", + "getterMethodDesc": "()I", + "getterName": "getHealth", + "getterClassName": "ag", + "getterFieldName": "aj", + "multiplier": 890636133, + "staticField": false + }, + { + "className": "ag", + "getterMethodDesc": "()I", + "getterName": "getMaxHealth", + "getterClassName": "ag", + "getterFieldName": "bs", + "multiplier": -254455673, + "staticField": false + }, + { + "className": "ag", + "getterMethodDesc": "()[I", + "getterName": "getHitCycle", + "getterClassName": "ag", + "getterFieldName": "av", + "staticField": false + }, + { + "className": "ag", + "getterMethodDesc": "()I", + "getterName": "getAnimation", + "getterClassName": "ag", + "getterFieldName": "bk", + "multiplier": -637206083, + "staticField": false + }, + { + "className": "ag", + "getterMethodDesc": "()I", + "getterName": "getInteracting", + "getterClassName": "ag", + "getterFieldName": "bv", + "multiplier": 224919161, + "staticField": false + }, + { + "className": "ag", + "getterMethodDesc": "()I", + "getterName": "getX", + "getterClassName": "ag", + "getterFieldName": "ak", + "multiplier": 173574639, + "staticField": false + }, + { + "className": "ag", + "getterMethodDesc": "()I", + "getterName": "getY", + "getterClassName": "ag", + "getterFieldName": "am", + "multiplier": -341573925, + "staticField": false + }, + { + "className": "client", + "getterMethodDesc": "()[Lcom/runeloader/api/bridge/os/accessor/World;", + "getterName": "getWorldList", + "getterClassName": "v", + "getterFieldName": "f", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/XHashTable;", + "getterName": "getItemContainers", + "getterClassName": "y", + "getterFieldName": "j", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/Region;", + "getterName": "getRegion", + "getterClassName": "dt", + "getterFieldName": "dq", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[Lcom/runeloader/api/bridge/os/accessor/XClanMember;", + "getterName": "getClanMembers", + "getterClassName": "ea", + "getterFieldName": "mr", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/Player;", + "getterName": "getLocalPlayer", + "getterClassName": "ek", + "getterFieldName": "hi", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[[Lcom/runeloader/api/bridge/os/accessor/Widget;", + "getterName": "getWidgets", + "getterClassName": "fv", + "getterFieldName": "j", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[Lcom/runeloader/api/bridge/os/accessor/NPC;", + "getterName": "getCachedNPCs", + "getterClassName": "client", + "getterFieldName": "cx", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[Lcom/runeloader/api/bridge/os/accessor/CollisionData;", + "getterName": "getCollisionMaps", + "getterClassName": "client", + "getterFieldName": "w", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[Lcom/runeloader/api/bridge/os/accessor/Player;", + "getterName": "getCachedPlayers", + "getterClassName": "client", + "getterFieldName": "gb", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[[[Lcom/runeloader/api/bridge/os/accessor/Deque;", + "getterName": "getGroundItemDeque", + "getterClassName": "client", + "getterFieldName": "hd", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[Lcom/runeloader/api/bridge/os/accessor/XGrandExchangeOffer;", + "getterName": "getGrandExchangeOffers", + "getterClassName": "client", + "getterFieldName": "pn", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getCamera2", + "getterClassName": "client", + "getterFieldName": "ok", + "multiplier": -586720657, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getScale", + "getterClassName": "client", + "getterFieldName": "oc", + "multiplier": 1750639481, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getCamera3", + "getterClassName": "client", + "getterFieldName": "oq", + "multiplier": -115979353, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getCameraX", + "getterClassName": "em", + "getterFieldName": "fj", + "multiplier": -2012461321, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getCameraY", + "getterClassName": "ew", + "getterFieldName": "fu", + "multiplier": 1006578465, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getCameraZ", + "getterClassName": "as", + "getterFieldName": "fh", + "multiplier": 2024395599, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getPlane", + "getterClassName": "bp", + "getterFieldName": "gs", + "multiplier": 1591567857, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getCameraPitch", + "getterClassName": "client", + "getterFieldName": "fp", + "multiplier": 1734781257, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getCameraYaw", + "getterClassName": "bh", + "getterFieldName": "fx", + "multiplier": -1538835479, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getMapScale", + "getterClassName": "client", + "getterFieldName": "ed", + "multiplier": 269522371, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getMapAngle", + "getterClassName": "client", + "getterFieldName": "fi", + "multiplier": -1793160455, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[[[I", + "getterName": "getTileHeights", + "getterClassName": "m", + "getterFieldName": "j", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[[[B", + "getterName": "getTileSettings", + "getterClassName": "m", + "getterFieldName": "l", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[I", + "getterName": "getSettings", + "getterClassName": "fo", + "getterFieldName": "l", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[I", + "getterName": "getWidgetSettings", + "getterClassName": "fo", + "getterFieldName": "a", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getEnergy", + "getterClassName": "client", + "getterFieldName": "jh", + "multiplier": -1215768761, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getWeight", + "getterClassName": "client", + "getterFieldName": "jx", + "multiplier": -1874130963, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getBaseX", + "getterClassName": "cf", + "getterFieldName": "dd", + "multiplier": -1831938679, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getBaseY", + "getterClassName": "ct", + "getterFieldName": "dn", + "multiplier": -1241787625, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[I", + "getterName": "getBoostedSkillLevels", + "getterClassName": "client", + "getterFieldName": "hv", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[I", + "getterName": "getRealSkillLevels", + "getterClassName": "client", + "getterFieldName": "hg", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[I", + "getterName": "getSkillExperiences", + "getterClassName": "client", + "getterFieldName": "hy", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getGameState", + "getterClassName": "client", + "getterFieldName": "d", + "multiplier": 1285263801, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()Ljava/lang/String;", + "getterName": "getUsername", + "getterClassName": "ac", + "getterFieldName": "ao", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getFPS", + "getterClassName": "er", + "getterFieldName": "qv", + "multiplier": 95389503, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getWorld", + "getterClassName": "client", + "getterFieldName": "i", + "multiplier": -1340762123, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getMenuOptionCount", + "getterClassName": "client", + "getterFieldName": "hb", + "multiplier": 1597447929, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()Z", + "getterName": "isMenuOpen", + "getterClassName": "client", + "getterFieldName": "hk", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[Ljava/lang/String;", + "getterName": "getMenuOptions", + "getterClassName": "client", + "getterFieldName": "il", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[Ljava/lang/String;", + "getterName": "getMenuTargets", + "getterClassName": "client", + "getterFieldName": "io", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[I", + "getterName": "getMenuTypes", + "getterClassName": "client", + "getterFieldName": "ic", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[I", + "getterName": "getMenuIdentifiers", + "getterClassName": "client", + "getterFieldName": "im", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[Lcom/runeloader/api/bridge/os/accessor/Friend;", + "getterName": "getFriends", + "getterClassName": "client", + "getterFieldName": "of", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[Lcom/runeloader/api/bridge/os/accessor/Ignore;", + "getterName": "getIgnores", + "getterClassName": "client", + "getterFieldName": "oj", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getCurrentPacketOpcode", + "getterClassName": "client", + "getterFieldName": "p", + "multiplier": 1183949399, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()I", + "getterName": "getGameCycle", + "getterClassName": "client", + "getterFieldName": "p", + "multiplier": 1183949399, + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[Z", + "getterName": "getValidInterfaces", + "getterClassName": "fv", + "getterFieldName": "l", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()Z", + "getterName": "isResized", + "getterClassName": "client", + "getterFieldName": "lm", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/XHashTable;", + "getterName": "getComponentTable", + "getterClassName": "client", + "getterFieldName": "id", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[I", + "getterName": "getWidgetPositionX", + "getterClassName": "client", + "getterFieldName": "lf", + "staticField": true + }, + { + "className": "client", + "getterMethodDesc": "()[I", + "getterName": "getWidgetPositionY", + "getterClassName": "client", + "getterFieldName": "la", + "staticField": true + }, + { + "className": "am", + "getterMethodDesc": "()I", + "getterName": "getId", + "getterClassName": "am", + "getterFieldName": "j", + "multiplier": -1553248223, + "staticField": false + }, + { + "className": "am", + "getterMethodDesc": "()I", + "getterName": "getQuantity", + "getterClassName": "am", + "getterFieldName": "l", + "multiplier": 1680491553, + "staticField": false + }, + { + "className": "cf", + "getterMethodDesc": "()I", + "getterName": "getX", + "getterClassName": "cf", + "getterFieldName": "l", + "multiplier": -1653966587, + "staticField": false + }, + { + "className": "cf", + "getterMethodDesc": "()I", + "getterName": "getY", + "getterClassName": "cf", + "getterFieldName": "a", + "multiplier": 560834759, + "staticField": false + }, + { + "className": "cf", + "getterMethodDesc": "()I", + "getterName": "getHash", + "getterClassName": "cf", + "getterFieldName": "j", + "multiplier": 1596143467, + "staticField": false + }, + { + "className": "cf", + "getterMethodDesc": "()I", + "getterName": "getFlags", + "getterClassName": "cf", + "getterFieldName": "o", + "multiplier": -521899065, + "staticField": false + }, + { + "className": "cf", + "getterMethodDesc": "()I", + "getterName": "getHeight", + "getterClassName": "cf", + "getterFieldName": "h", + "multiplier": 1607844131, + "staticField": false + }, + { + "className": "cf", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/Renderable;", + "getterName": "getBottom", + "getterClassName": "cf", + "getterFieldName": "i", + "staticField": false + }, + { + "className": "cf", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/Renderable;", + "getterName": "getMiddle", + "getterClassName": "cf", + "getterFieldName": "f", + "staticField": false + }, + { + "className": "cf", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/Renderable;", + "getterName": "getTop", + "getterClassName": "cf", + "getterFieldName": "m", + "staticField": false + }, + { + "className": "cz", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/Renderable;", + "getterName": "getRenderable", + "getterClassName": "cz", + "getterFieldName": "f", + "staticField": false + }, + { + "className": "cz", + "getterMethodDesc": "()I", + "getterName": "getPlane", + "getterClassName": "cz", + "getterFieldName": "j", + "multiplier": -1937641387, + "staticField": false + }, + { + "className": "cz", + "getterMethodDesc": "()I", + "getterName": "getRelativeX", + "getterClassName": "cz", + "getterFieldName": "o", + "multiplier": 1324128483, + "staticField": false + }, + { + "className": "cz", + "getterMethodDesc": "()I", + "getterName": "getRelativeY", + "getterClassName": "cz", + "getterFieldName": "n", + "multiplier": 1900169327, + "staticField": false + }, + { + "className": "cz", + "getterMethodDesc": "()I", + "getterName": "getOffsetX", + "getterClassName": "cz", + "getterFieldName": "h", + "multiplier": -1678710799, + "staticField": false + }, + { + "className": "cz", + "getterMethodDesc": "()I", + "getterName": "getOffsetY", + "getterClassName": "cz", + "getterFieldName": "k", + "multiplier": 590979045, + "staticField": false + }, + { + "className": "cz", + "getterMethodDesc": "()I", + "getterName": "getX", + "getterClassName": "cz", + "getterFieldName": "a", + "multiplier": -439838937, + "staticField": false + }, + { + "className": "cz", + "getterMethodDesc": "()I", + "getterName": "getY", + "getterClassName": "cz", + "getterFieldName": "i", + "multiplier": 249963455, + "staticField": false + }, + { + "className": "cz", + "getterMethodDesc": "()I", + "getterName": "getHeight", + "getterClassName": "cz", + "getterFieldName": "l", + "multiplier": -1496951985, + "staticField": false + }, + { + "className": "cz", + "getterMethodDesc": "()I", + "getterName": "getOrientation", + "getterClassName": "cz", + "getterFieldName": "m", + "multiplier": -1178349931, + "staticField": false + }, + { + "className": "cz", + "getterMethodDesc": "()I", + "getterName": "getHash", + "getterClassName": "cz", + "getterFieldName": "q", + "multiplier": -1171940171, + "staticField": false + }, + { + "className": "cz", + "getterMethodDesc": "()I", + "getterName": "getFlags", + "getterClassName": "cz", + "getterFieldName": "u", + "multiplier": 1386293683, + "staticField": false + }, + { + "className": "a", + "getterMethodDesc": "()I", + "getterName": "getTotalLevel", + "getterClassName": "a", + "getterFieldName": "k", + "multiplier": -1764853731, + "staticField": false + }, + { + "className": "a", + "getterMethodDesc": "()I", + "getterName": "getCombatLevel", + "getterClassName": "a", + "getterFieldName": "o", + "multiplier": 1059759119, + "staticField": false + }, + { + "className": "a", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/PlayerComposition;", + "getterName": "getComposition", + "getterClassName": "a", + "getterFieldName": "l", + "staticField": false + }, + { + "className": "a", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/Model;", + "getterName": "getModel", + "getterClassName": "a", + "getterFieldName": "g", + "staticField": false + }, + { + "className": "a", + "getterMethodDesc": "()Ljava/lang/String;", + "getterName": "getName", + "getterClassName": "a", + "getterFieldName": "j", + "staticField": false + }, + { + "className": "a", + "getterMethodDesc": "()I", + "getterName": "getTeam", + "getterClassName": "a", + "getterFieldName": "w", + "multiplier": -907063375, + "staticField": false + }, + { + "className": "cq", + "getterMethodDesc": "()[[[Lcom/runeloader/api/bridge/os/accessor/Tile;", + "getterName": "getTiles", + "getterClassName": "cq", + "getterFieldName": "m", + "staticField": false + }, + { + "className": "cq", + "getterMethodDesc": "()[Lcom/runeloader/api/bridge/os/accessor/GameObject;", + "getterName": "getObjects", + "getterClassName": "cq", + "getterFieldName": "n", + "staticField": false + }, + { + "className": "ar", + "getterMethodDesc": "()Lcom/runeloader/api/bridge/os/accessor/NPCComposition;", + "getterName": "getComposition", + "getterClassName": "ar", + "getterFieldName": "j", + "staticField": false + }, + { + "className": "fa", + "getterMethodDesc": "()Z", + "getterName": "isFemale", + "getterClassName": "fa", + "getterFieldName": "a", + "staticField": false + }, + { + "className": "fa", + "getterMethodDesc": "()[I", + "getterName": "getBodyParts", + "getterClassName": "fa", + "getterFieldName": "j", + "staticField": false + }, + { + "className": "fa", + "getterMethodDesc": "()[I", + "getterName": "getBodyPartColours", + "getterClassName": "fa", + "getterFieldName": "l", + "staticField": false + } + ], + "superChangeInjects": [], + "addInterfaceInjects": [ + { + "clientClass": "hi", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/ClassInfo" + }, + { + "clientClass": "hk", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/FileOnDisk" + }, + { + "clientClass": "d", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/Friend" + }, + { + "clientClass": "er", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/GameEngine" + }, + { + "clientClass": "hz", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/XGrandExchangeOffer" + }, + { + "clientClass": "gd", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/XHashTable" + }, + { + "clientClass": "h", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/Ignore" + }, + { + "clientClass": "gu", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/Node" + }, + { + "clientClass": "o", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/Projectile" + }, + { + "clientClass": "cr", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/SpritePixels" + }, + { + "clientClass": "fv", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/Widget" + }, + { + "clientClass": "v", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/World" + }, + { + "clientClass": "dc", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/Buffer" + }, + { + "clientClass": "gj", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/CacheableNode" + }, + { + "clientClass": "e", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/XClanMember" + }, + { + "clientClass": "dt", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/CollisionData" + }, + { + "clientClass": "gr", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/Deque" + }, + { + "clientClass": "aj", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/ItemComposition" + }, + { + "clientClass": "y", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/XItemContainer" + }, + { + "clientClass": "aa", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/MessageNode" + }, + { + "clientClass": "ao", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/NPCComposition" + }, + { + "clientClass": "an", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/ObjectComposition" + }, + { + "clientClass": "ce", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/Renderable" + }, + { + "clientClass": "al", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/Sequence" + }, + { + "clientClass": "ck", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/Tile" + }, + { + "clientClass": "i", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/WidgetNode" + }, + { + "clientClass": "ag", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/Actor" + }, + { + "clientClass": "client", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/Client" + }, + { + "clientClass": "am", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/Item" + }, + { + "clientClass": "cf", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/ItemLayer" + }, + { + "clientClass": "dd", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/Model" + }, + { + "clientClass": "cz", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/GameObject" + }, + { + "clientClass": "a", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/Player" + }, + { + "clientClass": "cq", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/Region" + }, + { + "clientClass": "ar", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/NPC" + }, + { + "clientClass": "fa", + "interfaceClass": "com/runeloader/api/bridge/os/accessor/PlayerComposition" + } + ], + "fields": [], + "methodMods": [ + { + "startIndex": 0, + "nodes": [ + { + "opcode": 21, + "var": 0 + }, + { + "opcode": 184, + "owner": "com/runecore/api/bridge/os/Callbacks", + "name": "gameStateChanged", + "desc": "(I)V" + } + ], + "owner": "client", + "method": "r", + "desc": "(II)V" + }, + { + "startIndex": 19, + "nodes": [ + { + "opcode": 184, + "owner": "com/runeloader/api/bridge/os/Callbacks", + "name": "worldChanged", + "desc": "()V" + } + ], + "owner": "l", + "method": "q", + "desc": "(Lv;I)V" + }, + { + "startIndex": 124, + "nodes": [ + { + "opcode": 184, + "owner": "com/runeloader/api/bridge/os/Callbacks", + "name": "worldChanged", + "desc": "()V" + } + ], + "owner": "client", + "method": "init", + "desc": "()V" + }, + { + "startIndex": 0, + "nodes": [ + { + "opcode": 25, + "var": 1 + }, + { + "opcode": 21, + "var": 2 + }, + { + "opcode": 184, + "owner": "com/runeloader/api/bridge/os/Callbacks", + "name": "transform", + "desc": "(Ljava/lang/String;I)Ljava/lang/String;" + }, + { + "opcode": 58, + "var": 1 + } + ], + "owner": "dc", + "method": "bn", + "desc": "(Ljava/lang/String;Ljava/lang/String;IIIIB)V" + }, + { + "startIndex": 10018, + "nodes": [ + { + "opcode": 21, + "var": 5 + }, + { + "opcode": 21, + "var": 7 + }, + { + "opcode": 21, + "var": 6 + }, + { + "opcode": 184, + "owner": "com/runeloader/api/bridge/os/Callbacks", + "name": "skill", + "desc": "(III)V" + } + ], + "owner": "client", + "method": "h", + "desc": "(I)V" + }, + { + "startIndex": 5, + "nodes": [ + { + "opcode": 184, + "owner": "com/runeloader/api/bridge/os/Callbacks", + "name": "pulse", + "desc": "()V" + } + ], + "owner": "client", + "method": "h", + "desc": "(I)V" + }, + { + "startIndex": 0, + "nodes": [ + { + "opcode": 21, + "var": 0 + }, + { + "opcode": 184, + "owner": "com/runeloader/api/bridge/os/Callbacks", + "name": "varpChange", + "desc": "(I)V" + } + ], + "owner": "dx", + "method": "dn", + "desc": "(II)V" + }, + { + "startIndex": 0, + "nodes": [ + { + "opcode": 21, + "var": 1 + }, + { + "opcode": 25, + "var": 2 + }, + { + "opcode": 25, + "var": 3 + }, + { + "opcode": 25, + "var": 4 + }, + { + "opcode": 184, + "owner": "com/runeloader/api/bridge/os/Callbacks", + "name": "message", + "desc": "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" + } + ], + "owner": "ak", + "method": "j", + "desc": "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Laa;" + }, + { + "startIndex": 293, + "nodes": [ + { + "opcode": 89 + }, + { + "opcode": 184, + "owner": "com/runeloader/api/bridge/os/Callbacks", + "name": "objectSpawned", + "desc": "(Lcom/runeloader/api/bridge/os/accessor/GameObject;)V" + } + ], + "owner": "cq", + "method": "u", + "desc": "(IIIIIIIILce;IZII)Z" + }, + { + "startIndex": 0, + "nodes": [ + { + "opcode": 25, + "var": 1 + }, + { + "opcode": 184, + "owner": "com/runeloader/api/bridge/os/Callbacks", + "name": "objectRemoved", + "desc": "(Lcom/runeloader/api/bridge/os/accessor/GameObject;)V" + } + ], + "owner": "cq", + "method": "y", + "desc": "(Lcz;)V" + } + ], + "addMethods": [ + { + "clientClass": "client", + "methodName": "sendGameMessage", + "methodDesc": "(ILjava/lang/String;Ljava/lang/String;I)V", + "instructions": [ + { + "opcode": 21, + "var": 1 + }, + { + "opcode": 25, + "var": 2 + }, + { + "opcode": 25, + "var": 3 + }, + { + "opcode": 21, + "var": 4 + }, + { + "opcode": 184, + "owner": "s", + "name": "j", + "desc": "(ILjava/lang/String;Ljava/lang/String;I)V" + }, + { + "opcode": 177 + } + ] + }, + { + "clientClass": "gd", + "methodName": "get", + "methodDesc": "(J)Lcom/runeloader/api/bridge/os/accessor/Node;", + "instructions": [ + { + "opcode": 25, + "var": 0 + }, + { + "opcode": 22, + "var": 1 + }, + { + "opcode": 182, + "owner": "gd", + "name": "j", + "desc": "(J)Lgu;" + }, + { + "opcode": 176 + } + ] + }, + { + "clientClass": "fv", + "methodName": "setRelativeY", + "methodDesc": "(I)V", + "instructions": [ + { + "opcode": 25, + "var": 0 + }, + { + "opcode": 21, + "var": 1 + }, + { + "opcode": 18, + "cst": -1957749619 + }, + { + "opcode": 104 + }, + { + "opcode": 181, + "owner": "fv", + "name": "ab", + "desc": "I" + }, + { + "opcode": 177 + } + ] + }, + { + "clientClass": "client", + "methodName": "hopToWorld", + "methodDesc": "(Ljava/lang/String;II)V", + "instructions": [ + { + "opcode": 187, + "desc": "v" + }, + { + "opcode": 89 + }, + { + "opcode": 183, + "owner": "v", + "name": "\u003cinit\u003e", + "desc": "()V" + }, + { + "opcode": 58, + "var": 4 + }, + { + "opcode": 25, + "var": 4 + }, + { + "opcode": 25, + "var": 1 + }, + { + "opcode": 181, + "owner": "v", + "name": "u", + "desc": "Ljava/lang/String;" + }, + { + "opcode": 25, + "var": 4 + }, + { + "opcode": 21, + "var": 2 + }, + { + "opcode": 18, + "cst": 663699185 + }, + { + "opcode": 104 + }, + { + "opcode": 181, + "owner": "v", + "name": "r", + "desc": "I" + }, + { + "opcode": 25, + "var": 4 + }, + { + "opcode": 21, + "var": 3 + }, + { + "opcode": 18, + "cst": -403786747 + }, + { + "opcode": 104 + }, + { + "opcode": 181, + "owner": "v", + "name": "b", + "desc": "I" + }, + { + "opcode": 16, + "operand": 45 + }, + { + "opcode": 18, + "cst": -1934831293 + }, + { + "opcode": 184, + "owner": "client", + "name": "r", + "desc": "(II)V" + }, + { + "opcode": 178, + "owner": "hi", + "name": "cq", + "desc": "Lem;" + }, + { + "opcode": 18, + "cst": -888469545 + }, + { + "opcode": 182, + "owner": "em", + "name": "i", + "desc": "(I)V" + }, + { + "opcode": 1 + }, + { + "opcode": 179, + "owner": "hi", + "name": "cq", + "desc": "Lem;" + }, + { + "opcode": 25, + "var": 4 + }, + { + "opcode": 18, + "cst": -2074383180 + }, + { + "opcode": 184, + "owner": "l", + "name": "q", + "desc": "(Lv;I)V" + }, + { + "opcode": 177 + } + ] + } + ], + "newMethodMods": [] +} \ No newline at end of file