Commit f7711cd7abe151211784b0d0abce536d6cd746f5

Authored by Mumfrey
1 parent f709bce8

adding ProfilingHandlerList, some refactoring and minor fixes

.classpath
@@ -18,7 +18,7 @@ @@ -18,7 +18,7 @@
18 <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar"/> 18 <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar"/>
19 <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/com/mojang/authlib/1.5.17/authlib-1.5.17.jar"/> 19 <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/com/mojang/authlib/1.5.17/authlib-1.5.17.jar"/>
20 <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/org/lwjgl/lwjgl/lwjgl/2.9.1/lwjgl-2.9.1.jar"/> 20 <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/org/lwjgl/lwjgl/lwjgl/2.9.1/lwjgl-2.9.1.jar"/>
21 - <classpathentry exported="true" kind="lib" path="lib/asm-debug-all-5.0.3.jar" sourcepath="/ASM/src"/> 21 + <classpathentry exported="true" kind="lib" path="lib/asm-debug-all-5.0.3.jar"/>
22 <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/org/lwjgl/lwjgl/lwjgl_util/2.9.1/lwjgl_util-2.9.1.jar"/> 22 <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/org/lwjgl/lwjgl/lwjgl_util/2.9.1/lwjgl_util-2.9.1.jar"/>
23 <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/com/mojang/realms/1.5.5/realms-1.5.5.jar"/> 23 <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/com/mojang/realms/1.5.5/realms-1.5.5.jar"/>
24 <classpathentry kind="output" path="bin"/> 24 <classpathentry kind="output" path="bin"/>
debug/obfuscation.properties
@@ -19,6 +19,7 @@ field_147712_ad=shaderResourceLocations @@ -19,6 +19,7 @@ field_147712_ad=shaderResourceLocations
19 field_147713_ae=shaderIndex 19 field_147713_ae=shaderIndex
20 field_175083_ad=useShader 20 field_175083_ad=useShader
21 field_149528_b=view 21 field_149528_b=view
  22 +field_70163_u=posY
22 func_148833_a=processPacket 23 func_148833_a=processPacket
23 func_71411_J=runGameLoop 24 func_71411_J=runGameLoop
24 func_71407_l=runTick 25 func_71407_l=runTick
@@ -60,4 +61,5 @@ func_147346_a=processPlayerBlockPlacement @@ -60,4 +61,5 @@ func_147346_a=processPlayerBlockPlacement
60 func_175087_a=handleAnimation 61 func_175087_a=handleAnimation
61 func_147345_a=processPlayerDigging 62 func_147345_a=processPlayerDigging
62 func_71190_q=updateTimeLightAndEntities 63 func_71190_q=updateTimeLightAndEntities
63 -func_180031_a=checkThreadAndEnqueue  
64 \ No newline at end of file 64 \ No newline at end of file
  65 +func_180031_a=checkThreadAndEnqueue
  66 +func_147347_a=processPlayer
65 \ No newline at end of file 67 \ No newline at end of file
java/client/com/mumfrey/liteloader/client/LiteLoaderEventBrokerClient.java
@@ -19,6 +19,7 @@ import net.minecraft.util.Timer; @@ -19,6 +19,7 @@ import net.minecraft.util.Timer;
19 import org.lwjgl.input.Mouse; 19 import org.lwjgl.input.Mouse;
20 20
21 import com.mumfrey.liteloader.*; 21 import com.mumfrey.liteloader.*;
  22 +import com.mumfrey.liteloader.client.overlays.IEntityRenderer;
22 import com.mumfrey.liteloader.client.overlays.IMinecraft; 23 import com.mumfrey.liteloader.client.overlays.IMinecraft;
23 import com.mumfrey.liteloader.common.LoadingProgress; 24 import com.mumfrey.liteloader.common.LoadingProgress;
24 import com.mumfrey.liteloader.core.InterfaceRegistrationDelegate; 25 import com.mumfrey.liteloader.core.InterfaceRegistrationDelegate;
@@ -26,6 +27,7 @@ import com.mumfrey.liteloader.core.LiteLoader; @@ -26,6 +27,7 @@ import com.mumfrey.liteloader.core.LiteLoader;
26 import com.mumfrey.liteloader.core.LiteLoaderEventBroker; 27 import com.mumfrey.liteloader.core.LiteLoaderEventBroker;
27 import com.mumfrey.liteloader.core.event.HandlerList; 28 import com.mumfrey.liteloader.core.event.HandlerList;
28 import com.mumfrey.liteloader.core.event.HandlerList.ReturnLogicOp; 29 import com.mumfrey.liteloader.core.event.HandlerList.ReturnLogicOp;
  30 +import com.mumfrey.liteloader.core.event.ProfilingHandlerList;
29 import com.mumfrey.liteloader.interfaces.FastIterableDeque; 31 import com.mumfrey.liteloader.interfaces.FastIterableDeque;
30 import com.mumfrey.liteloader.launch.LoaderProperties; 32 import com.mumfrey.liteloader.launch.LoaderProperties;
31 import com.mumfrey.liteloader.transformers.event.EventInfo; 33 import com.mumfrey.liteloader.transformers.event.EventInfo;
@@ -62,7 +64,7 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker&lt;Minecraft @@ -62,7 +64,7 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker&lt;Minecraft
62 */ 64 */
63 private int worldHashCode = 0; 65 private int worldHashCode = 0;
64 66
65 - private FastIterableDeque<Tickable> tickListeners = new HandlerList<Tickable>(Tickable.class); 67 + private FastIterableDeque<Tickable> tickListeners;
66 private FastIterableDeque<GameLoopListener> loopListeners = new HandlerList<GameLoopListener>(GameLoopListener.class); 68 private FastIterableDeque<GameLoopListener> loopListeners = new HandlerList<GameLoopListener>(GameLoopListener.class);
67 private FastIterableDeque<RenderListener> renderListeners = new HandlerList<RenderListener>(RenderListener.class); 69 private FastIterableDeque<RenderListener> renderListeners = new HandlerList<RenderListener>(RenderListener.class);
68 private FastIterableDeque<PostRenderListener> postRenderListeners = new HandlerList<PostRenderListener>(PostRenderListener.class); 70 private FastIterableDeque<PostRenderListener> postRenderListeners = new HandlerList<PostRenderListener>(PostRenderListener.class);
@@ -84,6 +86,7 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker&lt;Minecraft @@ -84,6 +86,7 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker&lt;Minecraft
84 LiteLoaderEventBrokerClient.instance = this; 86 LiteLoaderEventBrokerClient.instance = this;
85 87
86 this.engineClient = (GameEngineClient)engine; 88 this.engineClient = (GameEngineClient)engine;
  89 + this.tickListeners = new ProfilingHandlerList<Tickable>(Tickable.class, this.engineClient.getProfiler());
