package net.fybertech.dynamicmappings.mappers;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import net.fybertech.dynamicmappings.DynamicMappings;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.FieldInsnNode;
import org.objectweb.asm.tree.FieldNode;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.MethodNode;
public class MappingsBase
{
public ClassNode getClassNode(String className)
{
return DynamicMappings.getClassNode(className);
}
public ClassNode getClassNodeFromMapping(String deobfClass)
{
return DynamicMappings.getClassNodeFromMapping(deobfClass);
}
public void addClassMapping(String deobfClassName, ClassNode node)
{
DynamicMappings.addClassMapping(deobfClassName, node);
}
public void addClassMapping(String deobfClassName, String obfClassName)
{
DynamicMappings.addClassMapping(deobfClassName, obfClassName);
}
public String getClassMapping(String deobfClassName)
{
return DynamicMappings.getClassMapping(deobfClassName);
}
public boolean searchConstantPoolForStrings(String className, String... matchStrings)
{
return DynamicMappings.searchConstantPoolForStrings(className, matchStrings);
}
public List<MethodNode> getMatchingMethods(ClassNode cn, String name, String desc)
{
return DynamicMappings.getMatchingMethods(cn, name, desc);
}
public List<MethodNode> getMatchingMethods(ClassNode cn, int accessCode, int returnType, int... parameterTypes)
{
return DynamicMappings.getMatchingMethods(cn, accessCode, returnType, parameterTypes);
}
public void addFieldMapping(String deobfFieldDesc, String obfFieldDesc)
{
DynamicMappings.addFieldMapping(deobfFieldDesc, obfFieldDesc);
}
public void addFieldMapping(String deobfFieldDesc, FieldInsnNode obfField)
{
DynamicMappings.addFieldMapping(deobfFieldDesc, obfField.owner + " " + obfField.name + " " + obfField.desc);
}
public void addMethodMapping(String deobfMethodDesc, String obfMethodDesc)
{
DynamicMappings.addMethodMapping(deobfMethodDesc, obfMethodDesc);
}
public void addMethodMapping(String deobfMethodDesc, MethodInsnNode obfMethod)
{
DynamicMappings.addMethodMapping(deobfMethodDesc, obfMethod.owner + " " + obfMethod.name + " " + obfMethod.desc);
}
public boolean matchOpcodeSequence(AbstractInsnNode insn, int...opcodes)
{
return DynamicMappings.matchOpcodeSequence(insn, opcodes);
}
public String getLdcString(AbstractInsnNode node)
{
return DynamicMappings.getLdcString(node);
}
public boolean checkMethodParameters(MethodNode method, int ... types)
{
return DynamicMappings.checkMethodParameters(method, types);
}
public List<FieldNode> getMatchingFields(ClassNode cn, String name, String desc)
{
return DynamicMappings.getMatchingFields(cn, name, desc);
}
public List<MethodNode> removeMethodsWithFlags(List<MethodNode> methods, int accFlags)
{
return DynamicMappings.removeMethodsWithFlags(methods, accFlags);
}
public List<MethodNode> removeMethodsWithoutFlags(List<MethodNode> methods, int accFlags)
{
return DynamicMappings.removeMethodsWithoutFlags(methods, accFlags);
}
public boolean isLdcWithString(AbstractInsnNode node, String string)
{
return DynamicMappings.isLdcWithString(node, string);
}
public boolean isLdcWithInteger(AbstractInsnNode node, int val)
{
return DynamicMappings.isLdcWithInteger(node, val);
}
public boolean isLdcWithFloat(AbstractInsnNode node, float val)
{
return DynamicMappings.isLdcWithFloat(node, val);
}
public AbstractInsnNode getNextRealOpcode(AbstractInsnNode insn)
{
return DynamicMappings.getNextRealOpcode(insn);
}
public MethodNode getMethodNode(ClassNode cn, String obfMapping)
{
return DynamicMappings.getMethodNode(cn, obfMapping);
}
public MethodNode getMethodNode(ClassNode cn, MethodInsnNode obfMethod)
{
if (obfMethod == null) return null;
return DynamicMappings.getMethodNode(cn, obfMethod.owner + " " + obfMethod.name + " " + obfMethod.desc);
}
public MethodNode getMethodNodeFromMapping(ClassNode cn, String deobfMapping)
{
return DynamicMappings.getMethodNodeFromMapping(cn, deobfMapping);
}
@SuppressWarnings("rawtypes")
public List<MethodNode> getMethodsWithDescriptor(List methods, String desc)
{
return DynamicMappings.getMethodsWithDescriptor(methods, desc);
}
public String assembleDescriptor(Object... objects)
{
return DynamicMappings.assembleDescriptor(objects);
}
public <T> List<T> getAllInsnNodesOfType(AbstractInsnNode startInsn, Class<T> classType)
{
return DynamicMappings.getAllInsnNodesOfType(startInsn, classType);
}
public boolean searchConstantPoolForClasses(String className, String... matchStrings)
{
return DynamicMappings.searchConstantPoolForClasses(className, matchStrings);
}
public AbstractInsnNode[] getOpcodeSequenceArray(AbstractInsnNode insn, int...opcodes)
{
return DynamicMappings.getOpcodeSequenceArray(insn, opcodes);
}
@SuppressWarnings("unchecked")
public AbstractInsnNode[] getInsnNodeSequenceArray(AbstractInsnNode insn, Class<? extends AbstractInsnNode>...nodeClasses)
{
return DynamicMappings.getInsnNodeSequenceArray(insn, nodeClasses);
}
public AbstractInsnNode findNextOpcodeNum(AbstractInsnNode insn, int opcode)
{
return DynamicMappings.findNextOpcodeNum(insn, opcode);
}
public <T> T getNextInsnNodeOfType(AbstractInsnNode startInsn, Class<T> classType)
{
return DynamicMappings.getNextInsnNodeOfType(startInsn, classType);
}
public String getLdcClass(AbstractInsnNode node)
{
return DynamicMappings.getLdcClass(node);
}
public FieldNode getFieldNode(ClassNode cn, String obfMapping)
{
return DynamicMappings.getFieldNode(cn, obfMapping);
}
public FieldNode getFieldNodeFromMapping(ClassNode cn, String deobfMapping)
{
return DynamicMappings.getFieldNodeFromMapping(cn, deobfMapping);
}
public boolean classHasInterfaces(ClassNode classNode, String... ifaces)
{
return DynamicMappings.classHasInterfaces(classNode, ifaces);
}
public boolean doesInheritFrom(String className, String inheritFrom)
{
return DynamicMappings.doesInheritFrom(className, inheritFrom);
}
public boolean searchConstantPoolForFields(String className, String...fields)
{
className = className.replace(".", "/");
InputStream stream = DynamicMappings.class.getClassLoader().getResourceAsStream(className + ".class");
if (stream == null) return false;
ClassReader reader = null;
try {
reader = new ClassReader(stream);
} catch (IOException e) { return false; }
int itemCount = reader.getItemCount();
char[] buffer = new char[reader.getMaxStringLength()];
int matches = 0;
for (int n = 1; n < itemCount; n++) {
int pos = reader.getItem(n);
if (pos == 0 || reader.b[pos - 1] != 9) continue;
String owner = reader.readClass(pos, buffer);
pos = reader.getItem(reader.readUnsignedShort(pos + 2));
String name = reader.readUTF8(pos, buffer);
String desc = reader.readUTF8(pos + 2, buffer);
String fieldRef = owner + " " + name + " " + desc;
for (int n2 = 0; n2 < fields.length; n2++) {
if (fieldRef.equals(fields[n2].replace(".", "/"))) { matches++; break; }
}
}
return (matches == fields.length);
}
public String getSoundField(String sound)
{
String full = getSoundFieldFull(sound);
if (full == null) return null;
return full.split(" ")[1];
}
public String getSoundFieldFull(String sound)
{
sound = sound.replace(".", "_");
return DynamicMappings.getFieldMapping("net/minecraft/init/Sounds " + sound + " Lnet/minecraft/util/Sound;");
}
public <T> List<T> getAllInsnNodesOfType(MethodNode method, Class<T> classType)
{
return DynamicMappings.getAllInsnNodesOfType(method.instructions.getFirst(), classType);
}
public <T> List<T> getAllInsnNodesOfType(ClassNode classNode, Class<T> classType)
{
List<T> output = new ArrayList<>();
if (classNode.methods == null) return output;
for (MethodNode method : classNode.methods) {
output.addAll(getAllInsnNodesOfType(method, classType));
}
return output;
}
@SuppressWarnings("unchecked")
public boolean matchInsnNodeSequence(AbstractInsnNode insn, Class<? extends AbstractInsnNode>...nodeClasses)
{
return DynamicMappings.matchInsnNodeSequence(insn, nodeClasses);
}
public List<FieldInsnNode> filterFieldInsnNodes(List<FieldInsnNode> list, String owner, String desc)
{
List<FieldInsnNode> output = new ArrayList<>();
for (FieldInsnNode fn : list) {
if (owner != null && !fn.owner.equals(owner)) continue;
if (desc != null && !fn.desc.equals(desc)) continue;
output.add(fn);
}
return output;
}
public List<MethodInsnNode> filterMethodInsnNodes(List<MethodInsnNode> list, String owner, String name, String desc)
{
List<MethodInsnNode> output = new ArrayList<>();
for (MethodInsnNode mn : list) {
if (owner != null && !mn.owner.equals(owner)) continue;
if (name != null && !mn.name.equals(name)) continue;
if (desc != null && !mn.desc.equals(desc)) continue;
output.add(mn);
}
return output;
}
public List<MethodInsnNode> filterMethodInsnNodes(List<MethodInsnNode> list, String owner, String desc)
{
return filterMethodInsnNodes(list, owner, null, desc);
}
public List<MethodInsnNode> filterMethodInsnNodes(List<MethodInsnNode> list, String owner, MethodNode node)
{
return filterMethodInsnNodes(list, owner, node.name, node.desc);
}
public int countFieldsWithDesc(ClassNode cn, String obfDesc)
{
int count = 0;
for (FieldNode fn : cn.fields) {
if (fn.desc.equals(obfDesc)) count++;
}
return count;
}
public List<String> getStringsFromMethod(MethodNode method)
{
return DynamicMappings.getStringsFromMethod(method);
}
public boolean doesMethodContainString(MethodNode method, String string)
{
return DynamicMappings.doesMethodContainString(method, string);
}
public List<MethodNode> getMethodsContainingString(ClassNode cn, String string)
{
return DynamicMappings.getMethodsContainingString(cn, string);
}
public boolean doesMethodUseField(MethodNode method, String owner, String name, String desc)
{
return DynamicMappings.doesMethodUseField(method, owner, name, desc);
}
public boolean doesMethodUseMethod(MethodNode method, String owner, String name, String desc)
{
return DynamicMappings.doesMethodUseMethod(method, owner, name, desc);
}
public List<MethodNode> filterMethodsUsingField(List<MethodNode> paramMethods, String owner, String name, String desc)
{
return DynamicMappings.filterMethodsUsingField(paramMethods, owner, name, desc);
}
public Integer getLdcInteger(AbstractInsnNode node)
{
return DynamicMappings.getLdcInteger(node);
}
public Float getLdcFloat(AbstractInsnNode node)
{
return DynamicMappings.getLdcFloat(node);
}
public List<Integer> getIntegersFromMethod(MethodNode method)
{
return DynamicMappings.getIntegersFromMethod(method);
}
public List<Float> getFloatsFromMethod(MethodNode method)
{
return DynamicMappings.getFloatsFromMethod(method);
}
public boolean doesMethodContainInteger(MethodNode method, int i)
{
return DynamicMappings.doesMethodContainInteger(method, i);
}
public List<MethodNode> filterMethodsUsingMethod(List<MethodNode> paramMethods, String owner, String name, String desc)
{
return DynamicMappings.filterMethodsUsingMethod(paramMethods, owner, name, desc);
}
}