aboutsummaryrefslogtreecommitdiff
path: root/src/Java/gtPlusPlus/preloader
diff options
context:
space:
mode:
authorAlkalus <3060479+draknyte1@users.noreply.github.com>2020-01-10 16:28:11 +0000
committerAlkalus <3060479+draknyte1@users.noreply.github.com>2020-01-10 16:28:11 +0000
commita6753414a126d48a4615288d1f0e907ad524c54d (patch)
treec61bdc53c44924310de57ef628660c900c232480 /src/Java/gtPlusPlus/preloader
parent63e94d2dda9495c5894f942902a76c0c17871381 (diff)
downloadGT5-Unofficial-a6753414a126d48a4615288d1f0e907ad524c54d.tar.gz
GT5-Unofficial-a6753414a126d48a4615288d1f0e907ad524c54d.tar.bz2
GT5-Unofficial-a6753414a126d48a4615288d1f0e907ad524c54d.zip
+ Added ASM to log/patch misuses of EntityLivingBase.setHealth().
$ Fixed getItemStackInPlayersHand() being Server Sided only.
Diffstat (limited to 'src/Java/gtPlusPlus/preloader')
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/AsmConfig.java8
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_Forge_EntityLivingBase_SetHealth.java137
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java59
3 files changed, 181 insertions, 23 deletions
diff --git a/src/Java/gtPlusPlus/preloader/asm/AsmConfig.java b/src/Java/gtPlusPlus/preloader/asm/AsmConfig.java
index b3fbcb2d61..06b1cb8013 100644
--- a/src/Java/gtPlusPlus/preloader/asm/AsmConfig.java
+++ b/src/Java/gtPlusPlus/preloader/asm/AsmConfig.java
@@ -22,6 +22,7 @@ public class AsmConfig {
public static boolean enableRcItemDupeFix;
public static boolean enableTcAspectSafety;
public static boolean enabledLwjglKeybindingFix;
+ public static boolean enabledFixEntitySetHealth;
public static boolean disableAllLogging;
@@ -51,6 +52,12 @@ public class AsmConfig {
disableAllLogging = prop.getBoolean(false);
propOrderDebug.add(prop.getName());
+ prop = config.get("debug", "enabledFixEntitySetHealth", true);
+ prop.comment = "Enable/Disable entity setHealth() fix.";
+ prop.setLanguageKey("gtpp.enabledFixEntitySetHealth").setRequiresMcRestart(true);
+ enabledFixEntitySetHealth = prop.getBoolean(true);
+ propOrderDebug.add(prop.getName());
+
prop = config.get("debug", "enableChunkDebugging", false);
prop.comment = "Enable/Disable Chunk Debugging Features, Must Be enabled on Client and Server.";
prop.setLanguageKey("gtpp.enableChunkDebugging").setRequiresMcRestart(true);
@@ -137,6 +144,7 @@ public class AsmConfig {
FMLLog.log(Level.INFO, "[GT++ ASM] Gc Fuel Changes Patch - Enabled: "+enableGcFuelChanges, new Object[0]);
FMLLog.log(Level.INFO, "[GT++ ASM] Railcraft Fluid Flow Patch - Enabled: "+enableRcFlowFix, new Object[0]);
FMLLog.log(Level.INFO, "[GT++ ASM] Thaumcraft Aspect Safety Patch - Enabled: "+enableTcAspectSafety, new Object[0]);
+ FMLLog.log(Level.INFO, "[GT++ ASM] Fix bad usage of EntityLivingBase.setHealth Patch - Enabled: "+enabledFixEntitySetHealth, new Object[0]);
} catch (Exception var3) {
FMLLog.log(Level.ERROR, var3, "GT++ ASM had a problem loading it's config", new Object[0]);
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
new file mode 100644
index 0000000000..ff0cd41d2f
--- /dev/null
+++ b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_Forge_EntityLivingBase_SetHealth.java
@@ -0,0 +1,137 @@
+package gtPlusPlus.preloader.asm.transformers;
+
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+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;
+ private boolean didPatch = false;
+
+ public ClassTransformer_Forge_EntityLivingBase_SetHealth(String aClassName, byte[] basicClass) {
+ if (basicClass == null) {
+ return;
+ }
+
+ ClassReader reader = new ClassReader(basicClass);
+ ClassWriter writer = new ClassWriter(reader, ClassWriter.COMPUTE_MAXS);
+ ClassVisitor visitor = writer;
+ SetHealthVisitor aVisitor = new SetHealthVisitor(visitor);
+ visitor = aVisitor;
+ reader.accept(visitor, 0);
+ if (reader != null && writer != null) {
+ isValid = true;
+ }
+ else {
+ isValid = false;
+ }
+ mReader = reader;
+ mWriter = writer;
+ didPatch = aVisitor.didPatchInternal;
+ }
+
+ public boolean isValidTransformer() {
+ return isValid;
+ }
+
+ public ClassReader getReader() {
+ return mReader;
+ }
+
+ public ClassWriter getWriter() {
+ return mWriter;
+ }
+
+
+ public static class SetHealthVisitor extends ClassVisitor {
+ private String clsName = null;
+ private boolean didPatchInternal = false;
+ private static final String callbackOwner = org.objectweb.asm.Type.getInternalName(SetHealthVisitor.class);
+
+ private SetHealthVisitor(ClassVisitor cv) {
+ super(Opcodes.ASM5, cv);
+ }
+
+ @Override
+ 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
+ ) {
+ final boolean warn = !(clsName.equals(
+ "net/minecraft/entity/EntityLivingBase"
+ ));
+
+ 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")) {
+ 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
+ //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");
+
+ public static void setHealthGeneric(EntityLivingBase aEntity, float aValue) {
+ aEntity.attackEntityFrom(mGenericDamageSource, aValue);
+ }
+
+ }
+
+
+ public boolean didPatchClass() {
+ return didPatch;
+ }
+
+}
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 d81c96dcca..d1ddcc4a9e 100644
--- a/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java
+++ b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java
@@ -30,9 +30,9 @@ public class Preloader_Transformer_Handler implements IClassTransformer {
System.out.println("[GT++ ASM] Asm Config Location: "+mConfig.config.getConfigFile().getAbsolutePath());
System.out.println("[GT++ ASM] Is DevHelper Valid? "+gtPlusPlus.preloader.DevHelper.mIsValidHelper);
}
-
+
private static Boolean mObf = null;
-
+
public boolean checkObfuscated() {
if (mObf != null) {
return mObf;
@@ -60,6 +60,19 @@ public class Preloader_Transformer_Handler implements IClassTransformer {
}
public byte[] transform(String name, String transformedName, byte[] basicClass) {
+ /*
+ * Here we patch all instances of entity.setHealth and replace them with a static function.
+ * Only EntityLivingBase is left untouched, as nothing else truly needs to be calling this method and avoiding forge hooks.
+ * May exclude all vanilla/forge class if this causes issues though.
+ */
+ if (mConfig.enabledFixEntitySetHealth) {
+ ClassTransformer_Forge_EntityLivingBase_SetHealth aForgeHealthFix = new ClassTransformer_Forge_EntityLivingBase_SetHealth(transformedName, basicClass);
+ if (aForgeHealthFix.isValidTransformer() && aForgeHealthFix.didPatchClass()) {
+ FMLRelaunchLog.log("[GT++ ASM] Fix EntityLivingBase.setHealth misuse", Level.INFO, "Transforming %s", transformedName);
+ basicClass = aForgeHealthFix.getWriter().toByteArray();
+ }
+ }
+
// Is this environment obfuscated? (Extra checks just in case some weird shit happens during the check)
boolean obfuscated = checkObfuscated();
boolean probablyShouldBeFalse = false;
@@ -69,7 +82,7 @@ public class Preloader_Transformer_Handler implements IClassTransformer {
FMLRelaunchLog.log("[GT++ ASM] LWJGL Keybinding index out of bounds fix", Level.INFO, "Transforming %s", transformedName);
return new ClassTransformer_LWJGL_Keyboard(basicClass).getWriter().toByteArray();
}
-
+
//Enable mapping of Tickets and loaded chunks. - Forge
if (transformedName.equals("net.minecraftforge.common.ForgeChunkManager") && mConfig.enableChunkDebugging) {
FMLRelaunchLog.log("[GT++ ASM] Chunkloading Patch", Level.INFO, "Transforming %s", transformedName);
@@ -94,7 +107,7 @@ public class Preloader_Transformer_Handler implements IClassTransformer {
FMLRelaunchLog.log("[GT++ ASM] Bright Fluids", Level.INFO, "Transforming %s", transformedName);
return new ClassTransformer_TiConFluids("getLightValue", obfuscated, basicClass).getWriter().toByteArray();
}
-
+
//Fix RC stuff
//Patching PROCESS_VOLUME to allow 4x more transfer limits
if (transformedName.equals("mods.railcraft.common.fluids.FluidHelper") && mConfig.enableRcFlowFix) {
@@ -123,15 +136,15 @@ public class Preloader_Transformer_Handler implements IClassTransformer {
}
}
-
-
-
-
-
+
+
+
+
+
/**
* Gregtech ASM Patches
*/
-
+
//Make GT_Utilities safer
if (transformedName.equals("gtPlusPlus.preloader.asm.transformers.ClassTransformer_GT_Utility")) {
FMLRelaunchLog.log("[GT++ ASM] Gregtech Utilities Patch", Level.INFO, "Transforming %s", transformedName);
@@ -147,7 +160,7 @@ public class Preloader_Transformer_Handler implements IClassTransformer {
FMLRelaunchLog.log("[GT++ ASM] Gregtech Achievements Patch", Level.INFO, "Transforming %s", transformedName);
return new ClassTransformer_GT_Achievements_CrashFix(basicClass, obfuscated).getWriter().toByteArray();
}
-
+
//Fix bad handling of a loop left from original decompilation
//Also Fix Achievements, although currently disabled.
if (transformedName.equals("gregtech.common.GT_Client")) {
@@ -165,16 +178,16 @@ public class Preloader_Transformer_Handler implements IClassTransformer {
FMLRelaunchLog.log("[GT++ ASM] Gregtech setMetaTileEntity Patch", Level.INFO, "Transforming %s", transformedName);
return new ClassTransformer_GT_BaseMetaTileEntity(basicClass).getWriter().toByteArray();
}
-
+
//Fix log handling on the charcoal pit
if (transformedName.equals("gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_Charcoal_Pit")) {
FMLRelaunchLog.log("[GT++ ASM] GT Charcoal Pit Fix", Level.INFO, "Transforming %s", transformedName);
return new ClassTransformer_GT_CharcoalPit(basicClass, obfuscated).getWriter().toByteArray();
}
-
-
-
-
+
+
+
+
//Patching Meta Tile Tooltips
if (transformedName.equals("gregtech.common.blocks.GT_Item_Machines") && mConfig.enableGtTooltipFix) {
FMLRelaunchLog.log("[GT++ ASM] Gregtech Tooltip Patch", Level.INFO, "Transforming %s", transformedName);
@@ -203,7 +216,7 @@ public class Preloader_Transformer_Handler implements IClassTransformer {
}
return new ClassTransformer_GT_BlockMachines_MetaPipeEntity(basicClass, probablyShouldBeFalse, mode).getWriter().toByteArray();
}
-
+
String[] aIC2ClassNames = new String[] {
"ic2.core.block.BlockTileEntity",
"ic2.core.block.machine.BlockMachine",
@@ -230,24 +243,24 @@ public class Preloader_Transformer_Handler implements IClassTransformer {
return new ClassTransformer_IC2_GetHarvestTool(basicClass, obfuscated, transformedName).getWriter().toByteArray();
}
}
-
+
//Fix IC2 Hazmat
if (transformedName.equals("ic2.core.item.armor.ItemArmorHazmat")) {
FMLRelaunchLog.log("[GT++ ASM] IC2 Hazmat Patch", Level.INFO, "Transforming %s", transformedName);
return new ClassTransformer_IC2_Hazmat(basicClass, transformedName).getWriter().toByteArray();
}
-
+
//Fix Thaumcraft Shit
//Patching ItemWispEssence to allow invalid item handling
if (transformedName.equals("thaumcraft.common.items.ItemWispEssence") && mConfig.enableTcAspectSafety) {
FMLRelaunchLog.log("[GT++ ASM] Thaumcraft WispEssence_Patch", Level.INFO, "Transforming %s", transformedName);
return new ClassTransformer_TC_ItemWispEssence(basicClass, obfuscated).getWriter().toByteArray();
}
-
-
+
+
return basicClass;
}
-
-
+
+
}