87 } 90 }
88 91
89 static LiteLoaderEventBrokerClient getInstance() 92 static LiteLoaderEventBrokerClient getInstance()
@@ -302,6 +305,7 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker&lt;Minecraft @@ -302,6 +305,7 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker&lt;Minecraft
302 */ 305 */
303 void postRender(float partialTicks, long timeSlice) 306 void postRender(float partialTicks, long timeSlice)
304 { 307 {
  308 + ((IEntityRenderer)this.engineClient.getClient().entityRenderer).setupCamera(partialTicks, 0);
305 this.postRenderListeners.all().onPostRender(partialTicks); 309 this.postRenderListeners.all().onPostRender(partialTicks);
306 } 310 }
307 311
@@ -377,7 +381,7 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker&lt;Minecraft @@ -377,7 +381,7 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker&lt;Minecraft
377 */ 381 */
378 void onTick() 382 void onTick()
379 { 383 {
380 - this.profiler.startSection("litemods"); 384 + this.profiler.endStartSection("litemods");
381 385
382 Timer minecraftTimer = ((IMinecraft)this.engine.getClient()).getTimer(); 386 Timer minecraftTimer = ((IMinecraft)this.engine.getClient()).getTimer();
383 float partialTicks = minecraftTimer.renderPartialTicks; 387 float partialTicks = minecraftTimer.renderPartialTicks;
@@ -408,8 +412,6 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker&lt;Minecraft @@ -408,8 +412,6 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker&lt;Minecraft
408 this.worldHashCode = worldHashCode; 412 this.worldHashCode = worldHashCode;
409 super.onWorldChanged(minecraft.theWorld); 413 super.onWorldChanged(minecraft.theWorld);
410 } 414 }
411 -  
412 - this.profiler.endSection();  
413 } 415 }
414 416
415 /** 417 /**
java/client/com/mumfrey/liteloader/util/ModUtilities.java
@@ -43,7 +43,7 @@ public abstract class ModUtilities @@ -43,7 +43,7 @@ public abstract class ModUtilities
43 */ 43 */
44 public static boolean fmlIsPresent() 44 public static boolean fmlIsPresent()
45 { 45 {
46 - return Obf.fmlIsPresent(); 46 + return ObfuscationUtilities.fmlIsPresent();
47 } 47 }
48 48
49 public static void setWindowSize(int width, int height) 49 public static void setWindowSize(int width, int height)
@@ -212,10 +212,12 @@ public abstract class ModUtilities @@ -212,10 +212,12 @@ public abstract class ModUtilities
212 * 212 *
213 * @param fieldName Name of field to get, returned unmodified if in debug mode 213 * @param fieldName Name of field to get, returned unmodified if in debug mode
214 * @return Obfuscated field name if present 214 * @return Obfuscated field name if present
  215 + * @deprecated use ObfuscationUtilities.getObfuscatedFieldName instead
215 */ 216 */
  217 + @Deprecated
216 public static String getObfuscatedFieldName(String fieldName, String obfuscatedFieldName, String seargeFieldName) 218 public static String getObfuscatedFieldName(String fieldName, String obfuscatedFieldName, String seargeFieldName)
217 { 219 {
218 - return Obf.getObfuscatedFieldName(fieldName, obfuscatedFieldName, seargeFieldName); 220 + return ObfuscationUtilities.getObfuscatedFieldName(fieldName, obfuscatedFieldName, seargeFieldName);
219 } 221 }
220 222
221 /** 223 /**
@@ -223,10 +225,12 @@ public abstract class ModUtilities @@ -223,10 +225,12 @@ public abstract class ModUtilities
223 * 225 *
224 * @param obf Field to get, returned unmodified if in debug mode 226 * @param obf Field to get, returned unmodified if in debug mode
225 * @return Obfuscated field name if present 227 * @return Obfuscated field name if present
  228 + * @deprecated use ObfuscationUtilities.getObfuscatedFieldName instead
226 */ 229 */
  230 + @Deprecated
227 public static String getObfuscatedFieldName(Obf obf) 231 public static String getObfuscatedFieldName(Obf obf)
228 { 232 {
229 - return Obf.getObfuscatedFieldName(obf); 233 + return ObfuscationUtilities.getObfuscatedFieldName(obf);
230 } 234 }
231 235
232 @SuppressWarnings("unchecked") 236 @SuppressWarnings("unchecked")
java/common/com/mumfrey/liteloader/core/event/HandlerList.java
1 package com.mumfrey.liteloader.core.event; 1 package com.mumfrey.liteloader.core.event;
2 2
3 import java.io.Closeable; 3 import java.io.Closeable;
  4 +import java.io.File;
4 import java.io.IOException; 5 import java.io.IOException;
5 import java.lang.reflect.Constructor; 6 import java.lang.reflect.Constructor;
6 import java.net.URL; 7 import java.net.URL;
@@ -17,12 +18,15 @@ import java.util.Set; @@ -17,12 +18,15 @@ import java.util.Set;
17 import net.minecraft.launchwrapper.IClassTransformer; 18 import net.minecraft.launchwrapper.IClassTransformer;
18 import net.minecraft.launchwrapper.Launch; 19 import net.minecraft.launchwrapper.Launch;
19 20
  21 +import org.apache.commons.io.FileUtils;
  22 +import org.apache.logging.log4j.core.helpers.Booleans;
