diff options
author | Jordan Byrne <draknyte1@hotmail.com> | 2018-01-31 22:16:31 +1000 |
---|---|---|
committer | Jordan Byrne <draknyte1@hotmail.com> | 2018-01-31 22:16:31 +1000 |
commit | 7a1c92118a53b5bc6294d65361e16c5859597a10 (patch) | |
tree | 2dba81c7d2eb78e48ceba687af6aaaa1de746289 /src/Java/gtPlusPlus/preloader/asm/transformers | |
parent | c793ff869c74bae8c35516042f5ae883aeb270c9 (diff) | |
download | GT5-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.java | 171 | ||||
-rw-r--r-- | src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java | 3 |
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; |