aboutsummaryrefslogtreecommitdiff
path: root/src/Java/gtPlusPlus/preloader/asm/transformers
diff options
context:
space:
mode:
authorAlkalus <3060479+draknyte1@users.noreply.github.com>2019-08-14 21:13:04 +0100
committerAlkalus <3060479+draknyte1@users.noreply.github.com>2019-08-14 21:13:04 +0100
commit110f15eeaf7ffa91339e21556b0c259ef40bee98 (patch)
tree5ee6f446330c96006a8f9da3dd0e42e845077bd0 /src/Java/gtPlusPlus/preloader/asm/transformers
parentede55e818ba0312f061e154402cd82ec4603480d (diff)
downloadGT5-Unofficial-110f15eeaf7ffa91339e21556b0c259ef40bee98.tar.gz
GT5-Unofficial-110f15eeaf7ffa91339e21556b0c259ef40bee98.tar.bz2
GT5-Unofficial-110f15eeaf7ffa91339e21556b0c259ef40bee98.zip
$ Hopefully improved some basic logic within Railcraft item handling. Hopefully Fixes #529.
Diffstat (limited to 'src/Java/gtPlusPlus/preloader/asm/transformers')
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_Railcraft_InvTools.java229
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java5
2 files changed, 234 insertions, 0 deletions
diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_Railcraft_InvTools.java b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_Railcraft_InvTools.java
new file mode 100644
index 0000000000..b70fca0847
--- /dev/null
+++ b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_Railcraft_InvTools.java
@@ -0,0 +1,229 @@
+package gtPlusPlus.preloader.asm.transformers;
+
+import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
+import static org.objectweb.asm.Opcodes.ACC_STATIC;
+import static org.objectweb.asm.Opcodes.ALOAD;
+import static org.objectweb.asm.Opcodes.ARETURN;
+import static org.objectweb.asm.Opcodes.ASM5;
+import static org.objectweb.asm.Opcodes.INVOKESTATIC;
+
+import java.lang.reflect.Method;
+
+import org.apache.logging.log4j.Level;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+
+public class ClassTransformer_Railcraft_InvTools {
+
+ private final boolean isValid;
+ private final ClassReader reader;
+ private final ClassWriter writer;
+
+
+ public static ItemStack depleteItem(ItemStack stack) {
+ if (stack == null) {
+ return GT_Values.NI;
+ }
+ else {
+ if (stack.stackSize <= 1) {
+ ItemStack container = stack.getItem().getContainerItem(stack);
+ if (container != null) {
+ return container;
+ }
+ else {
+ return GT_Values.NI;
+ }
+
+ }
+ else {
+ ItemUtils.depleteStack(stack);
+ return stack;
+ }
+ }
+ }
+
+ public static ItemStack depleteItem1(ItemStack stack) {
+ return gtPlusPlus.preloader.asm.transformers.ClassTransformer_Railcraft_InvTools.depleteItem(stack);
+ }
+
+ public ClassTransformer_Railcraft_InvTools(byte[] basicClass, boolean obfuscated2) {
+ ClassReader aTempReader = null;
+ ClassWriter aTempWriter = null;
+
+ boolean obfuscated = false;
+ boolean a1 = false;
+ boolean a2 = false;
+
+ //Find Non-Obf method
+ try {
+ Method aGetStackInSlot = IInventory.class.getDeclaredMethod("getStackInSlot", int.class);
+ if (aGetStackInSlot != null) {
+ a1 = true;
+ }
+ } catch (NoSuchMethodException | SecurityException e) {}
+
+ //Find Obf method
+ try {
+ Method aGetStackInSlotObf = IInventory.class.getDeclaredMethod("func_70301_a", int.class);
+ if (aGetStackInSlotObf != null) {
+ a2 = true;
+ }
+ } catch (NoSuchMethodException | SecurityException e) {}
+
+
+ if (a1) {
+ obfuscated = false;
+ }
+ else if (a2) {
+ obfuscated = true;
+ }
+ else {
+ //Fallback
+ obfuscated = false;
+ }
+ FMLRelaunchLog.log("[GT++ ASM] Railcraft negative ItemStack Fix", Level.INFO, "Are we patching obfuscated methods? "+obfuscated);
+
+ aTempReader = new ClassReader(basicClass);
+ aTempWriter = new ClassWriter(aTempReader, ClassWriter.COMPUTE_FRAMES);
+ aTempReader.accept(new AddFieldAdapter(aTempWriter), 0);
+
+ injectMethod("depleteItem", aTempWriter, obfuscated);
+
+ if (aTempReader != null && aTempWriter != null) {
+ isValid = true;
+ }
+ else {
+ isValid = false;
+ }
+
+ FMLRelaunchLog.log("[GT++ ASM] Railcraft negative ItemStack Fix", Level.INFO, "Valid? "+isValid+".");
+ reader = aTempReader;
+ writer = aTempWriter;
+ }
+
+ public boolean isValidTransformer() {
+ return isValid;
+ }
+
+ public ClassReader getReader() {
+ return reader;
+ }
+
+ public ClassWriter getWriter() {
+ return writer;
+ }
+
+ public boolean injectMethod(String aMethodName, ClassWriter cw, boolean obfuscated) {
+ MethodVisitor mv;
+ boolean didInject = false;
+ FMLRelaunchLog.log("[GT++ ASM] Railcraft negative ItemStack Fix", Level.INFO, "Injecting " + aMethodName + ".");
+ if (aMethodName.equals("depleteItem") && !obfuscated) {
+ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "depleteItem", "(Lnet/minecraft/item/ItemStack;)Lnet/minecraft/item/ItemStack;", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(36, l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/preloader/asm/transformers/ClassTransformer_Railcraft_InvTools", "depleteItem", "(Lnet/minecraft/item/ItemStack;)Lnet/minecraft/item/ItemStack;", false);
+ mv.visitInsn(ARETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("stack", "Lnet/minecraft/item/ItemStack;", null, l0, l1, 0);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ didInject = true;
+ }
+ else if (aMethodName.equals("depleteItem") && obfuscated) {
+ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "depleteItem", "(Ladd;)Ladd;", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(36, l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/preloader/asm/transformers/ClassTransformer_Railcraft_InvTools", "depleteItem", "(Ladd;)Ladd;", false);
+ mv.visitInsn(ARETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("stack", "Ladd;", null, l0, l1, 0);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ didInject = true;
+ }
+ FMLRelaunchLog.log("[GT++ ASM] Railcraft negative ItemStack Fix", Level.INFO, "Method injection complete. "+(obfuscated ? "Obfuscated" : "Non-Obfuscated"));
+ return didInject;
+ }
+
+
+
+
+
+
+
+
+
+ public class AddFieldAdapter extends ClassVisitor {
+
+ public AddFieldAdapter(ClassVisitor cv) {
+ super(ASM5, cv);
+ this.cv = cv;
+ }
+
+ @Override
+ public FieldVisitor visitField(
+ int access, String name, String desc, String signature, Object value) {
+ if (name.equals("PROCESS_VOLUME") && desc.equals("I")) {
+ FMLRelaunchLog.log("[GT++ ASM] Railcraft negative ItemStack Fix", Level.INFO, "Removing "+"PROCESS_VOLUME"+".");
+ return null;
+ }
+ return cv.visitField(access, name, desc, signature, value);
+ }
+
+
+ private final String[] aMethodsToStrip = new String[] {"depleteItem"};
+
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+
+ MethodVisitor methodVisitor;
+ boolean found = false;
+
+ for (String s : aMethodsToStrip) {
+ if (name.equals(s)) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ }
+ else {
+ methodVisitor = null;
+ }
+
+ if (found) {
+ FMLRelaunchLog.log("[GT++ ASM] Railcraft negative ItemStack Fix", Level.INFO,
+ "Found method " + name + ", removing.");
+ }
+ return methodVisitor;
+ }
+
+
+ }
+
+
+
+
+
+
+}
diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java
index f73ee12d7e..6c283af832 100644
--- a/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java
+++ b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java
@@ -96,6 +96,11 @@ public class Preloader_Transformer_Handler implements IClassTransformer {
FMLRelaunchLog.log("[GT++ ASM] Railcraft PROCESS_VOLUME Patch", Level.INFO, "Transforming %s", transformedName);
return new ClassTransformer_Railcraft_FluidHelper(basicClass, obfuscated).getWriter().toByteArray();
}
+ //Fix Weird glitch involving negative itemstacks.
+ if (transformedName.equals("mods.railcraft.common.util.inventory.InvTools")) {
+ FMLRelaunchLog.log("[GT++ ASM] Railcraft negative ItemStack Fix", Level.INFO, "Transforming %s", transformedName);
+ return new ClassTransformer_Railcraft_InvTools(basicClass, obfuscated).getWriter().toByteArray();
+ }
//Fix GC stuff
if (mConfig.enableGcFuelChanges) {