20 import org.objectweb.asm.ClassReader; 23 import org.objectweb.asm.ClassReader;
21 import org.objectweb.asm.ClassWriter; 24 import org.objectweb.asm.ClassWriter;
22 import org.objectweb.asm.Label; 25 import org.objectweb.asm.Label;
23 import org.objectweb.asm.Opcodes; 26 import org.objectweb.asm.Opcodes;
24 import org.objectweb.asm.Type; 27 import org.objectweb.asm.Type;
25 import org.objectweb.asm.tree.*; 28 import org.objectweb.asm.tree.*;
  29 +import org.objectweb.asm.util.CheckClassAdapter;
26 30
27 import com.mumfrey.liteloader.Priority; 31 import com.mumfrey.liteloader.Priority;
28 import com.mumfrey.liteloader.core.runtime.Obf; 32 import com.mumfrey.liteloader.core.runtime.Obf;
@@ -236,7 +240,7 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T @@ -236,7 +240,7 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T
236 */ 240 */
237 protected void bake() 241 protected void bake()
238 { 242 {
239 - HandlerListClassLoader<T> classLoader = new HandlerListClassLoader<T>(this.type, this.logicOp); 243 + HandlerListClassLoader<T> classLoader = new HandlerListClassLoader<T>(this.type, this.logicOp, this.getDecorator());
240 this.bakedHandler = classLoader.newHandler(this); 244 this.bakedHandler = classLoader.newHandler(this);
241 if (classLoader instanceof Closeable) 245 if (classLoader instanceof Closeable)
242 { 246 {
@@ -248,6 +252,11 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T @@ -248,6 +252,11 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T
248 } 252 }
249 } 253 }
250 254
  255 + protected IHandlerListDecorator<T> getDecorator()
  256 + {
  257 + return null;
  258 + }
  259 +
