Commit 10400e12bd4cb12e59e3361cb43e748c0307261a
1 parent
7e6adb61
LiteLoader 1.5_01
+ Compatibility for FML's new runtime deobfuscation
Showing
3 changed files
with
33 additions
and
14 deletions
java/com/mumfrey/liteloader/core/LiteLoader.java
| ... | ... | @@ -65,7 +65,7 @@ public final class LiteLoader implements FilenameFilter |
| 65 | 65 | /** |
| 66 | 66 | * Liteloader version |
| 67 | 67 | */ |
| 68 | - private static final String LOADER_VERSION = "1.5"; | |
| 68 | + private static final String LOADER_VERSION = "1.5_01"; | |
| 69 | 69 | |
| 70 | 70 | /** |
| 71 | 71 | * Loader revision, can be used by mods to determine whether the loader is sufficiently up-to-date |
| ... | ... | @@ -336,7 +336,7 @@ public final class LiteLoader implements FilenameFilter |
| 336 | 336 | */ |
| 337 | 337 | private void prepareClassOverrides() |
| 338 | 338 | { |
| 339 | - this.registerBaseClassOverride(ModUtilities.getObfuscatedFieldName("net.minecraft.src.CallableJVMFlags", "h"), "h"); | |
| 339 | + this.registerBaseClassOverride(ModUtilities.getObfuscatedFieldName("net.minecraft.src.CallableJVMFlags", "h", "h"), "h"); | |
| 340 | 340 | } |
| 341 | 341 | |
| 342 | 342 | /** | ... | ... |
java/com/mumfrey/liteloader/util/ModUtilities.java
| ... | ... | @@ -8,14 +8,29 @@ import java.util.Set; |
| 8 | 8 | |
| 9 | 9 | import com.mumfrey.liteloader.core.LiteLoader; |
| 10 | 10 | |
| 11 | +import net.minecraft.client.ClientBrandRetriever; | |
| 11 | 12 | import net.minecraft.client.Minecraft; |
| 12 | 13 | import net.minecraft.src.*; |
| 13 | 14 | |
| 14 | 15 | public abstract class ModUtilities |
| 15 | 16 | { |
| 17 | + /** | |
| 18 | + * Collection of packets we have already overridden, so that duplicate registrations can generate a warning | |
| 19 | + */ | |
| 16 | 20 | private static Set<Integer> overriddenPackets = new HashSet<Integer>(); |
| 17 | 21 | |
| 18 | 22 | /** |
| 23 | + * True if FML is being used, in which case we use searge names instead of raw field/method names | |
| 24 | + */ | |
| 25 | + private static boolean forgeModLoader = false; | |
| 26 | + | |
| 27 | + static | |
| 28 | + { | |
| 29 | + // Check for FML | |
| 30 | + forgeModLoader = ClientBrandRetriever.getClientModName().contains("fml"); | |
| 31 | + } | |
| 32 | + | |
| 33 | + /** | |
| 19 | 34 | * Add a renderer map entry for the specified entity class |
| 20 | 35 | * |
| 21 | 36 | * @param entityClass |
| ... | ... | @@ -92,9 +107,10 @@ public abstract class ModUtilities |
| 92 | 107 | * @param fieldName Name of field to get, returned unmodified if in debug mode |
| 93 | 108 | * @return Obfuscated field name if present |
| 94 | 109 | */ |
| 95 | - public static String getObfuscatedFieldName(String fieldName, String obfuscatedFieldName) | |
| 110 | + public static String getObfuscatedFieldName(String fieldName, String obfuscatedFieldName, String seargeFieldName) | |
| 96 | 111 | { |
| 97 | - return (!net.minecraft.src.Tessellator.instance.getClass().getSimpleName().equals("Tessellator")) ? obfuscatedFieldName : fieldName; | |
| 112 | + if (forgeModLoader) return seargeFieldName; | |
| 113 | + return !net.minecraft.src.Tessellator.instance.getClass().getSimpleName().equals("Tessellator") ? obfuscatedFieldName : fieldName; | |
| 98 | 114 | } |
| 99 | 115 | |
| 100 | 116 | /** | ... | ... |
java/com/mumfrey/liteloader/util/PrivateFields.java
| ... | ... | @@ -33,6 +33,8 @@ public class PrivateFields<P, T> |
| 33 | 33 | */ |
| 34 | 34 | public final String name; |
| 35 | 35 | |
| 36 | + public final String seargeName; | |
| 37 | + | |
| 36 | 38 | /** |
| 37 | 39 | * Name used to access the field, determined at init |
| 38 | 40 | */ |
| ... | ... | @@ -45,13 +47,14 @@ public class PrivateFields<P, T> |
| 45 | 47 | * @param mcpName |
| 46 | 48 | * @param name |
| 47 | 49 | */ |
| 48 | - private PrivateFields(Class<P> owner, String mcpName, String name) | |
| 50 | + private PrivateFields(Class<P> owner, String mcpName, String name, String seargeName) | |
| 49 | 51 | { |
| 50 | 52 | this.parentClass = owner; |
| 51 | - this.mcpName = mcpName; | |
| 52 | - this.name = name; | |
| 53 | + this.mcpName = mcpName; | |
| 54 | + this.name = name; | |
| 55 | + this.seargeName = seargeName; | |
| 53 | 56 | |
| 54 | - this.fieldName = ModUtilities.getObfuscatedFieldName(mcpName, name); | |
| 57 | + this.fieldName = ModUtilities.getObfuscatedFieldName(mcpName, name, seargeName); | |
| 55 | 58 | } |
| 56 | 59 | |
| 57 | 60 | /** |
| ... | ... | @@ -127,16 +130,16 @@ public class PrivateFields<P, T> |
| 127 | 130 | */ |
| 128 | 131 | public static final class StaticFields<P, T> extends PrivateFields<P, T> |
| 129 | 132 | { |
| 130 | - public StaticFields(Class<P> owner, String mcpName, String name) { super(owner, mcpName, name); } | |
| 133 | + public StaticFields(Class<P> owner, String mcpName, String name, String fmlName) { super(owner, mcpName, name, fmlName); } | |
| 131 | 134 | public T get() { return get(null); } |
| 132 | 135 | public void set(T value) { set(null, value); } |
| 133 | 136 | |
| 134 | - public static final StaticFields<Packet, Map> packetClassToIdMap = new StaticFields<Packet, Map> (Packet.class, "packetClassToIdMap", "a"); // Packet/packetClassToIdMap | |
| 135 | - public static final StaticFields<TileEntity, Map> tileEntityNameToClassMap = new StaticFields<TileEntity, Map> (TileEntity.class, "nameToClassMap", "a"); // TileEntity/nameToClassMap | |
| 137 | + public static final StaticFields<Packet, Map> packetClassToIdMap = new StaticFields<Packet, Map> (Packet.class, "packetClassToIdMap", "a", "field_73291_a"); // Packet/packetClassToIdMap | |
| 138 | + public static final StaticFields<TileEntity, Map> tileEntityNameToClassMap = new StaticFields<TileEntity, Map> (TileEntity.class, "nameToClassMap", "a", "field_70326_a"); // TileEntity/nameToClassMap | |
| 136 | 139 | } |
| 137 | 140 | |
| 138 | - public static final PrivateFields<Minecraft, Timer> minecraftTimer = new PrivateFields<Minecraft, Timer> (Minecraft.class, "timer", "V"); // Minecraft/timer | |
| 139 | - public static final PrivateFields<Minecraft, Profiler> minecraftProfiler = new PrivateFields<Minecraft, Profiler> (Minecraft.class, "mcProfiler", "J"); // Minecraft/mcProfiler | |
| 140 | - public static final PrivateFields<RenderManager, Map> entityRenderMap = new PrivateFields<RenderManager, Map> (RenderManager.class, "entityRenderMap", "q"); // RenderManager/entityRenderMap | |
| 141 | + public static final PrivateFields<Minecraft, Timer> minecraftTimer = new PrivateFields<Minecraft, Timer> (Minecraft.class, "timer", "V", "field_71428_T"); // Minecraft/timer | |
| 142 | + public static final PrivateFields<Minecraft, Profiler> minecraftProfiler = new PrivateFields<Minecraft, Profiler> (Minecraft.class, "mcProfiler", "J", "field_71424_I"); // Minecraft/mcProfiler | |
| 143 | + public static final PrivateFields<RenderManager, Map> entityRenderMap = new PrivateFields<RenderManager, Map> (RenderManager.class, "entityRenderMap", "q", "field_78729_o"); // RenderManager/entityRenderMap | |
| 141 | 144 | } |
| 142 | 145 | ... | ... |