diff options
author | Alkalus <3060479+draknyte1@users.noreply.github.com> | 2020-01-13 17:03:40 +0000 |
---|---|---|
committer | Alkalus <3060479+draknyte1@users.noreply.github.com> | 2020-01-13 17:03:40 +0000 |
commit | 394d6a29a42bd4a9005c13b3f00284fd2bb6b9f4 (patch) | |
tree | b868925fe32e4e958dbb83762e90cc24145436a4 /src/Java/gtPlusPlus/preloader/asm | |
parent | 9232871f5a734a52ecdc7bc24e35b009bf9c5b66 (diff) | |
download | GT5-Unofficial-394d6a29a42bd4a9005c13b3f00284fd2bb6b9f4.tar.gz GT5-Unofficial-394d6a29a42bd4a9005c13b3f00284fd2bb6b9f4.tar.bz2 GT5-Unofficial-394d6a29a42bd4a9005c13b3f00284fd2bb6b9f4.zip |
$ Fixed #606.
Diffstat (limited to 'src/Java/gtPlusPlus/preloader/asm')
4 files changed, 60 insertions, 44 deletions
diff --git a/src/Java/gtPlusPlus/preloader/asm/AsmConfig.java b/src/Java/gtPlusPlus/preloader/asm/AsmConfig.java index fc7d408cb9..88bcf6b28b 100644 --- a/src/Java/gtPlusPlus/preloader/asm/AsmConfig.java +++ b/src/Java/gtPlusPlus/preloader/asm/AsmConfig.java @@ -15,6 +15,7 @@ public class AsmConfig { public static boolean enableTiConFluidLighting; public static boolean enableGtTooltipFix; public static boolean enableGtNbtFix; + public static boolean enableGtCharcoalPitFix; public static boolean enableChunkDebugging; public static boolean enableCofhPatch; public static boolean enableGcFuelChanges; @@ -98,6 +99,14 @@ public class AsmConfig { enableGtTooltipFix = prop.getBoolean(true); propOrder.add(prop.getName()); + + + prop = config.get("general", "enableGtCharcoalPitFix", true); + prop.comment = "Makes the Charcoal Pile Igniter work better."; + prop.setLanguageKey("gtpp.enableGtCharcoalPitFix").setRequiresMcRestart(true); + enableGtCharcoalPitFix = prop.getBoolean(true); + propOrder.add(prop.getName()); + prop = config.get("general", "enableGcFuelChanges", true); prop.comment = "Enable/Disable changes to Galacticraft Rocket Fuels."; prop.setLanguageKey("gtpp.enableGcFuelChanges").setRequiresMcRestart(true); diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_Forge_EntityLivingBase_SetHealth.java b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_Forge_EntityLivingBase_SetHealth.java index ff0cd41d2f..d56b9de059 100644 --- a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_Forge_EntityLivingBase_SetHealth.java +++ b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_Forge_EntityLivingBase_SetHealth.java @@ -11,7 +11,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.DamageSource; public class ClassTransformer_Forge_EntityLivingBase_SetHealth { - + private boolean isValid = false; private ClassReader mReader = null; private ClassWriter mWriter = null; @@ -21,7 +21,7 @@ public class ClassTransformer_Forge_EntityLivingBase_SetHealth { if (basicClass == null) { return; } - + ClassReader reader = new ClassReader(basicClass); ClassWriter writer = new ClassWriter(reader, ClassWriter.COMPUTE_MAXS); ClassVisitor visitor = writer; @@ -62,67 +62,60 @@ public class ClassTransformer_Forge_EntityLivingBase_SetHealth { } @Override - public void visit( - int version, int access, String name, String signature, String superName, String[] interfaces - ) { + public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { super.visit( version, access, name, signature, superName, interfaces - ); + ); this.clsName = name; } @Override public MethodVisitor visitMethod( - int mAccess, final String mName, final String mDesc, String mSignature, String[] mExceptions - ) { + int mAccess, final String mName, final String mDesc, String mSignature, String[] mExceptions) { final boolean warn = !(clsName.equals( "net/minecraft/entity/EntityLivingBase" - )); + )); - return new MethodVisitor( - Opcodes.ASM5, super.visitMethod( - mAccess, mName, mDesc, mSignature, mExceptions - ) - ) { + return new MethodVisitor(Opcodes.ASM5, super.visitMethod(mAccess, mName, mDesc, mSignature, mExceptions)) { @Override public void visitMethodInsn( int opcode, String owner, String name, String desc, boolean isIntf - ) { + ) { if (owner.equals( "net/minecraft/entity/EntityLivingBase" - ) && name.equals("setHealth") && desc.equals("(F)V")) { + ) && name.equals("setHealth") && desc.equals("(F)V")) { if (warn) { FMLRelaunchLog.warning( "=============================================================" - ); + ); FMLRelaunchLog.warning( "MOD HAS DIRECT REFERENCE Entity.setHealth() THIS IS NOT ALLOWED!" - ); + ); FMLRelaunchLog.warning( "Offendor: %s.%s%s", SetHealthVisitor.this.clsName, mName, mDesc - ); + ); FMLRelaunchLog.warning( "Use EntityLiving.attackEntityFrom(DamageSource, damageDealt) instead" - ); + ); FMLRelaunchLog.warning( "=============================================================" - ); + ); } didPatchInternal = true; - //opcode = Opcodes.INVOKESTATIC; // Set it static + //opcode = Opcodes.INVOKESTATIC; // Set it static //owner = SetHealthVisitor.callbackOwner; //name = "setHealthGeneric"; // Replace the method name //desc = "(Lnet/minecraft/entity/EntityLivingBase;F)V"; // Replace the method desc - + } super.visitMethodInsn(opcode, owner, name, desc, isIntf); } }; } - - private final static DamageSource mGenericDamageSource = new DamageSource("gtpp.generic"); - + + private final static DamageSource mGenericDamageSource = new DamageSource("gtpp.generic"); + public static void setHealthGeneric(EntityLivingBase aEntity, float aValue) { aEntity.attackEntityFrom(mGenericDamageSource, aValue); } diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_CharcoalPit.java b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_CharcoalPit.java index 9c79db265d..45e1608d6b 100644 --- a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_CharcoalPit.java +++ b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_CharcoalPit.java @@ -17,10 +17,9 @@ import org.objectweb.asm.MethodVisitor; import cpw.mods.fml.relauncher.FMLRelaunchLog; import gregtech.api.enums.OrePrefixes; -import gtPlusPlus.api.objects.Logger; import gtPlusPlus.core.util.minecraft.ItemUtils; +import gtPlusPlus.core.util.reflect.ReflectionUtils; import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; @@ -31,35 +30,48 @@ public class ClassTransformer_GT_CharcoalPit { private final ClassWriter writer; public static boolean isWoodLog(Block log) { - //Logger.INFO("checking for log"); boolean isLog1 = OrePrefixes.log.contains(new ItemStack(log, 1)); if (isLog1) { - //Logger.INFO("Found 1"); return true; } ArrayList<ItemStack> oredict = OreDictionary.getOres("logWood"); if (oredict.contains(ItemUtils.getSimpleStack(log))) { - //Logger.INFO("found 2"); return true; - } - //Logger.INFO("Did not find. "+(log != null ? ""+log.getLocalizedName() : "Null or invalid block?")); + } return false; } public ClassTransformer_GT_CharcoalPit(byte[] basicClass, boolean obfuscated) { ClassReader aTempReader = null; ClassWriter aTempWriter = null; + boolean aBadTime = false; + if (ReflectionUtils.doesClassExist("aji")) { + obfuscated = true; + } + else { + if (ReflectionUtils.doesClassExist("net.minecraft.block.Block")) { + obfuscated = false; + } + else { + // Bad... Like.. very bad.. + FMLRelaunchLog.log("[GT++ ASM] GT Charcoal Pit Fix", Level.INFO, "Unable to find Block.class/aji.class, this is BAD. Not Patching."); + } + } aTempReader = new ClassReader(basicClass); aTempWriter = new ClassWriter(aTempReader, ClassWriter.COMPUTE_FRAMES); - aTempReader.accept(new AddFieldAdapter(aTempWriter), 0); - injectMethod("isWoodLog", obfuscated, aTempWriter); - if (aTempReader != null && aTempWriter != null) { - isValid = true; - } else { + if (!aBadTime) { + aTempReader.accept(new CustomClassVisitor(aTempWriter), 0); + injectMethod("isWoodLog", obfuscated, aTempWriter); + if (aTempReader != null && aTempWriter != null) { + isValid = true; + } else { + isValid = false; + } + } + else { isValid = false; } - FMLRelaunchLog.log("[GT++ ASM] GT Charcoal Pit Fix", Level.INFO, - "Valid? " + isValid + "."); + FMLRelaunchLog.log("[GT++ ASM] GT Charcoal Pit Fix", Level.INFO, "Valid? " + isValid + "."); reader = aTempReader; writer = aTempWriter; } @@ -86,11 +98,12 @@ public class ClassTransformer_GT_CharcoalPit { aBlockClassName = "aji"; } if (aMethodName.equals("isWoodLog")) { + mv = cw.visitMethod(ACC_PUBLIC, "isWoodLog", "(L"+aBlockClassName+";)Z", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); - mv.visitLineNumber(49, l0); + mv.visitLineNumber(197, l0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_CharcoalPit", "isWoodLog", "(L"+aBlockClassName+";)Z", false); mv.visitInsn(IRETURN); @@ -101,14 +114,15 @@ public class ClassTransformer_GT_CharcoalPit { mv.visitMaxs(1, 2); mv.visitEnd(); didInject = true; + } FMLRelaunchLog.log("[GT++ ASM] GT Charcoal Pit Fix", Level.INFO, "Method injection complete."); return didInject; } - public class AddFieldAdapter extends ClassVisitor { + public class CustomClassVisitor extends ClassVisitor { - public AddFieldAdapter(ClassVisitor cv) { + public CustomClassVisitor(ClassVisitor cv) { super(ASM5, cv); this.cv = cv; } 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 7e2914ea30..d8dc71dff0 100644 --- a/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java +++ b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java @@ -186,7 +186,7 @@ public class Preloader_Transformer_Handler implements IClassTransformer { } //Fix log handling on the charcoal pit - if (transformedName.equals("gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_Charcoal_Pit")) { + if (transformedName.equals("gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_Charcoal_Pit") && mConfig.enableGtCharcoalPitFix) { FMLRelaunchLog.log("[GT++ ASM] GT Charcoal Pit Fix", Level.INFO, "Transforming %s", transformedName); return new ClassTransformer_GT_CharcoalPit(basicClass, obfuscated).getWriter().toByteArray(); } |