aboutsummaryrefslogtreecommitdiff
path: root/src/Java/gtPlusPlus/preloader/asm/transformers
diff options
context:
space:
mode:
authorJordan Byrne <draknyte1@hotmail.com>2018-01-31 22:16:31 +1000
committerJordan Byrne <draknyte1@hotmail.com>2018-01-31 22:16:31 +1000
commit7a1c92118a53b5bc6294d65361e16c5859597a10 (patch)
tree2dba81c7d2eb78e48ceba687af6aaaa1de746289 /src/Java/gtPlusPlus/preloader/asm/transformers
parentc793ff869c74bae8c35516042f5ae883aeb270c9 (diff)
downloadGT5-Unofficial-7a1c92118a53b5bc6294d65361e16c5859597a10.tar.gz
GT5-Unofficial-7a1c92118a53b5bc6294d65361e16c5859597a10.tar.bz2
GT5-Unofficial-7a1c92118a53b5bc6294d65361e16c5859597a10.zip
$ Finished ASM for getDrops() GT fix.
% Mild re-arrangement to CI.java.
Diffstat (limited to 'src/Java/gtPlusPlus/preloader/asm/transformers')
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer2.java171
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java3
2 files changed, 104 insertions, 70 deletions
diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer2.java b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer2.java
index 55c384c58b..89c41452d5 100644
--- a/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer2.java
+++ b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer2.java
@@ -2,39 +2,68 @@ package gtPlusPlus.preloader.asm.transformers;
import static org.objectweb.asm.Opcodes.*;
-import java.rmi.AccessException;
import java.util.ArrayList;
import java.util.Arrays;
import org.apache.logging.log4j.Level;
import org.objectweb.asm.*;
+import org.objectweb.asm.commons.GeneratorAdapter;
import cpw.mods.fml.relauncher.FMLRelaunchLog;
import gregtech.api.GregTech_API;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.item.ItemUtils;
import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.fluids.FluidStack;
public class Preloader_ClassTransformer2 {
+ private final static Class<BaseMetaTileEntity> customTransformer2 = BaseMetaTileEntity.class;
- public ArrayList<ItemStack> getDrops(BaseMetaTileEntity o) {
+ public static ArrayList<ItemStack> getDrops(BaseMetaTileEntity o) {
+ Logger.INFO("DROP!");
try {
- int tID = (int) ReflectionUtils.getField(getClass(), "mID").get(o);
- NBTTagCompound tRecipeStuff = (NBTTagCompound) ReflectionUtils.getField(getClass(), "mRecipeStuff").get(o);
- boolean tMuffler = (boolean) ReflectionUtils.getField(getClass(), "mMuffler").get(o);
- boolean tLockUpgrade = (boolean) ReflectionUtils.getField(getClass(), "mLockUpgrade").get(o);
- boolean tSteamConverter = (boolean) ReflectionUtils.getField(getClass(), "mSteamConverter").get(o);
- byte tColor = (byte) ReflectionUtils.getField(getClass(), "mColor").get(o);
- byte tOtherUpgrades = (byte) ReflectionUtils.getField(getClass(), "mOtherUpgrades").get(o);
- byte tStrongRedstone = (byte) ReflectionUtils.getField(getClass(), "mStrongRedstone").get(o);
- int[] tCoverSides = (int[]) ReflectionUtils.getField(getClass(), "mCoverSides").get(o);
- int[] tCoverData = (int[]) ReflectionUtils.getField(getClass(), "mCoverData").get(o);
- BaseMetaTileEntity tMetaTileEntity = (BaseMetaTileEntity) ReflectionUtils.getField(getClass(), "mMetaTileEntity").get(o);
-
+ short tID = (short) ReflectionUtils.getField(customTransformer2, "mID").get(o);
+ NBTTagCompound tRecipeStuff = (NBTTagCompound) ReflectionUtils.getField(customTransformer2, "mRecipeStuff").get(o);
+ boolean tMuffler = (boolean) ReflectionUtils.getField(customTransformer2, "mMuffler").get(o);
+ boolean tLockUpgrade = (boolean) ReflectionUtils.getField(customTransformer2, "mLockUpgrade").get(o);
+ boolean tSteamConverter = (boolean) ReflectionUtils.getField(customTransformer2, "mSteamConverter").get(o);
+ byte tColor = (byte) ReflectionUtils.getField(customTransformer2, "mColor").get(o);
+ byte tOtherUpgrades = (byte) ReflectionUtils.getField(customTransformer2, "mOtherUpgrades").get(o);
+ byte tStrongRedstone = (byte) ReflectionUtils.getField(customTransformer2, "mStrongRedstone").get(o);
+ int[] tCoverSides = (int[]) ReflectionUtils.getField(customTransformer2, "mCoverSides").get(o);
+ int[] tCoverData = (int[]) ReflectionUtils.getField(customTransformer2, "mCoverData").get(o);
+ FluidStack tFluid = null;
+ if (GT_MetaTileEntity_BasicTank.class.isInstance(o)) {
+ try {
+ tFluid = (FluidStack) ReflectionUtils.getField(GT_MetaTileEntity_BasicTank.class, "mFluid").get(o);
+ }
+ catch (Throwable t) {
+ Logger.REFLECTION("mFluid was not set.");
+ }
+ }
+ else {
+ Logger.REFLECTION("mFluid was not found.");
+ }
+ BaseMetaTileEntity tMetaTileEntity = o;
+
+ Logger.REFLECTION("tID: "+(tID != 0));
+ Logger.REFLECTION("tRecipeStuff: "+(tRecipeStuff != null));
+ Logger.REFLECTION("tMuffler: "+(tMuffler != false));
+ Logger.REFLECTION("tLockUpgrade: "+(tLockUpgrade != false));
+ Logger.REFLECTION("tSteamConverter: "+(tSteamConverter != false));
+ Logger.REFLECTION("tColor: "+(tColor != 0));
+ Logger.REFLECTION("tOtherUpgrades: "+(tOtherUpgrades != 0));
+ Logger.REFLECTION("tCoverSides: "+(tCoverSides != null));
+ Logger.REFLECTION("tCoverData: "+(tCoverData != null));
+ Logger.REFLECTION("tMetaTileEntity: "+(tMetaTileEntity != null));
+
ItemStack rStack = new ItemStack(GregTech_API.sBlockMachines, 1, tID);
NBTTagCompound tNBT = new NBTTagCompound();
@@ -43,6 +72,8 @@ public class Preloader_ClassTransformer2 {
if (tLockUpgrade) tNBT.setBoolean("mLockUpgrade", tLockUpgrade);
if (tSteamConverter) tNBT.setBoolean("mSteamConverter", tSteamConverter);
if (tColor > 0) tNBT.setByte("mColor", tColor);
+ //if (tFluid != null) tFluid.writeToNBT(tNBT);
+ if (tFluid != null) tNBT.setTag("mFluid", tFluid.tag);
if (tOtherUpgrades > 0) tNBT.setByte("mOtherUpgrades", tOtherUpgrades);
if (tStrongRedstone > 0) tNBT.setByte("mStrongRedstone", tStrongRedstone);
for (byte i = 0; i < tCoverSides.length; i++) {
@@ -62,15 +93,22 @@ public class Preloader_ClassTransformer2 {
Logger.REFLECTION("Trying to set NBT data to Itemstack from invalid tile, World might explode.");
((IMetaTileEntity) tMetaTileEntity).setItemNBT(tNBT); //Valid? Idk
}
- catch (Throwable t){}
+ catch (Throwable t){
+ Logger.REFLECTION("getDropsHack1");
+ t.printStackTrace();
+ }
}
-
+
//Set stack NBT
if (!tNBT.hasNoTags()) rStack.setTagCompound(tNBT);
return new ArrayList<ItemStack>(Arrays.asList(rStack));
}
- catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException a){}
- return null;
+ catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException a){
+ Logger.REFLECTION("getDropsHack2");
+ a.printStackTrace();
+ }
+ ArrayList<ItemStack> u = new ArrayList<ItemStack>(Arrays.asList(new ItemStack[]{ItemUtils.getSimpleStack(Blocks.bedrock)}));
+ return u;
}
@@ -84,75 +122,70 @@ public class Preloader_ClassTransformer2 {
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("getDrops") && desc.equals("()Ljava/util/ArrayList;")) {
- FMLRelaunchLog.log("[GT++ ASM] NBTFixer", Level.INFO, "Found target method. [Unobfuscated]");
- return new RegisterOreImplVisitor(methodVisitor, false);
- }
- else if(name.equals("getDrops") && desc.equals("(Ljava/lang/String;Ladd;)V")) {
- FMLRelaunchLog.log("[GT++ ASM] NBTFixer", Level.INFO, "Found target method. [Obfuscated]");
- return new RegisterOreImplVisitor(methodVisitor, true);
+ FMLRelaunchLog.log("[GT++ ASM] NBTFixer", Level.INFO, "Found target method. Access OpCode: "+access);
+ //return new TrySwapMethod(methodVisitor, access, name, desc);
+ return new SwapTwo(methodVisitor);
}
return methodVisitor;
}
}
- private static final class RegisterOreImplVisitor extends MethodVisitor {
+ /*private static final class TrySwapMethod extends GeneratorAdapter {
- private final boolean mObfuscated;
+ public TrySwapMethod(MethodVisitor mv, int access, String name, String desc) {
+ super(Opcodes.ASM5, mv, access, name, desc);
+ FMLRelaunchLog.log("[GT++ ASM] NBTFixer", Level.INFO, "Created method swapper for '"+name+"' in 'gregtech/api/metatileentity/BaseMetaTileEntity'. Desc: "+desc);
+ }
- public RegisterOreImplVisitor(MethodVisitor mv, boolean obfuscated) {
+ @Override
+ public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
+ //gtPlusPlus.preloader.asm.transformers.Preloader_ClassTransformer2
+ if(opcode==INVOKESPECIAL && owner.equals("net/minecraft/item/ItemStack")
+ && name.equals("<init>") && desc.equals("(Lnet/minecraft/block/Block;II)V")) {
+ FMLRelaunchLog.log("[GT++ ASM] NBTFixer", Level.INFO, "Trying to proccess '"+name+"' | Opcode: "+opcode+" | Desc: "+desc+" | Owner: "+owner);
+ FMLRelaunchLog.log("[GT++ ASM] NBTFixer", Level.INFO, "Fixing Greg & Blood's poor attempt at setItemNBT().");
+ // not relaying the original instruction to super effectively removes the original
+ // instruction, instead we're producing a different instruction:
+ super.visitVarInsn(ALOAD, 0);
+ super.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer2",
+ "getDrops", "()Ljava/util/ArrayList;", false);
+ FMLRelaunchLog.log("[GT++ ASM] NBTFixer", Level.INFO, "Method should now be replaced.");
+ }
+ else { // relaying to super will reproduce the same instruction
+ //FMLRelaunchLog.log("[GT++ ASM] NBTFixer", Level.INFO, "Original method call.");
+ super.visitMethodInsn(opcode, owner, name, desc, itf);
+ }
+ }
+
+ // all other, not overridden visit methods reproduce the original instructions
+ }*/
+
+ private static final class SwapTwo extends MethodVisitor {
+
+ public SwapTwo(MethodVisitor mv) {
super(ASM5, mv);
- this.mObfuscated = obfuscated;
}
@Override
public void visitCode() {
FMLRelaunchLog.log("[GT++ ASM] NBTFixer", Level.INFO, "Fixing Greg & Blood's poor attempt at setItemNBT().");
- /*super.visitCode();
+ super.visitCode();
+ //ALOAD 0
+ //INVOKESTATIC gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer2 getDrops (Lgregtech/api/metatileentity/BaseMetaTileEntity;)Ljava/util/ArrayList;
+ //ARETURN
+
super.visitVarInsn(ALOAD, 0);
- super.visitVarInsn(ALOAD, 1);
- if (!mObfuscated){
- FMLRelaunchLog.log("[GT++ ASM] NBTFixer", Level.INFO, "Injecting target method. [Unobfuscated]");
- super.visitMethodInsn(INVOKESTATIC,
- "gtPlusPlus/preloader/Preloader_GT_OreDict",
- "shouldPreventRegistration",
- "(Ljava/lang/String;Lnet/minecraft/item/ItemStack;)Z",
+ super.visitMethodInsn(INVOKESTATIC,
+ "gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer2",
+ "getDrops",
+ "(Lgregtech/api/metatileentity/BaseMetaTileEntity;)Ljava/util/ArrayList;",
false);
- }
- else {
- FMLRelaunchLog.log("[GT++ ASM] NBTFixer", Level.INFO, "Injecting target method. [Obfuscated]");
- super.visitMethodInsn(INVOKESTATIC,
- "gtPlusPlus/preloader/Preloader_GT_OreDict",
- "shouldPreventRegistration",
- "(Ljava/lang/String;Ladd;)Z",
- false);
- }
- Label endLabel = new Label();
- super.visitJumpInsn(IFEQ, endLabel);
- super.visitInsn(RETURN);
- super.visitLabel(endLabel);*/
+ FMLRelaunchLog.log("[GT++ ASM] NBTFixer", Level.INFO, "Method should now be replaced.");
+ //super.visitVarInsn(ARETURN, 0);
+ super.visitInsn(ARETURN);
}
}
-
- public static class GetDropsReplacer extends MethodVisitor {
- private final MethodVisitor target;
-
- public GetDropsReplacer(MethodVisitor methodVisitor) {
- super(ASM4, null);
- this.target=methodVisitor;
- }
-
- @Override
- public void visitCode() {
- target.visitCode();
- target.visitTypeInsn(NEW, "java/io/IOException");
- target.visitInsn(DUP);
- target.visitMethodInsn(INVOKESPECIAL,"java/io/IOException","<init>","()V",false);
- target.visitInsn(ATHROW);
- target.visitMaxs(2, 0);
- target.visitEnd();
- }
- }
}
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 0a2f674875..723061f998 100644
--- a/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java
+++ b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java
@@ -21,7 +21,8 @@ public class Preloader_Transformer_Handler implements IClassTransformer {
if(transformedName.equals("gregtech.api.metatileentity.BaseMetaTileEntity")) {
FMLRelaunchLog.log("[GT++ ASM] NBTFixer", Level.INFO, "Transforming %s", transformedName);
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
- new ClassReader(basicClass).accept(new GT_MetaTile_Visitor(classWriter), 0);
+ ClassReader x = new ClassReader(basicClass);
+ x.accept(new GT_MetaTile_Visitor(classWriter), ClassReader.EXPAND_FRAMES);
return classWriter.toByteArray();
}
return basicClass;