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/AsmConfig.java9
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/ClassesToTransform.java1
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/Preloader_FMLLoadingPlugin.java2
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_Utility.java194
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_Hazmat.java6
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_TT_ThaumicRestorer.java611
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java53
7 files changed, 809 insertions, 67 deletions
diff --git a/src/Java/gtPlusPlus/preloader/asm/AsmConfig.java b/src/Java/gtPlusPlus/preloader/asm/AsmConfig.java
index d0c59726de..a5981b15d9 100644
--- a/src/Java/gtPlusPlus/preloader/asm/AsmConfig.java
+++ b/src/Java/gtPlusPlus/preloader/asm/AsmConfig.java
@@ -30,6 +30,7 @@ public class AsmConfig {
public static boolean enableTcAspectSafety;
public static boolean enabledLwjglKeybindingFix;
public static boolean enabledFixEntitySetHealth;
+ public static boolean enableThaumicTinkererRepairFix;
public static boolean disableAllLogging;
public static boolean debugMode;
@@ -96,6 +97,14 @@ public class AsmConfig {
enableOreDictPatch = prop.getBoolean(false);
propOrderDebug.add(prop.getName());
+ prop = config.get("debug", "enableThaumicTinkererRepairFix", false);
+ prop.comment = "Enable/Disable Patch for Thaumic Repairer";
+ prop.setLanguageKey("gtpp.enableThaumicTinkererRepairFix").setRequiresMcRestart(true);
+ enableThaumicTinkererRepairFix = prop.getBoolean(false);
+ propOrderDebug.add(prop.getName());
+
+
+
diff --git a/src/Java/gtPlusPlus/preloader/asm/ClassesToTransform.java b/src/Java/gtPlusPlus/preloader/asm/ClassesToTransform.java
index 84593f6597..3366f4aefe 100644
--- a/src/Java/gtPlusPlus/preloader/asm/ClassesToTransform.java
+++ b/src/Java/gtPlusPlus/preloader/asm/ClassesToTransform.java
@@ -52,6 +52,7 @@ public class ClassesToTransform {
public static final String THAUMCRAFT_ITEM_WISP_ESSENCE = "thaumcraft.common.items.ItemWispEssence";
+ public static final String THAUMICTINKERER_TILE_REPAIRER = "thaumic.tinkerer.common.block.tile.TileRepairer";
public static final String IC2_ITEM_ARMOUR_HAZMAT = "ic2.core.item.armor.ItemArmorHazmat";
public static final String IC2_BLOCK_BASE_TILE_ENTITY = "ic2.core.block.BlockTileEntity";
diff --git a/src/Java/gtPlusPlus/preloader/asm/Preloader_FMLLoadingPlugin.java b/src/Java/gtPlusPlus/preloader/asm/Preloader_FMLLoadingPlugin.java
index 46196cb87f..8aa449df5d 100644
--- a/src/Java/gtPlusPlus/preloader/asm/Preloader_FMLLoadingPlugin.java
+++ b/src/Java/gtPlusPlus/preloader/asm/Preloader_FMLLoadingPlugin.java
@@ -13,6 +13,8 @@ import net.minecraft.launchwrapper.Launch;
@SortingIndex(10097)
@MCVersion(value = "1.7.10")
+@IFMLLoadingPlugin.TransformerExclusions("gtPlusPlus.preloader")
+@IFMLLoadingPlugin.Name(CORE_Preloader.NAME)
public class Preloader_FMLLoadingPlugin implements IFMLLoadingPlugin {
//-Dfml.coreMods.load=gtPlusPlus.preloader.asm.Preloader_FMLLoadingPlugin
diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_Utility.java b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_Utility.java
index 307900ad9e..fa711e5693 100644
--- a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_Utility.java
+++ b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_Utility.java
@@ -1,11 +1,6 @@
package gtPlusPlus.preloader.asm.transformers;
-import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
-import static org.objectweb.asm.Opcodes.ACC_STATIC;
-import static org.objectweb.asm.Opcodes.ASM5;
-import static org.objectweb.asm.Opcodes.INVOKESTATIC;
-import static org.objectweb.asm.Opcodes.IRETURN;
-import static org.objectweb.asm.Opcodes.LLOAD;
+import static org.objectweb.asm.Opcodes.*;
import org.apache.logging.log4j.Level;
import org.objectweb.asm.ClassReader;
@@ -14,8 +9,14 @@ import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
-import cpw.mods.fml.relauncher.FMLRelaunchLog;
import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.preloader.Preloader_Logger;
+import ic2.core.IC2Potion;
+import ic2.core.item.armor.ItemArmorHazmat;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.EnumCreatureAttribute;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
public class ClassTransformer_GT_Utility {
@@ -23,6 +24,8 @@ public class ClassTransformer_GT_Utility {
private final ClassReader reader;
private final ClassWriter writer;
private final String className;
+
+
public ClassTransformer_GT_Utility(byte[] basicClass, String aClassName) {
@@ -40,13 +43,20 @@ public class ClassTransformer_GT_Utility {
isValid = false;
}
- FMLRelaunchLog.log("[GT++ ASM] Gregtech Utilities Patch", Level.INFO, "Valid patch? " + isValid + ".");
+ Preloader_Logger.LOG("Gregtech Utilities Patch", Level.INFO, "Valid patch? " + isValid + ".");
reader = aTempReader;
writer = aTempWriter;
if (reader != null && writer != null) {
- FMLRelaunchLog.log("[GT++ ASM] Gregtech Utilities Patch", Level.INFO, "Attempting Method Injection.");
+ Preloader_Logger.LOG("Gregtech Utilities Patch", Level.INFO, "Attempting Method Injection.");
injectMethod("getTier");
+ injectMethod("applyRadioactivity");
+ injectMethod("isWearingFullFrostHazmat");
+ injectMethod("isWearingFullHeatHazmat");
+ injectMethod("isWearingFullBioHazmat");
+ injectMethod("isWearingFullRadioHazmat");
+ injectMethod("isWearingFullElectroHazmat");
+ injectMethod("isWearingFullGasHazmat");
}
}
@@ -67,9 +77,118 @@ public class ClassTransformer_GT_Utility {
MethodVisitor mv;
boolean didInject = false;
ClassWriter cw = getWriter();
- String aClassNameFormatted = Utils.class.getName().replace(".", "/");
- FMLRelaunchLog.log("[GT++ ASM] Gregtech Utilities Patch", Level.INFO, "Injecting " + aMethodName + ", static replacement call to "+aClassNameFormatted+".");
+ String aClassNameFormatted = Utils.class.getName().replace(".", "/");
+
+ if (aMethodName.equals("isWearingFullFrostHazmat")){
+ Preloader_Logger.LOG("Gregtech Utilities Patch", Level.INFO, "Injecting " + aMethodName + ".");
+ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "isWearingFullFrostHazmat", "(Lnet/minecraft/entity/EntityLivingBase;)Z", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(1273, l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/core/util/minecraft/EntityUtils", "isWearingFullFrostHazmat", "(Lnet/minecraft/entity/EntityLivingBase;)Z", false);
+ mv.visitInsn(IRETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("aEntity", "Lnet/minecraft/entity/EntityLivingBase;", null, l0, l1, 0);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ didInject = true;
+ }
+
+ if (aMethodName.equals("isWearingFullHeatHazmat")){
+ Preloader_Logger.LOG("Gregtech Utilities Patch", Level.INFO, "Injecting " + aMethodName + ".");
+ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "isWearingFullHeatHazmat", "(Lnet/minecraft/entity/EntityLivingBase;)Z", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(1277, l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/core/util/minecraft/EntityUtils", "isWearingFullHeatHazmat", "(Lnet/minecraft/entity/EntityLivingBase;)Z", false);
+ mv.visitInsn(IRETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("aEntity", "Lnet/minecraft/entity/EntityLivingBase;", null, l0, l1, 0);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ didInject = true;
+ }
+
+ if (aMethodName.equals("isWearingFullBioHazmat")){
+ Preloader_Logger.LOG("Gregtech Utilities Patch", Level.INFO, "Injecting " + aMethodName + ".");
+ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "isWearingFullBioHazmat", "(Lnet/minecraft/entity/EntityLivingBase;)Z", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(1281, l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/core/util/minecraft/EntityUtils", "isWearingFullBioHazmat", "(Lnet/minecraft/entity/EntityLivingBase;)Z", false);
+ mv.visitInsn(IRETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("aEntity", "Lnet/minecraft/entity/EntityLivingBase;", null, l0, l1, 0);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ didInject = true;
+ }
+
+ if (aMethodName.equals("isWearingFullRadioHazmat")){
+ Preloader_Logger.LOG("Gregtech Utilities Patch", Level.INFO, "Injecting " + aMethodName + ".");
+ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "isWearingFullRadioHazmat", "(Lnet/minecraft/entity/EntityLivingBase;)Z", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(1285, l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/core/util/minecraft/EntityUtils", "isWearingFullRadioHazmat", "(Lnet/minecraft/entity/EntityLivingBase;)Z", false);
+ mv.visitInsn(IRETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("aEntity", "Lnet/minecraft/entity/EntityLivingBase;", null, l0, l1, 0);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ didInject = true;
+ }
+
+ if (aMethodName.equals("isWearingFullElectroHazmat")){
+ Preloader_Logger.LOG("Gregtech Utilities Patch", Level.INFO, "Injecting " + aMethodName + ".");
+ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "isWearingFullElectroHazmat", "(Lnet/minecraft/entity/EntityLivingBase;)Z", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(1289, l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/core/util/minecraft/EntityUtils", "isWearingFullElectroHazmat", "(Lnet/minecraft/entity/EntityLivingBase;)Z", false);
+ mv.visitInsn(IRETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("aEntity", "Lnet/minecraft/entity/EntityLivingBase;", null, l0, l1, 0);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ didInject = true;
+ }
+
+ if (aMethodName.equals("isWearingFullGasHazmat")){
+ Preloader_Logger.LOG("Gregtech Utilities Patch", Level.INFO, "Injecting " + aMethodName + ".");
+ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "isWearingFullGasHazmat", "(Lnet/minecraft/entity/EntityLivingBase;)Z", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(1293, l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/core/util/minecraft/EntityUtils", "isWearingFullGasHazmat", "(Lnet/minecraft/entity/EntityLivingBase;)Z", false);
+ mv.visitInsn(IRETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("aEntity", "Lnet/minecraft/entity/EntityLivingBase;", null, l0, l1, 0);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ didInject = true;
+ }
+
if (aMethodName.equals("getTier")) {
+ Preloader_Logger.LOG("Gregtech Utilities Patch", Level.INFO, "Injecting " + aMethodName + ", static replacement call to "+aClassNameFormatted+".");
mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "getTier", "(J)B", null, null);
mv.visitCode();
Label l0 = new Label();
@@ -84,8 +203,31 @@ public class ClassTransformer_GT_Utility {
mv.visitMaxs(2, 2);
mv.visitEnd();
didInject = true;
+ }
+
+ if (aMethodName.equals("applyRadioactivity")){
+ Preloader_Logger.LOG("Gregtech Utilities Patch", Level.INFO, "Injecting " + aMethodName + ".");
+ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "applyRadioactivity", "(Lnet/minecraft/entity/EntityLivingBase;II)Z", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(1342, l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitVarInsn(ILOAD, 1);
+ mv.visitVarInsn(ILOAD, 2);
+ mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/core/util/minecraft/EntityUtils", "applyRadioactivity", "(Lnet/minecraft/entity/EntityLivingBase;II)Z", false);
+ mv.visitInsn(IRETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("aEntity", "Lnet/minecraft/entity/EntityLivingBase;", null, l0, l1, 0);
+ mv.visitLocalVariable("aLevel", "I", null, l0, l1, 1);
+ mv.visitLocalVariable("aAmountOfItems", "I", null, l0, l1, 2);
+ mv.visitMaxs(3, 3);
+ mv.visitEnd();
+ didInject = true;
}
- FMLRelaunchLog.log("[GT++ ASM] Gregtech Utilities Patch", Level.INFO, "Method injection complete.");
+
+ Preloader_Logger.LOG("Gregtech Utilities Patch", Level.INFO, "Method injection complete.");
return didInject;
}
@@ -104,13 +246,35 @@ public class ClassTransformer_GT_Utility {
if (name.equals("getTier")) {
methodVisitor = null;
- } else {
+ }
+ else if (name.equals("applyRadioactivity")){
+ methodVisitor = null;
+ }
+ else if (name.equals("isWearingFullFrostHazmat")){
+ methodVisitor = null;
+ }
+ else if (name.equals("isWearingFullHeatHazmat")){
+ methodVisitor = null;
+ }
+ else if (name.equals("isWearingFullBioHazmat")){
+ methodVisitor = null;
+ }
+ else if (name.equals("isWearingFullRadioHazmat")){
+ methodVisitor = null;
+ }
+ else if (name.equals("isWearingFullElectroHazmat")){
+ methodVisitor = null;
+ }
+ else if (name.equals("isWearingFullGasHazmat")){
+ methodVisitor = null;
+ }
+ else {
methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
}
if (methodVisitor == null) {
- FMLRelaunchLog.log("[GT++ ASM] Gregtech Utilities Patch", Level.INFO,
- "Found method " + name + ", removing.");
+ Preloader_Logger.LOG("Gregtech Utilities Patch", Level.INFO, "Found method " + name + ", removing.");
+ Preloader_Logger.LOG("Gregtech Utilities Patch", Level.INFO, "Descriptor: "+desc);
}
return methodVisitor;
}
diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_Hazmat.java b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_Hazmat.java
index 52e4d7d99d..10f04e7a48 100644
--- a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_Hazmat.java
+++ b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_Hazmat.java
@@ -3,11 +3,7 @@ package gtPlusPlus.preloader.asm.transformers;
import static org.objectweb.asm.Opcodes.*;
import org.apache.logging.log4j.Level;
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.*;
import cpw.mods.fml.relauncher.FMLRelaunchLog;
import gtPlusPlus.core.util.minecraft.HazmatUtils;
diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_TT_ThaumicRestorer.java b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_TT_ThaumicRestorer.java
new file mode 100644
index 0000000000..05b8054ff8
--- /dev/null
+++ b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_TT_ThaumicRestorer.java
@@ -0,0 +1,611 @@
+package gtPlusPlus.preloader.asm.transformers;
+
+import static org.objectweb.asm.Opcodes.*;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+import org.apache.logging.log4j.Level;
+import org.objectweb.asm.*;
+
+import cpw.mods.fml.common.Loader;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.Preloader_Logger;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+
+public class ClassTransformer_TT_ThaumicRestorer {
+
+ private final boolean isValid;
+ private final ClassReader reader;
+ private final ClassWriter writer;
+
+ private static boolean mInit = false;
+
+ private static Class mTileRepairerClass;
+ private static Class mTTConfigHandler;
+ private static Class mTinkersConstructCompat;
+ private static Class mThaumicTinkerer;
+ private static Class mTCProxy;
+
+ private static Method mIsTcTool;
+ private static Method mGetTcDamage;
+ private static Method mFixTcDamage;
+ private static Method mSparkle;
+ private static Method mDrawEssentia;
+
+ private static Field mRepairTiconTools;
+ private static Field mTicksExisted;
+ private static Field mInventory;
+ private static Field mTookLastTick;
+ private static Field mDamageLastTick;
+ private static Field mProxyTC;
+
+ private static boolean repairTConTools = false;
+
+ // thaumic.tinkerer.common.block.tile.TileRepairer
+
+ private static final boolean isTConstructTool(ItemStack aStack) {
+ return ReflectionUtils.invoke(null, mIsTcTool, new Object[] {aStack});
+ }
+ private static final int getDamage(ItemStack aStack) {
+ return (int) ReflectionUtils.invokeNonBool(null, mGetTcDamage, new Object[] {aStack});
+ }
+ private static final boolean fixDamage(ItemStack aStack, int aAmount) {
+ return ReflectionUtils.invoke(null, mFixTcDamage, new Object[] {aStack, aAmount});
+ }
+ private static final int drawEssentia(TileEntity aTile) {
+ return (int) ReflectionUtils.invokeNonBool(aTile, mDrawEssentia, new Object[] {});
+ }
+ private static final void sparkle(float a, float b, float c, int d) {
+ ReflectionUtils.invokeVoid(ReflectionUtils.getFieldValue(mProxyTC), mSparkle, new Object[] {a, b, c, d});
+ }
+
+ public static void updateEntity(TileEntity aTile) {
+ if (!mInit) {
+ // Set the classes we need
+ mTileRepairerClass = ReflectionUtils.getClass("thaumic.tinkerer.common.block.tile.TileRepairer");
+ mTTConfigHandler = ReflectionUtils.getClass("thaumic.tinkerer.common.core.handler.ConfigHandler");
+ mTinkersConstructCompat = ReflectionUtils.getClass("thaumic.tinkerer.common.compat.TinkersConstructCompat");
+ mThaumicTinkerer = ReflectionUtils.getClass("thaumic.tinkerer.common.ThaumicTinkerer");
+ mTCProxy = ReflectionUtils.getClass("thaumcraft.common.CommonProxy");
+ // Set the methods we need
+ mIsTcTool = ReflectionUtils.getMethod(mTinkersConstructCompat, "isTConstructTool", new Class[] {ItemStack.class});
+ mGetTcDamage = ReflectionUtils.getMethod(mTinkersConstructCompat, "getDamage", new Class[] {ItemStack.class});
+ mFixTcDamage = ReflectionUtils.getMethod(mTinkersConstructCompat, "fixDamage", new Class[] {ItemStack.class, int.class});
+ mSparkle = ReflectionUtils.getMethod(mTCProxy, "sparkle", new Class[] {float.class, float.class, float.class, int.class});
+ mDrawEssentia = ReflectionUtils.getMethod(mTileRepairerClass, "drawEssentia", new Class[] {});
+ // Set the fields we need
+ mRepairTiconTools = ReflectionUtils.getField(mTTConfigHandler, "repairTConTools");
+ mTicksExisted = ReflectionUtils.getField(mTileRepairerClass, "ticksExisted");
+ mInventory = ReflectionUtils.getField(mTileRepairerClass, "inventorySlots");
+ mTookLastTick = ReflectionUtils.getField(mTileRepairerClass, "tookLastTick");
+ mDamageLastTick = ReflectionUtils.getField(mTileRepairerClass, "dmgLastTick");
+ mProxyTC = ReflectionUtils.getField(mThaumicTinkerer, "tcProxy");
+ repairTConTools = (boolean) ReflectionUtils.getFieldValue(mRepairTiconTools);
+ mInit = true;
+ }
+ if (mInit) {
+ if (mTileRepairerClass.isInstance(aTile)) {
+ int ticksExisted = (int) ReflectionUtils.getFieldValue(mTicksExisted, aTile);
+ ItemStack[] inventorySlots = (ItemStack[]) ReflectionUtils.getFieldValue(mInventory, aTile);
+ boolean tookLastTick = (boolean) ReflectionUtils.getFieldValue(mTookLastTick, aTile);
+ int dmgLastTick = (int) ReflectionUtils.getFieldValue(mDamageLastTick, aTile);
+ ticksExisted++;
+ ReflectionUtils.setField(aTile, mTicksExisted, ticksExisted);
+ boolean aDidRun = false;
+ if (ticksExisted % 10 == 0) {
+ if (Loader.isModLoaded("TConstruct") && repairTConTools && inventorySlots[0] != null && isTConstructTool(inventorySlots[0])) {
+ final int dmg = getDamage(inventorySlots[0]);
+ if (dmg > 0) {
+ final int essentia = drawEssentia(aTile);
+ fixDamage(inventorySlots[0], essentia);
+ aTile.markDirty();
+ if (dmgLastTick != 0 && dmgLastTick != dmg) {
+ sparkle((float)(aTile.xCoord + 0.25 + Math.random() / 2.0), (float)(aTile.yCoord + 1 + Math.random() / 2.0), (float)(aTile.zCoord + 0.25 + Math.random() / 2.0), 0);
+ tookLastTick = true;
+ }
+ else {
+ tookLastTick = false;
+ }
+ }
+ else {
+ tookLastTick = false;
+ }
+ dmgLastTick = ((inventorySlots[0] == null) ? 0 : getDamage(inventorySlots[0]));
+ aDidRun = true;
+ }
+ if (inventorySlots[0] != null && inventorySlots[0].getItemDamage() > 0 && inventorySlots[0].getItem().isRepairable()) {
+ final int essentia2 = drawEssentia(aTile);
+ final int dmg2 = inventorySlots[0].getItemDamage();
+ inventorySlots[0].setItemDamage(Math.max(0, dmg2 - essentia2));
+ aTile.markDirty();
+ if (dmgLastTick != 0 && dmgLastTick != dmg2) {
+ sparkle((float)(aTile.xCoord + 0.25 + Math.random() / 2.0), (float)(aTile.yCoord + 1 + Math.random() / 2.0), (float)(aTile.zCoord + 0.25 + Math.random() / 2.0), 0);
+ tookLastTick = true;
+ }
+ else {
+ tookLastTick = false;
+ }
+ }
+ else {
+ tookLastTick = false;
+ }
+ dmgLastTick = ((inventorySlots[0] == null) ? 0 : inventorySlots[0].getItemDamage());
+ aDidRun = true;
+ }
+ if (aDidRun) {
+ ReflectionUtils.setField(aTile, mInventory, inventorySlots);
+ ReflectionUtils.setField(aTile, mTookLastTick, tookLastTick);
+ ReflectionUtils.setField(aTile, mDamageLastTick, dmgLastTick);
+ }
+ }
+ }
+ }
+
+ public ClassTransformer_TT_ThaumicRestorer(byte[] basicClass) {
+ ClassReader aTempReader = null;
+ ClassWriter aTempWriter = null;
+ boolean obfuscated = false;
+ aTempReader = new ClassReader(basicClass);
+ aTempWriter = new ClassWriter(aTempReader, ClassWriter.COMPUTE_FRAMES);
+ AddAdapter aMethodStripper = new AddAdapter(aTempWriter);
+ aTempReader.accept(aMethodStripper, 0);
+ obfuscated = aMethodStripper.isObfuscated;
+ String aUpdateEntity = obfuscated ? "func_145845_h" : "updateEntity";
+ Preloader_Logger.LOG("Thaumic Tinkerer RepairItem Patch", Level.INFO, "Patching: "+aUpdateEntity+", Are we patching obfuscated methods? "+obfuscated);
+ //injectMethod(aUpdateEntity, aTempWriter, obfuscated);
+ injectMethodNew(aTempWriter, obfuscated);
+ if (aTempReader != null && aTempWriter != null) {
+ isValid = true;
+ }
+ else {
+ isValid = false;
+ }
+ Preloader_Logger.LOG("Thaumic Tinkerer RepairItem Patch", Level.INFO, "Valid? "+isValid+".");
+ reader = aTempReader;
+ writer = aTempWriter;
+ }
+
+ public boolean isValidTransformer() {
+ return isValid;
+ }
+
+ public ClassReader getReader() {
+ return reader;
+ }
+
+ public ClassWriter getWriter() {
+ return writer;
+ }
+
+ public boolean injectMethodNew(ClassWriter cw, boolean obfuscated) {
+ MethodVisitor mv;
+ boolean didInject = false;
+ String aUpdateEntity = obfuscated ? "func_145845_h" : "updateEntity";
+ String aTileEntity = obfuscated ? "aor" : "net/minecraft/tileentity/TileEntity";
+ Preloader_Logger.LOG("Thaumic Tinkerer RepairItem Patch", Level.INFO, "Injecting " + aUpdateEntity + ".");
+ mv = cw.visitMethod(ACC_PUBLIC, aUpdateEntity, "()V", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(60, l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/preloader/asm/transformers/ClassTransformer_TT_ThaumicRestorer", "updateEntity", "(L"+aTileEntity+";)V", false);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLineNumber(61, l1);
+ mv.visitInsn(RETURN);
+ Label l2 = new Label();
+ mv.visitLabel(l2);
+ mv.visitLocalVariable("this", "Lthaumic/tinkerer/common/block/tile/TileRepairer;", null, l0, l2, 0);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ didInject = true;
+ Preloader_Logger.LOG("Thaumic Tinkerer RepairItem Patch", Level.INFO, "Method injection complete. "+(obfuscated ? "Obfuscated" : "Non-Obfuscated"));
+ return didInject;
+ }
+
+ public boolean injectMethod(String aMethodName, ClassWriter cw, boolean obfuscated) {
+ MethodVisitor mv;
+ boolean didInject = false;
+ Preloader_Logger.LOG("Thaumic Tinkerer RepairItem Patch", Level.INFO, "Injecting " + aMethodName + ".");
+
+ String aItemStack = obfuscated ? "add" : "net/minecraft/item/ItemStack";
+ String aItem = obfuscated ? "adb" : "net/minecraft/item/Item";
+ String aGetItemDamage = obfuscated ? "func_150976_a" : "getItemDamage";
+ String aGetItem = obfuscated ? "func_77973_b" : "getItem";
+ String aSetItemDamage = obfuscated ? "func_77964_b" : "setItemDamage";
+ String aIsRepairable = obfuscated ? "func_82789_a" : "isRepairable";
+
+ mv = cw.visitMethod(ACC_PUBLIC, aMethodName, "()V", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(59, l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitInsn(DUP);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "ticksExisted", "I");
+ mv.visitInsn(ICONST_1);
+ mv.visitInsn(IADD);
+ mv.visitInsn(DUP_X1);
+ mv.visitFieldInsn(PUTFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "ticksExisted", "I");
+ mv.visitIntInsn(BIPUSH, 10);
+ mv.visitInsn(IREM);
+ Label l1 = new Label();
+ mv.visitJumpInsn(IFNE, l1);
+ Label l2 = new Label();
+ mv.visitLabel(l2);
+ mv.visitLineNumber(60, l2);
+ mv.visitLdcInsn("TConstruct");
+ mv.visitMethodInsn(INVOKESTATIC, "cpw/mods/fml/common/Loader", "isModLoaded", "(Ljava/lang/String;)Z", false);
+ Label l3 = new Label();
+ mv.visitJumpInsn(IFEQ, l3);
+ mv.visitFieldInsn(GETSTATIC, "thaumic/tinkerer/common/core/handler/ConfigHandler", "repairTConTools", "Z");
+ mv.visitJumpInsn(IFEQ, l3);
+ Label l4 = new Label();
+ mv.visitLabel(l4);
+ mv.visitLineNumber(61, l4);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "inventorySlots", "[L"+aItemStack+";");
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(AALOAD);
+ mv.visitJumpInsn(IFNULL, l3);
+ Label l5 = new Label();
+ mv.visitLabel(l5);
+ mv.visitLineNumber(62, l5);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "inventorySlots", "[L"+aItemStack+";");
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(AALOAD);
+ mv.visitMethodInsn(INVOKESTATIC, "thaumic/tinkerer/common/compat/TinkersConstructCompat", "isTConstructTool", "(L"+aItemStack+";)Z", false);
+ mv.visitJumpInsn(IFEQ, l3);
+ Label l6 = new Label();
+ mv.visitLabel(l6);
+ mv.visitLineNumber(63, l6);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "inventorySlots", "[L"+aItemStack+";");
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(AALOAD);
+ mv.visitMethodInsn(INVOKESTATIC, "thaumic/tinkerer/common/compat/TinkersConstructCompat", "getDamage", "(L"+aItemStack+";)I", false);
+ mv.visitVarInsn(ISTORE, 1);
+ Label l7 = new Label();
+ mv.visitLabel(l7);
+ mv.visitLineNumber(64, l7);
+ mv.visitVarInsn(ILOAD, 1);
+ Label l8 = new Label();
+ mv.visitJumpInsn(IFLE, l8);
+ Label l9 = new Label();
+ mv.visitLabel(l9);
+ mv.visitLineNumber(65, l9);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "thaumic/tinkerer/common/block/tile/TileRepairer", "drawEssentia", "()I", false);
+ mv.visitVarInsn(ISTORE, 2);
+ Label l10 = new Label();
+ mv.visitLabel(l10);
+ mv.visitLineNumber(66, l10);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "inventorySlots", "[L"+aItemStack+";");
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(AALOAD);
+ mv.visitVarInsn(ILOAD, 2);
+ mv.visitMethodInsn(INVOKESTATIC, "thaumic/tinkerer/common/compat/TinkersConstructCompat", "fixDamage", "(L"+aItemStack+";I)Z", false);
+ mv.visitInsn(POP);
+ Label l11 = new Label();
+ mv.visitLabel(l11);
+ mv.visitLineNumber(67, l11);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "thaumic/tinkerer/common/block/tile/TileRepairer", "markDirty", "()V", false);
+ Label l12 = new Label();
+ mv.visitLabel(l12);
+ mv.visitLineNumber(68, l12);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "dmgLastTick", "I");
+ Label l13 = new Label();
+ mv.visitJumpInsn(IFEQ, l13);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "dmgLastTick", "I");
+ mv.visitVarInsn(ILOAD, 1);
+ mv.visitJumpInsn(IF_ICMPEQ, l13);
+ Label l14 = new Label();
+ mv.visitLabel(l14);
+ mv.visitLineNumber(69, l14);
+ mv.visitFieldInsn(GETSTATIC, "thaumic/tinkerer/common/ThaumicTinkerer", "tcProxy", "Lthaumcraft/common/CommonProxy;");
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "xCoord", "I");
+ mv.visitInsn(I2D);
+ mv.visitLdcInsn(new Double("0.25"));
+ mv.visitInsn(DADD);
+ mv.visitMethodInsn(INVOKESTATIC, "java/lang/Math", "random", "()D", false);
+ mv.visitLdcInsn(new Double("2.0"));
+ mv.visitInsn(DDIV);
+ mv.visitInsn(DADD);
+ mv.visitInsn(D2F);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "yCoord", "I");
+ mv.visitInsn(ICONST_1);
+ mv.visitInsn(IADD);
+ mv.visitInsn(I2D);
+ mv.visitMethodInsn(INVOKESTATIC, "java/lang/Math", "random", "()D", false);
+ mv.visitLdcInsn(new Double("2.0"));
+ mv.visitInsn(DDIV);
+ mv.visitInsn(DADD);
+ mv.visitInsn(D2F);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "zCoord", "I");
+ mv.visitInsn(I2D);
+ mv.visitLdcInsn(new Double("0.25"));
+ mv.visitInsn(DADD);
+ mv.visitMethodInsn(INVOKESTATIC, "java/lang/Math", "random", "()D", false);
+ mv.visitLdcInsn(new Double("2.0"));
+ mv.visitInsn(DDIV);
+ mv.visitInsn(DADD);
+ mv.visitInsn(D2F);
+ mv.visitInsn(ICONST_0);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "thaumcraft/common/CommonProxy", "sparkle", "(FFFI)V", false);
+ Label l15 = new Label();
+ mv.visitLabel(l15);
+ mv.visitLineNumber(70, l15);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitInsn(ICONST_1);
+ mv.visitFieldInsn(PUTFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "tookLastTick", "Z");
+ Label l16 = new Label();
+ mv.visitLabel(l16);
+ mv.visitLineNumber(71, l16);
+ Label l17 = new Label();
+ mv.visitJumpInsn(GOTO, l17);
+ mv.visitLabel(l13);
+ mv.visitFrame(Opcodes.F_APPEND,2, new Object[] {Opcodes.INTEGER, Opcodes.INTEGER}, 0, null);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitInsn(ICONST_0);
+ mv.visitFieldInsn(PUTFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "tookLastTick", "Z");
+ Label l18 = new Label();
+ mv.visitLabel(l18);
+ mv.visitLineNumber(72, l18);
+ mv.visitJumpInsn(GOTO, l17);
+ mv.visitLabel(l8);
+ mv.visitFrame(Opcodes.F_CHOP,1, null, 0, null);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitInsn(ICONST_0);
+ mv.visitFieldInsn(PUTFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "tookLastTick", "Z");
+ mv.visitLabel(l17);
+ mv.visitLineNumber(73, l17);
+ mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "inventorySlots", "[L"+aItemStack+";");
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(AALOAD);
+ Label l19 = new Label();
+ mv.visitJumpInsn(IFNONNULL, l19);
+ mv.visitInsn(ICONST_0);
+ Label l20 = new Label();
+ mv.visitJumpInsn(GOTO, l20);
+ mv.visitLabel(l19);
+ mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"thaumic/tinkerer/common/block/tile/TileRepairer"});
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "inventorySlots", "[L"+aItemStack+";");
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(AALOAD);
+ mv.visitMethodInsn(INVOKESTATIC, "thaumic/tinkerer/common/compat/TinkersConstructCompat", "getDamage", "(L"+aItemStack+";)I", false);
+ mv.visitLabel(l20);
+ mv.visitFrame(Opcodes.F_FULL, 2, new Object[] {"thaumic/tinkerer/common/block/tile/TileRepairer", Opcodes.INTEGER}, 2, new Object[] {"thaumic/tinkerer/common/block/tile/TileRepairer", Opcodes.INTEGER});
+ mv.visitFieldInsn(PUTFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "dmgLastTick", "I");
+ Label l21 = new Label();
+ mv.visitLabel(l21);
+ mv.visitLineNumber(74, l21);
+ mv.visitInsn(RETURN);
+ mv.visitLabel(l3);
+ mv.visitLineNumber(78, l3);
+ mv.visitFrame(Opcodes.F_CHOP,1, null, 0, null);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "inventorySlots", "[L"+aItemStack+";");
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(AALOAD);
+ Label l22 = new Label();
+ mv.visitJumpInsn(IFNULL, l22);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "inventorySlots", "[L"+aItemStack+";");
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(AALOAD);
+ mv.visitMethodInsn(INVOKEVIRTUAL, ""+aItemStack+"", ""+aGetItemDamage+"", "()I", false);
+ mv.visitJumpInsn(IFLE, l22);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "inventorySlots", "[L"+aItemStack+";");
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(AALOAD);
+ mv.visitMethodInsn(INVOKEVIRTUAL, ""+aItemStack+"", ""+aGetItem+"", "()L"+aItem+";", false);
+ mv.visitMethodInsn(INVOKEVIRTUAL, ""+aItem+"", ""+aIsRepairable+"", "()Z", false);
+ mv.visitJumpInsn(IFEQ, l22);
+ Label l23 = new Label();
+ mv.visitLabel(l23);
+ mv.visitLineNumber(79, l23);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "thaumic/tinkerer/common/block/tile/TileRepairer", "drawEssentia", "()I", false);
+ mv.visitVarInsn(ISTORE, 1);
+ Label l24 = new Label();
+ mv.visitLabel(l24);
+ mv.visitLineNumber(80, l24);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "inventorySlots", "[L"+aItemStack+";");
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(AALOAD);
+ mv.visitMethodInsn(INVOKEVIRTUAL, ""+aItemStack+"", ""+aGetItemDamage+"", "()I", false);
+ mv.visitVarInsn(ISTORE, 2);
+ Label l25 = new Label();
+ mv.visitLabel(l25);
+ mv.visitLineNumber(81, l25);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "inventorySlots", "[L"+aItemStack+";");
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(AALOAD);
+ mv.visitInsn(ICONST_0);
+ mv.visitVarInsn(ILOAD, 2);
+ mv.visitVarInsn(ILOAD, 1);
+ mv.visitInsn(ISUB);
+ mv.visitMethodInsn(INVOKESTATIC, "java/lang/Math", "max", "(II)I", false);
+ mv.visitMethodInsn(INVOKEVIRTUAL, ""+aItemStack+"", ""+aSetItemDamage+"", "(I)V", false);
+ Label l26 = new Label();
+ mv.visitLabel(l26);
+ mv.visitLineNumber(82, l26);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "thaumic/tinkerer/common/block/tile/TileRepairer", "markDirty", "()V", false);
+ Label l27 = new Label();
+ mv.visitLabel(l27);
+ mv.visitLineNumber(84, l27);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "dmgLastTick", "I");
+ Label l28 = new Label();
+ mv.visitJumpInsn(IFEQ, l28);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "dmgLastTick", "I");
+ mv.visitVarInsn(ILOAD, 2);
+ mv.visitJumpInsn(IF_ICMPEQ, l28);
+ Label l29 = new Label();
+ mv.visitLabel(l29);
+ mv.visitLineNumber(85, l29);
+ mv.visitFieldInsn(GETSTATIC, "thaumic/tinkerer/common/ThaumicTinkerer", "tcProxy", "Lthaumcraft/common/CommonProxy;");
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "xCoord", "I");
+ mv.visitInsn(I2D);
+ mv.visitLdcInsn(new Double("0.25"));
+ mv.visitInsn(DADD);
+ mv.visitMethodInsn(INVOKESTATIC, "java/lang/Math", "random", "()D", false);
+ mv.visitLdcInsn(new Double("2.0"));
+ mv.visitInsn(DDIV);
+ mv.visitInsn(DADD);
+ mv.visitInsn(D2F);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "yCoord", "I");
+ mv.visitInsn(ICONST_1);
+ mv.visitInsn(IADD);
+ mv.visitInsn(I2D);
+ mv.visitMethodInsn(INVOKESTATIC, "java/lang/Math", "random", "()D", false);
+ mv.visitLdcInsn(new Double("2.0"));
+ mv.visitInsn(DDIV);
+ mv.visitInsn(DADD);
+ mv.visitInsn(D2F);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "zCoord", "I");
+ mv.visitInsn(I2D);
+ mv.visitLdcInsn(new Double("0.25"));
+ mv.visitInsn(DADD);
+ mv.visitMethodInsn(INVOKESTATIC, "java/lang/Math", "random", "()D", false);
+ mv.visitLdcInsn(new Double("2.0"));
+ mv.visitInsn(DDIV);
+ mv.visitInsn(DADD);
+ mv.visitInsn(D2F);
+ mv.visitInsn(ICONST_0);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "thaumcraft/common/CommonProxy", "sparkle", "(FFFI)V", false);
+ Label l30 = new Label();
+ mv.visitLabel(l30);
+ mv.visitLineNumber(86, l30);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitInsn(ICONST_1);
+ mv.visitFieldInsn(PUTFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "tookLastTick", "Z");
+ Label l31 = new Label();
+ mv.visitLabel(l31);
+ mv.visitLineNumber(87, l31);
+ Label l32 = new Label();
+ mv.visitJumpInsn(GOTO, l32);
+ mv.visitLabel(l28);
+ mv.visitFrame(Opcodes.F_APPEND,2, new Object[] {Opcodes.INTEGER, Opcodes.INTEGER}, 0, null);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitInsn(ICONST_0);
+ mv.visitFieldInsn(PUTFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "tookLastTick", "Z");
+ Label l33 = new Label();
+ mv.visitLabel(l33);
+ mv.visitLineNumber(88, l33);
+ mv.visitJumpInsn(GOTO, l32);
+ mv.visitLabel(l22);
+ mv.visitFrame(Opcodes.F_CHOP,2, null, 0, null);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitInsn(ICONST_0);
+ mv.visitFieldInsn(PUTFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "tookLastTick", "Z");
+ mv.visitLabel(l32);
+ mv.visitLineNumber(90, l32);
+ mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "inventorySlots", "[L"+aItemStack+";");
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(AALOAD);
+ Label l34 = new Label();
+ mv.visitJumpInsn(IFNONNULL, l34);
+ mv.visitInsn(ICONST_0);
+ Label l35 = new Label();
+ mv.visitJumpInsn(GOTO, l35);
+ mv.visitLabel(l34);
+ mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"thaumic/tinkerer/common/block/tile/TileRepairer"});
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "inventorySlots", "[L"+aItemStack+";");
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(AALOAD);
+ mv.visitMethodInsn(INVOKEVIRTUAL, ""+aItemStack+"", ""+aGetItemDamage+"", "()I", false);
+ mv.visitLabel(l35);
+ mv.visitFrame(Opcodes.F_FULL, 1, new Object[] {"thaumic/tinkerer/common/block/tile/TileRepairer"}, 2, new Object[] {"thaumic/tinkerer/common/block/tile/TileRepairer", Opcodes.INTEGER});
+ mv.visitFieldInsn(PUTFIELD, "thaumic/tinkerer/common/block/tile/TileRepairer", "dmgLastTick", "I");
+ mv.visitLabel(l1);
+ mv.visitLineNumber(92, l1);
+ mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ mv.visitInsn(RETURN);
+ Label l36 = new Label();
+ mv.visitLabel(l36);
+ mv.visitLocalVariable("this", "Lthaumic/tinkerer/common/block/tile/TileRepairer;", null, l0, l36, 0);
+ mv.visitLocalVariable("dmg", "I", null, l7, l3, 1);
+ mv.visitLocalVariable("essentia", "I", null, l10, l18, 2);
+ mv.visitLocalVariable("essentia", "I", null, l24, l33, 1);
+ mv.visitLocalVariable("dmg", "I", null, l25, l33, 2);
+ mv.visitMaxs(9, 3);
+ mv.visitEnd();
+ didInject = true;
+ Preloader_Logger.LOG("Thaumic Tinkerer RepairItem Patch", Level.INFO, "Method injection complete. "+(obfuscated ? "Obfuscated" : "Non-Obfuscated"));
+ return didInject;
+ }
+
+ public class AddAdapter extends ClassVisitor {
+
+ public AddAdapter(ClassVisitor cv) {
+ super(ASM5, cv);
+ this.cv = cv;
+ }
+
+ private final String[] aMethodsToStrip = new String[] {"updateEntity", "func_145845_h"};
+ public boolean isObfuscated = false;
+
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+
+ MethodVisitor methodVisitor;
+ boolean found = false;
+
+ for (String s : aMethodsToStrip) {
+ if (name.equals(s)) {
+ found = true;
+ if (s.equals(aMethodsToStrip[1])) {
+ isObfuscated = true;
+ }
+ break;
+ }
+ }
+ if (!found) {
+ methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ }
+ else {
+ methodVisitor = null;
+ }
+
+ if (found) {
+ Preloader_Logger.LOG("Thaumic Tinkerer RepairItem Patch", Level.INFO,
+ "Found method " + name + ", removing.");
+ }
+ return methodVisitor;
+ }
+
+ }
+
+
+
+
+}
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 5dc7dcfbc8..cb9799fce7 100644
--- a/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java
+++ b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java
@@ -1,52 +1,6 @@
package gtPlusPlus.preloader.asm.transformers;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.COFH_ORE_DICTIONARY_ARBITER;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.FORGE_CHUNK_MANAGER;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.FORGE_ORE_DICTIONARY;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.GALACTICRAFT_ENTITY_AUTO_ROCKET;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.GALACTICRAFT_FLUID_UTILS;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.GALACTICRAFT_TILE_ENTITY_FUEL_LOADER;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.GTPP_MTE_HATCH_SUPER_INPUT_BUS;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.GTPP_MTE_HATCH_SUPER_OUTPUT_BUS;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.GT_ACHIEVEMENTS;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.GT_BASE_META_TILE_ENTITY;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.GT_BLOCK_MACHINES;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.GT_CLIENT_PROXY;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.GT_ITEM_MACHINES;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.GT_METAGENERATED_TOOL;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.GT_METAPIPE_FLUID;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.GT_METAPIPE_FRAME;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.GT_METAPIPE_ITEM;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.GT_MTE_CHARCOAL_PIT;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.GT_MTE_HATCH_INPUTBUS;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.GT_MTE_HATCH_OUTPUTBUS;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.GT_PACKET_TILE_ENTITY;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.GT_UTILITY;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.IC2_BLOCK_BASE_TILE_ENTITY;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.IC2_BLOCK_CHARGEPAD;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.IC2_BLOCK_ELECTRIC;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.IC2_BLOCK_GENERATOR;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.IC2_BLOCK_HEAT_GENERATOR;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.IC2_BLOCK_KINETIC_GENERATOR;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.IC2_BLOCK_LUMINATOR;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.IC2_BLOCK_MACHINE1;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.IC2_BLOCK_MACHINE2;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.IC2_BLOCK_MACHINE3;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.IC2_BLOCK_PERSONAL;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.IC2_BLOCK_REACTOR_ACCESS_HATCH;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.IC2_BLOCK_REACTOR_CHAMBER;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.IC2_BLOCK_REACTOR_FLUID_PORT;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.IC2_BLOCK_REACTOR_REDSTONE_PORT;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.IC2_BLOCK_REACTOR_VESSEL;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.IC2_ITEM_ARMOUR_HAZMAT;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.LWJGL_KEYBOARD;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.MINECRAFT_GAMESETTINGS;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.MINECRAFT_GAMESETTINGS_OBF;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.RAILCRAFT_FLUID_HELPER;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.RAILCRAFT_INVENTORY_TOOLS;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.RAILCRAFT_TILE_FLUID_LOADER;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.THAUMCRAFT_ITEM_WISP_ESSENCE;
-import static gtPlusPlus.preloader.asm.ClassesToTransform.TINKERS_FLUID_BLOCK;
+import static gtPlusPlus.preloader.asm.ClassesToTransform.*;
import java.io.File;
import java.io.IOException;
@@ -317,6 +271,11 @@ public class Preloader_Transformer_Handler implements IClassTransformer {
Preloader_Logger.INFO("Thaumcraft WispEssence_Patch", "Transforming "+transformedName);
return new ClassTransformer_TC_ItemWispEssence(basicClass, obfuscated).getWriter().toByteArray();
}
+ //Fix Thaumic Tinkerer Shit
+ if (transformedName.equals(THAUMICTINKERER_TILE_REPAIRER) && AsmConfig.enableThaumicTinkererRepairFix) {
+ //Preloader_Logger.INFO("Thaumic Tinkerer RepairItem Patch", "Transforming "+transformedName);
+ //return new ClassTransformer_TT_ThaumicRestorer(basicClass).getWriter().toByteArray();
+ }
return basicClass;