Commit 553f79521c3a83974d15c2246e627865cd58a371

Authored by Mumfrey
2 parents 84ea1ab3 4aa0b57c

Merge branch '1.10.2'

build.gradle
... ... @@ -71,15 +71,12 @@ repositories {
71 71 }
72 72  
73 73 dependencies {
74   -// compile 'org.ow2.asm:asm-debug-all:5.0.3'
75   - compile('org.spongepowered:mixin:0.5.6-SNAPSHOT') {
  74 + compile('org.spongepowered:mixin:0.5.11-SNAPSHOT') {
76 75 exclude module: 'asm-commons'
77 76 exclude module: 'asm-tree'
78 77 exclude module: 'launchwrapper'
79 78 exclude module: 'guava'
80 79 }
81   -// compile 'com.google.guava:guava:17.0'
82   -// compile 'com.google.code.gson:gson:2.2.4'
83 80 }
84 81  
85 82 minecraft {
... ...
gradle.properties
... ... @@ -5,6 +5,6 @@ description=LiteLoader
5 5 url=http://www.liteloader.com
6 6 organization=LiteLoader
7 7 buildType=SNAPSHOT
8   -buildVersion=1.9.4
9   -mcVersion=1.9.4
10   -mcMappings=snapshot_20160517
11 8 \ No newline at end of file
  9 +buildVersion=1.10.2
  10 +mcVersion=1.10.2
  11 +mcMappings=snapshot_20160628
12 12 \ No newline at end of file
... ...
src/client/java/com/mumfrey/liteloader/client/api/LiteLoaderCoreAPIClient.java
... ... @@ -52,9 +52,8 @@ public class LiteLoaderCoreAPIClient extends LiteLoaderCoreAPI
52 52 public String[] getMixinConfigs()
53 53 {
54 54 String[] commonConfigs = super.getMixinConfigs();
55   - return ObjectArrays.concat(commonConfigs, new String[] {
56   - "mixins.liteloader.client.json"
57   - }, String.class);
  55 + String[] clientConfigs = new String[] { "mixins.liteloader.client.json" };
  56 + return ObjectArrays.concat(commonConfigs, clientConfigs, String.class);
58 57 }
59 58  
60 59 /* (non-Javadoc)
... ...
src/client/java/com/mumfrey/liteloader/client/mixin/MixinIntIdentityHashBiMap.java
... ... @@ -15,8 +15,8 @@ import net.minecraft.util.IntIdentityHashBiMap;
15 15 @Mixin(IntIdentityHashBiMap.class)
16 16 public abstract class MixinIntIdentityHashBiMap<V> implements IIntIdentityHashBiMap<V>
17 17 {
18   - @Shadow private V[] keys;
19   - @Shadow private int[] values;
  18 + @Shadow private V[] values;
  19 + @Shadow private int[] intKeys;
20 20 @Shadow private V[] byId;
21 21 @Shadow private int nextFreeIndex;
22 22 @Shadow private int mapSize;
... ... @@ -35,9 +35,9 @@ public abstract class MixinIntIdentityHashBiMap&lt;V&gt; implements IIntIdentityHashBi
35 35 public void removeObject(V object)
36 36 {
37 37 int index = this.getIndex(object, this.hashObject(object));
38   - int intKey = this.values[index];
39   - this.keys[index] = null;
40   - this.values[index] = 0;
  38 + int intKey = this.intKeys[index];
  39 + this.values[index] = null;
  40 + this.intKeys[index] = 0;
41 41 this.byId[intKey] = null;
42 42 }
43 43 }
... ...
src/client/java/com/mumfrey/liteloader/util/ModUtilities.java
... ... @@ -5,33 +5,25 @@
5 5 */
6 6 package com.mumfrey.liteloader.util;
7 7  
8   -import java.lang.reflect.Field;
9   -import java.lang.reflect.Modifier;
10 8 import java.util.Map;
11 9  
12 10 import org.lwjgl.LWJGLException;
13 11 import org.lwjgl.opengl.Display;
14 12 import org.lwjgl.opengl.DisplayMode;
15 13  
16   -import com.mumfrey.liteloader.client.ducks.IMutableRegistry;
17 14 import com.mumfrey.liteloader.client.ducks.IRenderManager;
18 15 import com.mumfrey.liteloader.client.ducks.ITileEntityRendererDispatcher;
19 16 import com.mumfrey.liteloader.client.overlays.IMinecraft;
20 17 import com.mumfrey.liteloader.client.util.PrivateFieldsClient;
21 18 import com.mumfrey.liteloader.util.log.LiteLoaderLogger;
22 19  
23   -import net.minecraft.block.Block;
24 20 import net.minecraft.client.Minecraft;
25 21 import net.minecraft.client.renderer.entity.Render;
26 22 import net.minecraft.client.renderer.entity.RenderManager;
27 23 import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
28 24 import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
29 25 import net.minecraft.entity.Entity;
30   -import net.minecraft.init.Blocks;
31   -import net.minecraft.init.Items;
32   -import net.minecraft.item.Item;
33 26 import net.minecraft.tileentity.TileEntity;
34   -import net.minecraft.util.ResourceLocation;
35 27  
36 28 /**
37 29 * A small collection of useful functions for mods
... ... @@ -103,115 +95,6 @@ public abstract class ModUtilities
103 95 }
104 96 }
105 97  
106   - /**
107   - * Add a block to the blocks registry
108   - *
109   - * @param blockId Block ID to insert
110   - * @param blockName Block identifier
111   - * @param block Block to register
112   - * @param force Force insertion even if the operation is blocked by FMl
113   - *
114   - * @deprecated Register blocks directly with the registry
115   - */
116   - @SuppressWarnings("unchecked")
117   - @Deprecated
118   - public static void addBlock(int blockId, ResourceLocation blockName, Block block, boolean force)
119   - {
120   - boolean exists = Block.REGISTRY.containsKey(blockName);
121   - Block existingBlock = Block.REGISTRY.getObject(blockName);
122   -
123   - try
124   - {
125   - Block.REGISTRY.register(blockId, blockName, block);
126   - }
127   - catch (IllegalArgumentException ex)
128   - {
129   - if (!force) throw new IllegalArgumentException("Could not register block '" + blockName + "', the operation was blocked by FML.", ex);
130   -
131   - if (Block.REGISTRY instanceof IMutableRegistry)
132   - {
133   - ((IMutableRegistry<ResourceLocation, Block>)Block.REGISTRY).removeObjectFromRegistry(blockName);
134   - Block.REGISTRY.register(blockId, blockName, block);
135   - }
136   - }
137   -
138   - if (exists)
139   - {
140   - try
141   - {
142   - for (Field field : Blocks.class.getDeclaredFields())
143   - {
144   - field.setAccessible(true);
145   - if (field.isAccessible() && Block.class.isAssignableFrom(field.getType()))
146   - {
147   - Block fieldValue = (Block)field.get(null);
148   - if (fieldValue == existingBlock)
149   - {
150   - ModUtilities.setFinalStaticField(field, block);
151   - }
152   - }
153   - }
154   - }
155   - catch (Exception ex)
156   - {
157   - ex.printStackTrace();
158   - }
159   - }
160   - }
161   -
162   - /**
163   - * Add an item to the items registry
164   - *
165   - * @param itemId Item ID to insert
166   - * @param itemName Item identifier
167   - * @param item Item to register
168   - * @param force Force insertion even if the operation is blocked by FMl
169   - *
170   - * @deprecated Register items directly with the registry
171   - */
172   - @SuppressWarnings("unchecked")
173   - @Deprecated
174   - public static void addItem(int itemId, ResourceLocation itemName, Item item, boolean force)
175   - {
176   - boolean exists = Item.REGISTRY.containsKey(itemName);
177   - Item existingItem = Item.REGISTRY.getObject(itemName);
178   -
179   - try
180   - {
181   - Item.REGISTRY.register(itemId, itemName, item);
182   - }
183   - catch (IllegalArgumentException ex)
184   - {
185   - if (!force) throw new IllegalArgumentException("Could not register item '" + itemName + "', the operation was blocked by FML.", ex);
186   -
187   - if (Block.REGISTRY instanceof IMutableRegistry)
188   - {
189   - ((IMutableRegistry<ResourceLocation, Block>)Item.REGISTRY).removeObjectFromRegistry(itemName);
190   - Item.REGISTRY.register(itemId, itemName, item);
191   - }
192   - }
193   -
194   - if (exists)
195   - {
196   - try
197   - {
198   - for (Field field : Items.class.getDeclaredFields())
199   - {
200   - field.setAccessible(true);
201   - if (field.isAccessible() && Item.class.isAssignableFrom(field.getType()))
202   - {
203   - Item fieldValue = (Item)field.get(null);
204   - if (fieldValue == existingItem)
205   - {
206   - ModUtilities.setFinalStaticField(field, item);
207   - }
208   - }
209   - }
210   - }
211   - catch (Exception ex) {}
212   - }
213   - }
214   -
215 98 @SuppressWarnings("unchecked")
216 99 public static void addTileEntity(String entityName, Class<? extends TileEntity> tileEntityClass)
217 100 {
... ... @@ -227,13 +110,4 @@ public abstract class ModUtilities
227 110 ex.printStackTrace();
228 111 }
229 112 }
230   -
231   - private static void setFinalStaticField(Field field, Object value)
232   - throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException
233   - {
234   - Field modifiers = Field.class.getDeclaredField("modifiers");
235   - modifiers.setAccessible(true);
236   - modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
237   - field.set(null, value);
238   - }
239 113 }
... ...
src/client/resources/mixins.liteloader.client.json
1 1 {
2 2 "required": true,
3   - "minVersion": "0.5.3",
  3 + "minVersion": "0.5.10",
  4 + "target": "@env(DEFAULT)",
4 5 "package": "com.mumfrey.liteloader.client.mixin",
5 6 "refmap": "mixins.liteloader.client.refmap.json",
6 7 "mixins": [
... ...
src/main/java/com/mumfrey/liteloader/api/MixinConfigProvider.java
... ... @@ -5,23 +5,12 @@
5 5 */
6 6 package com.mumfrey.liteloader.api;
7 7  
8   -import org.spongepowered.asm.mixin.MixinEnvironment.CompatibilityLevel;
9   -
10 8 /**
11 9 * Container for all of an API's mixin environment configuration
12 10 */
13 11 public interface MixinConfigProvider
14 12 {
15 13 /**
16   - * Get the minimum required mixin operating compatibility level for this
17   - * API, can return null.
18   - *
19   - * @deprecated Specify level in configs
20   - */
21   - @Deprecated
22   - public abstract CompatibilityLevel getCompatibilityLevel();
23   -
24   - /**
25 14 * Get mixin configuration files for this API, all returned configs will be
26 15 * added to the DEFAULT environment. Can return null.
27 16 */
... ...
src/main/java/com/mumfrey/liteloader/api/manager/APIProviderBasic.java
... ... @@ -13,8 +13,6 @@ import java.util.List;
13 13 import java.util.Map;
14 14 import java.util.regex.Matcher;
15 15  
16   -import org.spongepowered.asm.mixin.MixinEnvironment;
17   -import org.spongepowered.asm.mixin.MixinEnvironment.CompatibilityLevel;
18 16 import org.spongepowered.asm.mixin.Mixins;
19 17  
20 18 import com.mumfrey.liteloader.api.CoreProvider;
... ... @@ -76,12 +74,6 @@ class APIProviderBasic implements APIProvider, APIAdapter
76 74 MixinConfigProvider mixins = api.getMixins();
77 75 if (mixins != null)
78 76 {
79   - CompatibilityLevel level = mixins.getCompatibilityLevel();
80   - if (level != null)
81   - {
82   - MixinEnvironment.setCompatibilityLevel(level);
83   - }
84   -
85 77 String[] configs = mixins.getMixinConfigs();
86 78 if (configs != null)
87 79 {
... ...
src/main/java/com/mumfrey/liteloader/core/LiteLoaderVersion.java
... ... @@ -12,7 +12,7 @@ import java.util.Set;
12 12 * LiteLoader version table
13 13 *
14 14 * @author Adam Mummery-Smith
15   - * @version 1.9.4_00
  15 + * @version 1.10.2_00
16 16 */
17 17 public enum LiteLoaderVersion
18 18 {
... ... @@ -46,12 +46,14 @@ public enum LiteLoaderVersion
46 46 MC_1_8_0_R0(32, 0, "1.8", "1.8.0", "1.8", "1.8.0"),
47 47 MC_1_8_9_R0(34, 0, "1.8.9", "1.8.9", "1.8.9"),
48 48 MC_1_9_0_R0(35, 0, "1.9", "1.9.0", "1.9", "1.9.0"),
49   - MC_1_9_4_R0(36, 0, "1.9.4", "1.9.4", "1.9.4");
  49 + MC_1_9_4_R0(36, 0, "1.9.4", "1.9.4", "1.9.4"),
  50 + MC_1_10_R0(37, 0, "1.10", "1.10", "1.10", "1.10.0", "1.10.r1"),
  51 + MC_1_10_2_R0(38, 0, "1.10.2", "1.10.2", "1.10.2", "1.10.r1");
50 52  
51 53 /**
52 54 * Current loader version
53 55 */
54   - public static final LiteLoaderVersion CURRENT = LiteLoaderVersion.MC_1_9_4_R0;
  56 + public static final LiteLoaderVersion CURRENT = LiteLoaderVersion.MC_1_10_2_R0;
55 57  
56 58 private static final LiteLoaderUpdateSite updateSite = new LiteLoaderUpdateSite(LiteLoaderVersion.CURRENT.getMinecraftVersion(),
57 59 LiteLoaderVersion.CURRENT.getReleaseTimestamp());
... ...
src/main/java/com/mumfrey/liteloader/core/api/LiteLoaderCoreAPI.java
... ... @@ -10,8 +10,6 @@ import java.util.ArrayList;
10 10 import java.util.Collections;
11 11 import java.util.List;
12 12  
13   -import org.spongepowered.asm.mixin.MixinEnvironment.CompatibilityLevel;
14   -
15 13 import com.mumfrey.liteloader.api.EnumeratorModule;
16 14 import com.mumfrey.liteloader.api.LiteAPI;
17 15 import com.mumfrey.liteloader.api.MixinConfigProvider;
... ... @@ -160,12 +158,6 @@ public abstract class LiteLoaderCoreAPI implements LiteAPI, MixinConfigProvider
160 158 }
161 159  
162 160 @Override
163   - public CompatibilityLevel getCompatibilityLevel()
164   - {
165   - return null;
166   - }
167   -
168   - @Override
169 161 public String[] getMixinConfigs()
170 162 {
171 163 return new String[] {
... ...
src/main/java/com/mumfrey/liteloader/core/runtime/Obf.java
... ... @@ -17,7 +17,7 @@ import org.spongepowered.asm.obfuscation.SrgMethod;
17 17 * Centralised obfuscation table for LiteLoader
18 18 *
19 19 * @author Adam Mummery-Smith
20   - * TODO Obfuscation 1.9.4
  20 + * TODO Obfuscation 1.10.2
21 21 */
22 22 public class Obf
23 23 {
... ... @@ -43,14 +43,14 @@ public class Obf
43 43  
44 44 // Classes
45 45 // -----------------------------------------------------------------------------------------
46   - public static final Obf Minecraft = new Obf("net.minecraft.client.Minecraft", "bcd" );
47   - public static final Obf EntityRenderer = new Obf("net.minecraft.client.renderer.EntityRenderer", "bnd" );
48   - public static final Obf Blocks = new Obf("net.minecraft.init.Blocks", "aju" );
  46 + public static final Obf Minecraft = new Obf("net.minecraft.client.Minecraft", "bcx" );
  47 + public static final Obf EntityRenderer = new Obf("net.minecraft.client.renderer.EntityRenderer", "bnz" );
  48 + public static final Obf Blocks = new Obf("net.minecraft.init.Blocks", "akg" );
49 49 public static final Obf CrashReport$6 = new Obf("net.minecraft.crash.CrashReport$6", "b$6" );
50   - public static final Obf INetHandler = new Obf("net.minecraft.network.INetHandler", "er" );
51   - public static final Obf Items = new Obf("net.minecraft.init.Items", "ads" );
52   - public static final Obf Profiler = new Obf("net.minecraft.profiler.Profiler", "oo" );
53   - public static final Obf TileEntity = new Obf("net.minecraft.tileentity.TileEntity", "apv" );
  50 + public static final Obf INetHandler = new Obf("net.minecraft.network.INetHandler", "et" );
  51 + public static final Obf Items = new Obf("net.minecraft.init.Items", "aeb" );
  52 + public static final Obf Profiler = new Obf("net.minecraft.profiler.Profiler", "oq" );
  53 + public static final Obf TileEntity = new Obf("net.minecraft.tileentity.TileEntity", "aqk" );
54 54  
55 55 // Fields
56 56 // -----------------------------------------------------------------------------------------
... ...
src/main/java/com/mumfrey/liteloader/core/runtime/Packets.java
... ... @@ -12,7 +12,7 @@ import java.util.Map;
12 12 * Packet obfuscation table
13 13 *
14 14 * @author Adam Mummery-Smith
15   - * TODO Obfuscation 1.9.4
  15 + * TODO Obfuscation 1.10.2
16 16 */
17 17 public final class Packets extends Obf
18 18 {
... ... @@ -37,123 +37,123 @@ public final class Packets extends Obf
37 37  
38 38 private static Map<String, Packets> packetMap = new HashMap<String, Packets>();
39 39  
40   - public static Packets CPacketEncryptionResponse = new Packets("net/minecraft/network/login/client/CPacketEncryptionResponse", "ju", Context.SERVER);
41   - public static Packets CPacketLoginStart = new Packets("net/minecraft/network/login/client/CPacketLoginStart", "jt", Context.SERVER);
42   - public static Packets SPacketDisconnectLogin = new Packets("net/minecraft/network/login/server/SPacketDisconnect", "jr", Context.CLIENT);
43   - public static Packets SPacketEnableCompression = new Packets("net/minecraft/network/login/server/SPacketEnableCompression", "jq", Context.CLIENT);
44   - public static Packets SPacketEncryptionRequest = new Packets("net/minecraft/network/login/server/SPacketEncryptionRequest", "jp", Context.CLIENT);
45   - public static Packets SPacketLoginSuccess = new Packets("net/minecraft/network/login/server/SPacketLoginSuccess", "jo", Context.CLIENT);
46   - public static Packets CPacketAnimation = new Packets("net/minecraft/network/play/client/CPacketAnimation", "jf", Context.SERVER);
47   - public static Packets CPacketChatMessage = new Packets("net/minecraft/network/play/client/CPacketChatMessage", "ik", Context.SERVER);
48   - public static Packets CPacketClickWindow = new Packets("net/minecraft/network/play/client/CPacketClickWindow", "ip", Context.SERVER);
49   - public static Packets CPacketClientSettings = new Packets("net/minecraft/network/play/client/CPacketClientSettings", "im", Context.SERVER);
50   - public static Packets CPacketClientStatus = new Packets("net/minecraft/network/play/client/CPacketClientStatus", "il", Context.SERVER);
51   - public static Packets CPacketCloseWindow = new Packets("net/minecraft/network/play/client/CPacketCloseWindow", "iq", Context.SERVER);
52   - public static Packets CPacketConfirmTeleport = new Packets("net/minecraft/network/play/client/CPacketConfirmTeleport", "ii", Context.SERVER);
53   - public static Packets CPacketConfirmTransaction = new Packets("net/minecraft/network/play/client/CPacketConfirmTransaction", "in", Context.SERVER);
54   - public static Packets CPacketCreativeInventoryAction = new Packets("net/minecraft/network/play/client/CPacketCreativeInventoryAction", "jd", Context.SERVER);
55   - public static Packets CPacketCustomPayload = new Packets("net/minecraft/network/play/client/CPacketCustomPayload", "ir", Context.SERVER);
56   - public static Packets CPacketEnchantItem = new Packets("net/minecraft/network/play/client/CPacketEnchantItem", "io", Context.SERVER);
57   - public static Packets CPacketEntityAction = new Packets("net/minecraft/network/play/client/CPacketEntityAction", "iz", Context.SERVER);
58   - public static Packets CPacketHeldItemChange = new Packets("net/minecraft/network/play/client/CPacketHeldItemChange", "jc", Context.SERVER);
59   - public static Packets CPacketInput = new Packets("net/minecraft/network/play/client/CPacketInput", "ja", Context.SERVER);
60   - public static Packets C00Handshake = new Packets("net/minecraft/network/handshake/client/C00Handshake", "jk", Context.SERVER);
61   - public static Packets CPacketKeepAlive = new Packets("net/minecraft/network/play/client/CPacketKeepAlive", "it", Context.SERVER);
62   - public static Packets CPacketPlayer = new Packets("net/minecraft/network/play/client/CPacketPlayer", "iu", Context.SERVER);
63   - public static Packets CPacketPlayerPosition = new Packets("net/minecraft/network/play/client/CPacketPlayer$Position", "iu$a", Context.SERVER);
64   - public static Packets CPacketPlayerPositionRotation = new Packets("net/minecraft/network/play/client/CPacketPlayer$PositionRotation", "iu$b", Context.SERVER);
65   - public static Packets CPacketPlayerRotation = new Packets("net/minecraft/network/play/client/CPacketPlayer$Rotation", "iu$c", Context.SERVER);
66   - public static Packets CPacketPlayerAbilities = new Packets("net/minecraft/network/play/client/CPacketPlayerAbilities", "ix", Context.SERVER);
67   - public static Packets CPacketPlayerDigging = new Packets("net/minecraft/network/play/client/CPacketPlayerDigging", "iy", Context.SERVER);
68   - public static Packets CPacketPlayerTryUseItem = new Packets("net/minecraft/network/play/client/CPacketPlayerTryUseItem", "ji", Context.SERVER);
69   - public static Packets CPacketPlayerTryUseItemOnBlock = new Packets("net/minecraft/network/play/client/CPacketPlayerTryUseItemOnBlock", "jh", Context.SERVER);
70   - public static Packets CPacketResourcePackStatus = new Packets("net/minecraft/network/play/client/CPacketResourcePackStatus", "jb", Context.SERVER);
71   - public static Packets CPacketSpectate = new Packets("net/minecraft/network/play/client/CPacketSpectate", "jg", Context.SERVER);
72   - public static Packets CPacketSteerBoat = new Packets("net/minecraft/network/play/client/CPacketSteerBoat", "iw", Context.SERVER);
73   - public static Packets CPacketTabComplete = new Packets("net/minecraft/network/play/client/CPacketTabComplete", "ij", Context.SERVER);
74   - public static Packets CPacketUpdateSign = new Packets("net/minecraft/network/play/client/CPacketUpdateSign", "je", Context.SERVER);
75   - public static Packets CPacketUseEntity = new Packets("net/minecraft/network/play/client/CPacketUseEntity", "is", Context.SERVER);
76   - public static Packets CPacketVehicleMove = new Packets("net/minecraft/network/play/client/CPacketVehicleMove", "iv", Context.SERVER);
77   - public static Packets SPacketAnimation = new Packets("net/minecraft/network/play/server/SPacketAnimation", "fr", Context.CLIENT);
78   - public static Packets SPacketBlockAction = new Packets("net/minecraft/network/play/server/SPacketBlockAction", "fv", Context.CLIENT);
79   - public static Packets SPacketBlockBreakAnim = new Packets("net/minecraft/network/play/server/SPacketBlockBreakAnim", "ft", Context.CLIENT);
80   - public static Packets SPacketBlockChange = new Packets("net/minecraft/network/play/server/SPacketBlockChange", "fw", Context.CLIENT);
81   - public static Packets SPacketCamera = new Packets("net/minecraft/network/play/server/SPacketCamera", "hk", Context.CLIENT);
82   - public static Packets SPacketChangeGameState = new Packets("net/minecraft/network/play/server/SPacketChangeGameState", "gp", Context.CLIENT);
83   - public static Packets SPacketChat = new Packets("net/minecraft/network/play/server/SPacketChat", "ga", Context.CLIENT);
84   - public static Packets SPacketChunkData = new Packets("net/minecraft/network/play/server/SPacketChunkData", "gr", Context.CLIENT);
85   - public static Packets SPacketCloseWindow = new Packets("net/minecraft/network/play/server/SPacketCloseWindow", "gd", Context.CLIENT);
86   - public static Packets SPacketCollectItem = new Packets("net/minecraft/network/play/server/SPacketCollectItem", "ic", Context.CLIENT);
87   - public static Packets SPacketCombatEvent = new Packets("net/minecraft/network/play/server/SPacketCombatEvent", "ha", Context.CLIENT);
88   - public static Packets SPacketConfirmTransaction = new Packets("net/minecraft/network/play/server/SPacketConfirmTransaction", "gc", Context.CLIENT);
89   - public static Packets SPacketCooldown = new Packets("net/minecraft/network/play/server/SPacketCooldown", "gi", Context.CLIENT);
90   - public static Packets SPacketCustomPayload = new Packets("net/minecraft/network/play/server/SPacketCustomPayload", "gj", Context.CLIENT);
91   - public static Packets SPacketCustomSound = new Packets("net/minecraft/network/play/server/SPacketCustomSound", "gk", Context.CLIENT);
92   - public static Packets SPacketDestroyEntities = new Packets("net/minecraft/network/play/server/SPacketDestroyEntities", "he", Context.CLIENT);
93   - public static Packets SPacketDisconnect = new Packets("net/minecraft/network/play/server/SPacketDisconnect", "gl", Context.CLIENT);
94   - public static Packets SPacketDisplayObjective = new Packets("net/minecraft/network/play/server/SPacketDisplayObjective", "hm", Context.CLIENT);
95   - public static Packets SPacketEffect = new Packets("net/minecraft/network/play/server/SPacketEffect", "gs", Context.CLIENT);
96   - public static Packets SPacketEntity = new Packets("net/minecraft/network/play/server/SPacketEntity", "gw", Context.CLIENT);
97   - public static Packets S15PacketEntityRelMove = new Packets("net/minecraft/network/play/server/SPacketEntity$S15PacketEntityRelMove", "gw$a", Context.CLIENT);
98   - public static Packets S16PacketEntityLook = new Packets("net/minecraft/network/play/server/SPacketEntity$S16PacketEntityLook", "gw$c", Context.CLIENT);
99   - public static Packets S17PacketEntityLookMove = new Packets("net/minecraft/network/play/server/SPacketEntity$S17PacketEntityLookMove", "gw$b", Context.CLIENT);
100   - public static Packets SPacketEntityAttach = new Packets("net/minecraft/network/play/server/SPacketEntityAttach", "ho", Context.CLIENT);
101   - public static Packets SPacketEntityEffect = new Packets("net/minecraft/network/play/server/SPacketEntityEffect", "ig", Context.CLIENT);
102   - public static Packets SPacketEntityEquipment = new Packets("net/minecraft/network/play/server/SPacketEntityEquipment", "hq", Context.CLIENT);
103   - public static Packets SPacketEntityHeadLook = new Packets("net/minecraft/network/play/server/SPacketEntityHeadLook", "hi", Context.CLIENT);
104   - public static Packets SPacketEntityMetadata = new Packets("net/minecraft/network/play/server/SPacketEntityMetadata", "hn", Context.CLIENT);
105   - public static Packets SPacketEntityProperties = new Packets("net/minecraft/network/play/server/SPacketEntityProperties", "ie", Context.CLIENT);
106   - public static Packets SPacketEntityStatus = new Packets("net/minecraft/network/play/server/SPacketEntityStatus", "gm", Context.CLIENT);
107   - public static Packets SPacketEntityTeleport = new Packets("net/minecraft/network/play/server/SPacketEntityTeleport", "id", Context.CLIENT);
108   - public static Packets SPacketEntityVelocity = new Packets("net/minecraft/network/play/server/SPacketEntityVelocity", "hp", Context.CLIENT);
109   - public static Packets SPacketExplosion = new Packets("net/minecraft/network/play/server/SPacketExplosion", "gn", Context.CLIENT);
110   - public static Packets SPacketHeldItemChange = new Packets("net/minecraft/network/play/server/SPacketHeldItemChange", "hl", Context.CLIENT);
111   - public static Packets SPacketJoinGame = new Packets("net/minecraft/network/play/server/SPacketJoinGame", "gu", Context.CLIENT);
112   - public static Packets SPacketKeepAlive = new Packets("net/minecraft/network/play/server/SPacketKeepAlive", "gq", Context.CLIENT);
113   - public static Packets SPacketMaps = new Packets("net/minecraft/network/play/server/SPacketMaps", "gv", Context.CLIENT);
114   - public static Packets SPacketMoveVehicle = new Packets("net/minecraft/network/play/server/SPacketMoveVehicle", "gx", Context.CLIENT);
115   - public static Packets SPacketMultiBlockChange = new Packets("net/minecraft/network/play/server/SPacketMultiBlockChange", "gb", Context.CLIENT);
116   - public static Packets SPacketOpenWindow = new Packets("net/minecraft/network/play/server/SPacketOpenWindow", "ge", Context.CLIENT);
117   - public static Packets SPacketParticles = new Packets("net/minecraft/network/play/server/SPacketParticles", "gt", Context.CLIENT);
118   - public static Packets SPacketPlayerAbilities = new Packets("net/minecraft/network/play/server/SPacketPlayerAbilities", "gz", Context.CLIENT);
119   - public static Packets SPacketPlayerListHeaderFooter = new Packets("net/minecraft/network/play/server/SPacketPlayerListHeaderFooter", "ib", Context.CLIENT);
120   - public static Packets SPacketPlayerListItem = new Packets("net/minecraft/network/play/server/SPacketPlayerListItem", "hb", Context.CLIENT);
121   - public static Packets SPacketPlayerPosLook = new Packets("net/minecraft/network/play/server/SPacketPlayerPosLook", "hc", Context.CLIENT);
122   - public static Packets SPacketRemoveEntityEffect = new Packets("net/minecraft/network/play/server/SPacketRemoveEntityEffect", "hf", Context.CLIENT);
123   - public static Packets SPacketResourcePackSend = new Packets("net/minecraft/network/play/server/SPacketResourcePackSend", "hg", Context.CLIENT);
124   - public static Packets SPacketRespawn = new Packets("net/minecraft/network/play/server/SPacketRespawn", "hh", Context.CLIENT);
125   - public static Packets SPacketScoreboardObjective = new Packets("net/minecraft/network/play/server/SPacketScoreboardObjective", "ht", Context.CLIENT);
126   - public static Packets SPacketServerDifficulty = new Packets("net/minecraft/network/play/server/SPacketServerDifficulty", "fy", Context.CLIENT);
127   - public static Packets SPacketSetExperience = new Packets("net/minecraft/network/play/server/SPacketSetExperience", "hr", Context.CLIENT);
128   - public static Packets SPacketSetPassengers = new Packets("net/minecraft/network/play/server/SPacketSetPassengers", "hu", Context.CLIENT);
129   - public static Packets SPacketSetSlot = new Packets("net/minecraft/network/play/server/SPacketSetSlot", "gh", Context.CLIENT);
130   - public static Packets SPacketSignEditorOpen = new Packets("net/minecraft/network/play/server/SPacketSignEditorOpen", "gy", Context.CLIENT);
131   - public static Packets SPacketSoundEffect = new Packets("net/minecraft/network/play/server/SPacketSoundEffect", "ia", Context.CLIENT);
132   - public static Packets SPacketSpawnExperienceOrb = new Packets("net/minecraft/network/play/server/SPacketSpawnExperienceOrb", "fm", Context.CLIENT);
133   - public static Packets SPacketSpawnGlobalEntity = new Packets("net/minecraft/network/play/server/SPacketSpawnGlobalEntity", "fn", Context.CLIENT);
134   - public static Packets SPacketSpawnMob = new Packets("net/minecraft/network/play/server/SPacketSpawnMob", "fo", Context.CLIENT);
135   - public static Packets SPacketSpawnObject = new Packets("net/minecraft/network/play/server/SPacketSpawnObject", "fl", Context.CLIENT);
136   - public static Packets SPacketSpawnPainting = new Packets("net/minecraft/network/play/server/SPacketSpawnPainting", "fp", Context.CLIENT);
137   - public static Packets SPacketSpawnPlayer = new Packets("net/minecraft/network/play/server/SPacketSpawnPlayer", "fq", Context.CLIENT);
138   - public static Packets SPacketSpawnPosition = new Packets("net/minecraft/network/play/server/SPacketSpawnPosition", "hx", Context.CLIENT);
139   - public static Packets SPacketStatistics = new Packets("net/minecraft/network/play/server/SPacketStatistics", "fs", Context.CLIENT);
140   - public static Packets SPacketTabComplete = new Packets("net/minecraft/network/play/server/SPacketTabComplete", "fz", Context.CLIENT);
141   - public static Packets SPacketTeams = new Packets("net/minecraft/network/play/server/SPacketTeams", "hv", Context.CLIENT);
142   - public static Packets SPacketTimeUpdate = new Packets("net/minecraft/network/play/server/SPacketTimeUpdate", "hy", Context.CLIENT);
143   - public static Packets SPacketTitle = new Packets("net/minecraft/network/play/server/SPacketTitle", "hz", Context.CLIENT);
144   - public static Packets SPacketUnloadChunk = new Packets("net/minecraft/network/play/server/SPacketUnloadChunk", "go", Context.CLIENT);
145   - public static Packets SPacketUpdateBossInfo = new Packets("net/minecraft/network/play/server/SPacketUpdateBossInfo", "fx", Context.CLIENT);
146   - public static Packets SPacketUpdateHealth = new Packets("net/minecraft/network/play/server/SPacketUpdateHealth", "hs", Context.CLIENT);
147   - public static Packets SPacketUpdateScore = new Packets("net/minecraft/network/play/server/SPacketUpdateScore", "hw", Context.CLIENT);
148   - public static Packets SPacketUpdateTileEntity = new Packets("net/minecraft/network/play/server/SPacketUpdateTileEntity", "fu", Context.CLIENT);
149   - public static Packets SPacketUseBed = new Packets("net/minecraft/network/play/server/SPacketUseBed", "hd", Context.CLIENT);
150   - public static Packets SPacketWindowItems = new Packets("net/minecraft/network/play/server/SPacketWindowItems", "gf", Context.CLIENT);
151   - public static Packets SPacketWindowProperty = new Packets("net/minecraft/network/play/server/SPacketWindowProperty", "gg", Context.CLIENT);
152   - public static Packets SPacketWorldBorder = new Packets("net/minecraft/network/play/server/SPacketWorldBorder", "hj", Context.CLIENT);
153   - public static Packets CPacketPing = new Packets("net/minecraft/network/status/client/CPacketPing", "kc", Context.SERVER);
154   - public static Packets CPacketServerQuery = new Packets("net/minecraft/network/status/client/CPacketServerQuery", "kd", Context.SERVER);
155   - public static Packets SPacketPong = new Packets("net/minecraft/network/status/server/SPacketPong", "jy", Context.CLIENT);
156   - public static Packets SPacketServerInfo = new Packets("net/minecraft/network/status/server/SPacketServerInfo", "jz", Context.CLIENT);
  40 + public static Packets C00Handshake = new Packets("net/minecraft/network/handshake/client/C00Handshake", "jm", Context.SERVER);
  41 + public static Packets CPacketEncryptionResponse = new Packets("net/minecraft/network/login/client/CPacketEncryptionResponse", "jw", Context.SERVER);
  42 + public static Packets CPacketLoginStart = new Packets("net/minecraft/network/login/client/CPacketLoginStart", "jv", Context.SERVER);
  43 + public static Packets SPacketDisconnectLogin = new Packets("net/minecraft/network/login/server/SPacketDisconnect", "jt", Context.CLIENT);
  44 + public static Packets SPacketEnableCompression = new Packets("net/minecraft/network/login/server/SPacketEnableCompression", "js", Context.CLIENT);
  45 + public static Packets SPacketEncryptionRequest = new Packets("net/minecraft/network/login/server/SPacketEncryptionRequest", "jr", Context.CLIENT);
  46 + public static Packets SPacketLoginSuccess = new Packets("net/minecraft/network/login/server/SPacketLoginSuccess", "jq", Context.CLIENT);
  47 + public static Packets CPacketAnimation = new Packets("net/minecraft/network/play/client/CPacketAnimation", "jh", Context.SERVER);
  48 + public static Packets CPacketChatMessage = new Packets("net/minecraft/network/play/client/CPacketChatMessage", "im", Context.SERVER);
  49 + public static Packets CPacketClickWindow = new Packets("net/minecraft/network/play/client/CPacketClickWindow", "ir", Context.SERVER);
  50 + public static Packets CPacketClientSettings = new Packets("net/minecraft/network/play/client/CPacketClientSettings", "io", Context.SERVER);
  51 + public static Packets CPacketClientStatus = new Packets("net/minecraft/network/play/client/CPacketClientStatus", "in", Context.SERVER);
  52 + public static Packets CPacketCloseWindow = new Packets("net/minecraft/network/play/client/CPacketCloseWindow", "is", Context.SERVER);
  53 + public static Packets CPacketConfirmTeleport = new Packets("net/minecraft/network/play/client/CPacketConfirmTeleport", "ik", Context.SERVER);
  54 + public static Packets CPacketConfirmTransaction = new Packets("net/minecraft/network/play/client/CPacketConfirmTransaction", "ip", Context.SERVER);
  55 + public static Packets CPacketCreativeInventoryAction = new Packets("net/minecraft/network/play/client/CPacketCreativeInventoryAction", "jf", Context.SERVER);
  56 + public static Packets CPacketCustomPayload = new Packets("net/minecraft/network/play/client/CPacketCustomPayload", "it", Context.SERVER);
  57 + public static Packets CPacketEnchantItem = new Packets("net/minecraft/network/play/client/CPacketEnchantItem", "iq", Context.SERVER);
  58 + public static Packets CPacketEntityAction = new Packets("net/minecraft/network/play/client/CPacketEntityAction", "jb", Context.SERVER);
  59 + public static Packets CPacketHeldItemChange = new Packets("net/minecraft/network/play/client/CPacketHeldItemChange", "je", Context.SERVER);
  60 + public static Packets CPacketInput = new Packets("net/minecraft/network/play/client/CPacketInput", "jc", Context.SERVER);
  61 + public static Packets CPacketKeepAlive = new Packets("net/minecraft/network/play/client/CPacketKeepAlive", "iv", Context.SERVER);
  62 + public static Packets CPacketPlayer = new Packets("net/minecraft/network/play/client/CPacketPlayer", "iw", Context.SERVER);
  63 + public static Packets CPacketPlayerPosition = new Packets("net/minecraft/network/play/client/CPacketPlayer$Position", "iw$a", Context.SERVER);
  64 + public static Packets CPacketPlayerPositionRotation = new Packets("net/minecraft/network/play/client/CPacketPlayer$PositionRotation", "iw$b", Context.SERVER);
  65 + public static Packets CPacketPlayerRotation = new Packets("net/minecraft/network/play/client/CPacketPlayer$Rotation", "iw$c", Context.SERVER);
  66 + public static Packets CPacketPlayerAbilities = new Packets("net/minecraft/network/play/client/CPacketPlayerAbilities", "iz", Context.SERVER);
  67 + public static Packets CPacketPlayerDigging = new Packets("net/minecraft/network/play/client/CPacketPlayerDigging", "ja", Context.SERVER);
  68 + public static Packets CPacketPlayerTryUseItem = new Packets("net/minecraft/network/play/client/CPacketPlayerTryUseItem", "jk", Context.SERVER);
  69 + public static Packets CPacketPlayerTryUseItemOnBlock = new Packets("net/minecraft/network/play/client/CPacketPlayerTryUseItemOnBlock", "jj", Context.SERVER);
  70 + public static Packets CPacketResourcePackStatus = new Packets("net/minecraft/network/play/client/CPacketResourcePackStatus", "jd", Context.SERVER);
  71 + public static Packets CPacketSpectate = new Packets("net/minecraft/network/play/client/CPacketSpectate", "ji", Context.SERVER);
  72 + public static Packets CPacketSteerBoat = new Packets("net/minecraft/network/play/client/CPacketSteerBoat", "iy", Context.SERVER);
  73 + public static Packets CPacketTabComplete = new Packets("net/minecraft/network/play/client/CPacketTabComplete", "il", Context.SERVER);
  74 + public static Packets CPacketUpdateSign = new Packets("net/minecraft/network/play/client/CPacketUpdateSign", "jg", Context.SERVER);
  75 + public static Packets CPacketUseEntity = new Packets("net/minecraft/network/play/client/CPacketUseEntity", "iu", Context.SERVER);
  76 + public static Packets CPacketVehicleMove = new Packets("net/minecraft/network/play/client/CPacketVehicleMove", "ix", Context.SERVER);
  77 + public static Packets SPacketAnimation = new Packets("net/minecraft/network/play/server/SPacketAnimation", "ft", Context.CLIENT);
  78 + public static Packets SPacketBlockAction = new Packets("net/minecraft/network/play/server/SPacketBlockAction", "fx", Context.CLIENT);
  79 + public static Packets SPacketBlockBreakAnim = new Packets("net/minecraft/network/play/server/SPacketBlockBreakAnim", "fv", Context.CLIENT);
  80 + public static Packets SPacketBlockChange = new Packets("net/minecraft/network/play/server/SPacketBlockChange", "fy", Context.CLIENT);
  81 + public static Packets SPacketCamera = new Packets("net/minecraft/network/play/server/SPacketCamera", "hm", Context.CLIENT);
  82 + public static Packets SPacketChangeGameState = new Packets("net/minecraft/network/play/server/SPacketChangeGameState", "gr", Context.CLIENT);
  83 + public static Packets SPacketChat = new Packets("net/minecraft/network/play/server/SPacketChat", "gc", Context.CLIENT);
  84 + public static Packets SPacketChunkData = new Packets("net/minecraft/network/play/server/SPacketChunkData", "gt", Context.CLIENT);
  85 + public static Packets SPacketCloseWindow = new Packets("net/minecraft/network/play/server/SPacketCloseWindow", "gf", Context.CLIENT);
  86 + public static Packets SPacketCollectItem = new Packets("net/minecraft/network/play/server/SPacketCollectItem", "ie", Context.CLIENT);
  87 + public static Packets SPacketCombatEvent = new Packets("net/minecraft/network/play/server/SPacketCombatEvent", "hc", Context.CLIENT);
  88 + public static Packets SPacketConfirmTransaction = new Packets("net/minecraft/network/play/server/SPacketConfirmTransaction", "ge", Context.CLIENT);
  89 + public static Packets SPacketCooldown = new Packets("net/minecraft/network/play/server/SPacketCooldown", "gk", Context.CLIENT);
  90 + public static Packets SPacketCustomPayload = new Packets("net/minecraft/network/play/server/SPacketCustomPayload", "gl", Context.CLIENT);
  91 + public static Packets SPacketCustomSound = new Packets("net/minecraft/network/play/server/SPacketCustomSound", "gm", Context.CLIENT);
  92 + public static Packets SPacketDestroyEntities = new Packets("net/minecraft/network/play/server/SPacketDestroyEntities", "hg", Context.CLIENT);
  93 + public static Packets SPacketDisconnect = new Packets("net/minecraft/network/play/server/SPacketDisconnect", "gn", Context.CLIENT);
  94 + public static Packets SPacketDisplayObjective = new Packets("net/minecraft/network/play/server/SPacketDisplayObjective", "ho", Context.CLIENT);
  95 + public static Packets SPacketEffect = new Packets("net/minecraft/network/play/server/SPacketEffect", "gu", Context.CLIENT);
  96 + public static Packets SPacketEntity = new Packets("net/minecraft/network/play/server/SPacketEntity", "gy", Context.CLIENT);
  97 + public static Packets S15PacketEntityRelMove = new Packets("net/minecraft/network/play/server/SPacketEntity$S15PacketEntityRelMove", "gy$a", Context.CLIENT);
  98 + public static Packets S16PacketEntityLook = new Packets("net/minecraft/network/play/server/SPacketEntity$S16PacketEntityLook", "gy$c", Context.CLIENT);
  99 + public static Packets S17PacketEntityLookMove = new Packets("net/minecraft/network/play/server/SPacketEntity$S17PacketEntityLookMove", "gy$b", Context.CLIENT);
  100 + public static Packets SPacketEntityAttach = new Packets("net/minecraft/network/play/server/SPacketEntityAttach", "hq", Context.CLIENT);
  101 + public static Packets SPacketEntityEffect = new Packets("net/minecraft/network/play/server/SPacketEntityEffect", "ii", Context.CLIENT);
  102 + public static Packets SPacketEntityEquipment = new Packets("net/minecraft/network/play/server/SPacketEntityEquipment", "hs", Context.CLIENT);
  103 + public static Packets SPacketEntityHeadLook = new Packets("net/minecraft/network/play/server/SPacketEntityHeadLook", "hk", Context.CLIENT);
  104 + public static Packets SPacketEntityMetadata = new Packets("net/minecraft/network/play/server/SPacketEntityMetadata", "hp", Context.CLIENT);
  105 + public static Packets SPacketEntityProperties = new Packets("net/minecraft/network/play/server/SPacketEntityProperties", "ih", Context.CLIENT);
  106 + public static Packets SPacketEntityStatus = new Packets("net/minecraft/network/play/server/SPacketEntityStatus", "go", Context.CLIENT);
  107 + public static Packets SPacketEntityTeleport = new Packets("net/minecraft/network/play/server/SPacketEntityTeleport", "ig", Context.CLIENT);
  108 + public static Packets SPacketEntityVelocity = new Packets("net/minecraft/network/play/server/SPacketEntityVelocity", "hr", Context.CLIENT);
  109 + public static Packets SPacketExplosion = new Packets("net/minecraft/network/play/server/SPacketExplosion", "gp", Context.CLIENT);
  110 + public static Packets SPacketHeldItemChange = new Packets("net/minecraft/network/play/server/SPacketHeldItemChange", "hn", Context.CLIENT);
  111 + public static Packets SPacketJoinGame = new Packets("net/minecraft/network/play/server/SPacketJoinGame", "gw", Context.CLIENT);
  112 + public static Packets SPacketKeepAlive = new Packets("net/minecraft/network/play/server/SPacketKeepAlive", "gs", Context.CLIENT);
  113 + public static Packets SPacketMaps = new Packets("net/minecraft/network/play/server/SPacketMaps", "gx", Context.CLIENT);
  114 + public static Packets SPacketMoveVehicle = new Packets("net/minecraft/network/play/server/SPacketMoveVehicle", "gz", Context.CLIENT);
  115 + public static Packets SPacketMultiBlockChange = new Packets("net/minecraft/network/play/server/SPacketMultiBlockChange", "gd", Context.CLIENT);
  116 + public static Packets SPacketOpenWindow = new Packets("net/minecraft/network/play/server/SPacketOpenWindow", "gg", Context.CLIENT);
  117 + public static Packets SPacketParticles = new Packets("net/minecraft/network/play/server/SPacketParticles", "gv", Context.CLIENT);
  118 + public static Packets SPacketPlayerAbilities = new Packets("net/minecraft/network/play/server/SPacketPlayerAbilities", "hb", Context.CLIENT);
  119 + public static Packets SPacketPlayerListHeaderFooter = new Packets("net/minecraft/network/play/server/SPacketPlayerListHeaderFooter", "id", Context.CLIENT);
  120 + public static Packets SPacketPlayerListItem = new Packets("net/minecraft/network/play/server/SPacketPlayerListItem", "hd", Context.CLIENT);
  121 + public static Packets SPacketPlayerPosLook = new Packets("net/minecraft/network/play/server/SPacketPlayerPosLook", "he", Context.CLIENT);
  122 + public static Packets SPacketRemoveEntityEffect = new Packets("net/minecraft/network/play/server/SPacketRemoveEntityEffect", "hh", Context.CLIENT);
  123 + public static Packets SPacketResourcePackSend = new Packets("net/minecraft/network/play/server/SPacketResourcePackSend", "hi", Context.CLIENT);
  124 + public static Packets SPacketRespawn = new Packets("net/minecraft/network/play/server/SPacketRespawn", "hj", Context.CLIENT);
  125 + public static Packets SPacketScoreboardObjective = new Packets("net/minecraft/network/play/server/SPacketScoreboardObjective", "hv", Context.CLIENT);
  126 + public static Packets SPacketServerDifficulty = new Packets("net/minecraft/network/play/server/SPacketServerDifficulty", "ga", Context.CLIENT);
  127 + public static Packets SPacketSetExperience = new Packets("net/minecraft/network/play/server/SPacketSetExperience", "ht", Context.CLIENT);
  128 + public static Packets SPacketSetPassengers = new Packets("net/minecraft/network/play/server/SPacketSetPassengers", "hw", Context.CLIENT);
  129 + public static Packets SPacketSetSlot = new Packets("net/minecraft/network/play/server/SPacketSetSlot", "gj", Context.CLIENT);
  130 + public static Packets SPacketSignEditorOpen = new Packets("net/minecraft/network/play/server/SPacketSignEditorOpen", "ha", Context.CLIENT);
  131 + public static Packets SPacketSoundEffect = new Packets("net/minecraft/network/play/server/SPacketSoundEffect", "ic", Context.CLIENT);
  132 + public static Packets SPacketSpawnExperienceOrb = new Packets("net/minecraft/network/play/server/SPacketSpawnExperienceOrb", "fo", Context.CLIENT);
  133 + public static Packets SPacketSpawnGlobalEntity = new Packets("net/minecraft/network/play/server/SPacketSpawnGlobalEntity", "fp", Context.CLIENT);
  134 + public static Packets SPacketSpawnMob = new Packets("net/minecraft/network/play/server/SPacketSpawnMob", "fq", Context.CLIENT);
  135 + public static Packets SPacketSpawnObject = new Packets("net/minecraft/network/play/server/SPacketSpawnObject", "fn", Context.CLIENT);
  136 + public static Packets SPacketSpawnPainting = new Packets("net/minecraft/network/play/server/SPacketSpawnPainting", "fr", Context.CLIENT);
  137 + public static Packets SPacketSpawnPlayer = new Packets("net/minecraft/network/play/server/SPacketSpawnPlayer", "fs", Context.CLIENT);
  138 + public static Packets SPacketSpawnPosition = new Packets("net/minecraft/network/play/server/SPacketSpawnPosition", "hz", Context.CLIENT);
  139 + public static Packets SPacketStatistics = new Packets("net/minecraft/network/play/server/SPacketStatistics", "fu", Context.CLIENT);
  140 + public static Packets SPacketTabComplete = new Packets("net/minecraft/network/play/server/SPacketTabComplete", "gb", Context.CLIENT);
  141 + public static Packets SPacketTeams = new Packets("net/minecraft/network/play/server/SPacketTeams", "hx", Context.CLIENT);
  142 + public static Packets SPacketTimeUpdate = new Packets("net/minecraft/network/play/server/SPacketTimeUpdate", "ia", Context.CLIENT);
  143 + public static Packets SPacketTitle = new Packets("net/minecraft/network/play/server/SPacketTitle", "ib", Context.CLIENT);
  144 + public static Packets SPacketUnloadChunk = new Packets("net/minecraft/network/play/server/SPacketUnloadChunk", "gq", Context.CLIENT);
  145 + public static Packets SPacketUpdateBossInfo = new Packets("net/minecraft/network/play/server/SPacketUpdateBossInfo", "fz", Context.CLIENT);
  146 + public static Packets SPacketUpdateHealth = new Packets("net/minecraft/network/play/server/SPacketUpdateHealth", "hu", Context.CLIENT);
  147 + public static Packets SPacketUpdateScore = new Packets("net/minecraft/network/play/server/SPacketUpdateScore", "hy", Context.CLIENT);
  148 + public static Packets SPacketUpdateTileEntity = new Packets("net/minecraft/network/play/server/SPacketUpdateTileEntity", "fw", Context.CLIENT);
  149 + public static Packets SPacketUseBed = new Packets("net/minecraft/network/play/server/SPacketUseBed", "hf", Context.CLIENT);
  150 + public static Packets SPacketWindowItems = new Packets("net/minecraft/network/play/server/SPacketWindowItems", "gh", Context.CLIENT);
  151 + public static Packets SPacketWindowProperty = new Packets("net/minecraft/network/play/server/SPacketWindowProperty", "gi", Context.CLIENT);
  152 + public static Packets SPacketWorldBorder = new Packets("net/minecraft/network/play/server/SPacketWorldBorder", "hl", Context.CLIENT);
  153 + public static Packets CPacketPing = new Packets("net/minecraft/network/status/client/CPacketPing", "ke", Context.SERVER);
  154 + public static Packets CPacketServerQuery = new Packets("net/minecraft/network/status/client/CPacketServerQuery", "kf", Context.SERVER);
  155 + public static Packets SPacketPong = new Packets("net/minecraft/network/status/server/SPacketPong", "ka", Context.CLIENT);
  156 + public static Packets SPacketServerInfo = new Packets("net/minecraft/network/status/server/SPacketServerInfo", "kb", Context.CLIENT);
157 157  
158 158 // CHECKSTYLE:ON
159 159  
... ...
src/main/java/com/mumfrey/liteloader/interfaces/LoadableFile.java
... ... @@ -21,6 +21,8 @@ import java.util.regex.Pattern;
21 21 import java.util.zip.ZipEntry;
22 22 import java.util.zip.ZipFile;
23 23  
  24 +import org.spongepowered.asm.util.Constants.ManifestAttributes;
  25 +
24 26 import com.google.common.io.Files;
25 27 import com.google.common.primitives.Ints;
26 28 import com.mumfrey.liteloader.core.api.LoadableModFile;
... ... @@ -44,7 +46,7 @@ public class LoadableFile extends File implements TweakContainer&lt;File&gt;
44 46 public static final String MFATT_TWEAK_VERSION = "TweakVersion";
45 47 public static final String MFATT_IMPLEMENTATION_VENDOR = "Implementation-Vendor";
46 48 public static final String MFATT_TWEAK_AUTHOR = "TweakAuthor";
47   - public static final String MFATT_MIXIN_CONFIGS = "MixinConfigs";
  49 + public static final String MFATT_MIXIN_CONFIGS = ManifestAttributes.MIXINCONFIGS;
48 50 public static final String MFATT_INJECTION_STRATEGY = "TweakInjectionStrategy";
49 51  
50 52 private static final Pattern versionPattern = Pattern.compile("([0-9]+\\.)+[0-9]+([_A-Z0-9]+)?");
... ...
src/main/java/com/mumfrey/liteloader/launch/LiteLoaderTweaker.java
... ... @@ -38,8 +38,8 @@ public class LiteLoaderTweaker implements ITweaker
38 38 public static final int ENV_TYPE_CLIENT = 0;
39 39 public static final int ENV_TYPE_DEDICATEDSERVER = 1;
40 40  
41   - // TODO Version - 1.9.4
42   - public static final String VERSION = "1.9.4";
  41 + // TODO Version - 1.10.2
  42 + public static final String VERSION = "1.10.2";
43 43  
44 44 protected static final String bootstrapClassName = "com.mumfrey.liteloader.core.LiteLoaderBootstrap";
45 45  
... ...
src/main/java/com/mumfrey/liteloader/transformers/ClassOverlayTransformer.java
1   -/*
2   - * This file is part of LiteLoader.
3   - * Copyright (C) 2012-16 Adam Mummery-Smith
4   - * All Rights Reserved.
5   - */
6   -package com.mumfrey.liteloader.transformers;
7   -
8   -import java.io.IOException;
9   -import java.util.HashMap;
10   -import java.util.HashSet;
11   -import java.util.Iterator;
12   -import java.util.List;
13   -import java.util.Map;
14   -import java.util.Set;
15   -
16   -import org.objectweb.asm.ClassReader;
17   -import org.objectweb.asm.ClassWriter;
18   -import org.objectweb.asm.Opcodes;
19   -import org.objectweb.asm.Type;
20   -import org.objectweb.asm.commons.RemappingClassAdapter;
21   -import org.objectweb.asm.commons.SimpleRemapper;
22   -import org.objectweb.asm.tree.AbstractInsnNode;
23   -import org.objectweb.asm.tree.AnnotationNode;
24   -import org.objectweb.asm.tree.ClassNode;
25   -import org.objectweb.asm.tree.FieldInsnNode;
26   -import org.objectweb.asm.tree.FieldNode;
27   -import org.objectweb.asm.tree.LineNumberNode;
28   -import org.objectweb.asm.tree.MethodInsnNode;
29   -import org.objectweb.asm.tree.MethodNode;
30   -
31   -import com.mumfrey.liteloader.util.log.LiteLoaderLogger;
32   -
33   -import net.minecraft.launchwrapper.Launch;
34   -
35   -/**
36   - * This transformer applies one class to another as an "overlay". This works by
37   - * merging down and replacing all methods and fields from the "overlay" class
38   - * into the "target" class being transformed. Fields and methods marked with the
39   - * {@link Obfuscated} annotation will search through the list of provided names
40   - * to find a matching member in the target class, this allows methods and fields
41   - * in the target class to be referenced even if they have different names after
42   - * obfuscation.
43   - *
44   - * <p>The "target" class is identified by a special field which must be named
45   - * <tt>__TARGET</tt> in the overlay class which must be a private static field
46   - * of the appropriate target type.</p>
47   - *
48   - * <h3>Notes:</h3>
49   - *
50   - * <ul>
51   - * <li>Constructors WILL NOT BE overlaid, see below for instruction merging.
52   - * Constructors in the overlay class should throw an InstantiationError.
53   - * </li>
54   - *
55   - * <li>Static method invocations will not be processed by "transformMethod",
56   - * this means that any static methods invoked must be accessible from the
57   - * context of the transformed class (eg. public or package-private in the
58   - * same package).</li>
59   - *
60   - * <li>The overlay class MUST be a sibling of the target class to ensure
61   - * that calls to super.xxx are properly transformed. In other words the
62   - * overlay and the transformed class should have the same parent class
63   - * although they need not be in the same package unless any package-private
64   - * members are accessed.</li>
65   - *
66   - * <li>It is also possible to merge instructions from a "source" method into
67   - * a specific method in the transformed class by annotating the method with
68   - * a {@link AppendInsns} annotation, specifying the name of the target
69   - * method as the annotation value. The target method signature must match
70   - * the source method's signature and both methods must return VOID. The
71   - * instructions from the source method will be inserted immediately before
72   - * the RETURN opcode in the target method.</li>
73   - *
74   - * <li>To create a method stub for private methods you wish to invoke in the
75   - * target class, decorate the stub method with an {@link Stub} annotation,
76   - * this will cause the overlay transformer to NOT merge the method into the
77   - * target, but merely verify that it exists in the target class.</li>
78   - *
79   - * <li>Merge instructions into the constructor by specifying "<init>" as the
80   - * target method name.</li>
81   - * </ul>
82   - *
83   - * @author Adam Mummery-Smith
84   - * @deprecated Use mixins instead!
85   - */
86   -@Deprecated
87   -public abstract class ClassOverlayTransformer extends ClassTransformer
88   -{
89   - /**
90   - * Global list of overlaid classes, used to transform references in other
91   - * classes.
92   - */
93   - private static final Map<String, String> overlayMap = new HashMap<String, String>();
94   -
95   - /**
96   - * Remapper for dynamically renaming references to overlays in other classes
97   - */
98   - private static SimpleRemapper referenceRemapper;
99   -
100   - /**
101   - * The first ClassOverlayTransformer to be instantiated accepts
102   - * responsibility for performing remapping operations and becomes the
103   - * "remapping agent" transformer. This flag is set to true to indicate that
104   - * this instance is the remapping agent.
105   - */
106   - private boolean remappingAgent = false;
107   -
108   - /**
109   - * Name of the overlay class
110   - */
111   - private final String overlayClassName, overlayClassRef;
112   -
113   - /**
114   - * Target class to be transformed
115   - */
116   - private final String targetClassName;
117   -
118   - /**
119   - * Fields which get a different name from an {@link Obfuscated} annotation
120   - */
121   - private final Map<String, String> renamedFields = new HashMap<String, String>();
122   -
123   - /**
124   - * Methods which get a different name from an {@link Obfuscated} annotation
125   - */
126   - private final Map<String, String> renamedMethods = new HashMap<String, String>();
127   -
128   - /**
129   - * True to set the sourceFile property when applying the overlay
130   - */
131   - protected boolean setSourceFile = true;
132   -
133   - /**
134   - * @param overlayClassName
135   - */
136   - protected ClassOverlayTransformer(String overlayClassName)
137   - {
138   - this.overlayClassName = overlayClassName;
139   - this.overlayClassRef = overlayClassName.replace('.', '/');
140   -
141   - String targetClassName = null;
142   - ClassNode overlayClass = this.loadOverlayClass("<none>", true);
143   - for (FieldNode field : overlayClass.fields)
144   - {
145   - if ("__TARGET".equals(field.name) && ((field.access & Opcodes.ACC_STATIC) == Opcodes.ACC_STATIC))
146   - {
147   - targetClassName = Type.getType(field.desc).getClassName();
148   - }
149   - }
150   -
151   - if (targetClassName == null)
152   - {
153   - throw new RuntimeException(String.format("Overlay class %s is missing a __TARGET field, unable to identify target class",
154   - this.overlayClassName));
155   - }
156   -
157   - this.targetClassName = targetClassName;
158   - ClassOverlayTransformer.overlayMap.put(this.overlayClassRef, this.targetClassName.replace('.', '/'));
159   -
160   - // If this is the first ClassOverlayTransformer, the referenceMapper will be null
161   - if (ClassOverlayTransformer.referenceRemapper == null)
162   - {
163   - // Therefore create the referenceMapper and accept responsibility for class remapping
164   - ClassOverlayTransformer.referenceRemapper = new SimpleRemapper(ClassOverlayTransformer.overlayMap);
165   - this.remappingAgent = true;
166   - }
167   - }
168   -
169   - /* (non-Javadoc)
170   - * @see net.minecraft.launchwrapper.IClassTransformer
171   - * #transform(java.lang.String, java.lang.String, byte[])
172   - */
173   - @Override
174   - public byte[] transform(String name, String transformedName, byte[] basicClass)
175   - {
176   - if (this.targetClassName != null && this.targetClassName.equals(transformedName))
177   - {
178   - try
179   - {
180   - return this.applyOverlay(transformedName, basicClass);
181   - }
182   - catch (InvalidOverlayException th)
183   - {
184   - LiteLoaderLogger.severe(th, "Class overlay failed: %s %s", th.getClass().getName(), th.getMessage());
185   - th.printStackTrace();
186   - }
187   - }
188   - else if (this.overlayClassName.equals(transformedName))
189   - {
190   - throw new RuntimeException(String.format("%s is an overlay class and cannot be referenced directly", this.overlayClassName));
191   - }
192   - else if (this.remappingAgent && basicClass != null)
193   - {
194   - return this.remapClass(transformedName, basicClass);
195   - }
196   -
197   - return basicClass;
198   - }
199   -
200   - /**
201   - * Remap references to overlay classes in other classes to the overlay class
202   - *
203   - * @param transformedName
204   - * @param basicClass
205   - */
206   - private byte[] remapClass(String transformedName, byte[] basicClass)
207   - {
208   - ClassReader classReader = new ClassReader(basicClass);
209   - ClassWriter classWriter = new ClassWriter(classReader, 0);
210   -
211   - RemappingClassAdapter remappingAdapter = new RemappingClassAdapter(classWriter, ClassOverlayTransformer.referenceRemapper);
212   - classReader.accept(remappingAdapter, ClassReader.EXPAND_FRAMES);
213   -
214   - return classWriter.toByteArray();
215   - }
216   -
217   - /**
218   - * Apply the overlay to the class described by basicClass
219   - *
220   - * @param transformedName
221   - * @param classBytes
222   - */
223   - protected byte[] applyOverlay(String transformedName, byte[] classBytes)
224   - {
225   - ClassNode overlayClass = this.loadOverlayClass(transformedName, true);
226   - ClassNode targetClass = this.readClass(classBytes, true);
227   -
228   - LiteLoaderLogger.info("Applying overlay %s to %s", this.overlayClassName, transformedName);
229   -
230   - try
231   - {
232   - this.verifyClasses(targetClass, overlayClass);
233   - this.overlayInterfaces(targetClass, overlayClass);
234   - this.overlayAttributes(targetClass, overlayClass);
235   - this.overlayFields(targetClass, overlayClass);
236   - this.findRenamedMethods(targetClass, overlayClass);
237   - this.overlayMethods(targetClass, overlayClass);
238   - }
239   - catch (Exception ex)
240   - {
241   - throw new InvalidOverlayException("Unexpecteded error whilst applying the overlay class", ex);
242   - }
243   -
244   - this.postOverlayTransform(transformedName, targetClass, overlayClass);
245   -
246   - return this.writeClass(targetClass);
247   - }
248   -
249   - protected void postOverlayTransform(String transformedName, ClassNode targetClass, ClassNode overlayClass)
250   - {
251   - // Stub
252   - }
253   -
254   - /**
255   - * Perform pre-flight checks on the overlay and target classes
256   - *
257   - * @param targetClass
258   - * @param overlayClass
259   - */
260   - protected void verifyClasses(ClassNode targetClass, ClassNode overlayClass)
261   - {
262   - if (targetClass.superName == null || overlayClass.superName == null || !targetClass.superName.equals(overlayClass.superName))
263   - {
264   - throw new InvalidOverlayException("Overlay classes must have the same superclass as their target class");
265   - }
266   - }
267   -
268   - /**
269   - * Overlay interfaces implemented by the overlay class onto the target class
270   - *
271   - * @param targetClass
272   - * @param overlayClass
273   - */
274   - private void overlayInterfaces(ClassNode targetClass, ClassNode overlayClass)
275   - {
276   - for (String interfaceName : overlayClass.interfaces)
277   - {
278   - if (!targetClass.interfaces.contains(interfaceName))
279   - {
280   - targetClass.interfaces.add(interfaceName);
281   - }
282   - }
283   - }
284   -
285   - /**
286   - * Overlay misc attributes from overlay class onto the target class
287   - *
288   - * @param targetClass
289   - * @param overlayClass
290   - */
291   - private void overlayAttributes(ClassNode targetClass, ClassNode overlayClass)
292   - {
293   - if (this.setSourceFile ) targetClass.sourceFile = overlayClass.sourceFile;
294   - }
295   -
296   - /**
297   - * Overlay fields from overlay class into the target class. It is vital that
298   - * this is done before overlayMethods because we need to compute renamed
299   - * fields so that transformMethod can rename field references in the
300   - * method body.
301   - *
302   - * @param targetClass
303   - * @param overlayClass
304   - */
305   - private void overlayFields(ClassNode targetClass, ClassNode overlayClass)
306   - {
307   - for (FieldNode field : overlayClass.fields)
308   - {
309   - if ((field.access & Opcodes.ACC_STATIC) == Opcodes.ACC_STATIC && (field.access & Opcodes.ACC_PRIVATE) != Opcodes.ACC_PRIVATE)
310   - {
311   - throw new InvalidOverlayException(String.format("Overlay classes cannot contain non-private static methods or fields, found %s",
312   - field.name));
313   - }
314   -
315   - FieldNode target = ByteCodeUtilities.findTargetField(targetClass, field);
316   - if (target == null)
317   - {
318   - targetClass.fields.add(field);
319   - }
320   - else
321   - {
322   - if (!target.desc.equals(field.desc))
323   - {
324   - throw new InvalidOverlayException(String.format("The field %s in the target class has a conflicting signature", field.name));
325   - }
326   -
327   - if (!target.name.equals(field.name))
328   - {
329   - this.renamedFields.put(field.name, target.name);
330   - }
331   - }
332   - }
333   - }
334   -
335   - /**
336   - * Called before merging methods to build the map of original method names
337   - * -> new method names, this is then used by transformMethod to remap.
338   - *
339   - * @param targetClass
340   - * @param overlayClass
341   - */
342   - private void findRenamedMethods(ClassNode targetClass, ClassNode overlayClass)
343   - {
344   - for (MethodNode overlayMethod : overlayClass.methods)
345   - {
346   - if (ByteCodeUtilities.getVisibleAnnotation(overlayMethod, Stub.class) != null
347   - || (ByteCodeUtilities.getVisibleAnnotation(overlayMethod, AppendInsns.class) == null && !overlayMethod.name.startsWith("<")))
348   - {
349   - this.checkRenameMethod(targetClass, overlayMethod);
350   - }
351   - }
352   - }
353   -
354   - /**
355   - * Overlay methods from the overlay class into the target class
356   - *
357   - * @param targetClass
358   - * @param overlayClass
359   - */
360   - private void overlayMethods(ClassNode targetClass, ClassNode overlayClass)
361   - {
362   - for (MethodNode overlayMethod : overlayClass.methods)
363   - {
364   - this.transformMethod(overlayMethod, overlayClass.name, targetClass.name);
365   -
366   - AnnotationNode appendAnnotation = ByteCodeUtilities.getVisibleAnnotation(overlayMethod, AppendInsns.class);
367   - AnnotationNode stubAnnotation = ByteCodeUtilities.getVisibleAnnotation(overlayMethod, Stub.class);
368   -
369   - if (stubAnnotation != null)
370   - {
371   - MethodNode target = ByteCodeUtilities.findTargetMethod(targetClass, overlayMethod);
372   - if (target == null)
373   - {
374   - throw new InvalidOverlayException(String.format("Stub method %s was not located in the target class", overlayMethod.name));
375   - }
376   - }
377   - else if (appendAnnotation != null)
378   - {
379   - String targetMethodName = ByteCodeUtilities.<String>getAnnotationValue(appendAnnotation);
380   - this.appendInsns(targetClass, targetMethodName, overlayMethod);
381   - }
382   - else if (!overlayMethod.name.startsWith("<"))
383   - {
384   - if ((overlayMethod.access & Opcodes.ACC_STATIC) == Opcodes.ACC_STATIC
385   - && (overlayMethod.access & Opcodes.ACC_PRIVATE) != Opcodes.ACC_PRIVATE)
386   - {
387   - continue;
388   - }
389   -
390   - MethodNode target = ByteCodeUtilities.findTargetMethod(targetClass, overlayMethod);
391   - if (target != null) targetClass.methods.remove(target);
392   - targetClass.methods.add(overlayMethod);
393   - }
394   - else if ("<clinit>".equals(overlayMethod.name))
395   - {
396   - this.appendInsns(targetClass, overlayMethod.name, overlayMethod);
397   - }
398   - }
399   - }
400   -
401   - /**
402   - * Handles "re-parenting" the method supplied, changes all references to the
403   - * overlay class to refer to the target class (for field accesses and method
404   - * invocations) and also renames fields accesses to their obfuscated
405   - * versions.
406   - *
407   - * @param method
408   - * @param fromClass
409   - * @param toClass
410   - */
411   - private void transformMethod(MethodNode method, String fromClass, String toClass)
412   - {
413   - Iterator<AbstractInsnNode> iter = method.instructions.iterator();
414   - while (iter.hasNext())
415   - {
416   - AbstractInsnNode insn = iter.next();
417   -
418   - if (insn instanceof MethodInsnNode)
419   - {
420   - MethodInsnNode methodInsn = (MethodInsnNode)insn;
421   - if (methodInsn.owner.equals(fromClass))
422   - {
423   - methodInsn.owner = toClass;
424   -
425   - String methodDescriptor = methodInsn.name + methodInsn.desc;
426   - if (this.renamedMethods.containsKey(methodDescriptor))
427   - {
428   - methodInsn.name = this.renamedMethods.get(methodDescriptor);
429   - }
430   - }
431   - }
432   - if (insn instanceof FieldInsnNode)
433   - {
434   - FieldInsnNode fieldInsn = (FieldInsnNode)insn;
435   - if (fieldInsn.owner.equals(fromClass)) fieldInsn.owner = toClass;
436   -
437   - if (this.renamedFields.containsKey(fieldInsn.name))
438   - {
439   - String newName = this.renamedFields.get(fieldInsn.name);
440   - fieldInsn.name = newName;
441   - }
442   - }
443   - }
444   - }
445   -
446   - /**
447   - * Handles appending instructions from the source method to the target
448   - * method.
449   - *
450   - * @param targetClass
451   - * @param targetMethodName
452   - * @param sourceMethod
453   - */
454   - private void appendInsns(ClassNode targetClass, String targetMethodName, MethodNode sourceMethod)
455   - {
456   - if (Type.getReturnType(sourceMethod.desc) != Type.VOID_TYPE)
457   - {
458   - throw new IllegalArgumentException("Attempted to merge insns into a method which does not return void");
459   - }
460   -
461   - if (targetMethodName == null || targetMethodName.length() == 0) targetMethodName = sourceMethod.name;
462   -
463   - Set<String> obfuscatedNames = new HashSet<String>();
464   - AnnotationNode obfuscatedAnnotation = ByteCodeUtilities.getVisibleAnnotation(sourceMethod, Obfuscated.class);
465   - if (obfuscatedAnnotation != null)
466   - {
467   - obfuscatedNames.addAll(ByteCodeUtilities.<List<String>>getAnnotationValue(obfuscatedAnnotation));
468   - }
469   -
470   - for (MethodNode method : targetClass.methods)
471   - {
472   - if ((targetMethodName.equals(method.name) || obfuscatedNames.contains(method.name)) && sourceMethod.desc.equals(method.desc))
473   - {
474   - AbstractInsnNode returnNode = null;
475   - Iterator<AbstractInsnNode> findReturnIter = method.instructions.iterator();
476   - while (findReturnIter.hasNext())
477   - {
478   - AbstractInsnNode insn = findReturnIter.next();
479   - if (insn.getOpcode() == Opcodes.RETURN)
480   - {
481   - returnNode = insn;
482   - break;
483   - }
484   - }
485   -
486   - Iterator<AbstractInsnNode> injectIter = sourceMethod.instructions.iterator();
487   - while (injectIter.hasNext())
488   - {
489   - AbstractInsnNode insn = injectIter.next();
490   - if (!(insn instanceof LineNumberNode) && insn.getOpcode() != Opcodes.RETURN)
491   - {
492   - method.instructions.insertBefore(returnNode, insn);
493   - }
494   - }
495   - }
496   - }
497   - }
498   -
499   - /**
500   - * @param targetClass
501   - * @param searchFor
502   - */
503   - private void checkRenameMethod(ClassNode targetClass, MethodNode searchFor)
504   - {
505   - MethodNode target = ByteCodeUtilities.findTargetMethod(targetClass, searchFor);
506   - if (target != null && !target.name.equals(searchFor.name))
507   - {
508   - String methodDescriptor = searchFor.name + searchFor.desc;
509   - this.renamedMethods.put(methodDescriptor, target.name);
510   - searchFor.name = target.name;
511   - }
512   - }
513   -
514   - /**
515   - * @param transformedName
516   - * @throws InvalidOverlayException
517   - */
518   - private ClassNode loadOverlayClass(String transformedName, boolean runTransformers)
519   - {
520   - byte[] overlayBytes = null;
521   -
522   - try
523   - {
524   - if ((overlayBytes = Launch.classLoader.getClassBytes(this.overlayClassName)) == null)
525   - {
526   - throw new InvalidOverlayException(String.format("The specified overlay '%s' was not found", this.overlayClassName));
527   - }
528   -
529   - if (runTransformers)
530   - {
531   - overlayBytes = ByteCodeUtilities.applyTransformers(this.overlayClassName, overlayBytes, this);
532   - }
533   - }
534   - catch (IOException ex)
535   - {
536   - LiteLoaderLogger.severe("Failed to load overlay %s for %s, no overlay was applied", this.overlayClassName, transformedName);
537   - throw new InvalidOverlayException("An error was encountered whilst loading the overlay class", ex);
538   - }
539   -
540   - return this.readClass(overlayBytes, false);
541   - }
542   -}
  1 +///*
  2 +// * This file is part of LiteLoader.
  3 +// * Copyright (C) 2012-16 Adam Mummery-Smith
  4 +// * All Rights Reserved.
  5 +// */
  6 +//package com.mumfrey.liteloader.transformers;
  7 +//
  8 +//import java.io.IOException;
  9 +//import java.util.HashMap;
  10 +//import java.util.HashSet;
  11 +//import java.util.Iterator;
  12 +//import java.util.List;
  13 +//import java.util.Map;
  14 +//import java.util.Set;
  15 +//
  16 +//import org.objectweb.asm.ClassReader;
  17 +//import org.objectweb.asm.ClassWriter;
  18 +//import org.objectweb.asm.Opcodes;
  19 +//import org.objectweb.asm.Type;
  20 +//import org.objectweb.asm.commons.RemappingClassAdapter;
  21 +//import org.objectweb.asm.commons.SimpleRemapper;
  22 +//import org.objectweb.asm.tree.AbstractInsnNode;
  23 +//import org.objectweb.asm.tree.AnnotationNode;
  24 +//import org.objectweb.asm.tree.ClassNode;
  25 +//import org.objectweb.asm.tree.FieldInsnNode;
  26 +//import org.objectweb.asm.tree.FieldNode;
  27 +//import org.objectweb.asm.tree.LineNumberNode;
  28 +//import org.objectweb.asm.tree.MethodInsnNode;
  29 +//import org.objectweb.asm.tree.MethodNode;
  30 +//
  31 +//import com.mumfrey.liteloader.util.log.LiteLoaderLogger;
  32 +//
  33 +//import net.minecraft.launchwrapper.Launch;
  34 +//
  35 +///**
  36 +// * This transformer applies one class to another as an "overlay". This works by
  37 +// * merging down and replacing all methods and fields from the "overlay" class
  38 +// * into the "target" class being transformed. Fields and methods marked with the
  39 +// * {@link Obfuscated} annotation will search through the list of provided names
  40 +// * to find a matching member in the target class, this allows methods and fields
  41 +// * in the target class to be referenced even if they have different names after
  42 +// * obfuscation.
  43 +// *
  44 +// * <p>The "target" class is identified by a special field which must be named
  45 +// * <tt>__TARGET</tt> in the overlay class which must be a private static field
  46 +// * of the appropriate target type.</p>
  47 +// *
  48 +// * <h3>Notes:</h3>
  49 +// *
  50 +// * <ul>
  51 +// * <li>Constructors WILL NOT BE overlaid, see below for instruction merging.
  52 +// * Constructors in the overlay class should throw an InstantiationError.
  53 +// * </li>
  54 +// *
  55 +// * <li>Static method invocations will not be processed by "transformMethod",
  56 +// * this means that any static methods invoked must be accessible from the
  57 +// * context of the transformed class (eg. public or package-private in the
  58 +// * same package).</li>
  59 +// *
  60 +// * <li>The overlay class MUST be a sibling of the target class to ensure
  61 +// * that calls to super.xxx are properly transformed. In other words the
  62 +// * overlay and the transformed class should have the same parent class
  63 +// * although they need not be in the same package unless any package-private
  64 +// * members are accessed.</li>
  65 +// *
  66 +// * <li>It is also possible to merge instructions from a "source" method into
  67 +// * a specific method in the transformed class by annotating the method with
  68 +// * a {@link AppendInsns} annotation, specifying the name of the target
  69 +// * method as the annotation value. The target method signature must match
  70 +// * the source method's signature and both methods must return VOID. The
  71 +// * instructions from the source method will be inserted immediately before
  72 +// * the RETURN opcode in the target method.</li>
  73 +// *
  74 +// * <li>To create a method stub for private methods you wish to invoke in the
  75 +// * target class, decorate the stub method with an {@link Stub} annotation,
  76 +// * this will cause the overlay transformer to NOT merge the method into the
  77 +// * target, but merely verify that it exists in the target class.</li>
  78 +// *
  79 +// * <li>Merge instructions into the constructor by specifying "<init>" as the
  80 +// * target method name.</li>
  81 +// * </ul>
  82 +// *
  83 +// * @author Adam Mummery-Smith
  84 +// * @deprecated Use mixins instead!
  85 +// */
  86 +//@Deprecated
  87 +//public abstract class ClassOverlayTransformer extends ClassTransformer
  88 +//{
  89 +// /**
  90 +// * Global list of overlaid classes, used to transform references in other
  91 +// * classes.
  92 +// */
  93 +// private static final Map<String, String> overlayMap = new HashMap<String, String>();
  94 +//
  95 +// /**
  96 +// * Remapper for dynamically renaming references to overlays in other classes
  97 +// */
  98 +// private static SimpleRemapper referenceRemapper;
  99 +//
  100 +// /**
  101 +// * The first ClassOverlayTransformer to be instantiated accepts
  102 +// * responsibility for performing remapping operations and becomes the
  103 +// * "remapping agent" transformer. This flag is set to true to indicate that
  104 +// * this instance is the remapping agent.
  105 +// */
  106 +// private boolean remappingAgent = false;
  107 +//
  108 +// /**
  109 +// * Name of the overlay class
  110 +// */
  111 +// private final String overlayClassName, overlayClassRef;
  112 +//
  113 +// /**
  114 +// * Target class to be transformed
  115 +// */
  116 +// private final String targetClassName;
  117 +//
  118 +// /**
  119 +// * Fields which get a different name from an {@link Obfuscated} annotation
  120 +// */
  121 +// private final Map<String, String> renamedFields = new HashMap<String, String>();
  122 +//
  123 +// /**
  124 +// * Methods which get a different name from an {@link Obfuscated} annotation
  125 +// */
  126 +// private final Map<String, String> renamedMethods = new HashMap<String, String>();
  127 +//
  128 +// /**
  129 +// * True to set the sourceFile property when applying the overlay
  130 +// */
  131 +// protected boolean setSourceFile = true;
  132 +//
  133 +// /**
  134 +// * @param overlayClassName
  135 +// */
  136 +// protected ClassOverlayTransformer(String overlayClassName)
  137 +// {
  138 +// this.overlayClassName = overlayClassName;
  139 +// this.overlayClassRef = overlayClassName.replace('.', '/');
  140 +//
  141 +// String targetClassName = null;
  142 +// ClassNode overlayClass = this.loadOverlayClass("<none>", true);
  143 +// for (FieldNode field : overlayClass.fields)
  144 +// {
  145 +// if ("__TARGET".equals(field.name) && ((field.access & Opcodes.ACC_STATIC) == Opcodes.ACC_STATIC))
  146 +// {
  147 +// targetClassName = Type.getType(field.desc).getClassName();
  148 +// }
  149 +// }
  150 +//
  151 +// if (targetClassName == null)
  152 +// {
  153 +// throw new RuntimeException(String.format("Overlay class %s is missing a __TARGET field, unable to identify target class",
  154 +// this.overlayClassName));
  155 +// }
  156 +//
  157 +// this.targetClassName = targetClassName;
  158 +// ClassOverlayTransformer.overlayMap.put(this.overlayClassRef, this.targetClassName.replace('.', '/'));
  159 +//
  160 +// // If this is the first ClassOverlayTransformer, the referenceMapper will be null
  161 +// if (ClassOverlayTransformer.referenceRemapper == null)
  162 +// {
  163 +// // Therefore create the referenceMapper and accept responsibility for class remapping
  164 +// ClassOverlayTransformer.referenceRemapper = new SimpleRemapper(ClassOverlayTransformer.overlayMap);
  165 +// this.remappingAgent = true;
  166 +// }
  167 +// }
  168 +//
  169 +// /* (non-Javadoc)
  170 +// * @see net.minecraft.launchwrapper.IClassTransformer
  171 +// * #transform(java.lang.String, java.lang.String, byte[])
  172 +// */
  173 +// @Override
  174 +// public byte[] transform(String name, String transformedName, byte[] basicClass)
  175 +// {
  176 +// if (this.targetClassName != null && this.targetClassName.equals(transformedName))
  177 +// {
  178 +// try
  179 +// {
  180 +// return this.applyOverlay(transformedName, basicClass);
  181 +// }
  182 +// catch (InvalidOverlayException th)
  183 +// {
  184 +// LiteLoaderLogger.severe(th, "Class overlay failed: %s %s", th.getClass().getName(), th.getMessage());
  185 +// th.printStackTrace();
  186 +// }
  187 +// }
  188 +// else if (this.overlayClassName.equals(transformedName))
  189 +// {
  190 +// throw new RuntimeException(String.format("%s is an overlay class and cannot be referenced directly", this.overlayClassName));
  191 +// }
  192 +// else if (this.remappingAgent && basicClass != null)
  193 +// {
  194 +// return this.remapClass(transformedName, basicClass);
  195 +// }
  196 +//
  197 +// return basicClass;
  198 +// }
  199 +//
  200 +// /**
  201 +// * Remap references to overlay classes in other classes to the overlay class
  202 +// *
  203 +// * @param transformedName
  204 +// * @param basicClass
  205 +// */
  206 +// private byte[] remapClass(String transformedName, byte[] basicClass)
  207 +// {
  208 +// ClassReader classReader = new ClassReader(basicClass);
  209 +// ClassWriter classWriter = new ClassWriter(classReader, 0);
  210 +//
  211 +// RemappingClassAdapter remappingAdapter = new RemappingClassAdapter(classWriter, ClassOverlayTransformer.referenceRemapper);
  212 +// classReader.accept(remappingAdapter, ClassReader.EXPAND_FRAMES);
  213 +//
  214 +// return classWriter.toByteArray();
  215 +// }
  216 +//
  217 +// /**
  218 +// * Apply the overlay to the class described by basicClass
  219 +// *
  220 +// * @param transformedName
  221 +// * @param classBytes
  222 +// */
  223 +// protected byte[] applyOverlay(String transformedName, byte[] classBytes)
  224 +// {
  225 +// ClassNode overlayClass = this.loadOverlayClass(transformedName, true);
  226 +// ClassNode targetClass = this.readClass(classBytes, true);
  227 +//
  228 +// LiteLoaderLogger.info("Applying overlay %s to %s", this.overlayClassName, transformedName);
  229 +//
  230 +// try
  231 +// {
  232 +// this.verifyClasses(targetClass, overlayClass);
  233 +// this.overlayInterfaces(targetClass, overlayClass);
  234 +// this.overlayAttributes(targetClass, overlayClass);
  235 +// this.overlayFields(targetClass, overlayClass);
  236 +// this.findRenamedMethods(targetClass, overlayClass);
  237 +// this.overlayMethods(targetClass, overlayClass);
  238 +// }
  239 +// catch (Exception ex)
  240 +// {
  241 +// throw new InvalidOverlayException("Unexpecteded error whilst applying the overlay class", ex);
  242 +// }
  243 +//
  244 +// this.postOverlayTransform(transformedName, targetClass, overlayClass);
  245 +//
  246 +// return this.writeClass(targetClass);
  247 +// }
  248 +//
  249 +// protected void postOverlayTransform(String transformedName, ClassNode targetClass, ClassNode overlayClass)
  250 +// {
  251 +// // Stub
  252 +// }
  253 +//
  254 +// /**
  255 +// * Perform pre-flight checks on the overlay and target classes
  256 +// *
  257 +// * @param targetClass
  258 +// * @param overlayClass
  259 +// */
  260 +// protected void verifyClasses(ClassNode targetClass, ClassNode overlayClass)
  261 +// {
  262 +// if (targetClass.superName == null || overlayClass.superName == null || !targetClass.superName.equals(overlayClass.superName))
  263 +// {
  264 +// throw new InvalidOverlayException("Overlay classes must have the same superclass as their target class");
  265 +// }
  266 +// }
  267 +//
  268 +// /**
  269 +// * Overlay interfaces implemented by the overlay class onto the target class
  270 +// *
  271 +// * @param targetClass
  272 +// * @param overlayClass
  273 +// */
  274 +// private void overlayInterfaces(ClassNode targetClass, ClassNode overlayClass)
  275 +// {
  276 +// for (String interfaceName : overlayClass.interfaces)
  277 +// {
  278 +// if (!targetClass.interfaces.contains(interfaceName))
  279 +// {
  280 +// targetClass.interfaces.add(interfaceName);
  281 +// }
  282 +// }
  283 +// }
  284 +//
  285 +// /**
  286 +// * Overlay misc attributes from overlay class onto the target class
  287 +// *
  288 +// * @param targetClass
  289 +// * @param overlayClass
  290 +// */
  291 +// private void overlayAttributes(ClassNode targetClass, ClassNode overlayClass)
  292 +// {
  293 +// if (this.setSourceFile ) targetClass.sourceFile = overlayClass.sourceFile;
  294 +// }
  295 +//
  296 +// /**
  297 +// * Overlay fields from overlay class into the target class. It is vital that
  298 +// * this is done before overlayMethods because we need to compute renamed
  299 +// * fields so that transformMethod can rename field references in the
  300 +// * method body.
  301 +// *
  302 +// * @param targetClass
  303 +// * @param overlayClass
  304 +// */
  305 +// private void overlayFields(ClassNode targetClass, ClassNode overlayClass)
  306 +// {
  307 +// for (FieldNode field : overlayClass.fields)
  308 +// {
  309 +// if ((field.access & Opcodes.ACC_STATIC) == Opcodes.ACC_STATIC && (field.access & Opcodes.ACC_PRIVATE) != Opcodes.ACC_PRIVATE)
  310 +// {
  311 +// throw new InvalidOverlayException(String.format("Overlay classes cannot contain non-private static methods or fields, found %s",
  312 +// field.name));
  313 +// }
  314 +//
  315 +// FieldNode target = ByteCodeUtilities.findTargetField(targetClass, field);
  316 +// if (target == null)
  317 +// {
  318 +// targetClass.fields.add(field);
  319 +// }
  320 +// else
  321 +// {
  322 +// if (!target.desc.equals(field.desc))
  323 +// {
  324 +// throw new InvalidOverlayException(String.format("The field %s in the target class has a conflicting signature", field.name));
  325 +// }
  326 +//
  327 +// if (!target.name.equals(field.name))
  328 +// {
  329 +// this.renamedFields.put(field.name, target.name);
  330 +// }
  331 +// }
  332 +// }
  333 +// }
  334 +//
  335 +// /**
  336 +// * Called before merging methods to build the map of original method names
  337 +// * -> new method names, this is then used by transformMethod to remap.
  338 +// *
  339 +// * @param targetClass
  340 +// * @param overlayClass
  341 +// */
  342 +// private void findRenamedMethods(ClassNode targetClass, ClassNode overlayClass)
  343 +// {
  344 +// for (MethodNode overlayMethod : overlayClass.methods)
  345 +// {
  346 +// if (ByteCodeUtilities.getVisibleAnnotation(overlayMethod, Stub.class) != null
  347 +// || (ByteCodeUtilities.getVisibleAnnotation(overlayMethod, AppendInsns.class) == null && !overlayMethod.name.startsWith("<")))
  348 +// {
  349 +// this.checkRenameMethod(targetClass, overlayMethod);
  350 +// }
  351 +// }
  352 +// }
  353 +//
  354 +// /**
  355 +// * Overlay methods from the overlay class into the target class
  356 +// *
  357 +// * @param targetClass
  358 +// * @param overlayClass
  359 +// */
  360 +// private void overlayMethods(ClassNode targetClass, ClassNode overlayClass)
  361 +// {
  362 +// for (MethodNode overlayMethod : overlayClass.methods)
  363 +// {
  364 +// this.transformMethod(overlayMethod, overlayClass.name, targetClass.name);
  365 +//
  366 +// AnnotationNode appendAnnotation = ByteCodeUtilities.getVisibleAnnotation(overlayMethod, AppendInsns.class);
  367 +// AnnotationNode stubAnnotation = ByteCodeUtilities.getVisibleAnnotation(overlayMethod, Stub.class);
  368 +//
  369 +// if (stubAnnotation != null)
  370 +// {
  371 +// MethodNode target = ByteCodeUtilities.findTargetMethod(targetClass, overlayMethod);
  372 +// if (target == null)
  373 +// {
  374 +// throw new InvalidOverlayException(String.format("Stub method %s was not located in the target class", overlayMethod.name));
  375 +// }
  376 +// }
  377 +// else if (appendAnnotation != null)
  378 +// {
  379 +// String targetMethodName = ByteCodeUtilities.<String>getAnnotationValue(appendAnnotation);
  380 +// this.appendInsns(targetClass, targetMethodName, overlayMethod);
  381 +// }
  382 +// else if (!overlayMethod.name.startsWith("<"))
  383 +// {
  384 +// if ((overlayMethod.access & Opcodes.ACC_STATIC) == Opcodes.ACC_STATIC
  385 +// && (overlayMethod.access & Opcodes.ACC_PRIVATE) != Opcodes.ACC_PRIVATE)
  386 +// {
  387 +// continue;
  388 +// }
  389 +//
  390 +// MethodNode target = ByteCodeUtilities.findTargetMethod(targetClass, overlayMethod);
  391 +// if (target != null) targetClass.methods.remove(target);
  392 +// targetClass.methods.add(overlayMethod);
  393 +// }
  394 +// else if ("<clinit>".equals(overlayMethod.name))
  395 +// {
  396 +// this.appendInsns(targetClass, overlayMethod.name, overlayMethod);
  397 +// }
  398 +// }
  399 +// }
  400 +//
  401 +// /**
  402 +// * Handles "re-parenting" the method supplied, changes all references to the
  403 +// * overlay class to refer to the target class (for field accesses and method
  404 +// * invocations) and also renames fields accesses to their obfuscated
  405 +// * versions.
  406 +// *
  407 +// * @param method
  408 +// * @param fromClass
  409 +// * @param toClass
  410 +// */
  411 +// private void transformMethod(MethodNode method, String fromClass, String toClass)
  412 +// {
  413 +// Iterator<AbstractInsnNode> iter = method.instructions.iterator();
  414 +// while (iter.hasNext())
  415 +// {
  416 +// AbstractInsnNode insn = iter.next();
  417 +//
  418 +// if (insn instanceof MethodInsnNode)
  419 +// {
  420 +// MethodInsnNode methodInsn = (MethodInsnNode)insn;
  421 +// if (methodInsn.owner.equals(fromClass))
  422 +// {
  423 +// methodInsn.owner = toClass;
  424 +//
  425 +// String methodDescriptor = methodInsn.name + methodInsn.desc;
  426 +// if (this.renamedMethods.containsKey(methodDescriptor))
  427 +// {
  428 +// methodInsn.name = this.renamedMethods.get(methodDescriptor);
  429 +// }
  430 +// }
  431 +// }
  432 +// if (insn instanceof FieldInsnNode)
  433 +// {
  434 +// FieldInsnNode fieldInsn = (FieldInsnNode)insn;
  435 +// if (fieldInsn.owner.equals(fromClass)) fieldInsn.owner = toClass;
  436 +//
  437 +// if (this.renamedFields.containsKey(fieldInsn.name))
  438 +// {
  439 +// String newName = this.renamedFields.get(fieldInsn.name);
  440 +// fieldInsn.name = newName;
  441 +// }
  442 +// }
  443 +// }
  444 +// }
  445 +//
  446 +// /**
  447 +// * Handles appending instructions from the source method to the target
  448 +// * method.
  449 +// *
  450 +// * @param targetClass
  451 +// * @param targetMethodName
  452 +// * @param sourceMethod
  453 +// */
  454 +// private void appendInsns(ClassNode targetClass, String targetMethodName, MethodNode sourceMethod)
  455 +// {
  456 +// if (Type.getReturnType(sourceMethod.desc) != Type.VOID_TYPE)
  457 +// {
  458 +// throw new IllegalArgumentException("Attempted to merge insns into a method which does not return void");
  459 +// }
  460 +//
  461 +// if (targetMethodName == null || targetMethodName.length() == 0) targetMethodName = sourceMethod.name;
  462 +//
  463 +// Set<String> obfuscatedNames = new HashSet<String>();
  464 +// AnnotationNode obfuscatedAnnotation = ByteCodeUtilities.getVisibleAnnotation(sourceMethod, Obfuscated.class);
  465 +// if (obfuscatedAnnotation != null)
  466 +// {
  467 +// obfuscatedNames.addAll(ByteCodeUtilities.<List<String>>getAnnotationValue(obfuscatedAnnotation));
  468 +// }
  469 +//
  470 +// for (MethodNode method : targetClass.methods)
  471 +// {
  472 +// if ((targetMethodName.equals(method.name) || obfuscatedNames.contains(method.name)) && sourceMethod.desc.equals(method.desc))
  473 +// {
  474 +// AbstractInsnNode returnNode = null;
  475 +// Iterator<AbstractInsnNode> findReturnIter = method.instructions.iterator();
  476 +// while (findReturnIter.hasNext())
  477 +// {
  478 +// AbstractInsnNode insn = findReturnIter.next();
  479 +// if (insn.getOpcode() == Opcodes.RETURN)
  480 +// {
  481 +// returnNode = insn;
  482 +// break;
  483 +// }
  484 +// }
  485 +//
  486 +// Iterator<AbstractInsnNode> injectIter = sourceMethod.instructions.iterator();
  487 +// while (injectIter.hasNext())
  488 +// {
  489 +// AbstractInsnNode insn = injectIter.next();
  490 +// if (!(insn instanceof LineNumberNode) && insn.getOpcode() != Opcodes.RETURN)
  491 +// {
  492 +// method.instructions.insertBefore(returnNode, insn);
  493 +// }
  494 +// }
  495 +// }
  496 +// }
  497 +// }
  498 +//
  499 +// /**
  500 +// * @param targetClass
  501 +// * @param searchFor
  502 +// */
  503 +// private void checkRenameMethod(ClassNode targetClass, MethodNode searchFor)
  504 +// {
  505 +// MethodNode target = ByteCodeUtilities.findTargetMethod(targetClass, searchFor);
  506 +// if (target != null && !target.name.equals(searchFor.name))
  507 +// {
  508 +// String methodDescriptor = searchFor.name + searchFor.desc;
  509 +// this.renamedMethods.put(methodDescriptor, target.name);
  510 +// searchFor.name = target.name;
  511 +// }
  512 +// }
  513 +//
  514 +// /**
  515 +// * @param transformedName
  516 +// * @throws InvalidOverlayException
  517 +// */
  518 +// private ClassNode loadOverlayClass(String transformedName, boolean runTransformers)
  519 +// {
  520 +// byte[] overlayBytes = null;
  521 +//
  522 +// try
  523 +// {
  524 +// if ((overlayBytes = Launch.classLoader.getClassBytes(this.overlayClassName)) == null)
  525 +// {
  526 +// throw new InvalidOverlayException(String.format("The specified overlay '%s' was not found", this.overlayClassName));
  527 +// }
  528 +//
  529 +// if (runTransformers)
  530 +// {
  531 +// overlayBytes = ByteCodeUtilities.applyTransformers(this.overlayClassName, overlayBytes, this);
  532 +// }
  533 +// }
  534 +// catch (IOException ex)
  535 +// {
  536 +// LiteLoaderLogger.severe("Failed to load overlay %s for %s, no overlay was applied", this.overlayClassName, transformedName);
  537 +// throw new InvalidOverlayException("An error was encountered whilst loading the overlay class", ex);
  538 +// }
  539 +//
  540 +// return this.readClass(overlayBytes, false);
  541 +// }
  542 +//}
... ...
src/main/resources/mixins.liteloader.core.json
1 1 {
2 2 "required": true,
3 3 "minVersion": "0.5.3",
  4 + "target": "@env(DEFAULT)",
4 5 "package": "com.mumfrey.liteloader.common.mixin",
5 6 "refmap": "mixins.liteloader.core.refmap.json",
6 7 "mixins": [
... ...