aboutsummaryrefslogtreecommitdiff
path: root/src/Java/gtPlusPlus/preloader/asm/transformers
diff options
context:
space:
mode:
Diffstat (limited to 'src/Java/gtPlusPlus/preloader/asm/transformers')
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer.java93
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer2.java138
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java30
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;
+ }
+
+}