aboutsummaryrefslogtreecommitdiff
path: root/src/Java/gtPlusPlus/preloader/asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/Java/gtPlusPlus/preloader/asm')
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/Preloader_FMLLoadingPlugin.java3
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer.java (renamed from src/Java/gtPlusPlus/preloader/asm/Preloader_ClassTransformer.java)19
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer2.java158
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java30
4 files changed, 193 insertions, 17 deletions
diff --git a/src/Java/gtPlusPlus/preloader/asm/Preloader_FMLLoadingPlugin.java b/src/Java/gtPlusPlus/preloader/asm/Preloader_FMLLoadingPlugin.java
index f6e5d49906..68aab74a0a 100644
--- a/src/Java/gtPlusPlus/preloader/asm/Preloader_FMLLoadingPlugin.java
+++ b/src/Java/gtPlusPlus/preloader/asm/Preloader_FMLLoadingPlugin.java
@@ -5,6 +5,7 @@ import java.util.Map;
import cpw.mods.fml.relauncher.IFMLLoadingPlugin;
import cpw.mods.fml.relauncher.IFMLLoadingPlugin.MCVersion;
import cpw.mods.fml.relauncher.IFMLLoadingPlugin.SortingIndex;
+import gtPlusPlus.preloader.asm.transformers.Preloader_Transformer_Handler;
@SortingIndex(10097)
@MCVersion(value = "1.7.10")
@@ -20,7 +21,7 @@ public class Preloader_FMLLoadingPlugin implements IFMLLoadingPlugin {
@Override
public String[] getASMTransformerClass() {
//This will return the name of the class
- return new String[]{Preloader_ClassTransformer.class.getName()};
+ return new String[]{Preloader_Transformer_Handler.class.getName()};
}
@Override
diff --git a/src/Java/gtPlusPlus/preloader/asm/Preloader_ClassTransformer.java b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer.java
index f4c06107a7..535d1f778b 100644
--- a/src/Java/gtPlusPlus/preloader/asm/Preloader_ClassTransformer.java
+++ b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer.java
@@ -1,4 +1,4 @@
-package gtPlusPlus.preloader.asm;
+package gtPlusPlus.preloader.asm.transformers;
import static org.objectweb.asm.Opcodes.*;
@@ -11,10 +11,9 @@ import cpw.mods.fml.relauncher.FMLRelaunchLog;
import gtPlusPlus.api.objects.Logger;
import gtPlusPlus.core.util.Utils;
import gtPlusPlus.preloader.CORE_Preloader;
-import net.minecraft.launchwrapper.IClassTransformer;
import net.minecraftforge.common.config.Configuration;
-public class Preloader_ClassTransformer implements IClassTransformer {
+public class Preloader_ClassTransformer {
public boolean getConfig(){
final Configuration config = new Configuration( new File(Utils.getMcDir(), "config/GTplusplus/GTplusplus.cfg"));
@@ -30,19 +29,7 @@ public class Preloader_ClassTransformer implements IClassTransformer {
return false;
}
-
- @Override
- 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();
- }
- return basicClass;
- }
-
- private static final class OreDictionaryVisitor extends ClassVisitor {
+ public static final class OreDictionaryVisitor extends ClassVisitor {
public OreDictionaryVisitor(ClassVisitor cv) {
super(ASM5, cv);
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..55c384c58b
--- /dev/null
+++ b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer2.java
@@ -0,0 +1,158 @@
+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);*/
+ }
+
+ }
+
+ 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
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;
+ }
+
+}