Commit c4b6db986fc5843633653e90b42cdb837e38f7b8

Authored by Mumfrey
1 parent c92c91ea

Liteloader 1.4.4

.classpath
@@ -2,23 +2,12 @@ @@ -2,23 +2,12 @@
2 <classpath> 2 <classpath>
3 <classpathentry kind="src" path="java"/> 3 <classpathentry kind="src" path="java"/>
4 <classpathentry kind="src" path="res"/> 4 <classpathentry kind="src" path="res"/>
  5 + <classpathentry combineaccessrules="false" kind="src" path="/ClientMods"/>
5 <classpathentry combineaccessrules="false" kind="src" path="/Client"/> 6 <classpathentry combineaccessrules="false" kind="src" path="/Client"/>
6 <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jre6"/> 7 <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jre6"/>
7 - <classpathentry kind="lib" path="jars/bin/jinput.jar">  
8 - <attributes>  
9 - <attribute name="org.eclipse.jdt.launching.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY" value="LiteLoader/jars/bin/natives"/>  
10 - </attributes>  
11 - </classpathentry>  
12 - <classpathentry kind="lib" path="jars/bin/lwjgl_util.jar">  
13 - <attributes>  
14 - <attribute name="org.eclipse.jdt.launching.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY" value="LiteLoader/jars/bin/natives"/>  
15 - </attributes>  
16 - </classpathentry>  
17 - <classpathentry kind="lib" path="jars/bin/lwjgl.jar">  
18 - <attributes>  
19 - <attribute name="org.eclipse.jdt.launching.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY" value="LiteLoader/jars/bin/natives"/>  
20 - </attributes>  
21 - </classpathentry>  
22 - <classpathentry kind="lib" path="jars/bin/minecraft.jar"/> 8 + <classpathentry kind="lib" path="/Client/jars/bin/jinput.jar"/>
  9 + <classpathentry kind="lib" path="/Client/jars/bin/lwjgl_util.jar"/>
  10 + <classpathentry kind="lib" path="/Client/jars/bin/lwjgl.jar"/>
  11 + <classpathentry kind="lib" path="/Client/jars/bin/minecraft.jar"/>
23 <classpathentry kind="output" path="bin"/> 12 <classpathentry kind="output" path="bin"/>
24 </classpath> 13 </classpath>
.project
@@ -14,13 +14,6 @@ @@ -14,13 +14,6 @@
14 <natures> 14 <natures>
15 <nature>org.eclipse.jdt.core.javanature</nature> 15 <nature>org.eclipse.jdt.core.javanature</nature>
16 </natures> 16 </natures>
17 - <linkedResources>  
18 - <link>  
19 - <name>jars</name>  
20 - <type>2</type>  
21 - <locationURI>MCP_LOC/jars</locationURI>  
22 - </link>  
23 - </linkedResources>  
24 <variableList> 17 <variableList>
25 <variable> 18 <variable>
26 <name>MCP_LOC</name> 19 <name>MCP_LOC</name>
java/com/mumfrey/liteloader/PreLoginListener.java 0 → 100644
  1 +package com.mumfrey.liteloader;
  2 +
  3 +import net.minecraft.src.NetHandler;
  4 +import net.minecraft.src.Packet1Login;
  5 +
  6 +/**
  7 + * Interface for mods which wish to be notified when the player connects to a server (or local game)
  8 + *
  9 + * @author Adam Mummery-Smith
  10 + */
  11 +public interface PreLoginListener extends LiteMod
  12 +{
  13 + /**
  14 + * Called on login
  15 + *
  16 + * @param netHandler Net handler
  17 + * @param loginPacket Login packet
  18 + */
  19 + public abstract boolean onPreLogin(NetHandler netHandler, Packet1Login loginPacket);
  20 +}
java/com/mumfrey/liteloader/RenderListener.java 0 → 100644
  1 +package com.mumfrey.liteloader;
  2 +
  3 +/**
  4 + * Interface for objects which want a pre-render callback
  5 + *
  6 + * @author Adam Mummery-Smith
  7 + */
  8 +public interface RenderListener extends LiteMod
  9 +{
  10 + /**
  11 + * Callback when a frame is rendered
  12 + */
  13 + public abstract void onRender();
  14 +
  15 + public abstract void onRenderWorld();
  16 +}
