Skip to content

Commit

Permalink
Finally working......
Browse files Browse the repository at this point in the history
Jesus age Christ this took some work, but damn is it worth it.

- Enchantments are now working outside dev
- Potions and Enchantments are now fully extended. Okay, back into the hole.
  • Loading branch information
ZombieHDGaming committed Oct 7, 2018
1 parent d095e79 commit f400c9a
Show file tree
Hide file tree
Showing 4 changed files with 111 additions and 45 deletions.
57 changes: 57 additions & 0 deletions src/main/java/org/dimdev/jeid/ASMException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package org.dimdev.jeid;

import org.objectweb.asm.tree.*;

import java.util.Iterator;

public class ASMException extends RuntimeException {
private static final long serialVersionUID = -8581611883691404427L;

public ASMException(String message) {
super("MaxPotionIDExtender - Class transformation error\n"+message);
}

public ASMException(String message, ClassNode node) {
this(message+"\n"+getStringDescriptor(node));
}

public ASMException(String message, MethodNode node) {
this(message+"\n"+getStringDescriptor(node));
}

private static String getStringDescriptor(MethodNode node) {
StringBuilder sb = new StringBuilder();
Iterator<AbstractInsnNode> i = node.instructions.iterator();
while (i.hasNext()) {
AbstractInsnNode n = i.next();
sb.append("["+n.getOpcode()+"] - "+getInsnDesc(n)+"\n");
}
return sb.toString();
}

private static String getInsnDesc(AbstractInsnNode n) {
if (n instanceof LdcInsnNode) {
return "LDC - "+((LdcInsnNode)n).cst.toString();
}
if (n instanceof LabelNode) {
return "Label - "+((LabelNode)n).getLabel().toString();
}
if (n instanceof LineNumberNode) {
return "Line - "+((LineNumberNode)n).line;
}
if (n instanceof IntInsnNode) {
return "Int - "+((IntInsnNode)n).operand;
}
if (n instanceof MethodInsnNode) {
MethodInsnNode m = (MethodInsnNode)n;
return "Method - "+m.name+", "+m.desc+", "+m.owner;
}
return n.getClass().getName();
}

private static String getStringDescriptor(ClassNode node) {
StringBuilder sb = new StringBuilder();
node.methods.forEach(m -> sb.append(m.name+": "+m.desc+"\n"));
return sb.toString();
}
}
62 changes: 54 additions & 8 deletions src/main/java/org/dimdev/jeid/JEIDTransformer.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,24 +48,42 @@ public byte[] transform(String name, String transformedName, byte[] basicClass)
ClassNode cn = new ClassNode();
cr.accept(cn, 0);
if (!cn.name.equals(Obf.NBTTagCompound)) {
throw new RuntimeException("The class NBTTagCompound has broken mappings, should be "+cn.name);
throw new ASMException("The class NBTTagCompound has broken mappings, should be "+cn.name);
}
}
if (transformedName.equals("net.minecraft.network.PacketBuffer")) {
ClassReader cr = new ClassReader(basicClass);
ClassNode cn = new ClassNode();
cr.accept(cn, 0);
if (!cn.name.equals(Obf.PacketBuffer)) {
throw new RuntimeException("The class PacketBuffer has broken mappings, should be "+cn.name);
throw new ASMException("The class PacketBuffer has broken mappings, should be "+cn.name);
}
}
return basicClass;
}

private static MethodNode locateMethod(ClassNode cn, String desc, String nameIn, String deobfNameIn) {
private static MethodNode locateMethod(ClassNode cn, String desc, String... namesIn) {
return cn.methods.parallelStream()
.filter(n -> n.desc.equals(desc) && (n.name.equals(nameIn) || n.name.equals(deobfNameIn)))
.findAny().orElseThrow(() -> new RuntimeException((nameIn +" ("+deobfNameIn+"): "+desc+" cannot be found in "+cn.name)));
.filter(n -> n.desc.equals(desc) && anyMatch(namesIn, n.name))
.findAny().orElseThrow(() -> new ASMException(getNames(namesIn) +": "+desc+" cannot be found in "+cn.name, cn));
}

private static boolean anyMatch(String[] pool, String match) {
for (String s:pool) {
if (s.equals(match)) {
return true;
}
}
return false;
}

private static String getNames(String[] pool) {
StringBuilder sb = new StringBuilder();
for (String s:pool) {
sb.append(s);
sb.append(" ");
}
return sb.toString().trim();
}

private static AbstractInsnNode locateTargetInsn(MethodNode mn, Predicate<AbstractInsnNode> filter) {
Expand All @@ -78,23 +96,39 @@ private static AbstractInsnNode locateTargetInsn(MethodNode mn, Predicate<Abstra
}
}
if (target==null) {
throw new RuntimeException("Can't locate target instruction in "+mn.name);
throw new ASMException("Can't locate target instruction in "+mn.name, mn);
}
return target;
}