251 /** 260 /**
252 * Invalidate current baked list 261 * Invalidate current baked list
253 */ 262 */
@@ -569,6 +578,10 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T @@ -569,6 +578,10 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T
569 { 578 {
570 private static final String HANDLER_VAR_PREFIX = "handler$"; 579 private static final String HANDLER_VAR_PREFIX = "handler$";
571 580
  581 + public static final boolean DUMP = Booleans.parseBoolean(System.getProperty("liteloader.debug.dump"), false);
  582 +
  583 + public static final boolean VALIDATE = Booleans.parseBoolean(System.getProperty("liteloader.debug.validate"), false);
  584 +
572 /** 585 /**
573 * Unique index number, just to ensure no name clashes 586 * Unique index number, just to ensure no name clashes
574 */ 587 */
@@ -590,6 +603,11 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T @@ -590,6 +603,11 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T
590 private final ReturnLogicOp logicOp; 603 private final ReturnLogicOp logicOp;
591 604
592 /** 605 /**
  606 + * Bytecode decorator
  607 + */
  608 + private final IHandlerListDecorator<T> decorator;
  609 +
  610 + /**
593 * Size of the handler list 611 * Size of the handler list
594 */ 612 */
595 private int size; 613 private int size;
@@ -598,12 +616,13 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T @@ -598,12 +616,13 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T
598 * @param type 616 * @param type
599 * @param logicOp 617 * @param logicOp
600 */ 618 */
601 - HandlerListClassLoader(Class<T> type, ReturnLogicOp logicOp) 619 + HandlerListClassLoader(Class<T> type, ReturnLogicOp logicOp, IHandlerListDecorator<T> decorator)
602 { 620 {
603 super(new URL[0], Launch.classLoader); 621 super(new URL[0], Launch.classLoader);
604 this.type = type; 622 this.type = type;
605 this.typeRef = type.getName().replace('.', '/'); 623 this.typeRef = type.getName().replace('.', '/');
606 this.logicOp = logicOp; 624 this.logicOp = logicOp;
  625 + this.decorator = decorator;
607 } 626 }
608 627
609 /** 628 /**
@@ -613,6 +632,12 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T @@ -613,6 +632,12 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T
613 public BakedHandlerList<T> newHandler(HandlerList<T> list) 632 public BakedHandlerList<T> newHandler(HandlerList<T> list)
614 { 633 {
615 this.size = list.size(); 634 this.size = list.size();
  635 + List<T> sortedList = list.getSortedList();
  636 +
  637 + if (this.decorator != null)
  638 + {
  639 + this.decorator.prepare(sortedList);
  640 + }
616 641
617 Class<BakedHandlerList<T>> handlerClass = null; 642 Class<BakedHandlerList<T>> handlerClass = null;
618 643
@@ -631,7 +656,7 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T @@ -631,7 +656,7 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T
631 { 656 {
632 // Create an instance of the class, populate the entries from the supplied list and return it 657 // Create an instance of the class, populate the entries from the supplied list and return it
633 BakedHandlerList<T> handlerList = this.createInstance(handlerClass); 658 BakedHandlerList<T> handlerList = this.createInstance(handlerClass);
634 - return handlerList.populate(list.getSortedList()); 659 + return handlerList.populate(sortedList);
635 } 660 }
636 catch (InstantiationException ex) 661 catch (InstantiationException ex)
637 { 662 {
@@ -650,6 +675,11 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T @@ -650,6 +675,11 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T
650 { 675 {
651 try 676 try
652 { 677 {
  678 + if (this.decorator != null)
  679 + {
  680 + return this.decorator.createInstance(handlerClass);
  681 + }
  682 +
653 Constructor<BakedHandlerList<T>> ctor = handlerClass.getDeclaredConstructor(); 683 Constructor<BakedHandlerList<T>> ctor = handlerClass.getDeclaredConstructor();
654 ctor.setAccessible(true); 684 ctor.setAccessible(true);
655 return ctor.newInstance(); 685 return ctor.newInstance();
@@ -671,7 +701,7 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T @@ -671,7 +701,7 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T
671 try 701 try
672 { 702 {
673 // Read the basic class template 703 // Read the basic class template
674 - byte[] bytes = Launch.classLoader.getClassBytes(Obf.BakedHandlerList.name); 704 + byte[] bytes = Launch.classLoader.getClassBytes(this.getTemplate().name);
675 ClassReader classReader = new ClassReader(bytes); 705 ClassReader classReader = new ClassReader(bytes);
676 ClassNode classNode = new ClassNode(); 706 ClassNode classNode = new ClassNode();
677 classReader.accept(classNode, ClassReader.EXPAND_FRAMES); 707 classReader.accept(classNode, ClassReader.EXPAND_FRAMES);
@@ -683,8 +713,16 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T @@ -683,8 +713,16 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T
683 ClassWriter classWriter = new ClassWriter(classReader, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); 713 ClassWriter classWriter = new ClassWriter(classReader, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
684 classNode.accept(classWriter); 714 classNode.accept(classWriter);
685 bytes = classWriter.toByteArray(); 715 bytes = classWriter.toByteArray();
  716 +
  717 + if (HandlerListClassLoader.VALIDATE)
  718 + {
  719 + classNode.accept(new CheckClassAdapter(new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES)));
  720 + }
686 721
687 -// classNode.accept(new org.objectweb.asm.util.CheckClassAdapter(new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES))); 722 + if (HandlerListClassLoader.DUMP)
  723 + {
  724 + FileUtils.writeByteArrayToFile(new File(".classes/" + name.replace('.', '/') + ".class"), bytes);
  725 + }
688 726
689 // Delegate to ClassLoader's usual behaviour to load the class we just generated 727 // Delegate to ClassLoader's usual behaviour to load the class we just generated
690 return this.defineClass(name, bytes, 0, bytes.length); 728 return this.defineClass(name, bytes, 0, bytes.length);
@@ -696,6 +734,16 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T @@ -696,6 +734,16 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T
696 } 734 }
697 } 735 }
698 736
  737 + private Obf getTemplate()
  738 + {
  739 + if (this.decorator != null)
  740 + {
  741 + return this.decorator.getTemplate();
  742 + }
  743 +
  744 + return Obf.BakedHandlerList;
  745 + }
  746 +
699 /** 747 /**
700 * Perform all class bytecode transformations 748 * Perform all class bytecode transformations
701 * 749 *
@@ -725,7 +773,7 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T @@ -725,7 +773,7 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T
725 { 773 {
726 classNode.access = classNode.access & ~Opcodes.ACC_ABSTRACT; 774 classNode.access = classNode.access & ~Opcodes.ACC_ABSTRACT;
727 classNode.name = name.replace('.', '/'); 775 classNode.name = name.replace('.', '/');
728 - classNode.superName = Obf.BakedHandlerList.ref; 776 + classNode.superName = this.getTemplate().ref;
729 classNode.interfaces.add(this.typeRef); 777 classNode.interfaces.add(this.typeRef);
730 classNode.sourceFile = name.substring(name.lastIndexOf('.') + 1) + ".java"; 778 classNode.sourceFile = name.substring(name.lastIndexOf('.') + 1) + ".java";
731 779
@@ -733,6 +781,11 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T @@ -733,6 +781,11 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T
733 { 781 {
734 classNode.fields.add(new FieldNode(Opcodes.ACC_PRIVATE, HandlerListClassLoader.HANDLER_VAR_PREFIX + handlerIndex, "L" + this.typeRef + ";", null, null)); 782 classNode.fields.add(new FieldNode(Opcodes.ACC_PRIVATE, HandlerListClassLoader.HANDLER_VAR_PREFIX + handlerIndex, "L" + this.typeRef + ";", null, null));
735 } 783 }
  784 +
  785 + if (this.decorator != null)
  786 + {
  787 + this.decorator.populateClass(name, classNode);
  788 + }
736 } 789 }
737 790
738 /** 791 /**
@@ -775,12 +828,17 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T @@ -775,12 +828,17 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T
775 if (insn instanceof MethodInsnNode) 828 if (insn instanceof MethodInsnNode)
776 { 829 {
777 MethodInsnNode methodInsn = (MethodInsnNode)insn; 830 MethodInsnNode methodInsn = (MethodInsnNode)insn;
778 - if (methodInsn.owner.equals("java/lang/Object")) 831 + if (methodInsn.getOpcode() == Opcodes.INVOKESPECIAL && methodInsn.name.equals(Obf.constructor.name))
779 { 832 {
780 - methodInsn.owner = Obf.BakedHandlerList.ref; 833 + methodInsn.owner = this.getTemplate().ref;
781 } 834 }
782 } 835 }
783 } 836 }
  837 +
  838 + if (this.decorator != null)
  839 + {
  840 + this.decorator.processCtor(classNode, method);
  841 + }
784 } 842 }
785 843
786 /** 844 /**
@@ -879,6 +937,11 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T @@ -879,6 +937,11 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T
879 method.access = Opcodes.ACC_PUBLIC; 937 method.access = Opcodes.ACC_PUBLIC;
880 this.populateVoidInvokationChain(classNode, method, args, returnType); 938 this.populateVoidInvokationChain(classNode, method, args, returnType);
881 } 939 }
  940 +
  941 + if (this.decorator != null)
  942 + {
  943 + this.decorator.populateInterfaceMethod(classNode, method);
  944 + }
882 } 945 }
883 946
884 /** 947 /**
@@ -963,14 +1026,25 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T @@ -963,14 +1026,25 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T
963 * @param method 1026 * @param method
964 * @param args 1027 * @param args
965 */ 1028 */
966 - private int invokeHandler(int handlerIndex, ClassNode classNode, MethodNode method, Type[] args) 1029 + private void invokeHandler(int handlerIndex, ClassNode classNode, MethodNode method, Type[] args)
967 { 1030 {
968 LabelNode lineNumberLabel = new LabelNode(new Label()); 1031 LabelNode lineNumberLabel = new LabelNode(new Label());
969 method.instructions.add(lineNumberLabel); 1032 method.instructions.add(lineNumberLabel);
970 method.instructions.add(new LineNumberNode(100 + handlerIndex, lineNumberLabel)); 1033 method.instructions.add(new LineNumberNode(100 + handlerIndex, lineNumberLabel));
971 method.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); 1034 method.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
972 method.instructions.add(new FieldInsnNode(Opcodes.GETFIELD, classNode.name, HandlerListClassLoader.HANDLER_VAR_PREFIX + handlerIndex, "L" + this.typeRef + ";")); 1035 method.instructions.add(new FieldInsnNode(Opcodes.GETFIELD, classNode.name, HandlerListClassLoader.HANDLER_VAR_PREFIX + handlerIndex, "L" + this.typeRef + ";"));
973 - return this.invokeInterfaceMethod(method, args); 1036 +
  1037 + if (this.decorator != null)
  1038 + {
  1039 + this.decorator.preInvokeInterfaceMethod(handlerIndex, classNode, method, args);
  1040 + }
  1041 +
  1042 + this.invokeInterfaceMethod(method, args);
  1043 +
  1044 + if (this.decorator != null)
  1045 + {
  1046 + this.decorator.postInvokeInterfaceMethod(handlerIndex, classNode, method, args);
  1047 + }
974 } 1048 }
975 1049
976 /** 1050 /**
@@ -979,7 +1053,7 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T @@ -979,7 +1053,7 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T
979 * @param method 1053 * @param method
980 * @param args 1054 * @param args
981 */ 1055 */
982 - private int invokeInterfaceMethod(MethodNode method, Type[] args) 1056 + private void invokeInterfaceMethod(MethodNode method, Type[] args)
983 { 1057 {
984 int argNumber = 1; 1058 int argNumber = 1;
985 for (Type type : args) 1059 for (Type type : args)
@@ -989,7 +1063,6 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T @@ -989,7 +1063,6 @@ public class HandlerList&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;T
989 } 1063 }
990 1064
991 method.instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, this.typeRef, method.name, method.desc, true)); 1065 method.instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, this.typeRef, method.name, method.desc, true));
992 - return argNumber;  
993 } 1066 }
994 1067
995 /** 1068 /**
java/common/com/mumfrey/liteloader/core/event/IHandlerListDecorator.java 0 → 100644
  1 +package com.mumfrey.liteloader.core.event;
  2 +
  3 +import java.util.List;
  4 +
  5 +import org.objectweb.asm.Type;
  6 +import org.objectweb.asm.tree.ClassNode;
  7 +import org.objectweb.asm.tree.MethodNode;
  8 +
  9 +import com.mumfrey.liteloader.core.event.HandlerList.BakedHandlerList;
  10 +import com.mumfrey.liteloader.core.runtime.Obf;
  11 +
  12 +/**
  13 + * Essentially a "mini plugin" for HandlerListClassLoader which allows alterations of the generated bytecode
  14 + *
  15 + * @author Adam Mummery-Smith
  16 + *
  17 + * @param <T>
  18 + */
  19 +public interface IHandlerListDecorator<T>
  20 +{
  21 + /**
  22 + * Get the template class name
  23 + */
  24 + public abstract Obf getTemplate();
  25 +
  26 + /**
  27 + * Prepare the decorator to accept the specified list of invokees
  28 + */
  29 + public abstract void prepare(List<T> sortedList);
  30 +
  31 + /**
  32 + * Create an instance of the handler class
  33 + */
  34 + public abstract BakedHandlerList<T> createInstance(Class<BakedHandlerList<T>> handlerClass) throws Exception;
  35 +
  36 + /**
  37 + * Called when populating the classNode
  38 + */
  39 + public abstract void populateClass(String name, ClassNode classNode);
  40 +
  41 + /**
  42 + * Called when processing the ctor
  43 + */
  44 + public abstract void processCtor(ClassNode classNode, MethodNode method);
  45 +
  46 + /**
  47 + * Called immediately before the interface method invokation bytecode is injected
  48 + */
  49 + public abstract void preInvokeInterfaceMethod(int handlerIndex, ClassNode classNode, MethodNode method, Type[] args);
  50 +
  51 + /**
  52 + * Called immediately after the interface method invokation bytecode is injected
  53 + */
  54 + public abstract void postInvokeInterfaceMethod(int handlerIndex, ClassNode classNode, MethodNode method, Type[] args);
  55 +
  56 + /**
  57 + * Called at the end of populateInterfaceMethod
  58 + */
  59 + public abstract void populateInterfaceMethod(ClassNode classNode, MethodNode method);
  60 +}
