diff options
Diffstat (limited to 'src/Java/gtPlusPlus/preloader')
-rw-r--r-- | src/Java/gtPlusPlus/preloader/Preloader_GT_OreDict.java | 74 | ||||
-rw-r--r-- | src/Java/gtPlusPlus/preloader/asm/Preloader_ClassTransformer.java | 132 |
2 files changed, 61 insertions, 145 deletions
diff --git a/src/Java/gtPlusPlus/preloader/Preloader_GT_OreDict.java b/src/Java/gtPlusPlus/preloader/Preloader_GT_OreDict.java index 7583493be4..f8bb372d66 100644 --- a/src/Java/gtPlusPlus/preloader/Preloader_GT_OreDict.java +++ b/src/Java/gtPlusPlus/preloader/Preloader_GT_OreDict.java @@ -1,70 +1,11 @@ package gtPlusPlus.preloader; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; import gregtech.common.items.GT_MetaGenerated_Item_01; -import gtPlusPlus.core.item.ModItems; -import gtPlusPlus.core.util.Utils; -import gtPlusPlus.core.util.item.ItemUtils; -import gtPlusPlus.xmod.gregtech.common.Meta_GT_Proxy; import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary.OreRegisterEvent; public class Preloader_GT_OreDict { - @SubscribeEvent - public void onItemRegisteredToOreDictionary(final OreRegisterEvent event) throws Throwable { - String name = event.Name; - ItemStack ore = event.Ore; - // Check Item is Valid - if (ore != null && (name != null && !name.equals(""))) { - // Check Item has a Valid MODID - String MODID = ""; - - try { - MODID = ItemUtils.getModId(ore); - } - catch (NullPointerException n) { - Utils.LOG_INFO("[Bug] Found Item with Bad MODID - " + ore.getDisplayName() - + " | If you recognise this item, please inform the developer."); - } - - if (MODID != null) { - // Check Item has a Valid MODID - if (!MODID.equals("")) { - // Check Item is from Gregtech - if (MODID.equals("gregtech")) { - //Utils.LOG_INFO("Found GT ITEM - " + ore.getDisplayName()); - // Circuit Removal - if (Meta_GT_Proxy.areWeUsingGregtech5uExperimental() && CORE_Preloader.enableOldGTcircuits) { - if (removeCircuit(ore)) { - Utils.LOG_INFO("[Old Feature - Circuits] Preventing " + ore.getDisplayName() - + " from registering itself with oredict tag " + name + "."); - //Do Magic - if (event.isCancelable()){ - event.setCanceled(true); - } - else { - try { - ore = ItemUtils.getSimpleStack(ModItems.AAA_Broken); - name = "null"; - //event.setCanceled(true); - throw new OreDictCancelledException("[Old Feature - Circuits] Circuit OreDict event cancelled."); - } - catch(OreDictCancelledException | UnsupportedOperationException | IllegalArgumentException o){ - Utils.LOG_INFO("[Old Feature - Circuits] Circuit OreDict event cancelled."); - } - finally{ - - } - } - } - } - } - } - } - } - } - - public static boolean removeCircuit(ItemStack circuit) { + + public static boolean shouldPreventRegistration(String string, ItemStack circuit) { int damageValue = circuit.getItemDamage() - 32000; if (circuit.getItem() instanceof GT_MetaGenerated_Item_01) { // 700-720 if (damageValue >= 700 && damageValue <= 720) { @@ -74,7 +15,7 @@ public class Preloader_GT_OreDict { else { try { if (Class.forName("gregtech.common.items.GT_MetaGenerated_Item_03") != null) { // 6/11/12/14/16/20/30-57/69-73/79-96 - Class MetaItem03 = Class.forName("gregtech.common.items.GT_MetaGenerated_Item_03"); + Class<?> MetaItem03 = Class.forName("gregtech.common.items.GT_MetaGenerated_Item_03"); if (isInstanceOf(MetaItem03, circuit.getItem())) { if (damageValue == 6 || damageValue == 11 || damageValue == 12 || damageValue == 14 || damageValue == 16 || damageValue == 20) { @@ -99,13 +40,8 @@ public class Preloader_GT_OreDict { } // Simplification of Life. - private static boolean isInstanceOf(Class clazz, Object obj) { + private static boolean isInstanceOf(Class<?> clazz, Object obj) { return clazz.isInstance(obj); } - - class OreDictCancelledException extends Exception { - public OreDictCancelledException(String msg){ - super(msg); - } - } + } diff --git a/src/Java/gtPlusPlus/preloader/asm/Preloader_ClassTransformer.java b/src/Java/gtPlusPlus/preloader/asm/Preloader_ClassTransformer.java index 330aef318a..e3a022dd6a 100644 --- a/src/Java/gtPlusPlus/preloader/asm/Preloader_ClassTransformer.java +++ b/src/Java/gtPlusPlus/preloader/asm/Preloader_ClassTransformer.java @@ -1,88 +1,68 @@ package gtPlusPlus.preloader.asm; -import static org.objectweb.asm.Opcodes.ALOAD; -import static org.objectweb.asm.Opcodes.INVOKESTATIC; - -import java.util.Iterator; +import static org.objectweb.asm.Opcodes.*; +import org.apache.logging.log4j.Level; import org.objectweb.asm.*; -import org.objectweb.asm.tree.*; -import gtPlusPlus.core.util.Utils; +import cpw.mods.fml.relauncher.FMLRelaunchLog; import net.minecraft.launchwrapper.IClassTransformer; public class Preloader_ClassTransformer implements IClassTransformer { @Override - public byte[] transform(String name, String transformedName, byte[] basicClass) { - - /*if (name.equals("abq")) { - Utils.LOG_ASM("[ASM] INSIDE OBFUSCATED EXPLOSION TRANSFORMER ABOUT TO PATCH: " + name); - return patchClassASM(name, basicClass, true); - } - - else if (name.equals("net.minecraftforge.oredict.OreDictionary")) { - Utils.LOG_ASM("[ASM] INSIDE OREDICT TRANSFORMER ABOUT TO PATCH: " + name); - return patchClassASM(name, basicClass, false); - }*/ - return basicClass; - } - - public byte[] patchClassASM(String name, byte[] bytes, boolean obfuscated) { - - String targetMethodName = ""; - - if(obfuscated == true) - targetMethodName ="a"; - else - targetMethodName ="registerOreImpl"; - - - //set up ASM class manipulation stuff. Consult the ASM docs for details - ClassNode classNode = new ClassNode(); - ClassReader classReader = new ClassReader(bytes); - classReader.accept(classNode, 0); - - - - //Now we loop over all of the methods declared inside the Explosion class until we get to the targetMethodName "doExplosionB" - - // find method to inject into - Iterator<MethodNode> methods = classNode.methods.iterator(); - while(methods.hasNext()) - { - MethodNode m = methods.next(); - Utils.LOG_ASM("[ASM] Method Name: "+m.name + " Desc:" + m.desc); - - //Check if this is doExplosionB and it's method signature is (Z)V which means that it accepts a boolean (Z) and returns a void (V) - if ((m.name.equals(targetMethodName) && m.desc.equals("(Ljava/lang/String;Lnet/minecraft/item/ItemStack;)V"))) - { - Utils.LOG_ASM("[ASM] Inside target method!"); - // find interesting instructions in method, there is a single FDIV instruction we use as target - - // make new instruction list - InsnList toInject = new InsnList(); - - //toInject.add(new VarInsnNode(ALOAD, 0)); - - toInject.add(new VarInsnNode(ALOAD, 1)); - toInject.add(new MethodInsnNode(INVOKESTATIC, "gtPlusPlus/preloader/Preloader_GT_OreDict", "removeCircuit", "(Lnet/minecraft/item/ItemStack;)Z, false")); - toInject.add(new VarInsnNode(Opcodes.IFEQ, 1)); - toInject.add(new VarInsnNode(Opcodes.RETURN, 0)); - //toInject.add(new VarInsnNode(org.objectweb.asm.Opcodes.LABEL END, 0)); - - // inject new instruction list into method instruction list - m.instructions.insert(toInject); - - Utils.LOG_ASM("Patching Complete!"); - break; - } - } - - //ASM specific for cleaning up and returning the final bytes for JVM processing. - ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); - classNode.accept(writer); - return writer.toByteArray(); - } + public byte[] transform(String name, String transformedName, byte[] basicClass) { + if(transformedName.equals("net.minecraftforge.oredict.OreDictionary")) { + FMLRelaunchLog.log("[GT++] OreDictTransformer", Level.INFO, "Transforming %s", transformedName); + ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES); + new ClassReader(basicClass).accept(new OreDictionaryVisitor(classWriter), 0); + return classWriter.toByteArray(); + } + return basicClass; + } + +private static final class OreDictionaryVisitor extends ClassVisitor { + + public OreDictionaryVisitor(ClassVisitor cv) { + super(ASM5, cv); + } + + @Override + public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { + MethodVisitor methodVisitor = super.visitMethod(access, name, desc, signature, exceptions); + if(name.equals("registerOreImpl") && desc.equals("(Ljava/lang/String;Lnet/minecraft/item/ItemStack;)V")) { + FMLRelaunchLog.log("[GT++] OreDictTransformer", Level.INFO, "Found target method."); + return new RegisterOreImplVisitor(methodVisitor); + } + return methodVisitor; + } + + } + + private static final class RegisterOreImplVisitor extends MethodVisitor { + + public RegisterOreImplVisitor(MethodVisitor mv) { + super(ASM5, mv); + } + + @SuppressWarnings("deprecation") + @Override + public void visitCode() { + super.visitCode(); + super.visitVarInsn(ALOAD, 0); + super.visitVarInsn(ALOAD, 1); + super.visitMethodInsn(INVOKESTATIC, + //"gtPlusPlus/preloader/Preloader_GT_OreDict", "removeCircuit", "(Lnet/minecraft/item/ItemStack;)Z, false"); + "gtPlusPlus/preloader/Preloader_GT_OreDict", + "shouldPreventRegistration", + "(Ljava/lang/String;Lnet/minecraft/item/ItemStack;)Z", + false); + Label endLabel = new Label(); + super.visitJumpInsn(IFEQ, endLabel); + super.visitInsn(RETURN); + super.visitLabel(endLabel); + } + + } } |