Commit c4b6db986fc5843633653e90b42cdb837e38f7b8

Authored by Mumfrey
1 parent c92c91ea

Liteloader 1.4.4

.classpath
... ... @@ -2,23 +2,12 @@
2 2 <classpath>
3 3 <classpathentry kind="src" path="java"/>
4 4 <classpathentry kind="src" path="res"/>
  5 + <classpathentry combineaccessrules="false" kind="src" path="/ClientMods"/>
5 6 <classpathentry combineaccessrules="false" kind="src" path="/Client"/>
6 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 12 <classpathentry kind="output" path="bin"/>
24 13 </classpath>
... ...
.project
... ... @@ -14,13 +14,6 @@
14 14 <natures>
15 15 <nature>org.eclipse.jdt.core.javanature</nature>
16 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 17 <variableList>
25 18 <variable>
26 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 25 @Override
26 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 14 *
15 15 * @author Adam Mummery-Smith
16 16 */
17   -public class LiteLoaderHook extends Profiler
  17 +public class HookProfiler extends Profiler
18 18 {
19 19 /**
20 20 * Logger instance
... ... @@ -24,12 +24,12 @@ public class LiteLoaderHook extends Profiler
24 24 /**
25 25 * LiteLoader instance which will receive callbacks
26 26 */
27   - private LiteLoader core;
  27 + private LiteLoader loader;
28 28  
29 29 /**
30 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 35 * Initialisation done
... ... @@ -57,9 +57,9 @@ public class LiteLoaderHook extends Profiler
57 57 * @param core LiteLoader object which will get callbacks
58 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 63 this.logger = logger;
64 64  
65 65 // Detect optifine (duh!)
... ... @@ -128,13 +128,18 @@ public class LiteLoaderHook extends Profiler
128 128 if (!initDone)
129 129 {
130 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 141 super.startSection(sectionName);
137   -
  142 +
138 143 if (ofProfiler != null)
139 144 {
140 145 try
... ... @@ -160,13 +165,13 @@ public class LiteLoaderHook extends Profiler
160 165 {
161 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 172 super.startSection("litetick");
168 173  
169   - core.onTick(tick);
  174 + loader.onTick(this, tick);
170 175 tick = false;
171 176  
172 177 super.endSection();
... ...
java/com/mumfrey/liteloader/core/LiteLoader.java
... ... @@ -28,26 +28,27 @@ import net.minecraft.src.Timer;
28 28 * LiteLoader is a simple loader which provides tick events to loaded mods
29 29 *
30 30 * @author Adam Mummery-Smith
31   - * @version 1.4.0
  31 + * @version 1.4.4
32 32 */
  33 +@SuppressWarnings("rawtypes")
33 34 public final class LiteLoader implements FilenameFilter
34 35 {
35 36 /**
36 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 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 47 * Minecraft versions that we will load mods for, this will be compared
47 48 * against the version.txt value in mod files to prevent outdated mods being
48 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 54 * LiteLoader is a singleton, this is the singleton instance
... ... @@ -96,6 +97,12 @@ public final class LiteLoader implements FilenameFilter
96 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 106 * List of mods which implement ChatListener interface and will receive chat
100 107 * events
101 108 */
... ... @@ -113,6 +120,11 @@ public final class LiteLoader implements FilenameFilter
113 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 128 * List of mods which implement PluginChannelListener interface
117 129 */
118 130 private LinkedList<PluginChannelListener> pluginChannelListeners = new LinkedList<PluginChannelListener>();
... ... @@ -127,7 +139,12 @@ public final class LiteLoader implements FilenameFilter
127 139 */
128 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 150 * Get the singleton instance of LiteLoader, initialises the loader if necessary
... ... @@ -138,7 +155,10 @@ public final class LiteLoader implements FilenameFilter
138 155 {
139 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 160 instance = new LiteLoader();
  161 + instance.initLoader();
142 162 }
143 163  
144 164 return instance;
... ... @@ -179,26 +199,37 @@ public final class LiteLoader implements FilenameFilter
179 199 */
180 200 private LiteLoader()
181 201 {
  202 + }
  203 +
  204 + private void initLoader()
  205 + {
  206 + if (loaderStartupDone) return;
  207 + loaderStartupDone = true;
  208 +
182 209 // Set up base class overrides
183 210 prepareClassOverrides();
184 211  
185 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 234 private void prepareClassOverrides()
204 235 {
... ... @@ -233,13 +264,18 @@ public final class LiteLoader implements FilenameFilter
233 264  
234 265 outputStream.close();
235 266 resourceInputStream.close();
236   -
  267 +
  268 + logger.info("Defining class override for " + binaryClassName);
237 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 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 283 * Set up reflection methods required by the loader
248 284 */
249 285 @SuppressWarnings("unchecked")
250   - private void prepareLoader()
  286 + private boolean prepareLoader()
251 287 {
252 288 try
253 289 {
... ... @@ -279,12 +315,14 @@ public final class LiteLoader implements FilenameFilter
279 315 FileHandler logFileHandler = new FileHandler(new File(Minecraft.getMinecraftDir(), "LiteLoader.txt").getAbsolutePath());
280 316 if (minecraftLogFormatter != null) logFileHandler.setFormatter(minecraftLogFormatter);
281 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 379 HashMap<String, Class> modsToLoad = null;
342 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 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 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 403 loadMods(modsToLoad);
... ... @@ -421,14 +468,17 @@ public final class LiteLoader implements FilenameFilter
421 468  
422 469 try
423 470 {
  471 + logger.info("Searching protection domain code source...");
  472 +
424 473 File packagePath = new File(LiteLoader.class.getProtectionDomain().getCodeSource().getLocation().toURI());
425   -
426 474 LinkedList<Class> modClasses = getSubclassesFor(packagePath, Minecraft.class.getClassLoader(), LiteMod.class, "LiteMod");
427 475  
428 476 for (Class mod : modClasses)
429 477 {
430 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 483 catch (Throwable th)
434 484 {
... ... @@ -438,6 +488,8 @@ public final class LiteLoader implements FilenameFilter
438 488 // Search through the class path and find mod classes
439 489 for (String classPathPart : classPathEntries)
440 490 {
  491 + logger.info(String.format("Searching %s...", classPathPart));
  492 +
441 493 File packagePath = new File(classPathPart);
442 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 497 {
446 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 504 // Search through mod files and find mod classes
451 505 for (File modFile : modFiles)
452 506 {
  507 + logger.info(String.format("Searching %s...", modFile.getAbsolutePath()));
  508 +
453 509 LinkedList<Class> modClasses = getSubclassesFor(modFile, Minecraft.class.getClassLoader(), LiteMod.class, "LiteMod");
454 510  
455 511 for (Class mod : modClasses)
456 512 {
457 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 519 return modsToLoad;
... ... @@ -468,7 +526,11 @@ public final class LiteLoader implements FilenameFilter
468 526 */
469 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 535 logger.info("Discovered " + modsToLoad.size() + " total mod(s)");
474 536  
... ... @@ -511,32 +573,42 @@ public final class LiteLoader implements FilenameFilter
511 573  
512 574 if (mod instanceof Tickable)
513 575 {
514   - tickListeners.add((Tickable)mod);
  576 + addTickListener((Tickable)mod);
515 577 }
516 578  
517 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 589 if (mod instanceof ChatFilter)
523 590 {
524   - chatFilters.add((ChatFilter)mod);
  591 + addChatFilter((ChatFilter)mod);
525 592 }
526 593  
527 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 604 if (mod instanceof LoginListener)
533 605 {
534   - loginListeners.add((LoginListener)mod);
  606 + addLoginListener((LoginListener)mod);
535 607 }
536 608  
537 609 if (mod instanceof PluginChannelListener)
538 610 {
539   - pluginChannelListeners.add((PluginChannelListener)mod);
  611 + addPluginChannelListener((PluginChannelListener)mod);
540 612 }
541 613  
542 614 loadedModsList += String.format("\n - %s version %s", mod.getName(), mod.getVersion());
... ... @@ -551,7 +623,7 @@ public final class LiteLoader implements FilenameFilter
551 623  
552 624 loadedModsList = String.format("%s loaded mod(s)%s", loadedModsCount, loadedModsList);
553 625 }
554   -
  626 +
555 627 /**
556 628 * Initialise mod hooks
557 629 */
... ... @@ -560,28 +632,35 @@ public final class LiteLoader implements FilenameFilter
560 632 try
561 633 {
562 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 638 HookChat.Register();
566 639 HookChat.RegisterPacketHandler(this);
567 640 }
568 641  
569 642 // Login hook
570   - if (loginListeners.size() > 0)
  643 + if ((preLoginListeners.size() > 0 || loginListeners.size() > 0) && !loginHooked)
571 644 {
  645 + loginHooked = true;
572 646 ModUtilities.registerPacketOverride(1, HookLogin.class);
573 647 HookLogin.loader = this;
574 648 }
575 649  
576 650 // Plugin channels hook
577   - if (pluginChannelListeners.size() > 0)
  651 + if (pluginChannelListeners.size() > 0 && !pluginChannelHooked)
578 652 {
  653 + pluginChannelHooked = true;
579 654 HookPluginChannels.Register();
580 655 HookPluginChannels.RegisterPacketHandler(this);
581 656 }
582 657  
583 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 665 catch (Exception ex)
587 666 {
... ... @@ -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 769 * Enumerate classes on the classpath which are subclasses of the specified
595 770 * class
596 771 *
... ... @@ -762,9 +937,9 @@ public final class LiteLoader implements FilenameFilter
762 937 */
763 938 public void onInit()
764 939 {
765   - if (!initDone)
  940 + if (!lateInitDone)
766 941 {
767   - initDone = true;
  942 + lateInitDone = true;
768 943  
769 944 for (InitCompleteListener initMod : initListeners)
770 945 {
... ... @@ -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 969 * Callback from the tick hook, ticks all tickable mods
786 970 *
787 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 975 float partialTicks = 0.0F;
792 976  
... ... @@ -809,7 +993,9 @@ public final class LiteLoader implements FilenameFilter
809 993 // Iterate tickable mods
810 994 for (Tickable tickable : tickListeners)
811 995 {
  996 + profiler.startSection(tickable.getClass().getSimpleName());
812 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 1018  
833 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 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 130 public T Get() { return Get(null); }
131 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 16 CallableJVMFlags(CrashReport par1CrashReport)
17 17 {
18 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 22 public String func_71487_a()
... ...
java/net/minecraft/src/RenderLightningBolt.java
1 1 package net.minecraft.src;
2 2  
3 3 import java.util.Random;
  4 +
4 5 import org.lwjgl.opengl.GL11;
5 6  
6 7 import com.mumfrey.liteloader.core.LiteLoader;
... ... @@ -12,8 +13,8 @@ public class RenderLightningBolt extends Render
12 13 // LiteLoader init
13 14 LiteLoader.getInstance();
14 15 }
15   -
16   - /**
  16 +
  17 + /**
17 18 * Actually renders the lightning bolt. This method is called through the doRender method.
18 19 */
19 20 public void doRenderLightningBolt(EntityLightningBolt par1EntityLightningBolt, double par2, double par4, double par6, float par8, float par9)
... ...