private byte[] transformItemStack(byte[] basicClass) {
ClassReader cr = new ClassReader(basicClass);
ClassNode cn = new ClassNode();
cr.accept(cn, 0);

String descr = "(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/client/util/ITooltipFlag;)Ljava/util/List;";
if (!cn.name.equals(Obf.ItemStack)) {
throw new ASMException("The class ItemStack has broken mappings, should be "+cn.name);
}

String descr = "(L"+Obf.EntityPlayer+";L"+Obf.ITooltipFlag+";)Ljava/util/List;";
String getIntegerName = Obf.isDeobf()?"getInteger":"func_74762_e";

MethodNode mn = locateMethod(cn, descr, "func_82840_a", "getTooltip");
MethodNode mn = locateMethod(cn, descr, "func_82840_a", "getTooltip", "a");
AbstractInsnNode target = locateTargetInsn(mn, n -> n.getOpcode()==Opcodes.INVOKEVIRTUAL && n.getPrevious().getOpcode()==Opcodes.LDC && ((LdcInsnNode)n.getPrevious()).cst.toString().equals("id"));
mn.instructions.insertBefore(target, new MethodInsnNode(Opcodes.INVOKEVIRTUAL, Obf.NBTTagCompound, getIntegerName, "(Ljava/lang/String;)I", false));
mn.instructions.remove(target);

String descAddEnch = "(L"+Obf.Enchantment+";I)V";
MethodNode mn2 = locateMethod(cn, descAddEnch, "addEnchantment", "func_77966_a", "a");

String setIntegerName = Obf.isDeobf() ? "setInteger" : "func_74768_a";

mn2.instructions.remove(locateTargetInsn(mn2, n -> n.getOpcode()==Opcodes.I2S));
AbstractInsnNode target2 = locateTargetInsn(mn2, n -> n.getOpcode()==Opcodes.INVOKEVIRTUAL && n.getPrevious().getPrevious().getPrevious().getOpcode()==Opcodes.LDC && ((LdcInsnNode)n.getPrevious().getPrevious().getPrevious()).cst.toString().equals("id"));
mn.instructions.insertBefore(target2, new MethodInsnNode(Opcodes.INVOKEVIRTUAL, Obf.NBTTagCompound, setIntegerName, "(Ljava/lang/String;I)V", false));
mn.instructions.remove(target2);


ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
cn.accept(cw);
return cw.toByteArray();
Expand Down Expand Up @@ -262,16 +296,28 @@ public static void loadData() {
PotionEffect ="net/minecraft/potion/PotionEffect";
SPacketEntityEffect = "net/minecraft/network/play/server/SPacketEntityEffect";
PacketBuffer = "net/minecraft/network/PacketBuffer";
ItemStack = "net/minecraft/item/ItemStack";
ITooltipFlag = "net/minecraft/client/util/ITooltipFlag";
Enchantment = "net/minecraft/enchantment/Enchantment";
EntityPlayer = "net/minecraft/entity/player/EntityPlayer";
} else {
NBTTagCompound = "fy";
PotionEffect = "va";
SPacketEntityEffect = "kw";
PacketBuffer = "gy";
ItemStack = "aip";
ITooltipFlag = "akb";
Enchantment = "alk";
EntityPlayer = "aed";
}
}

public static String NBTTagCompound;
public static String PotionEffect;
public static String SPacketEntityEffect;
public static String PacketBuffer;
public static String ItemStack;
public static String ITooltipFlag;
public static String Enchantment;
public static String EntityPlayer;
}
36 changes: 0 additions & 36 deletions src/main/java/org/dimdev/jeid/mixin/core/MixinItemStack.java

This file was deleted.

1 change: 0 additions & 1 deletion src/main/resources/mixins.jeid.core.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
"MixinChunkPrimer",
"MixinChunkProviderServer",
"MixinWorldInfo",
"MixinItemStack",
"MixinEnchantmentHelper",
"MixinItemEnchantedBook"
],
Expand Down

0 comments on commit f400c9a

Please sign in to comment.