Commit c4b6db986fc5843633653e90b42cdb837e38f7b8
1 parent
c92c91ea
Liteloader 1.4.4
Showing
10 changed files
with
324 additions
and
92 deletions
.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<P, T> | @@ -130,12 +130,12 @@ public class PrivateFields<P, T> | ||
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) |