java/common/com/mumfrey/liteloader/core/event/ProfilingHandlerList.java 0 → 100644
  1 +package com.mumfrey.liteloader.core.event;
  2 +
  3 +import java.lang.reflect.Constructor;
  4 +import java.util.ArrayList;
  5 +import java.util.List;
  6 +
  7 +import net.minecraft.profiler.Profiler;
  8 +
  9 +import org.objectweb.asm.Opcodes;
  10 +import org.objectweb.asm.Type;
  11 +import org.objectweb.asm.tree.ClassNode;
  12 +import org.objectweb.asm.tree.InsnNode;
  13 +import org.objectweb.asm.tree.LdcInsnNode;
  14 +import org.objectweb.asm.tree.MethodInsnNode;
  15 +import org.objectweb.asm.tree.MethodNode;
  16 +import org.objectweb.asm.tree.VarInsnNode;
  17 +
  18 +import com.mumfrey.liteloader.api.Listener;
  19 +import com.mumfrey.liteloader.core.runtime.Obf;
  20 +
  21 +/**
  22 + * A HandlerList which calls Profiler.beginSection and Profiler.endSection before every invokation
  23 + *
  24 + * @author Adam Mummery-Smith
  25 + *
  26 + * @param <T>
  27 + */
  28 +public class ProfilingHandlerList<T extends Listener> extends HandlerList<T>
  29 +{
  30 + private static final long serialVersionUID = 1L;
  31 +
  32 + /**
  33 + * Profiler to pass in to baked handler lists
  34 + */
  35 + private final Profiler profiler;
  36 +
  37 + /**
  38 + * @param type
  39 + * @param profiler
  40 + */
  41 + public ProfilingHandlerList(Class<T> type, Profiler profiler)
  42 + {
  43 + super(type);
  44 + this.profiler = profiler;
  45 + }
  46 +
  47 + /**
  48 + * @param type
  49 + * @param logicOp
  50 + * @param profiler
  51 + */
  52 + public ProfilingHandlerList(Class<T> type, ReturnLogicOp logicOp, Profiler profiler)
  53 + {
  54 + super(type, logicOp);
  55 + this.profiler = profiler;
  56 + }
  57 +
  58 + /**
  59 + * @param type
  60 + * @param logicOp
  61 + * @param sorted
  62 + * @param profiler
  63 + */
  64 + public ProfilingHandlerList(Class<T> type, ReturnLogicOp logicOp, boolean sorted, Profiler profiler)
  65 + {
  66 + super(type, logicOp, sorted);
  67 + this.profiler = profiler;
  68 + }
  69 +
  70 + /* (non-Javadoc)
  71 + * @see com.mumfrey.liteloader.core.event.HandlerList#getDecorator()
  72 + */
  73 + @Override
  74 + protected IHandlerListDecorator<T> getDecorator()
  75 + {
  76 + return new ProfilingHandlerListDecorator<T>(this.profiler);
  77 + }
  78 +
  79 + /**
  80 + * Decorator which adds the profiler section calls to the invokation lists
  81 + */
  82 + static class ProfilingHandlerListDecorator<T extends Listener> implements IHandlerListDecorator<T>
  83 + {
  84 + private final Profiler profiler;
  85 +
  86 + private final List<String> names = new ArrayList<String>();;
  87 +
  88 + protected ProfilingHandlerListDecorator(Profiler profiler)
  89 + {
  90 + this.profiler = profiler;
  91 + }
  92 +
  93 + /* (non-Javadoc)
  94 + * @see com.mumfrey.liteloader.core.event.IHandlerListDecorator#getTemplate()
  95 + */
  96 + @Override
  97 + public Obf getTemplate()
  98 + {
  99 + return Obf.BakedProfilingHandlerList;
  100 + }
  101 +
  102 + /* (non-Javadoc)
  103 + * @see com.mumfrey.liteloader.core.event.IHandlerListDecorator#prepare(java.util.List)
  104 + */
  105 + @Override
  106 + public void prepare(List<T> sortedList)
  107 + {
  108 + this.names.clear();
  109 +
  110 + for (Listener l : sortedList)
  111 + {
  112 + String name = l.getName();
  113 + this.names.add(name != null ? name : l.getClass().getSimpleName());
  114 + }
  115 + }
  116 +
  117 + /* (non-Javadoc)
  118 + * @see com.mumfrey.liteloader.core.event.IHandlerListDecorator#createInstance(java.lang.Class)
  119 + */
  120 + @Override
  121 + public BakedHandlerList<T> createInstance(Class<BakedHandlerList<T>> handlerClass) throws Exception
  122 + {
  123 + try
  124 + {
  125 + Constructor<BakedHandlerList<T>> ctor = handlerClass.getDeclaredConstructor(Profiler.class);
  126 + ctor.setAccessible(true);
  127 + return ctor.newInstance(this.profiler);
  128 + }
  129 + catch (Exception ex)
  130 + {
  131 + ex.printStackTrace();
  132 + throw ex;
  133 + }
  134 + }
  135 +
  136 + /* (non-Javadoc)
  137 + * @see com.mumfrey.liteloader.core.event.IHandlerListDecorator#populateClass(java.lang.String, org.objectweb.asm.tree.ClassNode)
  138 + */
  139 + @Override
  140 + public void populateClass(String name, ClassNode classNode)
  141 + {
  142 + }
  143 +
  144 + /* (non-Javadoc)
  145 + * @see com.mumfrey.liteloader.core.event.IHandlerListDecorator#processCtor(org.objectweb.asm.tree.ClassNode, org.objectweb.asm.tree.MethodNode)
  146 + */
  147 + @Override
  148 + public void processCtor(ClassNode classNode, MethodNode method)
  149 + {
  150 + // Actually replace the ctor code because it's easier
  151 + method.instructions.clear();
  152 + method.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
  153 + method.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));
  154 + method.instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, Obf.BakedProfilingHandlerList.ref, Obf.constructor.name, method.desc, false));
  155 + method.instructions.add(new InsnNode(Opcodes.RETURN));
  156 + }
  157 +
  158 + /* (non-Javadoc)
  159 + * @see com.mumfrey.liteloader.core.event.IHandlerListDecorator#preInvokeInterfaceMethod(int, org.objectweb.asm.tree.ClassNode, org.objectweb.asm.tree.MethodNode, org.objectweb.asm.Type[])
  160 + */
  161 + @Override
  162 + public void preInvokeInterfaceMethod(int handlerIndex, ClassNode classNode, MethodNode method, Type[] args)
  163 + {
  164 + // Call this.startSection
  165 + method.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
  166 + method.instructions.add(new LdcInsnNode(this.names.get(handlerIndex)));
  167 + method.instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, classNode.superName, "startSection", "(Ljava/lang/String;)V", false));
  168 + }
  169 +
  170 + /* (non-Javadoc)
  171 + * @see com.mumfrey.liteloader.core.event.IHandlerListDecorator#postInvokeInterfaceMethod(int, org.objectweb.asm.tree.ClassNode, org.objectweb.asm.tree.MethodNode, org.objectweb.asm.Type[])
  172 + */
  173 + @Override
  174 + public void postInvokeInterfaceMethod(int handlerIndex, ClassNode classNode, MethodNode method, Type[] args)
  175 + {
  176 + // Call this.endSection
  177 + method.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
  178 + method.instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, classNode.superName, "endSection", "()V", false));
  179 + }
  180 +
  181 + /* (non-Javadoc)
  182 + * @see com.mumfrey.liteloader.core.event.IHandlerListDecorator#populateInterfaceMethod(org.objectweb.asm.tree.ClassNode, org.objectweb.asm.tree.MethodNode)
  183 + */
  184 + @Override
  185 + public void populateInterfaceMethod(ClassNode classNode, MethodNode method)
  186 + {
  187 + }
  188 + }
  189 +
  190 + /**
  191 + * Template class for the profiling handler lists
  192 + *
  193 + * @author Adam Mummery-Smith
  194 + *
  195 + * @param <T>
  196 + */
  197 + public static abstract class BakedList<T> extends HandlerList.BakedHandlerList<T>
  198 + {
  199 + private final Profiler profiler;
  200 +
  201 + public BakedList(Profiler profiler)
  202 + {
  203 + this.profiler = profiler;
  204 + }
  205 +
  206 + @Override
  207 + public abstract T get();
  208 +
  209 + @Override
  210 + public abstract BakedHandlerList<T> populate(List<T> listeners);
  211 +
  212 + protected void startSection(String name)
  213 + {
  214 + this.profiler.startSection(name);
  215 + }
  216 +
  217 + protected void endSection()
  218 + {
  219 + this.profiler.endSection();
  220 + }
  221 + }
  222 +}