java/com/mumfrey/liteloader/core/HookLogin.java
@@ -25,8 +25,11 @@ public class HookLogin extends Packet1Login @@ -25,8 +25,11 @@ public class HookLogin extends Packet1Login
25 @Override 25 @Override
26 public void processPacket(NetHandler par1NetHandler) 26 public void processPacket(NetHandler par1NetHandler)
27 { 27 {
28 - super.processPacket(par1NetHandler);  
29 -  
30 - if (loader != null) loader.onConnectToServer(par1NetHandler, this); 28 + if (loader == null || loader.onPreLogin(par1NetHandler, this))
  29 + {
  30 + super.processPacket(par1NetHandler);
  31 +
  32 + if (loader != null) loader.onConnectToServer(par1NetHandler, this);
  33 + }
31 } 34 }
32 } 35 }
java/com/mumfrey/liteloader/core/LiteLoaderHook.java renamed to java/com/mumfrey/liteloader/core/HookProfiler.java
@@ -14,7 +14,7 @@ import net.minecraft.src.Profiler; @@ -14,7 +14,7 @@ import net.minecraft.src.Profiler;
14 * 14 *
15 * @author Adam Mummery-Smith 15 * @author Adam Mummery-Smith
16 */ 16 */
17 -public class LiteLoaderHook extends Profiler 17 +public class HookProfiler extends Profiler
18 { 18 {
19 /** 19 /**
20 * Logger instance 20 * Logger instance
@@ -24,12 +24,12 @@ public class LiteLoaderHook extends Profiler @@ -24,12 +24,12 @@ public class LiteLoaderHook extends Profiler
24 /** 24 /**
25 * LiteLoader instance which will receive callbacks 25 * LiteLoader instance which will receive callbacks
26 */ 26 */
27 - private LiteLoader core; 27 + private LiteLoader loader;
28 28
29 /** 29 /**
30 * Section list, used as a kind of stack to determine where we are in the profiler stack 30 * Section list, used as a kind of stack to determine where we are in the profiler stack
31 */ 31 */
32 - private LinkedList<String> sections = new LinkedList<String>(); 32 + private LinkedList<String> sectionStack = new LinkedList<String>();
33 33
34 /** 34 /**
35 * Initialisation done 35 * Initialisation done
@@ -57,9 +57,9 @@ public class LiteLoaderHook extends Profiler @@ -57,9 +57,9 @@ public class LiteLoaderHook extends Profiler
57 * @param core LiteLoader object which will get callbacks 57 * @param core LiteLoader object which will get callbacks
58 * @param logger Logger instance 58 * @param logger Logger instance
59 */ 59 */
60 - public LiteLoaderHook(LiteLoader core, Logger logger) 60 + public HookProfiler(LiteLoader core, Logger logger)
61 { 61 {
62 - this.core = core; 62 + this.loader = core;
63 this.logger = logger; 63 this.logger = logger;
64 64
65 // Detect optifine (duh!) 65 // Detect optifine (duh!)
@@ -128,13 +128,18 @@ public class LiteLoaderHook extends Profiler @@ -128,13 +128,18 @@ public class LiteLoaderHook extends Profiler
128 if (!initDone) 128 if (!initDone)
129 { 129 {
130 initDone = true; 130 initDone = true;
131 - core.onInit(); 131 + loader.onInit();
132 } 132 }
133 133
134 - if (sectionName.equals("animateTick")) tick = true;  
135 - sections.add(sectionName); 134 + if ("gameRenderer".equalsIgnoreCase(sectionName) && "root".equalsIgnoreCase(sectionStack.getLast()))
  135 + {
  136 + loader.onRender();
  137 + }
  138 +
  139 + if ("animateTick".equals(sectionName)) tick = true;
  140 + sectionStack.add(sectionName);
136 super.startSection(sectionName); 141 super.startSection(sectionName);
137 - 142 +
138 if (ofProfiler != null) 143 if (ofProfiler != null)
139 { 144 {
140 try 145 try
@@ -160,13 +165,13 @@ public class LiteLoaderHook extends Profiler @@ -160,13 +165,13 @@ public class LiteLoaderHook extends Profiler
160 { 165 {
161 super.endSection(); 166 super.endSection();
162 167
163 - String endingSection = sections.removeLast(); 168 + String endingSection = sectionStack.removeLast();
164 169
165 - if (endingSection.equalsIgnoreCase("gameRenderer") && sections.getLast().equalsIgnoreCase("root")) 170 + if ("gameRenderer".equalsIgnoreCase(endingSection) && "root".equalsIgnoreCase(sectionStack.getLast()))
166 { 171 {
167 super.startSection("litetick"); 172 super.startSection("litetick");
168 173
169 - core.onTick(tick); 174 + loader.onTick(this, tick);
170 tick = false; 175 tick = false;
171 176
172 super.endSection(); 177 super.endSection();
java/com/mumfrey/liteloader/core/LiteLoader.java
@@ -28,26 +28,27 @@ import net.minecraft.src.Timer; @@ -28,26 +28,27 @@ import net.minecraft.src.Timer;
28 * LiteLoader is a simple loader which provides tick events to loaded mods 28 * LiteLoader is a simple loader which provides tick events to loaded mods
29 * 29 *
30 * @author Adam Mummery-Smith 30 * @author Adam Mummery-Smith
31 - * @version 1.4.0 31 + * @version 1.4.4
32 */ 32 */
  33 +@SuppressWarnings("rawtypes")
33 public final class LiteLoader implements FilenameFilter 34 public final class LiteLoader implements FilenameFilter
34 { 35 {
35 /** 36 /**
36 * Liteloader version 37 * Liteloader version
37 */ 38 */
38 - private static final String LOADER_VERSION = "1.4.0"; 39 + private static final String LOADER_VERSION = "1.4.4";
39 40
40 /** 41 /**
41 * Loader revision, can be used by mods to determine whether the loader is sufficiently up-to-date 42 * Loader revision, can be used by mods to determine whether the loader is sufficiently up-to-date
42 */ 43 */
43 - private static final int LOADER_REVISION = 4; 44 + private static final int LOADER_REVISION = 6;
44 45
45 /** 46 /**
46 * Minecraft versions that we will load mods for, this will be compared 47 * Minecraft versions that we will load mods for, this will be compared
47 * against the version.txt value in mod files to prevent outdated mods being 48 * against the version.txt value in mod files to prevent outdated mods being
48 * loaded!!! 49 * loaded!!!
49 */ 50 */
50 - private static final String[] SUPPORTED_VERSIONS = { "1.4.0", "1.4" }; 51 + private static final String[] SUPPORTED_VERSIONS = { "1.4.4" };
51 52
52 /** 53 /**
53 * LiteLoader is a singleton, this is the singleton instance 54 * LiteLoader is a singleton, this is the singleton instance
@@ -96,6 +97,12 @@ public final class LiteLoader implements FilenameFilter @@ -96,6 +97,12 @@ public final class LiteLoader implements FilenameFilter
96 private LinkedList<InitCompleteListener> initListeners = new LinkedList<InitCompleteListener>(); 97 private LinkedList<InitCompleteListener> initListeners = new LinkedList<InitCompleteListener>();
97 98
98 /** 99 /**
  100 + * List of mods which implement RenderListener interface and will receive render events
  101 + * events
  102 + */
  103 + private LinkedList<RenderListener> renderListeners = new LinkedList<RenderListener>();
  104 +
  105 + /**
99 * List of mods which implement ChatListener interface and will receive chat 106 * List of mods which implement ChatListener interface and will receive chat
100 * events 107 * events
101 */ 108 */
@@ -113,6 +120,11 @@ public final class LiteLoader implements FilenameFilter @@ -113,6 +120,11 @@ public final class LiteLoader implements FilenameFilter
113 private LinkedList<LoginListener> loginListeners = new LinkedList<LoginListener>(); 120 private LinkedList<LoginListener> loginListeners = new LinkedList<LoginListener>();
114 121
115 /** 122 /**
  123 + * List of mods which implement LoginListener interface and will receive client login events
  124 + */
  125 + private LinkedList<PreLoginListener> preLoginListeners = new LinkedList<PreLoginListener>();
  126 +
  127 + /**
116 * List of mods which implement PluginChannelListener interface 128 * List of mods which implement PluginChannelListener interface
117 */ 129 */
118 private LinkedList<PluginChannelListener> pluginChannelListeners = new LinkedList<PluginChannelListener>(); 130 private LinkedList<PluginChannelListener> pluginChannelListeners = new LinkedList<PluginChannelListener>();
@@ -127,7 +139,12 @@ public final class LiteLoader implements FilenameFilter @@ -127,7 +139,12 @@ public final class LiteLoader implements FilenameFilter
127 */ 139 */
128 private Method mAddUrl; 140 private Method mAddUrl;
129 141
130 - private boolean initDone = false; 142 + /**
  143 + * Flag which keeps track of whether late initialisation has been done
  144 + */
  145 + private boolean loaderStartupDone, loaderStartupComplete, lateInitDone;
  146 +
  147 + private boolean chatHooked, loginHooked, pluginChannelHooked, tickHooked;
131 148
132 /** 149 /**
133 * Get the singleton instance of LiteLoader, initialises the loader if necessary 150 * Get the singleton instance of LiteLoader, initialises the loader if necessary
@@ -138,7 +155,10 @@ public final class LiteLoader implements FilenameFilter @@ -138,7 +155,10 @@ public final class LiteLoader implements FilenameFilter
138 { 155 {
139 if (instance == null) 156 if (instance == null)
140 { 157 {
  158 + // Return immediately to stop calls to getInstance causing re-init if they arrive
  159 + // before init is completed
141 instance = new LiteLoader(); 160 instance = new LiteLoader();
  161 + instance.initLoader();
142 } 162 }
143 163
144 return instance; 164 return instance;
@@ -179,26 +199,37 @@ public final class LiteLoader implements FilenameFilter @@ -179,26 +199,37 @@ public final class LiteLoader implements FilenameFilter
179 */ 199 */
180 private LiteLoader() 200 private LiteLoader()
181 { 201 {
  202 + }
  203 +
  204 + private void initLoader()
  205 + {
  206 + if (loaderStartupDone) return;
  207 + loaderStartupDone = true;
  208 +
182 // Set up base class overrides 209 // Set up base class overrides
183 prepareClassOverrides(); 210 prepareClassOverrides();
184 211
185 // Set up loader, initialises any reflection methods needed 212 // Set up loader, initialises any reflection methods needed
186 - prepareLoader();  
187 -  
188 - logger.info("Liteloader " + LOADER_VERSION + " starting up...");  
189 -  
190 - // Examines the class path and mods folder and locates loadable mods  
191 - prepareMods();  
192 -  
193 - // Initialises enumerated mods  
194 - initMods();  
195 -  
196 - // Initialises the required hooks for loaded mods  
197 - initHooks(); 213 + if (prepareLoader())
  214 + {
  215 + logger.info("LiteLoader " + LOADER_VERSION + " starting up...");
  216 + logger.info(String.format("Java reports OS=\"%s\"", System.getProperty("os.name").toLowerCase()));
  217 +
  218 + // Examines the class path and mods folder and locates loadable mods
  219 + prepareMods();
  220 +
  221 + // Initialises enumerated mods
  222 + initMods();
  223 +
  224 + // Initialises the required hooks for loaded mods
  225 + initHooks();
  226 +
  227 + loaderStartupComplete = true;
  228 + }
198 } 229 }
199 230
200 /** 231 /**
201 - * 232 + * Do dirty non-base-clean overrides
202 */ 233 */
203 private void prepareClassOverrides() 234 private void prepareClassOverrides()
204 { 235 {
@@ -233,13 +264,18 @@ public final class LiteLoader implements FilenameFilter @@ -233,13 +264,18 @@ public final class LiteLoader implements FilenameFilter
233 264
234 outputStream.close(); 265 outputStream.close();
235 resourceInputStream.close(); 266 resourceInputStream.close();
236 - 267 +
  268 + logger.info("Defining class override for " + binaryClassName);
237 mDefineClass.invoke(Minecraft.class.getClassLoader(), binaryClassName, data, 0, data.length); 269 mDefineClass.invoke(Minecraft.class.getClassLoader(), binaryClassName, data, 0, data.length);
238 } 270 }
  271 + else
  272 + {
  273 + logger.info("Error defining class override for " + binaryClassName + ", file not found");
  274 + }
239 } 275 }
240 catch (Throwable th) 276 catch (Throwable th)
241 { 277 {
242 - th.printStackTrace(); 278 + logger.log(Level.WARNING, "Error defining class override for " + binaryClassName, th);
243 } 279 }
244 } 280 }
245 281
@@ -247,7 +283,7 @@ public final class LiteLoader implements FilenameFilter @@ -247,7 +283,7 @@ public final class LiteLoader implements FilenameFilter
247 * Set up reflection methods required by the loader 283 * Set up reflection methods required by the loader
248 */ 284 */
249 @SuppressWarnings("unchecked") 285 @SuppressWarnings("unchecked")
250 - private void prepareLoader() 286 + private boolean prepareLoader()
251 { 287 {
252 try 288 try
253 { 289 {
@@ -279,12 +315,14 @@ public final class LiteLoader implements FilenameFilter @@ -279,12 +315,14 @@ public final class LiteLoader implements FilenameFilter
279 FileHandler logFileHandler = new FileHandler(new File(Minecraft.getMinecraftDir(), "LiteLoader.txt").getAbsolutePath()); 315 FileHandler logFileHandler = new FileHandler(new File(Minecraft.getMinecraftDir(), "LiteLoader.txt").getAbsolutePath());
280 if (minecraftLogFormatter != null) logFileHandler.setFormatter(minecraftLogFormatter); 316 if (minecraftLogFormatter != null) logFileHandler.setFormatter(minecraftLogFormatter);
281 logger.addHandler(logFileHandler); 317 logger.addHandler(logFileHandler);
282 -  
283 } 318 }
284 - catch (Exception ex) 319 + catch (Throwable th)
285 { 320 {
286 - logger.log(Level.SEVERE, "Error initialising LiteLoader", ex); 321 + logger.log(Level.SEVERE, "Error initialising LiteLoader", th);
  322 + return false;
287 } 323 }
  324 +
  325 + return true;
288 } 326 }
289 327
290 /** 328 /**
@@ -341,16 +379,25 @@ public final class LiteLoader implements FilenameFilter @@ -341,16 +379,25 @@ public final class LiteLoader implements FilenameFilter
341 HashMap<String, Class> modsToLoad = null; 379 HashMap<String, Class> modsToLoad = null;
342 try 380 try
343 { 381 {
344 - logger.info("Loading mods from class path");  
345 - 382 + logger.info("Enumerating class path...");
  383 +
  384 + String classPath = System.getProperty("java.class.path");
346 String classPathSeparator = System.getProperty("path.separator"); 385 String classPathSeparator = System.getProperty("path.separator");
347 - String[] classPathEntries = System.getProperty("java.class.path").split(classPathSeparator); 386 + String[] classPathEntries = classPath.split(classPathSeparator);
  387 +
  388 + logger.info(String.format("Class path separator=\"%s\"", classPathSeparator));
  389 + logger.info(String.format("Class path entries=(\n classpathEntry=%s\n)", classPath.replace(classPathSeparator, "\n classpathEntry=")));
  390 +
  391 + logger.info("Loading mods from class path...");
  392 +
348 modsToLoad = findModClasses(classPathEntries, modFiles); 393 modsToLoad = findModClasses(classPathEntries, modFiles);
  394 +
  395 + logger.info("Mod class discovery completed");
349 } 396 }
350 - catch (Exception ex) 397 + catch (Throwable th)
351 { 398 {
352 - // TODO Auto-generated catch block  
353 - ex.printStackTrace(); 399 + logger.log(Level.WARNING, "Mod class discovery failed", th);
  400 + return;
354 } 401 }
355 402
356 loadMods(modsToLoad); 403 loadMods(modsToLoad);
@@ -421,14 +468,17 @@ public final class LiteLoader implements FilenameFilter @@ -421,14 +468,17 @@ public final class LiteLoader implements FilenameFilter
421 468
422 try 469 try
423 { 470 {
  471 + logger.info("Searching protection domain code source...");
  472 +
424 File packagePath = new File(LiteLoader.class.getProtectionDomain().getCodeSource().getLocation().toURI()); 473 File packagePath = new File(LiteLoader.class.getProtectionDomain().getCodeSource().getLocation().toURI());
425 -  
426 LinkedList<Class> modClasses = getSubclassesFor(packagePath, Minecraft.class.getClassLoader(), LiteMod.class, "LiteMod"); 474 LinkedList<Class> modClasses = getSubclassesFor(packagePath, Minecraft.class.getClassLoader(), LiteMod.class, "LiteMod");
427 475
428 for (Class mod : modClasses) 476 for (Class mod : modClasses)
429 { 477 {
430 modsToLoad.put(mod.getSimpleName(), mod); 478 modsToLoad.put(mod.getSimpleName(), mod);
431 } 479 }
  480 +
  481 + if (modClasses.size() > 0) logger.info(String.format("Found %s potential matches", modClasses.size()));
432 } 482 }
433 catch (Throwable th) 483 catch (Throwable th)
434 { 484 {
@@ -438,6 +488,8 @@ public final class LiteLoader implements FilenameFilter @@ -438,6 +488,8 @@ public final class LiteLoader implements FilenameFilter
438 // Search through the class path and find mod classes 488 // Search through the class path and find mod classes
439 for (String classPathPart : classPathEntries) 489 for (String classPathPart : classPathEntries)
440 { 490 {
  491 + logger.info(String.format("Searching %s...", classPathPart));
  492 +
441 File packagePath = new File(classPathPart); 493 File packagePath = new File(classPathPart);
442 LinkedList<Class> modClasses = getSubclassesFor(packagePath, Minecraft.class.getClassLoader(), LiteMod.class, "LiteMod"); 494 LinkedList<Class> modClasses = getSubclassesFor(packagePath, Minecraft.class.getClassLoader(), LiteMod.class, "LiteMod");
443 495
@@ -445,17 +497,23 @@ public final class LiteLoader implements FilenameFilter @@ -445,17 +497,23 @@ public final class LiteLoader implements FilenameFilter
445 { 497 {
446 modsToLoad.put(mod.getSimpleName(), mod); 498 modsToLoad.put(mod.getSimpleName(), mod);
447 } 499 }
  500 +
  501 + if (modClasses.size() > 0) logger.info(String.format("Found %s potential matches", modClasses.size()));
448 } 502 }
449 503
450 // Search through mod files and find mod classes 504 // Search through mod files and find mod classes
451 for (File modFile : modFiles) 505 for (File modFile : modFiles)
452 { 506 {
  507 + logger.info(String.format("Searching %s...", modFile.getAbsolutePath()));
  508 +
453 LinkedList<Class> modClasses = getSubclassesFor(modFile, Minecraft.class.getClassLoader(), LiteMod.class, "LiteMod"); 509 LinkedList<Class> modClasses = getSubclassesFor(modFile, Minecraft.class.getClassLoader(), LiteMod.class, "LiteMod");
454 510
455 for (Class mod : modClasses) 511 for (Class mod : modClasses)
456 { 512 {
457 modsToLoad.put(mod.getSimpleName(), mod); 513 modsToLoad.put(mod.getSimpleName(), mod);
458 } 514 }
  515 +
  516 + if (modClasses.size() > 0) logger.info(String.format("Found %s potential matches", modClasses.size()));
459 } 517 }
460 518
461 return modsToLoad; 519 return modsToLoad;
@@ -468,7 +526,11 @@ public final class LiteLoader implements FilenameFilter @@ -468,7 +526,11 @@ public final class LiteLoader implements FilenameFilter
468 */ 526 */
469 private void loadMods(HashMap<String, Class> modsToLoad) 527 private void loadMods(HashMap<String, Class> modsToLoad)
470 { 528 {
471 - if (modsToLoad == null) return; 529 + if (modsToLoad == null)
  530 + {
  531 + logger.info("Mod class discovery failed. Not loading any mods!");
  532 + return;
  533 + }
472 534
473 logger.info("Discovered " + modsToLoad.size() + " total mod(s)"); 535 logger.info("Discovered " + modsToLoad.size() + " total mod(s)");
474 536
@@ -511,32 +573,42 @@ public final class LiteLoader implements FilenameFilter @@ -511,32 +573,42 @@ public final class LiteLoader implements FilenameFilter
511 573
512 if (mod instanceof Tickable) 574 if (mod instanceof Tickable)
513 { 575 {
514 - tickListeners.add((Tickable)mod); 576 + addTickListener((Tickable)mod);
515 } 577 }
516 578
517 if (mod instanceof InitCompleteListener) 579 if (mod instanceof InitCompleteListener)
518 { 580 {
519 - initListeners.add((InitCompleteListener)mod); 581 + addInitListener((InitCompleteListener)mod);
  582 + }
  583 +
  584 + if (mod instanceof RenderListener)
  585 + {
  586 + addRenderListener((RenderListener)mod);
520 } 587 }
521 588
522 if (mod instanceof ChatFilter) 589 if (mod instanceof ChatFilter)
523 { 590 {
524 - chatFilters.add((ChatFilter)mod); 591 + addChatFilter((ChatFilter)mod);
525 } 592 }
526 593
527 if (mod instanceof ChatListener && !(mod instanceof ChatFilter)) 594 if (mod instanceof ChatListener && !(mod instanceof ChatFilter))
528 { 595 {
529 - chatListeners.add((ChatListener)mod); 596 + addChatListener((ChatListener)mod);
  597 + }
  598 +
  599 + if (mod instanceof PreLoginListener)
  600 + {
  601 + addPreLoginListener((PreLoginListener)mod);
530 } 602 }
531 603
532 if (mod instanceof LoginListener) 604 if (mod instanceof LoginListener)
533 { 605 {
534 - loginListeners.add((LoginListener)mod); 606 + addLoginListener((LoginListener)mod);
535 } 607 }
536 608
537 if (mod instanceof PluginChannelListener) 609 if (mod instanceof PluginChannelListener)
538 { 610 {
539 - pluginChannelListeners.add((PluginChannelListener)mod); 611 + addPluginChannelListener((PluginChannelListener)mod);
540 } 612 }
541 613
542 loadedModsList += String.format("\n - %s version %s", mod.getName(), mod.getVersion()); 614 loadedModsList += String.format("\n - %s version %s", mod.getName(), mod.getVersion());
@@ -551,7 +623,7 @@ public final class LiteLoader implements FilenameFilter @@ -551,7 +623,7 @@ public final class LiteLoader implements FilenameFilter
551 623
552 loadedModsList = String.format("%s loaded mod(s)%s", loadedModsCount, loadedModsList); 624 loadedModsList = String.format("%s loaded mod(s)%s", loadedModsCount, loadedModsList);
553 } 625 }
554 - 626 +
555 /** 627 /**
556 * Initialise mod hooks 628 * Initialise mod hooks
557 */ 629 */
@@ -560,28 +632,35 @@ public final class LiteLoader implements FilenameFilter @@ -560,28 +632,35 @@ public final class LiteLoader implements FilenameFilter
560 try 632 try
561 { 633 {
562 // Chat hook 634 // Chat hook
563 - if (chatListeners.size() > 0 || chatFilters.size() > 0) 635 + if ((chatListeners.size() > 0 || chatFilters.size() > 0) && !chatHooked)
564 { 636 {
  637 + chatHooked = true;
565 HookChat.Register(); 638 HookChat.Register();
566 HookChat.RegisterPacketHandler(this); 639 HookChat.RegisterPacketHandler(this);
567 } 640 }
568 641
569 // Login hook 642 // Login hook
570 - if (loginListeners.size() > 0) 643 + if ((preLoginListeners.size() > 0 || loginListeners.size() > 0) && !loginHooked)
571 { 644 {
  645 + loginHooked = true;
572 ModUtilities.registerPacketOverride(1, HookLogin.class); 646 ModUtilities.registerPacketOverride(1, HookLogin.class);
573 HookLogin.loader = this; 647 HookLogin.loader = this;
574 } 648 }
575 649
576 // Plugin channels hook 650 // Plugin channels hook
577 - if (pluginChannelListeners.size() > 0) 651 + if (pluginChannelListeners.size() > 0 && !pluginChannelHooked)
578 { 652 {
  653 + pluginChannelHooked = true;
579 HookPluginChannels.Register(); 654 HookPluginChannels.Register();
580 HookPluginChannels.RegisterPacketHandler(this); 655 HookPluginChannels.RegisterPacketHandler(this);
581 } 656 }
582 657
583 // Tick hook 658 // Tick hook
584 - PrivateFields.minecraftProfiler.SetFinal(minecraft, new LiteLoaderHook(this, logger)); 659 + if (!tickHooked)
  660 + {
  661 + tickHooked = true;
  662 + PrivateFields.minecraftProfiler.SetFinal(minecraft, new HookProfiler(this, logger));
  663 + }
585 } 664 }
586 catch (Exception ex) 665 catch (Exception ex)
587 { 666 {
@@ -591,6 +670,102 @@ public final class LiteLoader implements FilenameFilter @@ -591,6 +670,102 @@ public final class LiteLoader implements FilenameFilter
591 } 670 }
592 671
593 /** 672 /**
  673 + * @param tickable
  674 + */
  675 + public void addTickListener(Tickable tickable)
  676 + {
  677 + if (!tickListeners.contains(tickable))
  678 + {
  679 + tickListeners.add(tickable);
  680 + if (loaderStartupComplete) initHooks();
  681 + }
  682 + }
  683 +
  684 + /**
  685 + * @param initCompleteListener
  686 + */
  687 + public void addInitListener(InitCompleteListener initCompleteListener)
  688 + {
  689 + if (!initListeners.contains(initCompleteListener))
  690 + {
  691 + initListeners.add(initCompleteListener);
  692 + if (loaderStartupComplete) initHooks();
  693 + }
  694 + }
  695 +
  696 + /**
  697 + * @param tickable
  698 + */
  699 + public void addRenderListener(RenderListener tickable)
  700 + {
  701 + if (!renderListeners.contains(tickable))
  702 + {
  703 + renderListeners.add(tickable);
  704 + if (loaderStartupComplete) initHooks();
  705 + }
  706 + }
  707 +
  708 + /**
  709 + * @param chatFilter
  710 + */
  711 + public void addChatFilter(ChatFilter chatFilter)
  712 + {
  713 + if (!chatFilters.contains(chatFilter))
  714 + {
  715 + chatFilters.add(chatFilter);
  716 + if (loaderStartupComplete) initHooks();
  717 + }
  718 + }
  719 +
  720 + /**
  721 + * @param chatListener
  722 + */
  723 + public void addChatListener(ChatListener chatListener)
  724 + {
  725 + if (!chatListeners.contains(chatListener))
  726 + {
  727 + chatListeners.add(chatListener);
  728 + if (loaderStartupComplete) initHooks();
  729 + }
  730 + }
  731 +
  732 + /**
  733 + * @param loginListener
  734 + */
  735 + public void addPreLoginListener(PreLoginListener loginListener)
  736 + {
  737 + if (!preLoginListeners.contains(loginListener))
  738 + {
  739 + preLoginListeners.add(loginListener);
  740 + if (loaderStartupComplete) initHooks();
  741 + }
  742 + }
  743 +
  744 + /**
  745 + * @param loginListener
  746 + */
  747 + public void addLoginListener(LoginListener loginListener)
  748 + {
  749 + if (!loginListeners.contains(loginListener))
  750 + {
  751 + loginListeners.add(loginListener);
  752 + if (loaderStartupComplete) initHooks();
  753 + }
  754 + }
  755 +
  756 + /**
  757 + * @param pluginChannelListener
  758 + */
  759 + public void addPluginChannelListener(PluginChannelListener pluginChannelListener)
  760 + {
  761 + if (!pluginChannelListeners.contains(pluginChannelListener))
  762 + {
  763 + pluginChannelListeners.add(pluginChannelListener);
  764 + if (loaderStartupComplete) initHooks();
  765 + }
  766 + }
  767 +
  768 + /**
594 * Enumerate classes on the classpath which are subclasses of the specified 769 * Enumerate classes on the classpath which are subclasses of the specified
595 * class 770 * class
596 * 771 *
@@ -762,9 +937,9 @@ public final class LiteLoader implements FilenameFilter @@ -762,9 +937,9 @@ public final class LiteLoader implements FilenameFilter
762 */ 937 */
763 public void onInit() 938 public void onInit()
764 { 939 {
765 - if (!initDone) 940 + if (!lateInitDone)
766 { 941 {
767 - initDone = true; 942 + lateInitDone = true;
768 943
769 for (InitCompleteListener initMod : initListeners) 944 for (InitCompleteListener initMod : initListeners)
770 { 945 {
@@ -780,13 +955,22 @@ public final class LiteLoader implements FilenameFilter @@ -780,13 +955,22 @@ public final class LiteLoader implements FilenameFilter
780 } 955 }
781 } 956 }
782 } 957 }
  958 +
  959 + /**
  960 + * Callback from the tick hook, pre render
  961 + */
  962 + public void onRender()
  963 + {
  964 + for (RenderListener renderListener : renderListeners)
  965 + renderListener.onRender();
  966 + }
783 967
784 /** 968 /**
785 * Callback from the tick hook, ticks all tickable mods 969 * Callback from the tick hook, ticks all tickable mods
786 * 970 *
787 * @param tick True if this is a new tick (otherwise it's just a new frame) 971 * @param tick True if this is a new tick (otherwise it's just a new frame)
788 */ 972 */
789 - public void onTick(boolean tick) 973 + public void onTick(Profiler profiler, boolean tick)
790 { 974 {
791 float partialTicks = 0.0F; 975 float partialTicks = 0.0F;
792 976
@@ -809,7 +993,9 @@ public final class LiteLoader implements FilenameFilter @@ -809,7 +993,9 @@ public final class LiteLoader implements FilenameFilter
809 // Iterate tickable mods 993 // Iterate tickable mods
810 for (Tickable tickable : tickListeners) 994 for (Tickable tickable : tickListeners)
811 { 995 {
  996 + profiler.startSection(tickable.getClass().getSimpleName());
812 tickable.onTick(minecraft, partialTicks, inGame, tick); 997 tickable.onTick(minecraft, partialTicks, inGame, tick);
  998 + profiler.endSection();
813 } 999 }
814 } 1000 }
815 1001
@@ -832,6 +1018,25 @@ public final class LiteLoader implements FilenameFilter @@ -832,6 +1018,25 @@ public final class LiteLoader implements FilenameFilter
832 1018
833 return true; 1019 return true;
834 } 1020 }
  1021 +
  1022 + /**
  1023 + * Pre-login callback from the login hook
  1024 + *
  1025 + * @param netHandler
  1026 + * @param hookLogin
  1027 + * @return
  1028 + */
  1029 + public boolean onPreLogin(NetHandler netHandler, Packet1Login loginPacket)
  1030 + {
  1031 + boolean cancelled = false;
  1032 +
  1033 + for (PreLoginListener loginListener : preLoginListeners)
  1034 + {
  1035 + cancelled |= !loginListener.onPreLogin(netHandler, loginPacket);
  1036 + }
  1037 +
  1038 + return !cancelled;
  1039 + }
835 1040
836 /** 1041 /**
837 * Callback from the login hook 1042 * Callback from the login hook
java/com/mumfrey/liteloader/util/PrivateFields.java
@@ -130,12 +130,12 @@ public class PrivateFields&lt;P, T&gt; @@ -130,12 +130,12 @@ public class PrivateFields&lt;P, T&gt;
130 public T Get() { return Get(null); } 130 public T Get() { return Get(null); }
131 public void Set(T value) { Set(null, value); } 131 public void Set(T value) { Set(null, value); }
132 132
133 - public static final StaticFields<Packet, Map> packetClassToIdMap = new StaticFields<Packet, Map> (Packet.class, "packetClassToIdMap", "a");  
134 - public static final StaticFields<TileEntity, Map> tileEntityNameToClassMap = new StaticFields<TileEntity, Map> (TileEntity.class, "nameToClassMap", "a"); 133 + public static final StaticFields<Packet, Map> packetClassToIdMap = new StaticFields<Packet, Map> (Packet.class, "packetClassToIdMap", "a"); // Packet/packetClassToIdMap
  134 + public static final StaticFields<TileEntity, Map> tileEntityNameToClassMap = new StaticFields<TileEntity, Map> (TileEntity.class, "nameToClassMap", "a"); // TileEntity/nameToClassMap
135 } 135 }
136 136
137 - public static final PrivateFields<Minecraft, Timer> minecraftTimer = new PrivateFields<Minecraft, Timer> (Minecraft.class, "timer", "T");  
138 - public static final PrivateFields<RenderManager, Map> entityRenderMap = new PrivateFields<RenderManager, Map> (RenderManager.class, "entityRenderMap", "o");  
139 - public static final PrivateFields<Minecraft, Profiler> minecraftProfiler = new PrivateFields<Minecraft, Profiler> (Minecraft.class, "mcProfiler", "I"); 137 + public static final PrivateFields<Minecraft, Timer> minecraftTimer = new PrivateFields<Minecraft, Timer> (Minecraft.class, "timer", "T"); // Minecraft/timer
  138 + public static final PrivateFields<Minecraft, Profiler> minecraftProfiler = new PrivateFields<Minecraft, Profiler> (Minecraft.class, "mcProfiler", "I"); // Minecraft/mcProfiler
  139 + public static final PrivateFields<RenderManager, Map> entityRenderMap = new PrivateFields<RenderManager, Map> (RenderManager.class, "entityRenderMap", "p"); // RenderManager/entityRenderMap
140 } 140 }
141 141
java/net/minecraft/src/CallableJVMFlags.java
@@ -16,7 +16,7 @@ class CallableJVMFlags implements Callable @@ -16,7 +16,7 @@ class CallableJVMFlags implements Callable
16 CallableJVMFlags(CrashReport par1CrashReport) 16 CallableJVMFlags(CrashReport par1CrashReport)
17 { 17 {
18 this.crashReportJVMFlags = par1CrashReport; 18 this.crashReportJVMFlags = par1CrashReport;
19 - par1CrashReport.addCrashSectionCallable("LiteLoader Mods", new CallableLiteLoaderMods(par1CrashReport)); 19 + par1CrashReport.func_85056_g().addCrashSectionCallable("LiteLoader Mods", new CallableLiteLoaderMods(par1CrashReport));
20 } 20 }
21 21
22 public String func_71487_a() 22 public String func_71487_a()
java/net/minecraft/src/RenderLightningBolt.java
1 package net.minecraft.src; 1 package net.minecraft.src;
2 2
3 import java.util.Random; 3 import java.util.Random;
  4 +
4 import org.lwjgl.opengl.GL11; 5 import org.lwjgl.opengl.GL11;
5 6
6 import com.mumfrey.liteloader.core.LiteLoader; 7 import com.mumfrey.liteloader.core.LiteLoader;
@@ -12,8 +13,8 @@ public class RenderLightningBolt extends Render @@ -12,8 +13,8 @@ public class RenderLightningBolt extends Render
12 // LiteLoader init 13 // LiteLoader init
13 LiteLoader.getInstance(); 14 LiteLoader.getInstance();
14 } 15 }
15 -  
16 - /** 16 +
  17 + /**
17 * Actually renders the lightning bolt. This method is called through the doRender method. 18 * Actually renders the lightning bolt. This method is called through the doRender method.
18 */ 19 */
19 public void doRenderLightningBolt(EntityLightningBolt par1EntityLightningBolt, double par2, double par4, double par6, float par8, float par9) 20 public void doRenderLightningBolt(EntityLightningBolt par1EntityLightningBolt, double par2, double par4, double par6, float par8, float par9)