diff options
Diffstat (limited to 'src/Java/gtPlusPlus/preloader/asm/transformers')
3 files changed, 261 insertions, 0 deletions
diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer.java b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer.java new file mode 100644 index 0000000000..535d1f778b --- /dev/null +++ b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer.java @@ -0,0 +1,93 @@ +package gtPlusPlus.preloader.asm.transformers; + +import static org.objectweb.asm.Opcodes.*; + +import java.io.File; + +import org.apache.logging.log4j.Level; +import org.objectweb.asm.*; + +import cpw.mods.fml.relauncher.FMLRelaunchLog; +import gtPlusPlus.api.objects.Logger; +import gtPlusPlus.core.util.Utils; +import gtPlusPlus.preloader.CORE_Preloader; +import net.minecraftforge.common.config.Configuration; + +public class Preloader_ClassTransformer { + + public boolean getConfig(){ + final Configuration config = new Configuration( new File(Utils.getMcDir(), "config/GTplusplus/GTplusplus.cfg")); + if (config != null){ + config.load(); + // Circuits + CORE_Preloader.enableOldGTcircuits = config.getBoolean("enableOldGTcircuits", "gregtech", false, + "Restores circuits and their recipes from Pre-5.09.28 times."); + Logger.INFO("GT++ ASM - Loaded the configuration file."); + return CORE_Preloader.enableOldGTcircuits; + } + Logger.INFO("GT++ ASM - Failed loading the configuration file."); + return false; + } + + public 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++ ASM] OreDictTransformer", Level.INFO, "Found target method. [Unobfuscated]"); + return new RegisterOreImplVisitor(methodVisitor, false); + } + else if(name.equals("registerOreImpl") && desc.equals("(Ljava/lang/String;Ladd;)V")) { + FMLRelaunchLog.log("[GT++ ASM] OreDictTransformer", Level.INFO, "Found target method. [Obfuscated]"); + return new RegisterOreImplVisitor(methodVisitor, true); + } + return methodVisitor; + } + + } + + private static final class RegisterOreImplVisitor extends MethodVisitor { + + private final boolean mObfuscated; + + public RegisterOreImplVisitor(MethodVisitor mv, boolean obfuscated) { + super(ASM5, mv); + this.mObfuscated = obfuscated; + } + + @Override + public void visitCode() { + FMLRelaunchLog.log("[GT++ ASM] OreDictTransformer", Level.INFO, "Fixing Forge's poor attempt at an oreDictionary."); + super.visitCode(); + super.visitVarInsn(ALOAD, 0); + super.visitVarInsn(ALOAD, 1); + if (!mObfuscated){ + FMLRelaunchLog.log("[GT++ ASM] OreDictTransformer", Level.INFO, "Injecting target method. [Unobfuscated]"); + super.visitMethodInsn(INVOKESTATIC, + "gtPlusPlus/preloader/Preloader_GT_OreDict", + "shouldPreventRegistration", + "(Ljava/lang/String;Lnet/minecraft/item/ItemStack;)Z", + false); + } + else { + FMLRelaunchLog.log("[GT++ ASM] OreDictTransformer", 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); + } + + } + +} diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer2.java b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer2.java new file mode 100644 index 0000000000..264b371d7e --- /dev/null +++ b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer2.java @@ -0,0 +1,138 @@ +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 cpw.mods.fml.relauncher.FMLRelaunchLog; +import gregtech.api.GregTech_API; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.metatileentity.BaseMetaTileEntity; +import gtPlusPlus.api.objects.Logger; +import gtPlusPlus.core.util.reflect.ReflectionUtils; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class Preloader_ClassTransformer2 { + + + public ArrayList<ItemStack> getDrops(BaseMetaTileEntity o) { + 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); + + ItemStack rStack = new ItemStack(GregTech_API.sBlockMachines, 1, tID); + NBTTagCompound tNBT = new NBTTagCompound(); + + if (tRecipeStuff != null && !tRecipeStuff.hasNoTags()) tNBT.setTag("GT.CraftingComponents", tRecipeStuff); + if (tMuffler) tNBT.setBoolean("mMuffler", tMuffler); + if (tLockUpgrade) tNBT.setBoolean("mLockUpgrade", tLockUpgrade); + if (tSteamConverter) tNBT.setBoolean("mSteamConverter", tSteamConverter); + if (tColor > 0) tNBT.setByte("mColor", tColor); + if (tOtherUpgrades > 0) tNBT.setByte("mOtherUpgrades", tOtherUpgrades); + if (tStrongRedstone > 0) tNBT.setByte("mStrongRedstone", tStrongRedstone); + for (byte i = 0; i < tCoverSides.length; i++) { + if (tCoverSides[i] != 0) { + tNBT.setIntArray("mCoverData", tCoverData); + tNBT.setIntArray("mCoverSides", tCoverSides); + break; + } + } + + //Set Item NBT + if (!o.isInvalid()){ + ((IMetaTileEntity) tMetaTileEntity).setItemNBT(tNBT); //Valid? Idk + } + else { + try { + Logger.REFLECTION("Trying to set NBT data to Itemstack from invalid tile, World might explode."); + ((IMetaTileEntity) tMetaTileEntity).setItemNBT(tNBT); //Valid? Idk + } + catch (Throwable t){} + } + + //Set stack NBT + if (!tNBT.hasNoTags()) rStack.setTagCompound(tNBT); + return new ArrayList<ItemStack>(Arrays.asList(rStack)); + } + catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException a){} + return null; + } + + + public static final class GT_MetaTile_Visitor extends ClassVisitor { + + public GT_MetaTile_Visitor(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("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); + } + return methodVisitor; + } + + } + + private static final class RegisterOreImplVisitor extends MethodVisitor { + + private final boolean mObfuscated; + + public RegisterOreImplVisitor(MethodVisitor mv, boolean obfuscated) { + 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.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", + 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);*/ + } + + } + +} diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java new file mode 100644 index 0000000000..0a2f674875 --- /dev/null +++ b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java @@ -0,0 +1,30 @@ +package gtPlusPlus.preloader.asm.transformers; + +import org.apache.logging.log4j.Level; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassWriter; + +import cpw.mods.fml.relauncher.FMLRelaunchLog; +import gtPlusPlus.preloader.asm.transformers.Preloader_ClassTransformer.OreDictionaryVisitor; +import gtPlusPlus.preloader.asm.transformers.Preloader_ClassTransformer2.GT_MetaTile_Visitor; +import net.minecraft.launchwrapper.IClassTransformer; + +public class Preloader_Transformer_Handler implements IClassTransformer { + + public byte[] transform(String name, String transformedName, byte[] basicClass) { + if(transformedName.equals("net.minecraftforge.oredict.OreDictionary")) { + FMLRelaunchLog.log("[GT++ ASM] OreDictTransformer", Level.INFO, "Transforming %s", transformedName); + ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES); + new ClassReader(basicClass).accept(new OreDictionaryVisitor(classWriter), 0); + return classWriter.toByteArray(); + } + 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); + return classWriter.toByteArray(); + } + return basicClass; + } + +} |