java/common/com/mumfrey/liteloader/core/runtime/Obf.java
@@ -7,10 +7,6 @@ import java.util.HashMap; @@ -7,10 +7,6 @@ import java.util.HashMap;
7 import java.util.Map; 7 import java.util.Map;
8 import java.util.Properties; 8 import java.util.Properties;
9 9
10 -import net.minecraft.launchwrapper.IClassTransformer;  
11 -import net.minecraft.launchwrapper.Launch;  
12 -import net.minecraft.server.MinecraftServer;  
13 -  
14 /** 10 /**
15 * Centralised obfuscation table for LiteLoader 11 * Centralised obfuscation table for LiteLoader
16 * 12 *
@@ -26,6 +22,7 @@ public class Obf @@ -26,6 +22,7 @@ public class Obf
26 public static final Obf EventProxy = new Obf("com.mumfrey.liteloader.core.event.EventProxy" ); 22 public static final Obf EventProxy = new Obf("com.mumfrey.liteloader.core.event.EventProxy" );
27 public static final Obf HandlerList = new Obf("com.mumfrey.liteloader.core.event.HandlerList" ); 23 public static final Obf HandlerList = new Obf("com.mumfrey.liteloader.core.event.HandlerList" );
28 public static final Obf BakedHandlerList = new Obf("com.mumfrey.liteloader.core.event.HandlerList$BakedHandlerList" ); 24 public static final Obf BakedHandlerList = new Obf("com.mumfrey.liteloader.core.event.HandlerList$BakedHandlerList" );
  25 + public static final Obf BakedProfilingHandlerList = new Obf("com.mumfrey.liteloader.core.event.ProfilingHandlerList$BakedList" );
29 public static final Obf PacketEvents = new Obf("com.mumfrey.liteloader.core.PacketEvents" ); 26 public static final Obf PacketEvents = new Obf("com.mumfrey.liteloader.core.PacketEvents" );
30 public static final Obf PacketEventsClient = new Obf("com.mumfrey.liteloader.client.PacketEventsClient" ); 27 public static final Obf PacketEventsClient = new Obf("com.mumfrey.liteloader.client.PacketEventsClient" );
31 public static final Obf LoadingBar = new Obf("com.mumfrey.liteloader.client.gui.startup.LoadingBar" ); 28 public static final Obf LoadingBar = new Obf("com.mumfrey.liteloader.client.gui.startup.LoadingBar" );
@@ -106,6 +103,7 @@ public class Obf @@ -106,6 +103,7 @@ public class Obf
106 public static final Obf shaderIndex = new Obf("field_147713_ae", "ac" ); 103 public static final Obf shaderIndex = new Obf("field_147713_ae", "ac" );
107 public static final Obf useShader = new Obf("field_175083_ad", "ad" ); 104 public static final Obf useShader = new Obf("field_175083_ad", "ad" );
108 public static final Obf viewDistance = new Obf("field_149528_b", "b" ); 105 public static final Obf viewDistance = new Obf("field_149528_b", "b" );
  106 + public static final Obf entityPosY = new Obf("field_70163_u", "t" );
109 107
110 // Methods 108 // Methods
111 // ----------------------------------------------------------------------------------------- 109 // -----------------------------------------------------------------------------------------
@@ -152,6 +150,7 @@ public class Obf @@ -152,6 +150,7 @@ public class Obf
152 public static final Obf processPlayerDigging = new Obf("func_147345_a", "a" ); 150 public static final Obf processPlayerDigging = new Obf("func_147345_a", "a" );
153 public static final Obf updateTimeLightAndEntities = new Obf("func_71190_q", "z" ); 151 public static final Obf updateTimeLightAndEntities = new Obf("func_71190_q", "z" );
154 public static final Obf checkThreadAndEnqueue = new Obf("func_180031_a", "a" ); 152 public static final Obf checkThreadAndEnqueue = new Obf("func_180031_a", "a" );
  153 + public static final Obf processPlayer = new Obf("func_147347_a", "a" );
155 154
156 public static final int MCP = 0; 155 public static final int MCP = 0;
157 public static final int SRG = 1; 156 public static final int SRG = 1;
@@ -353,6 +352,17 @@ public class Obf @@ -353,6 +352,17 @@ public class Obf
353 return Obf.getByName(name); 352 return Obf.getByName(name);
354 } 353 }
355 354
  355 + public static String lookupMCPName(String obfName)
  356 + {
  357 + for (Obf obf : Obf.obfs.values())
  358 + {
  359 + if (obfName.equals(obf.obf))
  360 + return obf.name;
  361 + }
  362 +
  363 + return obfName;
  364 + }
  365 +
356 /** 366 /**
357 * Ordinal reference, can be passed to some methods which accept an {@link Obf} to indicate an offset into a 367 * Ordinal reference, can be passed to some methods which accept an {@link Obf} to indicate an offset into a
358 * class rather than a named reference. 368 * class rather than a named reference.
@@ -403,61 +413,4 @@ public class Obf @@ -403,61 +413,4 @@ public class Obf
403 return this.ordinal; 413 return this.ordinal;
404 } 414 }
405 } 415 }
406 -  
407 - /**  
408 - * True if FML is being used, in which case we use searge names instead of raw field/method names  
409 - */  
410 - private static boolean fmlDetected = false;  
411 -  
412 - private static boolean seargeNames = false;  
413 -  
414 - static  
415 - {  
416 - // Check for FML  
417 - Obf.fmlDetected = Obf.fmlIsPresent();  
418 -  
419 - try  
420 - {  
421 - MinecraftServer.class.getDeclaredField("serverRunning");  
422 - }  
423 - catch (SecurityException ex)  
424 - {  
425 - }  
426 - catch (NoSuchFieldException ex)  
427 - {  
428 - Obf.seargeNames = true;  
429 - }  
430 - }  
431 -  
432 - public static boolean fmlIsPresent()  
433 - {  
434 - for (IClassTransformer transformer : Launch.classLoader.getTransformers())  
435 - if (transformer.getClass().getName().contains("fml")) return true;  
436 -  
437 - return false;  
438 - }  
439 -  
440 - /**  
441 - * Abstraction helper function  
442 - *  
443 - * @param fieldName Name of field to get, returned unmodified if in debug mode  
444 - * @return Obfuscated field name if present  
445 - */  
446 - public static String getObfuscatedFieldName(String fieldName, String obfuscatedFieldName, String seargeFieldName)  
447 - {  
448 - boolean deobfuscated = MinecraftServer.class.getSimpleName().equals("MinecraftServer");  
449 - return deobfuscated ? (Obf.seargeNames ? seargeFieldName : fieldName) : (Obf.fmlDetected ? seargeFieldName : obfuscatedFieldName);  
450 - }  
451 -  
452 - /**  
453 - * Abstraction helper function  
454 - *  
455 - * @param obf Field to get, returned unmodified if in debug mode  
456 - * @return Obfuscated field name if present  
457 - */  
458 - public static String getObfuscatedFieldName(Obf obf)  
459 - {  
460 - boolean deobfuscated = MinecraftServer.class.getSimpleName().equals("MinecraftServer");  
461 - return deobfuscated ? (Obf.seargeNames ? obf.srg : obf.name) : (Obf.fmlDetected ? obf.srg : obf.obf);  
462 - }  
463 } 416 }
java/common/com/mumfrey/liteloader/transformers/ByteCodeUtilities.java
@@ -344,8 +344,24 @@ public abstract class ByteCodeUtilities @@ -344,8 +344,24 @@ public abstract class ByteCodeUtilities
344 */ 344 */
345 public static List<LocalVariableNode> generateLocalVariableTable(ClassNode classNode, MethodNode method) 345 public static List<LocalVariableNode> generateLocalVariableTable(ClassNode classNode, MethodNode method)
346 { 346 {
  347 + List<Type> interfaces = null;
  348 + if (classNode.interfaces != null)
  349 + {
  350 + interfaces = new ArrayList<Type>();
  351 + for (String iface : classNode.interfaces)
  352 + {
  353 + interfaces.add(Type.getObjectType(iface));
  354 + }
  355 + }
  356 +
  357 + Type objectType = null;
  358 + if (classNode.superName != null)
  359 + {
  360 + objectType = Type.getObjectType(classNode.superName);
  361 + }
  362 +
347 // Use Analyzer to generate the bytecode frames 363 // Use Analyzer to generate the bytecode frames
348 - Analyzer<BasicValue> analyzer = new Analyzer<BasicValue>(new SimpleVerifier(Type.getObjectType(classNode.name), null, null, false)); 364 + Analyzer<BasicValue> analyzer = new Analyzer<BasicValue>(new SimpleVerifier(Type.getObjectType(classNode.name), objectType, interfaces, false));
349 try 365 try
350 { 366 {
351 analyzer.analyze(classNode.name, method); 367 analyzer.analyze(classNode.name, method);
java/common/com/mumfrey/liteloader/util/ObfuscationUtilities.java 0 → 100644
  1 +package com.mumfrey.liteloader.util;
  2 +
  3 +import net.minecraft.launchwrapper.IClassTransformer;
  4 +import net.minecraft.launchwrapper.Launch;
  5 +import net.minecraft.server.MinecraftServer;
  6 +import net.minecraft.util.BlockPos;
  7 +
  8 +import com.mumfrey.liteloader.core.runtime.Obf;
  9 +
  10 +public class ObfuscationUtilities
  11 +{
  12 + /**
  13 + * True if FML is being used, in which case we use searge names instead of raw field/method names
  14 + */
  15 + private static boolean fmlDetected = false;
  16 +
  17 + private static boolean seargeNames = false;
  18 +
  19 + static
  20 + {
  21 + // Check for FML
  22 + ObfuscationUtilities.fmlDetected = ObfuscationUtilities.fmlIsPresent();
  23 +
  24 + try
  25 + {
  26 + MinecraftServer.class.getDeclaredField("serverRunning");
  27 + }
  28 + catch (SecurityException ex)
  29 + {
  30 + }
  31 + catch (NoSuchFieldException ex)
  32 + {
  33 + ObfuscationUtilities.seargeNames = true;
  34 + }
  35 + }
  36 +
  37 + public static boolean fmlIsPresent()
  38 + {
  39 + for (IClassTransformer transformer : Launch.classLoader.getTransformers())
  40 + if (transformer.getClass().getName().contains("fml")) return true;
  41 +
  42 + return false;
  43 + }
  44 +
  45 + /**
  46 + * Abstraction helper function
  47 + *
  48 + * @param fieldName Name of field to get, returned unmodified if in debug mode
  49 + * @return Obfuscated field name if present
  50 + */
  51 + public static String getObfuscatedFieldName(String fieldName, String obfuscatedFieldName, String seargeFieldName)
  52 + {
  53 + boolean deobfuscated = BlockPos.class.getSimpleName().equals("BlockPos");
  54 + return deobfuscated ? (ObfuscationUtilities.seargeNames ? seargeFieldName : fieldName) : (ObfuscationUtilities.fmlDetected ? seargeFieldName : obfuscatedFieldName);
  55 + }
  56 +
  57 + /**
  58 + * Abstraction helper function
  59 + *
  60 + * @param obf Field to get, returned unmodified if in debug mode
  61 + * @return Obfuscated field name if present
  62 + */
  63 + public static String getObfuscatedFieldName(Obf obf)
  64 + {
  65 + boolean deobfuscated = BlockPos.class.getSimpleName().equals("BlockPos");
  66 + return deobfuscated ? (ObfuscationUtilities.seargeNames ? obf.srg : obf.name) : (ObfuscationUtilities.fmlDetected ? obf.srg : obf.obf);
  67 + }
  68 +}