Commit 34ccde51f499b777cbe30d71c21eaca8df9d8c55
1 parent
71879cd0
Preliminary commit for 1.6.3
+ Merged in launcher code + Refactored events and plugin channels into separate classes + Added HUDRenderListener + Added ClientBrandRetriever support + Added mod disablement support + Cross-thread check in profiler hook
Showing
33 changed files
with
2266 additions
and
1159 deletions
.classpath
@@ -8,5 +8,8 @@ | @@ -8,5 +8,8 @@ | ||
8 | <classpathentry kind="lib" path="/Client/jars/libraries/com/google/code/gson/gson/2.2.2/gson-2.2.2.jar"/> | 8 | <classpathentry kind="lib" path="/Client/jars/libraries/com/google/code/gson/gson/2.2.2/gson-2.2.2.jar"/> |
9 | <classpathentry kind="lib" path="/Client/jars/libraries/com/google/guava/guava/14.0/guava-14.0.jar"/> | 9 | <classpathentry kind="lib" path="/Client/jars/libraries/com/google/guava/guava/14.0/guava-14.0.jar"/> |
10 | <classpathentry kind="lib" path="/Client/jars/libraries/commons-io/commons-io/2.4/commons-io-2.4.jar"/> | 10 | <classpathentry kind="lib" path="/Client/jars/libraries/commons-io/commons-io/2.4/commons-io-2.4.jar"/> |
11 | + <classpathentry kind="lib" path="lib/launchwrapper-1.7.jar"/> | ||
12 | + <classpathentry kind="lib" path="lib/jopt-simple-4.5.jar"/> | ||
13 | + <classpathentry kind="src" path="run"/> | ||
11 | <classpathentry kind="output" path="bin"/> | 14 | <classpathentry kind="output" path="bin"/> |
12 | </classpath> | 15 | </classpath> |
ant/build_liteloader.xml
@@ -4,14 +4,14 @@ | @@ -4,14 +4,14 @@ | ||
4 | <taskdef resource="net/sf/antcontrib/antcontrib.properties"/> | 4 | <taskdef resource="net/sf/antcontrib/antcontrib.properties"/> |
5 | 5 | ||
6 | <!-- Versions !!IMPORTANT --> | 6 | <!-- Versions !!IMPORTANT --> |
7 | - <property name="version" value="1.6.2" /> | ||
8 | - <property name="mcversion" value="1.6.2" /> | 7 | + <property name="version" value="1.6.3" /> |
8 | + <property name="mcversion" value="1.6.3" /> | ||
9 | <property name="author" value="Mumfrey" /> | 9 | <property name="author" value="Mumfrey" /> |
10 | 10 | ||
11 | <!-- Project definitions and dependencies --> | 11 | <!-- Project definitions and dependencies --> |
12 | - <property name="upstream" value="LiteLoader,LegacyLauncher" /> | ||
13 | - <property name="project" value="LiteLoaderLauncher" /> | ||
14 | - <property name="md5set" value="legacylauncher" /> | 12 | + <property name="upstream" value="" /> |
13 | + <property name="project" value="LiteLoader" /> | ||
14 | + <property name="md5set" value="mcp" /> | ||
15 | <property name="outmd5set" value="liteloader" /> | 15 | <property name="outmd5set" value="liteloader" /> |
16 | 16 | ||
17 | <property name="mcp.dir" location="../../.." /> | 17 | <property name="mcp.dir" location="../../.." /> |
@@ -21,6 +21,7 @@ | @@ -21,6 +21,7 @@ | ||
21 | <property name="temp" location="${mcp.dir}/temp" /> | 21 | <property name="temp" location="${mcp.dir}/temp" /> |
22 | <property name="md5.dir" location="${mcp.dir}/md5" /> | 22 | <property name="md5.dir" location="${mcp.dir}/md5" /> |
23 | <property name="mc.src" location="${mcp.dir}/src/mcp" /> | 23 | <property name="mc.src" location="${mcp.dir}/src/mcp" /> |
24 | + <property name="libs" location="${mcp.dir}/lib" /> | ||
24 | 25 | ||
25 | <property name="dist.dir" location="${build}/dist" /> | 26 | <property name="dist.dir" location="${build}/dist" /> |
26 | <property name="stage.dir" location="${build}/stage/${ant.project.name}/${version}" /> | 27 | <property name="stage.dir" location="${build}/stage/${ant.project.name}/${version}" /> |
@@ -62,6 +63,10 @@ | @@ -62,6 +63,10 @@ | ||
62 | <target name="prepare" description="Prepare source for MCP" depends="preparemd5"> | 63 | <target name="prepare" description="Prepare source for MCP" depends="preparemd5"> |
63 | <echo level="info" message="Prepare sources for compile" /> | 64 | <echo level="info" message="Prepare sources for compile" /> |
64 | 65 | ||
66 | + <copy todir="${libs}" verbose="true" overwrite="true"> | ||
67 | + <fileset dir="${eclipse}/LiteLoader/lib" /> | ||
68 | + </copy> | ||
69 | + | ||
65 | <copy todir="${src}" verbose="false" overwrite="true"> | 70 | <copy todir="${src}" verbose="false" overwrite="true"> |
66 | <fileset dir="${mc.src}" /> | 71 | <fileset dir="${mc.src}" /> |
67 | </copy> | 72 | </copy> |
java/com/mumfrey/liteloader/HUDRenderListener.java
0 → 100644
1 | +package com.mumfrey.liteloader; | ||
2 | + | ||
3 | +/** | ||
4 | + * Interface for mods which want callbacks when the HUD is rendered | ||
5 | + * | ||
6 | + * @author Adam Mummery-Smith | ||
7 | + */ | ||
8 | +public interface HUDRenderListener | ||
9 | +{ | ||
10 | + public abstract void onPreRenderHUD(int screenWidth, int screenHeight); | ||
11 | + | ||
12 | + public abstract void onPostRenderHUD(int screenWidth, int screenHeight); | ||
13 | +} |
java/com/mumfrey/liteloader/core/ClassPathMod.java
@@ -35,10 +35,12 @@ public class ClassPathMod extends ModFile | @@ -35,10 +35,12 @@ public class ClassPathMod extends ModFile | ||
35 | { | 35 | { |
36 | if (this.isDirectory()) | 36 | if (this.isDirectory()) |
37 | { | 37 | { |
38 | + LiteLoader.getLogger().info(String.format("Registering \"%s/%s\" as mod resource pack with identifier \"%s\"", this.getParentFile().getName(), this.getName(), name)); | ||
38 | this.resourcePack = new ModResourcePackDir(name, this); | 39 | this.resourcePack = new ModResourcePackDir(name, this); |
39 | } | 40 | } |
40 | else | 41 | else |
41 | { | 42 | { |
43 | + LiteLoader.getLogger().info(String.format("Registering \"%s\" as mod resource pack with identifier \"%s\"", this.getName(), name)); | ||
42 | this.resourcePack = new ModResourcePack(name, this); | 44 | this.resourcePack = new ModResourcePack(name, this); |
43 | } | 45 | } |
44 | 46 |
java/com/mumfrey/liteloader/core/EnabledModsList.java
0 → 100644
1 | +package com.mumfrey.liteloader.core; | ||
2 | + | ||
3 | +import java.io.File; | ||
4 | +import java.io.FileReader; | ||
5 | +import java.io.FileWriter; | ||
6 | +import java.io.IOException; | ||
7 | +import java.util.List; | ||
8 | +import java.util.Map; | ||
9 | +import java.util.TreeMap; | ||
10 | + | ||
11 | +import com.google.gson.Gson; | ||
12 | +import com.google.gson.GsonBuilder; | ||
13 | + | ||
14 | +public class EnabledModsList | ||
15 | +{ | ||
16 | + private static transient Gson gson = new GsonBuilder().setPrettyPrinting().create(); | ||
17 | + | ||
18 | + private TreeMap<String, TreeMap<String, Boolean>> mods; | ||
19 | + | ||
20 | + private transient Boolean defaultEnabledValue = Boolean.TRUE; | ||
21 | + | ||
22 | + private transient boolean allowSave = true; | ||
23 | + | ||
24 | + private EnabledModsList() | ||
25 | + { | ||
26 | + } | ||
27 | + | ||
28 | + public boolean isEnabled(String profileName, String name) | ||
29 | + { | ||
30 | + Map<String, Boolean> profile = this.getProfile(profileName); | ||
31 | + name = name.toLowerCase().trim(); | ||
32 | + | ||
33 | + if (!profile.containsKey(name)) | ||
34 | + { | ||
35 | + profile.put(name, this.defaultEnabledValue); | ||
36 | + } | ||
37 | + | ||
38 | + return profile.get(name); | ||
39 | + } | ||
40 | + | ||
41 | + public void setEnabled(String profileName, String name, boolean enabled) | ||
42 | + { | ||
43 | + Map<String, Boolean> profile = this.getProfile(profileName); | ||
44 | + profile.put(name.toLowerCase().trim(), Boolean.valueOf(enabled)); | ||
45 | + | ||
46 | + this.allowSave = true; | ||
47 | + } | ||
48 | + | ||
49 | + public void processModsList(String profileName, List<String> modNameFilter) | ||
50 | + { | ||
51 | + Map<String, Boolean> profile = this.getProfile(profileName); | ||
52 | + | ||
53 | + try | ||
54 | + { | ||
55 | + if (modNameFilter != null) | ||
56 | + { | ||
57 | + for (String modName : profile.keySet()) | ||
58 | + { | ||
59 | + profile.put(modName, Boolean.FALSE); | ||
60 | + } | ||
61 | + | ||
62 | + this.defaultEnabledValue = Boolean.FALSE; | ||
63 | + this.allowSave = false; | ||
64 | + | ||
65 | + for (String filterEntry : modNameFilter) | ||
66 | + { | ||
67 | + profile.put(filterEntry.toLowerCase().trim(), Boolean.TRUE); | ||
68 | + } | ||
69 | + } | ||
70 | + } | ||
71 | + catch (Exception ex) | ||
72 | + { | ||
73 | + this.defaultEnabledValue = Boolean.TRUE; | ||
74 | + this.allowSave = true; | ||
75 | + } | ||
76 | + } | ||
77 | + | ||
78 | + private Map<String, Boolean> getProfile(String profileName) | ||
79 | + { | ||
80 | + if (this.mods == null) this.mods = new TreeMap<String, TreeMap<String,Boolean>>(); | ||
81 | + | ||
82 | + if (!this.mods.containsKey(profileName)) | ||
83 | + { | ||
84 | + this.mods.put(profileName, new TreeMap<String, Boolean>()); | ||
85 | + } | ||
86 | + | ||
87 | + return this.mods.get(profileName); | ||
88 | + } | ||
89 | + | ||
90 | + public static EnabledModsList createFrom(File file) | ||
91 | + { | ||
92 | + if (file.exists()) | ||
93 | + { | ||
94 | + FileReader reader = null; | ||
95 | + | ||
96 | + try | ||
97 | + { | ||
98 | + reader = new FileReader(file); | ||
99 | + EnabledModsList instance = gson.fromJson(reader, EnabledModsList.class); | ||
100 | + return instance; | ||
101 | + } | ||
102 | + catch (Exception ex) | ||
103 | + { | ||
104 | + ex.printStackTrace(); | ||
105 | + } | ||
106 | + finally | ||
107 | + { | ||
108 | + try | ||
109 | + { | ||
110 | + if (reader != null) | ||
111 | + reader.close(); | ||
112 | + } | ||
113 | + catch (IOException ex) | ||
114 | + { | ||
115 | + ex.printStackTrace(); | ||
116 | + } | ||
117 | + } | ||
118 | + } | ||
119 | + | ||
120 | + return new EnabledModsList(); | ||
121 | + } | ||
122 | + | ||
123 | + public void saveTo(File file) | ||
124 | + { | ||
125 | + if (!this.allowSave) return; | ||
126 | + | ||
127 | + FileWriter writer = null; | ||
128 | + | ||
129 | + try | ||
130 | + { | ||
131 | + writer = new FileWriter(file); | ||
132 | + gson.toJson(this, writer); | ||
133 | + } | ||
134 | + catch (Exception ex) | ||
135 | + { | ||
136 | + ex.printStackTrace(); | ||
137 | + } | ||
138 | + finally | ||
139 | + { | ||
140 | + try | ||
141 | + { | ||
142 | + if (writer != null) | ||
143 | + writer.close(); | ||
144 | + } | ||
145 | + catch (IOException ex) | ||
146 | + { | ||
147 | + ex.printStackTrace(); | ||
148 | + } | ||
149 | + } | ||
150 | + } | ||
151 | +} |
java/com/mumfrey/liteloader/core/Events.java
0 → 100644
1 | +package com.mumfrey.liteloader.core; | ||
2 | + | ||
3 | +import java.util.LinkedList; | ||
4 | +import java.util.logging.Level; | ||
5 | + | ||
6 | +import net.minecraft.src.*; | ||
7 | + | ||
8 | +import com.mumfrey.liteloader.*; | ||
9 | +import com.mumfrey.liteloader.Tickable; | ||
10 | +import com.mumfrey.liteloader.core.hooks.HookChat; | ||
11 | +import com.mumfrey.liteloader.core.hooks.HookLogin; | ||
12 | +import com.mumfrey.liteloader.core.hooks.HookProfiler; | ||
13 | +import com.mumfrey.liteloader.util.ModUtilities; | ||
14 | +import com.mumfrey.liteloader.util.PrivateFields; | ||
15 | + | ||
16 | +/** | ||
17 | + * | ||
18 | + * @author Adam Mummery-Smith | ||
19 | + */ | ||
20 | +public class Events implements IPlayerUsage | ||
21 | +{ | ||
22 | + /** | ||
23 | + * Reference to the loader instance | ||
24 | + */ | ||
25 | + private LiteLoader loader; | ||
26 | + | ||
27 | + /** | ||
28 | + * Reference to the game | ||
29 | + */ | ||
30 | + private Minecraft minecraft; | ||
31 | + | ||
32 | + /** | ||
33 | + * Plugin channel manager | ||
34 | + */ | ||
35 | + private PluginChannels pluginChannels; | ||
36 | + | ||
37 | + /** | ||
38 | + * Reference to the minecraft timer | ||
39 | + */ | ||
40 | + private Timer minecraftTimer; | ||
41 | + | ||
42 | + /** | ||
43 | + * Flags which keep track of whether hooks have been applied | ||
44 | + */ | ||
45 | + private boolean hookInitDone, lateInitDone, chatHooked, loginHooked, tickHooked; | ||
46 | + | ||
47 | + /** | ||
48 | + * Profiler hook objects | ||
49 | + */ | ||
50 | + private HookProfiler profilerHook = new HookProfiler(this); | ||
51 | + | ||
52 | + /** | ||
53 | + * ScaledResolution used by the pre-chat and post-chat render callbacks | ||
54 | + */ | ||
55 | + private ScaledResolution currentResolution; | ||
56 | + | ||
57 | + /** | ||
58 | + * Current screen width | ||
59 | + */ | ||
60 | + private int screenWidth = 854; | ||
61 | + | ||
62 | + /** | ||
63 | + * Current screen height | ||
64 | + */ | ||
65 | + private int screenHeight = 480; | ||
66 | + | ||
67 | + | ||
68 | + /** | ||
69 | + * List of mods which implement Tickable interface and will receive tick | ||
70 | + * events | ||
71 | + */ | ||
72 | + private LinkedList<Tickable> tickListeners = new LinkedList<Tickable>(); | ||
73 | + | ||
74 | + /** | ||
75 | + * List of mods which implement the GameLoopListener interface and will | ||
76 | + * receive loop events | ||
77 | + */ | ||
78 | + private LinkedList<GameLoopListener> loopListeners = new LinkedList<GameLoopListener>(); | ||
79 | + | ||
80 | + /** | ||
81 | + * | ||
82 | + */ | ||
83 | + private LinkedList<InitCompleteListener> initListeners = new LinkedList<InitCompleteListener>(); | ||
84 | + | ||
85 | + /** | ||
86 | + * List of mods which implement RenderListener interface and will receive | ||
87 | + * render events events | ||
88 | + */ | ||
89 | + private LinkedList<RenderListener> renderListeners = new LinkedList<RenderListener>(); | ||
90 | + | ||
91 | + /** | ||
92 | + * List of mods which implement the PostRenderListener interface and want to | ||
93 | + * render entities | ||
94 | + */ | ||
95 | + private LinkedList<PostRenderListener> postRenderListeners = new LinkedList<PostRenderListener>(); | ||
96 | + | ||
97 | + /** | ||
98 | + * List of mods which implement HUDRenderListener and want callbacks when HUD is rendered | ||
99 | + */ | ||
100 | + private LinkedList<HUDRenderListener> hudRenderListeners = new LinkedList<HUDRenderListener>(); | ||
101 | + | ||
102 | + /** | ||
103 | + * List of mods which implement ChatRenderListener and want to know when | ||
104 | + * chat is rendered | ||
105 | + */ | ||
106 | + private LinkedList<ChatRenderListener> chatRenderListeners = new LinkedList<ChatRenderListener>(); | ||
107 | + | ||
108 | + /** | ||
109 | + * List of mods which implement ChatListener interface and will receive chat | ||
110 | + * events | ||
111 | + */ | ||
112 | + private LinkedList<ChatListener> chatListeners = new LinkedList<ChatListener>(); | ||
113 | + | ||
114 | + /** | ||
115 | + * List of mods which implement ChatFilter interface and will receive chat | ||
116 | + * filter events | ||
117 | + */ | ||
118 | + private LinkedList<ChatFilter> chatFilters = new LinkedList<ChatFilter>(); | ||
119 | + | ||
120 | + /** | ||
121 | + * List of mods which implement LoginListener interface and will receive | ||
122 | + * client login events | ||
123 | + */ | ||
124 | + private LinkedList<LoginListener> loginListeners = new LinkedList<LoginListener>(); | ||
125 | + | ||
126 | + /** | ||
127 | + * List of mods which implement LoginListener interface and will receive | ||
128 | + * client login events | ||
129 | + */ | ||
130 | + private LinkedList<PreLoginListener> preLoginListeners = new LinkedList<PreLoginListener>(); | ||
131 | + | ||
132 | + public Events(LiteLoader loader, Minecraft minecraft, PluginChannels pluginChannels) | ||
133 | + { | ||
134 | + this.loader = loader; | ||
135 | + this.minecraft = minecraft; | ||
136 | + this.pluginChannels = pluginChannels; | ||
137 | + } | ||
138 | + | ||
139 | + /** | ||
140 | + * Add a listener to the relevant listener lists | ||
141 | + * | ||
142 | + * @param listener | ||
143 | + */ | ||
144 | + public void addListener(LiteMod listener) | ||
145 | + { | ||
146 | + if (listener instanceof Tickable) | ||
147 | + { | ||
148 | + this.addTickListener((Tickable)listener); | ||
149 | + } | ||
150 | + | ||
151 | + if (listener instanceof GameLoopListener) | ||
152 | + { | ||
153 | + this.addLoopListener((GameLoopListener)listener); | ||
154 | + } | ||
155 | + | ||
156 | + if (listener instanceof InitCompleteListener) | ||
157 | + { | ||
158 | + this.addInitListener((InitCompleteListener)listener); | ||
159 | + } | ||
160 | + | ||
161 | + if (listener instanceof RenderListener) | ||
162 | + { | ||
163 | + this.addRenderListener((RenderListener)listener); | ||
164 | + } | ||
165 | + | ||
166 | + if (listener instanceof PostRenderListener) | ||
167 | + { | ||
168 | + this.addPostRenderListener((PostRenderListener)listener); | ||
169 | + } | ||
170 | + | ||
171 | + if (listener instanceof ChatFilter) | ||
172 | + { | ||
173 | + this.addChatFilter((ChatFilter)listener); | ||
174 | + } | ||
175 | + | ||
176 | + if (listener instanceof ChatListener) | ||
177 | + { | ||
178 | + if (listener instanceof ChatFilter) | ||
179 | + { | ||
180 | + LiteLoader.getLogger().warning(String.format("Interface error initialising mod '%1s'. A mod implementing ChatFilter and ChatListener is not supported! Remove one of these interfaces", listener.getName())); | ||
181 | + } | ||
182 | + else | ||
183 | + { | ||
184 | + this.addChatListener((ChatListener)listener); | ||
185 | + } | ||
186 | + } | ||
187 | + | ||
188 | + if (listener instanceof ChatRenderListener) | ||
189 | + { | ||
190 | + this.addChatRenderListener((ChatRenderListener)listener); | ||
191 | + } | ||
192 | + | ||
193 | + if (listener instanceof HUDRenderListener) | ||
194 | + { | ||
195 | + this.addHUDRenderListener((HUDRenderListener)listener); | ||
196 | + } | ||
197 | + | ||
198 | + if (listener instanceof PreLoginListener) | ||
199 | + { | ||
200 | + this.addPreLoginListener((PreLoginListener)listener); | ||
201 | + } | ||
202 | + | ||
203 | + if (listener instanceof LoginListener) | ||
204 | + { | ||
205 | + this.addLoginListener((LoginListener)listener); | ||
206 | + } | ||
207 | + | ||
208 | + if (listener instanceof PluginChannelListener) | ||
209 | + { | ||
210 | + this.pluginChannels.addPluginChannelListener((PluginChannelListener)listener); | ||
211 | + } | ||
212 | + } | ||
213 | + | ||
214 | + | ||
215 | + /** | ||
216 | + * Initialise mod hooks | ||
217 | + */ | ||
218 | + public void initHooks() | ||
219 | + { | ||
220 | + try | ||
221 | + { | ||
222 | + LiteLoader.getLogger().info("Event manager is registering hooks"); | ||
223 | + | ||
224 | + // Chat hook | ||
225 | + if ((this.chatListeners.size() > 0 || this.chatFilters.size() > 0) && !this.chatHooked) | ||
226 | + { | ||
227 | + this.chatHooked = true; | ||
228 | + HookChat.register(); | ||
229 | + HookChat.registerPacketHandler(this); | ||
230 | + } | ||
231 | + | ||
232 | + // Login hook | ||
233 | + if ((this.preLoginListeners.size() > 0 || this.loginListeners.size() > 0) && !this.loginHooked) | ||
234 | + { | ||
235 | + this.loginHooked = true; | ||
236 | + ModUtilities.registerPacketOverride(1, HookLogin.class); | ||
237 | + HookLogin.events = this; | ||
238 | + } | ||
239 | + | ||
240 | + // Tick hook | ||
241 | + if (!this.tickHooked) | ||
242 | + { | ||
243 | + this.tickHooked = true; | ||
244 | + PrivateFields.minecraftProfiler.setFinal(this.minecraft, this.profilerHook); | ||
245 | + } | ||
246 | + | ||
247 | + // Sanity hook | ||
248 | + PlayerUsageSnooper snooper = this.minecraft.getPlayerUsageSnooper(); | ||
249 | + PrivateFields.playerStatsCollector.setFinal(snooper, this); | ||
250 | + | ||
251 | + this.pluginChannels.initHook(); | ||
252 | + } | ||
253 | + catch (Exception ex) | ||
254 | + { | ||
255 | + LiteLoader.getLogger().log(Level.WARNING, "Error creating hooks", ex); | ||
256 | + ex.printStackTrace(); | ||
257 | + } | ||
258 | + | ||
259 | + this.hookInitDone = true; | ||
260 | + } | ||
261 | + | ||
262 | + /** | ||
263 | + * @param tickable | ||
264 | + */ | ||
265 | + public void addTickListener(Tickable tickable) | ||
266 | + { | ||
267 | + if (!this.tickListeners.contains(tickable)) | ||
268 | + { | ||
269 | + this.tickListeners.add(tickable); | ||
270 | + if (this.hookInitDone) | ||
271 | + this.initHooks(); | ||
272 | + } | ||
273 | + } | ||
274 | + | ||
275 | + /** | ||
276 | + * @param loopListener | ||
277 | + */ | ||
278 | + public void addLoopListener(GameLoopListener loopListener) | ||
279 | + { | ||
280 | + if (!this.loopListeners.contains(loopListener)) | ||
281 | + { | ||
282 | + this.loopListeners.add(loopListener); | ||
283 | + if (this.hookInitDone) | ||
284 | + this.initHooks(); | ||
285 | + } | ||
286 | + } | ||
287 | + | ||
288 | + /** | ||
289 | + * @param initCompleteListener | ||
290 | + */ | ||
291 | + public void addInitListener(InitCompleteListener initCompleteListener) | ||
292 | + { | ||
293 | + if (!this.initListeners.contains(initCompleteListener)) | ||
294 | + { | ||
295 | + this.initListeners.add(initCompleteListener); | ||
296 | + if (this.hookInitDone) | ||
297 | + this.initHooks(); | ||
298 | + } | ||
299 | + } | ||
300 | + | ||
301 | + /** | ||
302 | + * @param renderListener | ||
303 | + */ | ||
304 | + public void addRenderListener(RenderListener renderListener) | ||
305 | + { | ||
306 | + if (!this.renderListeners.contains(renderListener)) | ||
307 | + { | ||
308 | + this.renderListeners.add(renderListener); | ||
309 | + if (this.hookInitDone) | ||
310 | + this.initHooks(); | ||
311 | + } | ||
312 | + } | ||
313 | + | ||
314 | + /** | ||
315 | + * @param postRenderListener | ||
316 | + */ | ||
317 | + public void addPostRenderListener(PostRenderListener postRenderListener) | ||
318 | + { | ||
319 | + if (!this.postRenderListeners.contains(postRenderListener)) | ||
320 | + { | ||
321 | + this.postRenderListeners.add(postRenderListener); | ||
322 | + if (this.hookInitDone) | ||
323 | + this.initHooks(); | ||
324 | + } | ||
325 | + } | ||
326 | + | ||
327 | + /** | ||
328 | + * @param chatFilter | ||
329 | + */ | ||
330 | + public void addChatFilter(ChatFilter chatFilter) | ||
331 | + { | ||
332 | + if (!this.chatFilters.contains(chatFilter)) | ||
333 | + { | ||
334 | + this.chatFilters.add(chatFilter); | ||
335 | + if (this.hookInitDone) | ||
336 | + this.initHooks(); | ||
337 | + } | ||
338 | + } | ||
339 | + | ||
340 | + /** | ||
341 | + * @param chatListener | ||
342 | + */ | ||
343 | + public void addChatListener(ChatListener chatListener) | ||
344 | + { | ||
345 | + if (!this.chatListeners.contains(chatListener)) | ||
346 | + { | ||
347 | + this.chatListeners.add(chatListener); | ||
348 | + if (this.hookInitDone) | ||
349 | + this.initHooks(); | ||
350 | + } | ||
351 | + } | ||
352 | + | ||
353 | + /** | ||
354 | + * @param chatRenderListener | ||
355 | + */ | ||
356 | + public void addChatRenderListener(ChatRenderListener chatRenderListener) | ||
357 | + { | ||
358 | + if (!this.chatRenderListeners.contains(chatRenderListener)) | ||
359 | + { | ||
360 | + this.chatRenderListeners.add(chatRenderListener); | ||
361 | + if (this.hookInitDone) | ||
362 | + this.initHooks(); | ||
363 | + } | ||
364 | + } | ||
365 | + | ||
366 | + /** | ||
367 | + * @param hudRenderListener | ||
368 | + */ | ||
369 | + public void addHUDRenderListener(HUDRenderListener hudRenderListener) | ||
370 | + { | ||
371 | + if (!this.hudRenderListeners.contains(hudRenderListener)) | ||
372 | + { | ||
373 | + this.hudRenderListeners.add(hudRenderListener); | ||
374 | + if (this.hookInitDone) | ||
375 | + this.initHooks(); | ||
376 | + } | ||
377 | + } | ||
378 | + | ||
379 | + /** | ||
380 | + * @param loginListener | ||
381 | + */ | ||
382 | + public void addPreLoginListener(PreLoginListener loginListener) | ||
383 | + { | ||
384 | + if (!this.preLoginListeners.contains(loginListener)) | ||
385 | + { | ||
386 | + this.preLoginListeners.add(loginListener); | ||
387 | + if (this.hookInitDone) | ||
388 | + this.initHooks(); | ||
389 | + } | ||
390 | + } | ||
391 | + | ||
392 | + /** | ||
393 | + * @param loginListener | ||
394 | + */ | ||
395 | + public void addLoginListener(LoginListener loginListener) | ||
396 | + { | ||
397 | + if (!this.loginListeners.contains(loginListener)) | ||
398 | + { | ||
399 | + this.loginListeners.add(loginListener); | ||
400 | + if (this.hookInitDone) | ||
401 | + this.initHooks(); | ||
402 | + } | ||
403 | + } | ||
404 | + | ||
405 | + /** | ||
406 | + * Late initialisation callback | ||
407 | + */ | ||
408 | + public void onInit() | ||
409 | + { | ||
410 | + this.loader.refreshResources(); | ||
411 | + | ||
412 | + if (!this.lateInitDone) | ||
413 | + { | ||
414 | + this.lateInitDone = true; | ||
415 | + | ||
416 | + for (InitCompleteListener initMod : this.initListeners) | ||
417 | + { | ||
418 | + try | ||
419 | + { | ||
420 | + LiteLoader.getLogger().info("Calling late init for mod " + initMod.getName()); | ||
421 | + initMod.onInitCompleted(this.minecraft, this.loader); | ||
422 | + } | ||
423 | + catch (Throwable th) | ||
424 | + { | ||
425 | + LiteLoader.getLogger().log(Level.WARNING, "Error initialising mod " + initMod.getName(), th); | ||
426 | + } | ||
427 | + } | ||
428 | + } | ||
429 | + | ||
430 | + this.loader.onInit(); | ||
431 | + } | ||
432 | + | ||
433 | + /** | ||
434 | + * Callback from the tick hook, pre render | ||
435 | + */ | ||
436 | + public void onRender() | ||
437 | + { | ||
438 | + this.loader.onRender(); | ||
439 | + | ||
440 | + for (RenderListener renderListener : this.renderListeners) | ||
441 | + renderListener.onRender(); | ||
442 | + } | ||
443 | + | ||
444 | + /** | ||
445 | + * Callback from the tick hook, post render entities | ||
446 | + */ | ||
447 | + public void postRenderEntities() | ||
448 | + { | ||
449 | + float partialTicks = (this.minecraftTimer != null) ? this.minecraftTimer.elapsedPartialTicks : 0.0F; | ||
450 | + | ||
451 | + for (PostRenderListener renderListener : this.postRenderListeners) | ||
452 | + renderListener.onPostRenderEntities(partialTicks); | ||
453 | + } | ||
454 | + | ||
455 | + /** | ||
456 | + * Callback from the tick hook, post render | ||
457 | + */ | ||
458 | + public void postRender() | ||
459 | + { | ||
460 | + float partialTicks = (this.minecraftTimer != null) ? this.minecraftTimer.elapsedPartialTicks : 0.0F; | ||
461 | + | ||
462 | + for (PostRenderListener renderListener : this.postRenderListeners) | ||
463 | + renderListener.onPostRender(partialTicks); | ||
464 | + } | ||
465 | + | ||
466 | + /** | ||
467 | + * Called immediately before the current GUI is rendered | ||
468 | + */ | ||
469 | + public void preRenderGUI() | ||
470 | + { | ||
471 | + for (RenderListener renderListener : this.renderListeners) | ||
472 | + renderListener.onRenderGui(this.minecraft.currentScreen); | ||
473 | + } | ||
474 | + | ||
475 | + /** | ||
476 | + * Called immediately after the world/camera transform is initialised | ||
477 | + */ | ||
478 | + public void onSetupCameraTransform() | ||
479 | + { | ||
480 | + for (RenderListener renderListener : this.renderListeners) | ||
481 | + renderListener.onSetupCameraTransform(); | ||
482 | + } | ||
483 | + | ||
484 | + /** | ||
485 | + * Called immediately before the chat log is rendered | ||
486 | + */ | ||
487 | + public void onRenderChat() | ||
488 | + { | ||
489 | + GuiNewChat chat = this.minecraft.ingameGUI.getChatGUI(); | ||
490 | + | ||
491 | + for (ChatRenderListener chatRenderListener : this.chatRenderListeners) | ||
492 | + chatRenderListener.onPreRenderChat(this.screenWidth, this.screenHeight, chat); | ||
493 | + } | ||
494 | + | ||
495 | + /** | ||
496 | + * Called immediately after the chat log is rendered | ||
497 | + */ | ||
498 | + public void postRenderChat() | ||
499 | + { | ||
500 | + GuiNewChat chat = this.minecraft.ingameGUI.getChatGUI(); | ||
501 | + | ||
502 | + for (ChatRenderListener chatRenderListener : this.chatRenderListeners) | ||
503 | + chatRenderListener.onPostRenderChat(this.screenWidth, this.screenHeight, chat); | ||
504 | + } | ||
505 | + | ||
506 | + /** | ||
507 | + * Callback when about to render the HUD | ||
508 | + */ | ||
509 | + public void onRenderHUD() | ||
510 | + { | ||
511 | + this.currentResolution = new ScaledResolution(this.minecraft.gameSettings, this.minecraft.displayWidth, this.minecraft.displayHeight); | ||
512 | + this.screenWidth = this.currentResolution.getScaledWidth(); | ||
513 | + this.screenHeight = this.currentResolution.getScaledHeight(); | ||
514 | + | ||
515 | + if (!this.minecraft.gameSettings.hideGUI || this.minecraft.currentScreen != null) | ||
516 | + { | ||
517 | + for (HUDRenderListener hudRenderListener : this.hudRenderListeners) | ||
518 | + hudRenderListener.onPreRenderHUD(this.screenWidth, this.screenHeight); | ||
519 | + } | ||
520 | + } | ||
521 | + | ||
522 | + /** | ||
523 | + * Callback when the HUD has just been rendered | ||
524 | + */ | ||
525 | + public void postRenderHUD() | ||
526 | + { | ||
527 | + if (!this.minecraft.gameSettings.hideGUI || this.minecraft.currentScreen != null) | ||
528 | + { | ||
529 | + for (HUDRenderListener hudRenderListener : this.hudRenderListeners) | ||
530 | + hudRenderListener.onPostRenderHUD(this.screenWidth, this.screenHeight); | ||
531 | + } | ||
532 | + } | ||
533 | + | ||
534 | + /** | ||
535 | + * Callback from the tick hook, called every frame when the timer is updated | ||
536 | + */ | ||
537 | + public void onTimerUpdate() | ||
538 | + { | ||
539 | + for (GameLoopListener loopListener : this.loopListeners) | ||
540 | + loopListener.onRunGameLoop(this.minecraft); | ||
541 | + } | ||
542 | + | ||
543 | + /** | ||
544 | + * Callback from the tick hook, ticks all tickable mods | ||
545 | + * | ||
546 | + * @param clock True if this is a new tick (otherwise it's just a new frame) | ||
547 | + */ | ||
548 | + public void onTick(Profiler profiler, boolean clock) | ||
549 | + { | ||
550 | + float partialTicks = 0.0F; | ||
551 | + | ||
552 | + // Try to get the minecraft timer object and determine the value of the | ||
553 | + // partialTicks | ||
554 | + if (clock || this.minecraftTimer == null) | ||
555 | + { | ||
556 | + this.minecraftTimer = PrivateFields.minecraftTimer.get(this.minecraft); | ||
557 | + } | ||
558 | + | ||
559 | + // Hooray, we got the timer reference | ||
560 | + if (this.minecraftTimer != null) | ||
561 | + { | ||
562 | + partialTicks = this.minecraftTimer.renderPartialTicks; | ||
563 | + clock = this.minecraftTimer.elapsedTicks > 0; | ||
564 | + } | ||
565 | + | ||
566 | + // Flag indicates whether we are in game at the moment | ||
567 | + boolean inGame = this.minecraft.renderViewEntity != null && this.minecraft.renderViewEntity.worldObj != null; | ||
568 | + | ||
569 | + if (clock) | ||
570 | + { | ||
571 | + this.loader.onTick(partialTicks, inGame); | ||
572 | + } | ||
573 | + | ||
574 | + // Iterate tickable mods | ||
575 | + for (Tickable tickable : this.tickListeners) | ||
576 | + { | ||
577 | + profiler.startSection(tickable.getClass().getSimpleName()); | ||
578 | + tickable.onTick(this.minecraft, partialTicks, inGame, clock); | ||
579 | + profiler.endSection(); | ||
580 | + } | ||
581 | + } | ||
582 | + | ||
583 | + /** | ||
584 | + * Callback from the chat hook | ||
585 | + * | ||
586 | + * @param chatPacket | ||
587 | + * @return | ||
588 | + */ | ||
589 | + public boolean onChat(Packet3Chat chatPacket) | ||
590 | + { | ||
591 | + if (chatPacket.message == null) | ||
592 | + return true; | ||
593 | + | ||
594 | + ChatMessageComponent chat = ChatMessageComponent.createFromJson(chatPacket.message); | ||
595 | + String message = chat.toStringWithFormatting(true); | ||
596 | + | ||
597 | + // Chat filters get a stab at the chat first, if any filter returns | ||
598 | + // false the chat is discarded | ||
599 | + for (ChatFilter chatFilter : this.chatFilters) | ||
600 | + { | ||
601 | + if (chatFilter.onChat(chatPacket, chat, message)) | ||
602 | + { | ||
603 | + chat = ChatMessageComponent.createFromJson(chatPacket.message); | ||
604 | + message = chat.toStringWithFormatting(true); | ||
605 | + } | ||
606 | + else | ||
607 | + { | ||
608 | + return false; | ||
609 | + } | ||
610 | + } | ||
611 | + | ||
612 | + // Chat listeners get the chat if no filter removed it | ||
613 | + for (ChatListener chatListener : this.chatListeners) | ||
614 | + chatListener.onChat(chat, message); | ||
615 | + | ||
616 | + return true; | ||
617 | + } | ||
618 | + | ||
619 | + /** | ||
620 | + * Pre-login callback from the login hook | ||
621 | + * | ||
622 | + * @param netHandler | ||
623 | + * @param hookLogin | ||
624 | + * @return | ||
625 | + */ | ||
626 | + public boolean onPreLogin(NetHandler netHandler, Packet1Login loginPacket) | ||
627 | + { | ||
628 | + boolean cancelled = false; | ||
629 | + | ||
630 | + for (PreLoginListener loginListener : this.preLoginListeners) | ||
631 | + { | ||
632 | + cancelled |= !loginListener.onPreLogin(netHandler, loginPacket); | ||
633 | + } | ||
634 | + | ||
635 | + return !cancelled; | ||
636 | + } | ||
637 | + | ||
638 | + /** | ||
639 | + * Callback from the login hook | ||
640 | + * | ||
641 | + * @param netHandler | ||
642 | + * @param loginPacket | ||
643 | + */ | ||
644 | + public void onConnectToServer(NetHandler netHandler, Packet1Login loginPacket) | ||
645 | + { | ||
646 | + this.loader.onLogin(netHandler, loginPacket); | ||
647 | + | ||
648 | + for (LoginListener loginListener : this.loginListeners) | ||
649 | + loginListener.onLogin(netHandler, loginPacket); | ||
650 | + | ||
651 | + this.pluginChannels.onConnectToServer(netHandler, loginPacket); | ||
652 | + } | ||
653 | + | ||
654 | + /* | ||
655 | + * (non-Javadoc) | ||
656 | + * | ||
657 | + * @see | ||
658 | + * net.minecraft.src.IPlayerUsage#addServerStatsToSnooper(net.minecraft. | ||
659 | + * src.PlayerUsageSnooper) | ||
660 | + */ | ||
661 | + @Override | ||
662 | + public void addServerStatsToSnooper(PlayerUsageSnooper var1) | ||
663 | + { | ||
664 | + this.minecraft.addServerStatsToSnooper(var1); | ||
665 | + } | ||
666 | + | ||
667 | + /* | ||
668 | + * (non-Javadoc) | ||
669 | + * | ||
670 | + * @see | ||
671 | + * net.minecraft.src.IPlayerUsage#addServerTypeToSnooper(net.minecraft.src | ||
672 | + * .PlayerUsageSnooper) | ||
673 | + */ | ||
674 | + @Override | ||
675 | + public void addServerTypeToSnooper(PlayerUsageSnooper var1) | ||
676 | + { | ||
677 | + this.sanityCheck(); | ||
678 | + this.minecraft.addServerTypeToSnooper(var1); | ||
679 | + } | ||
680 | + | ||
681 | + /* | ||
682 | + * (non-Javadoc) | ||
683 | + * | ||
684 | + * @see net.minecraft.src.IPlayerUsage#isSnooperEnabled() | ||
685 | + */ | ||
686 | + @Override | ||
687 | + public boolean isSnooperEnabled() | ||
688 | + { | ||
689 | + return this.minecraft.isSnooperEnabled(); | ||
690 | + } | ||
691 | + | ||
692 | + /* | ||
693 | + * (non-Javadoc) | ||
694 | + * | ||
695 | + * @see net.minecraft.src.IPlayerUsage#getLogAgent() | ||
696 | + */ | ||
697 | + @Override | ||
698 | + public ILogAgent getLogAgent() | ||
699 | + { | ||
700 | + return this.minecraft.getLogAgent(); | ||
701 | + } | ||
702 | + | ||
703 | + /** | ||
704 | + * Check that the profiler hook hasn't been overridden by something else | ||
705 | + */ | ||
706 | + private void sanityCheck() | ||
707 | + { | ||
708 | + if (this.tickHooked && this.minecraft.mcProfiler != this.profilerHook) | ||
709 | + { | ||
710 | + PrivateFields.minecraftProfiler.setFinal(this.minecraft, this.profilerHook); | ||
711 | + } | ||
712 | + } | ||
713 | +} |
java/com/mumfrey/liteloader/core/LiteLoader.java
1 | package com.mumfrey.liteloader.core; | 1 | package com.mumfrey.liteloader.core; |
2 | 2 | ||
3 | import java.io.*; | 3 | import java.io.*; |
4 | -import java.lang.reflect.Method; | 4 | +import java.lang.reflect.Field; |
5 | import java.net.MalformedURLException; | 5 | import java.net.MalformedURLException; |
6 | import java.net.URISyntaxException; | 6 | import java.net.URISyntaxException; |
7 | import java.net.URL; | 7 | import java.net.URL; |
8 | -import java.net.URLClassLoader; | ||
9 | import java.net.URLDecoder; | 8 | import java.net.URLDecoder; |
10 | -import java.nio.charset.Charset; | ||
11 | import java.util.ArrayList; | 9 | import java.util.ArrayList; |
12 | import java.util.Arrays; | 10 | import java.util.Arrays; |
13 | import java.util.Collections; | 11 | import java.util.Collections; |
@@ -30,24 +28,15 @@ import java.util.zip.ZipInputStream; | @@ -30,24 +28,15 @@ import java.util.zip.ZipInputStream; | ||
30 | 28 | ||
31 | import javax.activity.InvalidActivityException; | 29 | import javax.activity.InvalidActivityException; |
32 | 30 | ||
31 | +import net.minecraft.client.ClientBrandRetriever; | ||
32 | +import net.minecraft.launchwrapper.LaunchClassLoader; | ||
33 | import net.minecraft.src.*; | 33 | import net.minecraft.src.*; |
34 | 34 | ||
35 | -import com.mumfrey.liteloader.ChatFilter; | ||
36 | -import com.mumfrey.liteloader.ChatListener; | ||
37 | -import com.mumfrey.liteloader.ChatRenderListener; | ||
38 | -import com.mumfrey.liteloader.GameLoopListener; | ||
39 | -import com.mumfrey.liteloader.InitCompleteListener; | ||
40 | -import com.mumfrey.liteloader.LiteMod; | ||
41 | -import com.mumfrey.liteloader.LoginListener; | ||
42 | -import com.mumfrey.liteloader.Permissible; | ||
43 | -import com.mumfrey.liteloader.PluginChannelListener; | ||
44 | -import com.mumfrey.liteloader.PostRenderListener; | ||
45 | -import com.mumfrey.liteloader.PreLoginListener; | ||
46 | -import com.mumfrey.liteloader.RenderListener; | 35 | +import com.mumfrey.liteloader.*; |
47 | import com.mumfrey.liteloader.Tickable; | 36 | import com.mumfrey.liteloader.Tickable; |
48 | import com.mumfrey.liteloader.gui.GuiControlsPaginated; | 37 | import com.mumfrey.liteloader.gui.GuiControlsPaginated; |
38 | +import com.mumfrey.liteloader.log.LiteLoaderLogFormatter; | ||
49 | import com.mumfrey.liteloader.permissions.PermissionsManagerClient; | 39 | import com.mumfrey.liteloader.permissions.PermissionsManagerClient; |
50 | -import com.mumfrey.liteloader.util.ModUtilities; | ||
51 | import com.mumfrey.liteloader.util.PrivateFields; | 40 | import com.mumfrey.liteloader.util.PrivateFields; |
52 | 41 | ||
53 | /** | 42 | /** |
@@ -55,14 +44,14 @@ import com.mumfrey.liteloader.util.PrivateFields; | @@ -55,14 +44,14 @@ import com.mumfrey.liteloader.util.PrivateFields; | ||
55 | * lightweight mods | 44 | * lightweight mods |
56 | * | 45 | * |
57 | * @author Adam Mummery-Smith | 46 | * @author Adam Mummery-Smith |
58 | - * @version 1.6.2_04 | 47 | + * @version 1.6.3 |
59 | */ | 48 | */ |
60 | -public final class LiteLoader implements FilenameFilter, IPlayerUsage | 49 | +public final class LiteLoader implements FilenameFilter |
61 | { | 50 | { |
62 | /** | 51 | /** |
63 | * Liteloader version | 52 | * Liteloader version |
64 | */ | 53 | */ |
65 | - private static final LiteLoaderVersion VERSION = LiteLoaderVersion.MC_1_6_2_R3; | 54 | + private static final LiteLoaderVersion VERSION = LiteLoaderVersion.MC_1_6_3_R0; |
66 | 55 | ||
67 | /** | 56 | /** |
68 | * Maximum recursion depth for mod discovery | 57 | * Maximum recursion depth for mod discovery |
@@ -77,7 +66,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -77,7 +66,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
77 | /** | 66 | /** |
78 | * Logger for LiteLoader events | 67 | * Logger for LiteLoader events |
79 | */ | 68 | */ |
80 | - public static Logger logger = Logger.getLogger("liteloader"); | 69 | + private static Logger logger = Logger.getLogger("liteloader"); |
81 | 70 | ||
82 | /** | 71 | /** |
83 | * Use stdout rather than stderr | 72 | * Use stdout rather than stderr |
@@ -100,9 +89,14 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -100,9 +89,14 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
100 | private static String profile = ""; | 89 | private static String profile = ""; |
101 | 90 | ||
102 | /** | 91 | /** |
92 | + * Tweak system class loader | ||
93 | + */ | ||
94 | + private static LaunchClassLoader classLoader; | ||
95 | + | ||
96 | + /** | ||
103 | * List of mods passed into the command line | 97 | * List of mods passed into the command line |
104 | */ | 98 | */ |
105 | - private static List<String> modNameFilter = null; | 99 | + private EnabledModsList enabledModsList = null; |
106 | 100 | ||
107 | /** | 101 | /** |
108 | * Mods folder which contains mods and legacy config files | 102 | * Mods folder which contains mods and legacy config files |
@@ -126,6 +120,16 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -126,6 +120,16 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
126 | private File versionConfigFolder; | 120 | private File versionConfigFolder; |
127 | 121 | ||
128 | /** | 122 | /** |
123 | + * JSON file containing the list of enabled/disabled mods by profile | ||
124 | + */ | ||
125 | + private File enabledModsFile; | ||
126 | + | ||
127 | + /** | ||
128 | + * File to write log entries to | ||
129 | + */ | ||
130 | + private File logFile; | ||
131 | + | ||
132 | + /** | ||
129 | * Reference to the Minecraft game instance | 133 | * Reference to the Minecraft game instance |
130 | */ | 134 | */ |
131 | private Minecraft minecraft = Minecraft.getMinecraft(); | 135 | private Minecraft minecraft = Minecraft.getMinecraft(); |
@@ -158,11 +162,6 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -158,11 +162,6 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
158 | private boolean paginateControls = true; | 162 | private boolean paginateControls = true; |
159 | 163 | ||
160 | /** | 164 | /** |
161 | - * Reference to the minecraft timer | ||
162 | - */ | ||
163 | - private Timer minecraftTimer; | ||
164 | - | ||
165 | - /** | ||
166 | * Classes to load, mapped by class name | 165 | * Classes to load, mapped by class name |
167 | */ | 166 | */ |
168 | private Map<String, Class<? extends LiteMod>> modsToLoad = new HashMap<String, Class<? extends LiteMod>>(); | 167 | private Map<String, Class<? extends LiteMod>> modsToLoad = new HashMap<String, Class<? extends LiteMod>>(); |
@@ -193,103 +192,29 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -193,103 +192,29 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
193 | private LinkedList<LiteMod> loadedMods = new LinkedList<LiteMod>(); | 192 | private LinkedList<LiteMod> loadedMods = new LinkedList<LiteMod>(); |
194 | 193 | ||
195 | /** | 194 | /** |
196 | - * List of mods which implement Tickable interface and will receive tick | ||
197 | - * events | ||
198 | - */ | ||
199 | - private LinkedList<Tickable> tickListeners = new LinkedList<Tickable>(); | ||
200 | - | ||
201 | - /** | ||
202 | - * List of mods which implement the GameLoopListener interface and will | ||
203 | - * receive loop events | ||
204 | - */ | ||
205 | - private LinkedList<GameLoopListener> loopListeners = new LinkedList<GameLoopListener>(); | ||
206 | - | ||
207 | - /** | ||
208 | - * | ||
209 | - */ | ||
210 | - private LinkedList<InitCompleteListener> initListeners = new LinkedList<InitCompleteListener>(); | ||
211 | - | ||
212 | - /** | ||
213 | - * List of mods which implement RenderListener interface and will receive | ||
214 | - * render events events | ||
215 | - */ | ||
216 | - private LinkedList<RenderListener> renderListeners = new LinkedList<RenderListener>(); | ||
217 | - | ||
218 | - /** | ||
219 | - * List of mods which implement the PostRenderListener interface and want to | ||
220 | - * render entities | ||
221 | - */ | ||
222 | - private LinkedList<PostRenderListener> postRenderListeners = new LinkedList<PostRenderListener>(); | ||
223 | - | ||
224 | - /** | ||
225 | - * List of mods which implement ChatRenderListener and want to know when | ||
226 | - * chat is rendered | ||
227 | - */ | ||
228 | - private LinkedList<ChatRenderListener> chatRenderListeners = new LinkedList<ChatRenderListener>(); | ||
229 | - | ||
230 | - /** | ||
231 | - * List of mods which implement ChatListener interface and will receive chat | ||
232 | - * events | ||
233 | - */ | ||
234 | - private LinkedList<ChatListener> chatListeners = new LinkedList<ChatListener>(); | ||
235 | - | ||
236 | - /** | ||
237 | - * List of mods which implement ChatFilter interface and will receive chat | ||
238 | - * filter events | ||
239 | - */ | ||
240 | - private LinkedList<ChatFilter> chatFilters = new LinkedList<ChatFilter>(); | ||
241 | - | ||
242 | - /** | ||
243 | - * List of mods which implement LoginListener interface and will receive | ||
244 | - * client login events | ||
245 | - */ | ||
246 | - private LinkedList<LoginListener> loginListeners = new LinkedList<LoginListener>(); | ||
247 | - | ||
248 | - /** | ||
249 | - * List of mods which implement LoginListener interface and will receive | ||
250 | - * client login events | 195 | + * Mods which are loaded but disabled |
251 | */ | 196 | */ |
252 | - private LinkedList<PreLoginListener> preLoginListeners = new LinkedList<PreLoginListener>(); | 197 | + private LinkedList<ModFile> disabledMods = new LinkedList<ModFile>(); |
253 | 198 | ||
254 | /** | 199 | /** |
255 | - * List of mods which implement PluginChannelListener interface | 200 | + * Event manager |
256 | */ | 201 | */ |
257 | - private LinkedList<PluginChannelListener> pluginChannelListeners = new LinkedList<PluginChannelListener>(); | 202 | + private Events events; |
258 | 203 | ||
259 | /** | 204 | /** |
260 | - * Mapping of plugin channel names to listeners | 205 | + * Plugin channel manager |
261 | */ | 206 | */ |
262 | - private HashMap<String, LinkedList<PluginChannelListener>> pluginChannels = new HashMap<String, LinkedList<PluginChannelListener>>(); | 207 | + private PluginChannels pluginChannels; |
263 | 208 | ||
264 | /** | 209 | /** |
265 | - * Reference to the addUrl method on URLClassLoader | 210 | + * Permission Manager |
266 | */ | 211 | */ |
267 | - private Method mAddUrl; | 212 | + private PermissionsManagerClient permissionsManager = PermissionsManagerClient.getInstance(); |
268 | 213 | ||
269 | /** | 214 | /** |
270 | * Flag which keeps track of whether late initialisation has been done | 215 | * Flag which keeps track of whether late initialisation has been done |
271 | */ | 216 | */ |
272 | - private boolean loaderStartupDone, loaderStartupComplete, lateInitDone; | ||
273 | - | ||
274 | - /** | ||
275 | - * Flags which keep track of whether hooks have been applied | ||
276 | - */ | ||
277 | - private boolean chatHooked, loginHooked, pluginChannelHooked, tickHooked; | ||
278 | - | ||
279 | - /** | ||
280 | - * Profiler hook objects | ||
281 | - */ | ||
282 | - private HookProfiler profilerHook = new HookProfiler(this, logger); | ||
283 | - | ||
284 | - /** | ||
285 | - * ScaledResolution used by the pre-chat and post-chat render callbacks | ||
286 | - */ | ||
287 | - private ScaledResolution currentResolution; | ||
288 | - | ||
289 | - /** | ||
290 | - * Permission Manager | ||
291 | - */ | ||
292 | - private static PermissionsManagerClient permissionsManager = PermissionsManagerClient.getInstance(); | 217 | + private boolean loaderStartupDone, loaderStartupComplete; |
293 | 218 | ||
294 | /** | 219 | /** |
295 | * True while initialising mods if we need to do a resource manager reload once the process is completed | 220 | * True while initialising mods if we need to do a resource manager reload once the process is completed |
@@ -319,7 +244,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -319,7 +244,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
319 | /** | 244 | /** |
320 | * List of all registered mod keys | 245 | * List of all registered mod keys |
321 | */ | 246 | */ |
322 | - private List<KeyBinding> modKeys = new ArrayList<KeyBinding>(); | 247 | + private List<KeyBinding> modKeyBindings = new ArrayList<KeyBinding>(); |
323 | 248 | ||
324 | /** | 249 | /** |
325 | * Map of mod key bindings to their key codes, stored so that we don't need to cast from | 250 | * Map of mod key bindings to their key codes, stored so that we don't need to cast from |
@@ -327,99 +252,35 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -327,99 +252,35 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
327 | */ | 252 | */ |
328 | private Map<KeyBinding, Integer> storedModKeyBindings = new HashMap<KeyBinding, Integer>(); | 253 | private Map<KeyBinding, Integer> storedModKeyBindings = new HashMap<KeyBinding, Integer>(); |
329 | 254 | ||
330 | - public static final void init(File gameDirectory, File assetsDirectory, String profile, List<String> modNameFilter) | 255 | + @SuppressWarnings("unused") |
256 | + private static final void init(File gameDirectory, File assetsDirectory, String profile, List<String> modNameFilter, LaunchClassLoader classLoader) | ||
331 | { | 257 | { |
332 | - if (instance == null) | 258 | + if (LiteLoader.instance == null) |
333 | { | 259 | { |
334 | LiteLoader.gameDirectory = gameDirectory; | 260 | LiteLoader.gameDirectory = gameDirectory; |
335 | LiteLoader.assetsDirectory = assetsDirectory; | 261 | LiteLoader.assetsDirectory = assetsDirectory; |
336 | LiteLoader.profile = profile; | 262 | LiteLoader.profile = profile; |
263 | + LiteLoader.classLoader = classLoader; | ||
337 | 264 | ||
338 | - try | ||
339 | - { | ||
340 | - if (modNameFilter != null) | ||
341 | - { | ||
342 | - LiteLoader.modNameFilter = new ArrayList<String>(); | ||
343 | - for (String filterEntry : modNameFilter) | ||
344 | - { | ||
345 | - LiteLoader.modNameFilter.add(filterEntry.toLowerCase().trim()); | ||
346 | - } | ||
347 | - } | ||
348 | - } | ||
349 | - catch (Exception ex) | ||
350 | - { | ||
351 | - LiteLoader.modNameFilter = null; | ||
352 | - } | ||
353 | - | ||
354 | - instance = new LiteLoader(); | ||
355 | - instance.initLoader(); | 265 | + LiteLoader.instance = new LiteLoader(profile, modNameFilter); |
266 | + LiteLoader.instance.initLoader(); | ||
356 | } | 267 | } |
357 | - | ||
358 | - } | ||
359 | - | ||
360 | - /** | ||
361 | - * Get the singleton instance of LiteLoader, initialises the loader if | ||
362 | - * necessary | ||
363 | - * | ||
364 | - * @param locationProvider | ||
365 | - * @return LiteLoader instance | ||
366 | - */ | ||
367 | - public static final LiteLoader getInstance() | ||
368 | - { | ||
369 | - return instance; | ||
370 | - } | ||
371 | - | ||
372 | - /** | ||
373 | - * Get the LiteLoader logger object | ||
374 | - * | ||
375 | - * @return | ||
376 | - */ | ||
377 | - public static final Logger getLogger() | ||
378 | - { | ||
379 | - return logger; | ||
380 | - } | ||
381 | - | ||
382 | - /** | ||
383 | - * Get the output stream which we are using for console output | ||
384 | - * | ||
385 | - * @return | ||
386 | - */ | ||
387 | - public static final PrintStream getConsoleStream() | ||
388 | - { | ||
389 | - return useStdOut ? System.out : System.err; | ||
390 | - } | ||
391 | - | ||
392 | - /** | ||
393 | - * Get LiteLoader version | ||
394 | - * | ||
395 | - * @return | ||
396 | - */ | ||
397 | - public static final String getVersion() | ||
398 | - { | ||
399 | - return VERSION.getLoaderVersion(); | ||
400 | - } | ||
401 | - | ||
402 | - /** | ||
403 | - * Get the loader revision | ||
404 | - * | ||
405 | - * @return | ||
406 | - */ | ||
407 | - public static final int getRevision() | ||
408 | - { | ||
409 | - return VERSION.getLoaderRevision(); | ||
410 | - } | ||
411 | - | ||
412 | - public static final PermissionsManagerClient getPermissionsManager() | ||
413 | - { | ||
414 | - return permissionsManager; | ||
415 | } | 268 | } |
416 | - | 269 | + |
417 | /** | 270 | /** |
418 | * LiteLoader constructor | 271 | * LiteLoader constructor |
272 | + * @param profile | ||
273 | + * @param modNameFilter | ||
419 | */ | 274 | */ |
420 | - private LiteLoader() | 275 | + private LiteLoader(String profile, List<String> modNameFilter) |
421 | { | 276 | { |
422 | this.initPaths(); | 277 | this.initPaths(); |
278 | + | ||
279 | + this.enabledModsList = EnabledModsList.createFrom(this.enabledModsFile); | ||
280 | + this.enabledModsList.processModsList(profile, modNameFilter); | ||
281 | + | ||
282 | + this.pluginChannels = new PluginChannels(this); | ||
283 | + this.events = new Events(this, this.minecraft, this.pluginChannels); | ||
423 | } | 284 | } |
424 | 285 | ||
425 | /** | 286 | /** |
@@ -439,6 +300,9 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -439,6 +300,9 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
439 | if (!this.versionConfigFolder.exists()) this.versionConfigFolder.mkdirs(); | 300 | if (!this.versionConfigFolder.exists()) this.versionConfigFolder.mkdirs(); |
440 | 301 | ||
441 | this.propertiesFile = new File(this.configBaseFolder, "liteloader.properties"); | 302 | this.propertiesFile = new File(this.configBaseFolder, "liteloader.properties"); |
303 | + this.enabledModsFile = new File(this.configBaseFolder, "liteloader.profiles.json"); | ||
304 | + this.logFile = new File(this.configBaseFolder, "liteloader.log"); | ||
305 | + this.keyMapSettingsFile = new File(this.configBaseFolder, "liteloader.keys.properties"); | ||
442 | } | 306 | } |
443 | 307 | ||
444 | /** | 308 | /** |
@@ -466,15 +330,15 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -466,15 +330,15 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
466 | // Set up loader, initialises any reflection methods needed | 330 | // Set up loader, initialises any reflection methods needed |
467 | if (this.prepareLoader()) | 331 | if (this.prepareLoader()) |
468 | { | 332 | { |
469 | - logger.info(String.format("LiteLoader %s starting up...", VERSION.getLoaderVersion())); | 333 | + LiteLoader.getLogger().info(String.format("LiteLoader %s starting up...", VERSION.getLoaderVersion())); |
470 | 334 | ||
471 | // Print the branding version if any was provided | 335 | // Print the branding version if any was provided |
472 | if (this.branding != null) | 336 | if (this.branding != null) |
473 | { | 337 | { |
474 | - logger.info(String.format("Active Pack: %s", this.branding)); | 338 | + LiteLoader.getLogger().info(String.format("Active Pack: %s", this.branding)); |
475 | } | 339 | } |
476 | 340 | ||
477 | - logger.info(String.format("Java reports OS=\"%s\"", System.getProperty("os.name").toLowerCase())); | 341 | + LiteLoader.getLogger().info(String.format("Java reports OS=\"%s\"", System.getProperty("os.name").toLowerCase())); |
478 | 342 | ||
479 | boolean searchMods = this.localProperties.getProperty("search.mods", "true").equalsIgnoreCase("true"); | 343 | boolean searchMods = this.localProperties.getProperty("search.mods", "true").equalsIgnoreCase("true"); |
480 | boolean searchProtectionDomain = this.localProperties.getProperty("search.jar", "true").equalsIgnoreCase("true"); | 344 | boolean searchProtectionDomain = this.localProperties.getProperty("search.jar", "true").equalsIgnoreCase("true"); |
@@ -482,7 +346,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -482,7 +346,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
482 | 346 | ||
483 | if (!searchMods && !searchProtectionDomain && !searchClassPath) | 347 | if (!searchMods && !searchProtectionDomain && !searchClassPath) |
484 | { | 348 | { |
485 | - logger.warning("Invalid configuration, no search locations defined. Enabling all search locations."); | 349 | + LiteLoader.getLogger().warning("Invalid configuration, no search locations defined. Enabling all search locations."); |
486 | 350 | ||
487 | this.localProperties.setProperty("search.mods", "true"); | 351 | this.localProperties.setProperty("search.mods", "true"); |
488 | this.localProperties.setProperty("search.jar", "true"); | 352 | this.localProperties.setProperty("search.jar", "true"); |
@@ -496,18 +360,23 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -496,18 +360,23 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
496 | // Examines the class path and mods folder and locates loadable mods | 360 | // Examines the class path and mods folder and locates loadable mods |
497 | this.prepareMods(searchMods, searchProtectionDomain, searchClassPath); | 361 | this.prepareMods(searchMods, searchProtectionDomain, searchClassPath); |
498 | 362 | ||
363 | + // Spawn mod instances | ||
364 | + this.loadMods(); | ||
365 | + | ||
499 | // Initialises enumerated mods | 366 | // Initialises enumerated mods |
500 | this.initMods(); | 367 | this.initMods(); |
501 | 368 | ||
502 | // Initialises the required hooks for loaded mods | 369 | // Initialises the required hooks for loaded mods |
503 | - this.initHooks(); | ||
504 | - | 370 | + this.events.initHooks(); |
505 | this.loaderStartupComplete = true; | 371 | this.loaderStartupComplete = true; |
506 | 372 | ||
507 | this.writeProperties(); | 373 | this.writeProperties(); |
374 | + this.enabledModsList.saveTo(this.enabledModsFile); | ||
375 | + | ||
376 | + this.setBranding("LiteLoader"); | ||
508 | } | 377 | } |
509 | } | 378 | } |
510 | - | 379 | + |
511 | /** | 380 | /** |
512 | * Set up reflection methods required by the loader | 381 | * Set up reflection methods required by the loader |
513 | */ | 382 | */ |
@@ -515,10 +384,6 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -515,10 +384,6 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
515 | { | 384 | { |
516 | try | 385 | try |
517 | { | 386 | { |
518 | - // addURL method is used by the class loader to | ||
519 | - this.mAddUrl = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); | ||
520 | - this.mAddUrl.setAccessible(true); | ||
521 | - | ||
522 | // Prepare the properties | 387 | // Prepare the properties |
523 | this.prepareProperties(); | 388 | this.prepareProperties(); |
524 | 389 | ||
@@ -544,7 +409,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -544,7 +409,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
544 | } | 409 | } |
545 | catch (Throwable th) | 410 | catch (Throwable th) |
546 | { | 411 | { |
547 | - logger.log(Level.SEVERE, "Error initialising LiteLoader", th); | 412 | + LiteLoader.getLogger().log(Level.SEVERE, "Error initialising LiteLoader", th); |
548 | return false; | 413 | return false; |
549 | } | 414 | } |
550 | 415 | ||
@@ -559,16 +424,16 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -559,16 +424,16 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
559 | { | 424 | { |
560 | Formatter logFormatter = new LiteLoaderLogFormatter(); | 425 | Formatter logFormatter = new LiteLoaderLogFormatter(); |
561 | 426 | ||
562 | - logger.setUseParentHandlers(false); | ||
563 | - this.useStdOut = System.getProperty("liteloader.log", "stderr").equalsIgnoreCase("stdout") || this.localProperties.getProperty("log", "stderr").equalsIgnoreCase("stdout"); | 427 | + LiteLoader.getLogger().setUseParentHandlers(false); |
428 | + LiteLoader.useStdOut = System.getProperty("liteloader.log", "stderr").equalsIgnoreCase("stdout") || this.localProperties.getProperty("log", "stderr").equalsIgnoreCase("stdout"); | ||
564 | 429 | ||
565 | StreamHandler consoleHandler = useStdOut ? new com.mumfrey.liteloader.util.log.ConsoleHandler() : new java.util.logging.ConsoleHandler(); | 430 | StreamHandler consoleHandler = useStdOut ? new com.mumfrey.liteloader.util.log.ConsoleHandler() : new java.util.logging.ConsoleHandler(); |
566 | consoleHandler.setFormatter(logFormatter); | 431 | consoleHandler.setFormatter(logFormatter); |
567 | - logger.addHandler(consoleHandler); | 432 | + LiteLoader.getLogger().addHandler(consoleHandler); |
568 | 433 | ||
569 | - FileHandler logFileHandler = new FileHandler(new File(this.configBaseFolder, "LiteLoader.txt").getAbsolutePath()); | 434 | + FileHandler logFileHandler = new FileHandler(this.logFile.getAbsolutePath()); |
570 | logFileHandler.setFormatter(logFormatter); | 435 | logFileHandler.setFormatter(logFormatter); |
571 | - logger.addHandler(logFileHandler); | 436 | + LiteLoader.getLogger().addHandler(logFileHandler); |
572 | } | 437 | } |
573 | 438 | ||
574 | /** | 439 | /** |
@@ -607,8 +472,6 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -607,8 +472,6 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
607 | this.localProperties = new Properties(this.internalProperties); | 472 | this.localProperties = new Properties(this.internalProperties); |
608 | } | 473 | } |
609 | 474 | ||
610 | - this.keyMapSettingsFile = new File(this.configBaseFolder, "litemodkeys.properties"); | ||
611 | - | ||
612 | if (this.keyMapSettingsFile.exists()) | 475 | if (this.keyMapSettingsFile.exists()) |
613 | { | 476 | { |
614 | try | 477 | try |
@@ -648,7 +511,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -648,7 +511,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
648 | } | 511 | } |
649 | catch (Throwable th) | 512 | catch (Throwable th) |
650 | { | 513 | { |
651 | - logger.log(Level.WARNING, "Error writing liteloader properties", th); | 514 | + LiteLoader.getLogger().log(Level.WARNING, "Error writing liteloader properties", th); |
652 | } | 515 | } |
653 | } | 516 | } |
654 | 517 | ||
@@ -661,7 +524,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -661,7 +524,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
661 | */ | 524 | */ |
662 | public boolean registerModResourcePack(ResourcePack resourcePack) | 525 | public boolean registerModResourcePack(ResourcePack resourcePack) |
663 | { | 526 | { |
664 | - if (!this.registeredResourcePacks.containsKey(resourcePack.func_130077_b())) // TODO adamsrc -> getName() | 527 | + if (!this.registeredResourcePacks.containsKey(resourcePack.getPackName())) |
665 | { | 528 | { |
666 | this.pendingResourceReload = true; | 529 | this.pendingResourceReload = true; |
667 | 530 | ||
@@ -669,7 +532,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -669,7 +532,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
669 | if (!defaultResourcePacks.contains(resourcePack)) | 532 | if (!defaultResourcePacks.contains(resourcePack)) |
670 | { | 533 | { |
671 | defaultResourcePacks.add(resourcePack); | 534 | defaultResourcePacks.add(resourcePack); |
672 | - this.registeredResourcePacks.put(resourcePack.func_130077_b(), resourcePack); // TODO adamsrc -> getName() | 535 | + this.registeredResourcePacks.put(resourcePack.getPackName(), resourcePack); |
673 | return true; | 536 | return true; |
674 | } | 537 | } |
675 | } | 538 | } |
@@ -688,7 +551,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -688,7 +551,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
688 | this.pendingResourceReload = true; | 551 | this.pendingResourceReload = true; |
689 | 552 | ||
690 | List<ResourcePack> defaultResourcePacks = PrivateFields.defaultResourcePacks.get(this.minecraft); | 553 | List<ResourcePack> defaultResourcePacks = PrivateFields.defaultResourcePacks.get(this.minecraft); |
691 | - this.registeredResourcePacks.remove(resourcePack.func_130077_b()); // TODO adamsrc -> getName() | 554 | + this.registeredResourcePacks.remove(resourcePack.getPackName()); |
692 | defaultResourcePacks.remove(resourcePack); | 555 | defaultResourcePacks.remove(resourcePack); |
693 | return true; | 556 | return true; |
694 | } | 557 | } |
@@ -697,27 +560,107 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -697,27 +560,107 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
697 | } | 560 | } |
698 | 561 | ||
699 | /** | 562 | /** |
563 | + * Get the singleton instance of LiteLoader, initialises the loader if | ||
564 | + * necessary | ||
565 | + * | ||
566 | + * @param locationProvider | ||
567 | + * @return LiteLoader instance | ||
568 | + */ | ||
569 | + public static final LiteLoader getInstance() | ||
570 | + { | ||
571 | + return LiteLoader.instance; | ||
572 | + } | ||
573 | + | ||
574 | + /** | ||
575 | + * Get the LiteLoader logger object | ||
576 | + * | ||
577 | + * @return | ||
578 | + */ | ||
579 | + public static final Logger getLogger() | ||
580 | + { | ||
581 | + return LiteLoader.logger; | ||
582 | + } | ||
583 | + | ||
584 | + /** | ||
585 | + * Get the output stream which we are using for console output | ||
586 | + * | ||
587 | + * @return | ||
588 | + */ | ||
589 | + public static final PrintStream getConsoleStream() | ||
590 | + { | ||
591 | + return LiteLoader.useStdOut ? System.out : System.err; | ||
592 | + } | ||
593 | + | ||
594 | + /** | ||
595 | + * Get LiteLoader version | ||
596 | + * | ||
597 | + * @return | ||
598 | + */ | ||
599 | + public static final String getVersion() | ||
600 | + { | ||
601 | + return LiteLoader.VERSION.getLoaderVersion(); | ||
602 | + } | ||
603 | + | ||
604 | + /** | ||
605 | + * Get the loader revision | ||
606 | + * | ||
607 | + * @return | ||
608 | + */ | ||
609 | + public static final int getRevision() | ||
610 | + { | ||
611 | + return LiteLoader.VERSION.getLoaderRevision(); | ||
612 | + } | ||
613 | + | ||
614 | + /** | ||
615 | + * @return | ||
616 | + */ | ||
617 | + public static PermissionsManagerClient getPermissionsManager() | ||
618 | + { | ||
619 | + return LiteLoader.getInstance().permissionsManager; | ||
620 | + } | ||
621 | + | ||
622 | + /** | ||
623 | + * Get the event manager | ||
624 | + * | ||
625 | + * @return | ||
626 | + */ | ||
627 | + public static Events getEvents() | ||
628 | + { | ||
629 | + return LiteLoader.getInstance().events; | ||
630 | + } | ||
631 | + | ||
632 | + /** | ||
633 | + * Get the plugin channel manager | ||
634 | + * | ||
635 | + * @return | ||
636 | + */ | ||
637 | + public static PluginChannels getPluginChannels() | ||
638 | + { | ||
639 | + return LiteLoader.getInstance().pluginChannels; | ||
640 | + } | ||
641 | + | ||
642 | + /** | ||
700 | * Get the "mods" folder | 643 | * Get the "mods" folder |
701 | */ | 644 | */ |
702 | - public File getModsFolder() | 645 | + public static File getModsFolder() |
703 | { | 646 | { |
704 | - return this.modsFolder; | 647 | + return LiteLoader.getInstance().modsFolder; |
705 | } | 648 | } |
706 | 649 | ||
707 | /** | 650 | /** |
708 | * Get the common (version-independent) config folder | 651 | * Get the common (version-independent) config folder |
709 | */ | 652 | */ |
710 | - public File getCommonConfigFolder() | 653 | + public static File getCommonConfigFolder() |
711 | { | 654 | { |
712 | - return this.commonConfigFolder; | 655 | + return LiteLoader.getInstance().commonConfigFolder; |
713 | } | 656 | } |
714 | 657 | ||
715 | /** | 658 | /** |
716 | * Get the config folder for this version | 659 | * Get the config folder for this version |
717 | */ | 660 | */ |
718 | - public File getConfigFolder() | 661 | + public static File getConfigFolder() |
719 | { | 662 | { |
720 | - return this.versionConfigFolder; | 663 | + return LiteLoader.getInstance().versionConfigFolder; |
721 | } | 664 | } |
722 | 665 | ||
723 | /** | 666 | /** |
@@ -761,7 +704,15 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -761,7 +704,15 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
761 | { | 704 | { |
762 | return Collections.unmodifiableList(this.loadedMods); | 705 | return Collections.unmodifiableList(this.loadedMods); |
763 | } | 706 | } |
764 | - | 707 | + |
708 | + /** | ||
709 | + * Get a list containing all mod files which were NOT loaded | ||
710 | + */ | ||
711 | + public List<ModFile> getDisabledMods() | ||
712 | + { | ||
713 | + return Collections.unmodifiableList(this.disabledMods); | ||
714 | + } | ||
715 | + | ||
765 | /** | 716 | /** |
766 | * Used to get the name of the modpack being used | 717 | * Used to get the name of the modpack being used |
767 | * | 718 | * |
@@ -868,7 +819,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -868,7 +819,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
868 | } | 819 | } |
869 | 820 | ||
870 | /** | 821 | /** |
871 | - * Get metadata for the specified mod, attempts to retrieve the mod by name first | 822 | + * Get a metadata value for the specified mod |
872 | * | 823 | * |
873 | * @param mod | 824 | * @param mod |
874 | * @param metaDataKey | 825 | * @param metaDataKey |
@@ -893,24 +844,45 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -893,24 +844,45 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
893 | public String getModMetaData(LiteMod mod, String metaDataKey, String defaultValue) | 844 | public String getModMetaData(LiteMod mod, String metaDataKey, String defaultValue) |
894 | { | 845 | { |
895 | if (mod == null || metaDataKey == null) return defaultValue; | 846 | if (mod == null || metaDataKey == null) return defaultValue; |
896 | - | ||
897 | - String modClassName = mod.getClass().getSimpleName(); | ||
898 | - if (!this.modFiles.containsKey(modClassName)) return defaultValue; | ||
899 | - | ||
900 | - ModFile modFile = this.modFiles.get(modClassName); | ||
901 | - return modFile.getMetaValue(metaDataKey, defaultValue); | 847 | + return this.getModMetaData(mod.getClass(), metaDataKey, defaultValue); |
848 | + } | ||
849 | + | ||
850 | + /** | ||
851 | + * Get a metadata value for the specified mod | ||
852 | + * | ||
853 | + * @param modClassName | ||
854 | + * @param metaDataKey | ||
855 | + * @param defaultValue | ||
856 | + * @return | ||
857 | + */ | ||
858 | + public String getModMetaData(Class<? extends LiteMod> modClass, String metaDataKey, String defaultValue) | ||
859 | + { | ||
860 | + ModFile modFile = this.getModFile(modClass); | ||
861 | + return modFile != null ? modFile.getMetaValue(metaDataKey, defaultValue) : defaultValue; | ||
902 | } | 862 | } |
903 | 863 | ||
904 | /** | 864 | /** |
905 | * @param mod | 865 | * @param mod |
906 | * @return | 866 | * @return |
907 | */ | 867 | */ |
908 | - private ModFile getModFile(LiteMod mod) | 868 | + private ModFile getModFile(Class<? extends LiteMod> modClass) |
909 | { | 869 | { |
910 | - String modClassName = mod.getClass().getSimpleName(); | ||
911 | - return this.modFiles.containsKey(modClassName) ? this.modFiles.get(modClassName) : null; | 870 | + return this.modFiles.get(modClass.getSimpleName()); |
912 | } | 871 | } |
913 | - | 872 | + |
873 | + /** | ||
874 | + * Get the mod "name" metadata key, this is used for versioning, exclusivity, and enablement checks | ||
875 | + * | ||
876 | + * @param modClass | ||
877 | + * @return | ||
878 | + */ | ||
879 | + public String getModMetaName(Class<? extends LiteMod> modClass) | ||
880 | + { | ||
881 | + String modClassName = modClass.getSimpleName(); | ||
882 | + if (!this.modFiles.containsKey(modClassName)) return null; | ||
883 | + return this.modFiles.get(modClassName).getModName().toLowerCase(); | ||
884 | + } | ||
885 | + | ||
914 | /** | 886 | /** |
915 | * Enumerate the java class path and "mods" folder to find mod classes, then | 887 | * Enumerate the java class path and "mods" folder to find mod classes, then |
916 | * load the classes | 888 | * load the classes |
@@ -926,37 +898,35 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -926,37 +898,35 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
926 | File modFolder = this.getModsFolder(); | 898 | File modFolder = this.getModsFolder(); |
927 | if (modFolder.exists() && modFolder.isDirectory()) | 899 | if (modFolder.exists() && modFolder.isDirectory()) |
928 | { | 900 | { |
929 | - logger.info("Mods folder found, searching " + modFolder.getPath()); | 901 | + LiteLoader.getLogger().info("Mods folder found, searching " + modFolder.getPath()); |
930 | this.findModFiles(modFolder, modFiles); | 902 | this.findModFiles(modFolder, modFiles); |
931 | - logger.info("Found " + modFiles.size() + " mod file(s)"); | 903 | + LiteLoader.getLogger().info("Found " + modFiles.size() + " mod file(s)"); |
932 | } | 904 | } |
933 | } | 905 | } |
934 | 906 | ||
935 | try | 907 | try |
936 | { | 908 | { |
937 | - logger.info("Enumerating class path..."); | 909 | + LiteLoader.getLogger().info("Enumerating class path..."); |
938 | 910 | ||
939 | String classPath = System.getProperty("java.class.path"); | 911 | String classPath = System.getProperty("java.class.path"); |
940 | String classPathSeparator = System.getProperty("path.separator"); | 912 | String classPathSeparator = System.getProperty("path.separator"); |
941 | String[] classPathEntries = classPath.split(classPathSeparator); | 913 | String[] classPathEntries = classPath.split(classPathSeparator); |
942 | 914 | ||
943 | - logger.info(String.format("Class path separator=\"%s\"", classPathSeparator)); | ||
944 | - logger.info(String.format("Class path entries=(\n classpathEntry=%s\n)", classPath.replace(classPathSeparator, "\n classpathEntry="))); | 915 | + LiteLoader.getLogger().info(String.format("Class path separator=\"%s\"", classPathSeparator)); |
916 | + LiteLoader.getLogger().info(String.format("Class path entries=(\n classpathEntry=%s\n)", classPath.replace(classPathSeparator, "\n classpathEntry="))); | ||
945 | 917 | ||
946 | if (searchProtectionDomain || searchClassPath) | 918 | if (searchProtectionDomain || searchClassPath) |
947 | - logger.info("Discovering mods on class path..."); | 919 | + getLogger().info("Discovering mods on class path..."); |
948 | 920 | ||
949 | - this.findModClasses(classPathEntries, modFiles, searchProtectionDomain, searchClassPath); | 921 | + this.findModClasses(modFiles, searchProtectionDomain, searchClassPath, classPathEntries); |
950 | 922 | ||
951 | - logger.info("Mod class discovery completed"); | 923 | + LiteLoader.getLogger().info("Mod class discovery completed"); |
952 | } | 924 | } |
953 | catch (Throwable th) | 925 | catch (Throwable th) |
954 | { | 926 | { |
955 | - logger.log(Level.WARNING, "Mod class discovery failed", th); | 927 | + LiteLoader.getLogger().log(Level.WARNING, "Mod class discovery failed", th); |
956 | return; | 928 | return; |
957 | } | 929 | } |
958 | - | ||
959 | - this.loadMods(); | ||
960 | } | 930 | } |
961 | 931 | ||
962 | /** | 932 | /** |
@@ -978,11 +948,12 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -978,11 +948,12 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
978 | // Check for a version file | 948 | // Check for a version file |
979 | ZipFile modZip = new ZipFile(modFile); | 949 | ZipFile modZip = new ZipFile(modFile); |
980 | ZipEntry version = modZip.getEntry("litemod.json"); | 950 | ZipEntry version = modZip.getEntry("litemod.json"); |
981 | - | ||
982 | - if (version == null) | ||
983 | - { | ||
984 | - version = modZip.getEntry("version.txt"); | ||
985 | - } | 951 | + |
952 | + // Not supporting this past 1.6.2 | ||
953 | +// if (version == null) | ||
954 | +// { | ||
955 | +// version = modZip.getEntry("version.txt"); | ||
956 | +// } | ||
986 | 957 | ||
987 | if (version != null) | 958 | if (version != null) |
988 | { | 959 | { |
@@ -1003,7 +974,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1003,7 +974,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1003 | } | 974 | } |
1004 | catch (Exception ex) | 975 | catch (Exception ex) |
1005 | { | 976 | { |
1006 | - logger.warning("Error reading version data from " + modFile.getName()); | 977 | + LiteLoader.getLogger().warning("Error reading version data from " + modFile.getName()); |
1007 | } | 978 | } |
1008 | finally | 979 | finally |
1009 | { | 980 | { |
@@ -1020,10 +991,10 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1020,10 +991,10 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1020 | // to successfully add it to the class path | 991 | // to successfully add it to the class path |
1021 | if (LiteLoader.VERSION.isVersionSupported(modFileInfo.getVersion())) | 992 | if (LiteLoader.VERSION.isVersionSupported(modFileInfo.getVersion())) |
1022 | { | 993 | { |
1023 | - if (!modFileInfo.isJson()) | ||
1024 | - { | ||
1025 | - logger.warning("Missing or invalid litemod.json reading mod file: " + modFile.getAbsolutePath()); | ||
1026 | - } | 994 | +// if (!modFileInfo.isJson()) |
995 | +// { | ||
996 | +// logger.warning("Missing or invalid litemod.json reading mod file: " + modFile.getAbsolutePath()); | ||
997 | +// } | ||
1027 | 998 | ||
1028 | if (!versionOrderingSets.containsKey(modFileInfo.getName())) | 999 | if (!versionOrderingSets.containsKey(modFileInfo.getName())) |
1029 | { | 1000 | { |
@@ -1034,18 +1005,26 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1034,18 +1005,26 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1034 | } | 1005 | } |
1035 | else | 1006 | else |
1036 | { | 1007 | { |
1037 | - logger.info("Not adding invalid or outdated mod file: " + modFile.getAbsolutePath()); | 1008 | + LiteLoader.getLogger().info("Not adding invalid or outdated mod file: " + modFile.getAbsolutePath()); |
1038 | } | 1009 | } |
1039 | } | 1010 | } |
1040 | } | 1011 | } |
1041 | } | 1012 | } |
1013 | + else | ||
1014 | + { | ||
1015 | + ZipEntry legacyVersion = modZip.getEntry("version.txt"); | ||
1016 | + if (legacyVersion != null) | ||
1017 | + { | ||
1018 | + LiteLoader.getLogger().warning("version.txt is no longer supported, ignoring outdated mod file: " + modFile.getAbsolutePath()); | ||
1019 | + } | ||
1020 | + } | ||
1042 | 1021 | ||
1043 | modZip.close(); | 1022 | modZip.close(); |
1044 | } | 1023 | } |
1045 | catch (Exception ex) | 1024 | catch (Exception ex) |
1046 | { | 1025 | { |
1047 | ex.printStackTrace(System.err); | 1026 | ex.printStackTrace(System.err); |
1048 | - logger.warning("Error enumerating '" + modFile.getAbsolutePath() + "': Invalid zip file or error reading file"); | 1027 | + LiteLoader.getLogger().warning("Error enumerating '" + modFile.getAbsolutePath() + "': Invalid zip file or error reading file"); |
1049 | } | 1028 | } |
1050 | } | 1029 | } |
1051 | 1030 | ||
@@ -1056,14 +1035,12 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1056,14 +1035,12 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1056 | 1035 | ||
1057 | try | 1036 | try |
1058 | { | 1037 | { |
1059 | - if (this.addURLToClassPath(newestVersion.toURI().toURL())) | ||
1060 | - { | ||
1061 | - modFiles.add(newestVersion); | ||
1062 | - } | 1038 | + LiteLoader.classLoader.addURL(newestVersion.toURI().toURL()); |
1039 | + modFiles.add(newestVersion); | ||
1063 | } | 1040 | } |
1064 | catch (Exception ex) | 1041 | catch (Exception ex) |
1065 | { | 1042 | { |
1066 | - logger.warning("Error injecting '" + newestVersion.getAbsolutePath() + "' into classPath. The mod will not be loaded"); | 1043 | + LiteLoader.getLogger().warning("Error injecting '" + newestVersion.getAbsolutePath() + "' into classPath. The mod will not be loaded"); |
1067 | } | 1044 | } |
1068 | } | 1045 | } |
1069 | } | 1046 | } |
@@ -1081,10 +1058,9 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1081,10 +1058,9 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1081 | 1058 | ||
1082 | /** | 1059 | /** |
1083 | * Find mod classes in the class path and enumerated mod files list | 1060 | * Find mod classes in the class path and enumerated mod files list |
1084 | - * | ||
1085 | * @param classPathEntries Java class path split into string entries | 1061 | * @param classPathEntries Java class path split into string entries |
1086 | */ | 1062 | */ |
1087 | - private void findModClasses(String[] classPathEntries, List<ModFile> modFiles, boolean searchProtectionDomain, boolean searchClassPath) | 1063 | + private void findModClasses(List<ModFile> modFiles, boolean searchProtectionDomain, boolean searchClassPath, String[] classPathEntries) |
1088 | { | 1064 | { |
1089 | if (searchProtectionDomain) | 1065 | if (searchProtectionDomain) |
1090 | { | 1066 | { |
@@ -1094,7 +1070,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1094,7 +1070,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1094 | } | 1070 | } |
1095 | catch (Throwable th) | 1071 | catch (Throwable th) |
1096 | { | 1072 | { |
1097 | - logger.warning("Error loading from local class path: " + th.getMessage()); | 1073 | + LiteLoader.getLogger().warning("Error loading from local class path: " + th.getMessage()); |
1098 | } | 1074 | } |
1099 | } | 1075 | } |
1100 | 1076 | ||
@@ -1117,7 +1093,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1117,7 +1093,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1117 | @SuppressWarnings("unchecked") | 1093 | @SuppressWarnings("unchecked") |
1118 | private void searchProtectionDomain() throws MalformedURLException, URISyntaxException, UnsupportedEncodingException | 1094 | private void searchProtectionDomain() throws MalformedURLException, URISyntaxException, UnsupportedEncodingException |
1119 | { | 1095 | { |
1120 | - logger.info("Searching protection domain code source..."); | 1096 | + LiteLoader.getLogger().info("Searching protection domain code source..."); |
1121 | 1097 | ||
1122 | File packagePath = null; | 1098 | File packagePath = null; |
1123 | 1099 | ||
@@ -1152,14 +1128,14 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1152,14 +1128,14 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1152 | { | 1128 | { |
1153 | if (this.modsToLoad.containsKey(mod.getSimpleName())) | 1129 | if (this.modsToLoad.containsKey(mod.getSimpleName())) |
1154 | { | 1130 | { |
1155 | - logger.warning("Mod name collision for mod with class '" + mod.getSimpleName() + "', maybe you have more than one copy?"); | 1131 | + LiteLoader.getLogger().warning("Mod name collision for mod with class '" + mod.getSimpleName() + "', maybe you have more than one copy?"); |
1156 | } | 1132 | } |
1157 | 1133 | ||
1158 | this.modsToLoad.put(mod.getSimpleName(), (Class<? extends LiteMod>)mod); | 1134 | this.modsToLoad.put(mod.getSimpleName(), (Class<? extends LiteMod>)mod); |
1159 | } | 1135 | } |
1160 | 1136 | ||
1161 | if (modClasses.size() > 0) | 1137 | if (modClasses.size() > 0) |
1162 | - logger.info(String.format("Found %s potential matches", modClasses.size())); | 1138 | + LiteLoader.getLogger().info(String.format("Found %s potential matches", modClasses.size())); |
1163 | } | 1139 | } |
1164 | } | 1140 | } |
1165 | 1141 | ||
@@ -1172,7 +1148,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1172,7 +1148,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1172 | { | 1148 | { |
1173 | for (String classPathPart : classPathEntries) | 1149 | for (String classPathPart : classPathEntries) |
1174 | { | 1150 | { |
1175 | - logger.info(String.format("Searching %s...", classPathPart)); | 1151 | + LiteLoader.getLogger().info(String.format("Searching %s...", classPathPart)); |
1176 | 1152 | ||
1177 | File packagePath = new File(classPathPart); | 1153 | File packagePath = new File(classPathPart); |
1178 | LinkedList<Class<?>> modClasses = getSubclassesFor(packagePath, Minecraft.class.getClassLoader(), LiteMod.class, "LiteMod"); | 1154 | LinkedList<Class<?>> modClasses = getSubclassesFor(packagePath, Minecraft.class.getClassLoader(), LiteMod.class, "LiteMod"); |
@@ -1181,7 +1157,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1181,7 +1157,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1181 | { | 1157 | { |
1182 | if (this.modsToLoad.containsKey(mod.getSimpleName())) | 1158 | if (this.modsToLoad.containsKey(mod.getSimpleName())) |
1183 | { | 1159 | { |
1184 | - logger.warning("Mod name collision for mod with class '" + mod.getSimpleName() + "', maybe you have more than one copy?"); | 1160 | + LiteLoader.getLogger().warning("Mod name collision for mod with class '" + mod.getSimpleName() + "', maybe you have more than one copy?"); |
1185 | } | 1161 | } |
1186 | 1162 | ||
1187 | this.modsToLoad.put(mod.getSimpleName(), (Class<? extends LiteMod>)mod); | 1163 | this.modsToLoad.put(mod.getSimpleName(), (Class<? extends LiteMod>)mod); |
@@ -1189,7 +1165,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1189,7 +1165,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1189 | } | 1165 | } |
1190 | 1166 | ||
1191 | if (modClasses.size() > 0) | 1167 | if (modClasses.size() > 0) |
1192 | - logger.info(String.format("Found %s potential matches", modClasses.size())); | 1168 | + LiteLoader.getLogger().info(String.format("Found %s potential matches", modClasses.size())); |
1193 | } | 1169 | } |
1194 | } | 1170 | } |
1195 | 1171 | ||
@@ -1202,15 +1178,15 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1202,15 +1178,15 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1202 | { | 1178 | { |
1203 | for (ModFile modFile : modFiles) | 1179 | for (ModFile modFile : modFiles) |
1204 | { | 1180 | { |
1205 | - logger.info(String.format("Searching %s...", modFile.getAbsolutePath())); | 1181 | + LiteLoader.getLogger().info(String.format("Searching %s...", modFile.getAbsolutePath())); |
1206 | 1182 | ||
1207 | - LinkedList<Class<?>> modClasses = getSubclassesFor(modFile, Minecraft.class.getClassLoader(), LiteMod.class, "LiteMod"); | 1183 | + LinkedList<Class<?>> modClasses = LiteLoader.getSubclassesFor(modFile, Minecraft.class.getClassLoader(), LiteMod.class, "LiteMod"); |
1208 | 1184 | ||
1209 | for (Class<?> mod : modClasses) | 1185 | for (Class<?> mod : modClasses) |
1210 | { | 1186 | { |
1211 | if (this.modsToLoad.containsKey(mod.getSimpleName())) | 1187 | if (this.modsToLoad.containsKey(mod.getSimpleName())) |
1212 | { | 1188 | { |
1213 | - logger.warning("Mod name collision for mod with class '" + mod.getSimpleName() + "', maybe you have more than one copy?"); | 1189 | + LiteLoader.getLogger().warning("Mod name collision for mod with class '" + mod.getSimpleName() + "', maybe you have more than one copy?"); |
1214 | } | 1190 | } |
1215 | 1191 | ||
1216 | this.modsToLoad.put(mod.getSimpleName(), (Class<? extends LiteMod>)mod); | 1192 | this.modsToLoad.put(mod.getSimpleName(), (Class<? extends LiteMod>)mod); |
@@ -1218,7 +1194,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1218,7 +1194,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1218 | } | 1194 | } |
1219 | 1195 | ||
1220 | if (modClasses.size() > 0) | 1196 | if (modClasses.size() > 0) |
1221 | - logger.info(String.format("Found %s potential matches", modClasses.size())); | 1197 | + LiteLoader.getLogger().info(String.format("Found %s potential matches", modClasses.size())); |
1222 | } | 1198 | } |
1223 | } | 1199 | } |
1224 | 1200 | ||
@@ -1231,85 +1207,72 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1231,85 +1207,72 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1231 | { | 1207 | { |
1232 | if (this.modsToLoad == null) | 1208 | if (this.modsToLoad == null) |
1233 | { | 1209 | { |
1234 | - logger.info("Mod class discovery failed. Not loading any mods!"); | 1210 | + LiteLoader.getLogger().info("Mod class discovery failed. Not loading any mods!"); |
1235 | return; | 1211 | return; |
1236 | } | 1212 | } |
1237 | 1213 | ||
1238 | - logger.info("Discovered " + this.modsToLoad.size() + " total mod(s)"); | 1214 | + LiteLoader.getLogger().info("Discovered " + this.modsToLoad.size() + " total mod(s)"); |
1239 | 1215 | ||
1240 | this.pendingResourceReload = false; | 1216 | this.pendingResourceReload = false; |
1241 | - this.soundManagerReloadInhibitor = new SoundManagerReloadInhibitor((SimpleReloadableResourceManager)minecraft.func_110442_L(), minecraft.sndManager); // TODO adamsrc -> getResourceManager | ||
1242 | - if (this.inhibitSoundManagerReload) this.soundManagerReloadInhibitor.inhibit(); | 1217 | + this.soundManagerReloadInhibitor = new SoundManagerReloadInhibitor((SimpleReloadableResourceManager)this.minecraft.getResourceManager(), this.minecraft.sndManager); |
1218 | +// if (this.inhibitSoundManagerReload) this.soundManagerReloadInhibitor.inhibit(); | ||
1243 | 1219 | ||
1244 | for (Class<? extends LiteMod> mod : this.modsToLoad.values()) | 1220 | for (Class<? extends LiteMod> mod : this.modsToLoad.values()) |
1245 | { | 1221 | { |
1246 | try | 1222 | try |
1247 | { | 1223 | { |
1248 | - logger.info("Loading mod from " + mod.getName()); | ||
1249 | - | ||
1250 | - LiteMod newMod = mod.newInstance(); | ||
1251 | - | ||
1252 | - if (this.shouldAddMod(newMod)) | 1224 | + String metaName = this.getModMetaName(mod); |
1225 | + if (metaName == null || this.enabledModsList.isEnabled(this.profile, metaName)) | ||
1253 | { | 1226 | { |
1227 | + LiteLoader.getLogger().info(String.format("Loading mod from %s", mod.getName())); | ||
1228 | + | ||
1229 | + LiteMod newMod = mod.newInstance(); | ||
1230 | + | ||
1254 | this.mods.add(newMod); | 1231 | this.mods.add(newMod); |
1255 | - logger.info("Successfully added mod " + newMod.getName() + " version " + newMod.getVersion()); | 1232 | + LiteLoader.getLogger().info(String.format("Successfully added mod %s version %s", newMod.getName(), newMod.getVersion())); |
1256 | 1233 | ||
1257 | // Get the mod file and register it as a resource pack if it exists | 1234 | // Get the mod file and register it as a resource pack if it exists |
1258 | - ModFile modFile = this.getModFile(newMod); | ||
1259 | - if (modFile != null && modFile.registerAsResourcePack(newMod.getName())) | 1235 | + ModFile modFile = this.getModFile(mod); |
1236 | + if (modFile != null) | ||
1260 | { | 1237 | { |
1261 | - logger.info("Adding " + modFile.getAbsolutePath() + " to resources list"); | 1238 | + this.disabledMods.remove(modFile); |
1239 | + | ||
1240 | + if (modFile.registerAsResourcePack(newMod.getName())) | ||
1241 | + { | ||
1242 | + LiteLoader.getLogger().info(String.format("Successfully added \"%s\" to active resource pack set", modFile.getAbsolutePath())); | ||
1243 | + } | ||
1262 | } | 1244 | } |
1263 | } | 1245 | } |
1264 | else | 1246 | else |
1265 | { | 1247 | { |
1266 | - logger.info("Not loading mod " + newMod.getName() + ", excluded by filter"); | 1248 | + LiteLoader.getLogger().info(String.format("Not loading mod %s, excluded by filter", metaName)); |
1249 | + this.disabledMods.add(this.getModFile(mod)); | ||
1267 | } | 1250 | } |
1268 | } | 1251 | } |
1269 | catch (Throwable th) | 1252 | catch (Throwable th) |
1270 | { | 1253 | { |
1271 | - logger.warning(th.toString()); | 1254 | + LiteLoader.getLogger().warning(th.toString()); |
1272 | th.printStackTrace(); | 1255 | th.printStackTrace(); |
1273 | } | 1256 | } |
1274 | } | 1257 | } |
1275 | } | 1258 | } |
1276 | 1259 | ||
1277 | /** | 1260 | /** |
1278 | - * @param name | ||
1279 | - * @return | 1261 | + * Initialise the mods which were loaded |
1280 | */ | 1262 | */ |
1281 | - private boolean shouldAddMod(LiteMod mod) | 1263 | + private void initMods() |
1282 | { | 1264 | { |
1283 | - if (this.modNameFilter == null) return true; | 1265 | + this.loadedModsList = ""; |
1266 | + int loadedModsCount = 0; | ||
1284 | 1267 | ||
1285 | - String modClassName = mod.getClass().getSimpleName(); | ||
1286 | - if (!this.modFiles.containsKey(modClassName)) return true; | ||
1287 | - | ||
1288 | - String metaName = this.modFiles.get(modClassName).getModName().toLowerCase(); | ||
1289 | - if (this.modNameFilter.contains(metaName)) | ||
1290 | - { | ||
1291 | - return true; | ||
1292 | - } | ||
1293 | - | ||
1294 | - return false; | ||
1295 | - } | ||
1296 | - | ||
1297 | - /** | ||
1298 | - * Initialise the mods which were loaded | ||
1299 | - */ | ||
1300 | - private void initMods() | ||
1301 | - { | ||
1302 | - this.loadedModsList = ""; | ||
1303 | - int loadedModsCount = 0; | ||
1304 | - | ||
1305 | - for (Iterator<LiteMod> iter = this.mods.iterator(); iter.hasNext();) | 1268 | + for (Iterator<LiteMod> iter = this.mods.iterator(); iter.hasNext();) |
1306 | { | 1269 | { |
1307 | LiteMod mod = iter.next(); | 1270 | LiteMod mod = iter.next(); |
1308 | String modName = mod.getName(); | 1271 | String modName = mod.getName(); |
1309 | 1272 | ||
1310 | try | 1273 | try |
1311 | { | 1274 | { |
1312 | - logger.info("Initialising mod " + modName + " version " + mod.getVersion()); | 1275 | + LiteLoader.getLogger().info("Initialising mod " + modName + " version " + mod.getVersion()); |
1313 | 1276 | ||
1314 | try | 1277 | try |
1315 | { | 1278 | { |
@@ -1318,81 +1281,21 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1318,81 +1281,21 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1318 | 1281 | ||
1319 | if (LiteLoader.VERSION.getLoaderRevision() > lastModVersion.getLoaderRevision()) | 1282 | if (LiteLoader.VERSION.getLoaderRevision() > lastModVersion.getLoaderRevision()) |
1320 | { | 1283 | { |
1321 | - logger.info("Performing config upgrade for mod " + modName + ". Upgrading " + lastModVersion + " to " + LiteLoader.VERSION + "..."); | 1284 | + LiteLoader.getLogger().info("Performing config upgrade for mod " + modName + ". Upgrading " + lastModVersion + " to " + LiteLoader.VERSION + "..."); |
1322 | mod.upgradeSettings(VERSION.getMinecraftVersion(), this.versionConfigFolder, this.inflectVersionedConfigPath(lastModVersion)); | 1285 | mod.upgradeSettings(VERSION.getMinecraftVersion(), this.versionConfigFolder, this.inflectVersionedConfigPath(lastModVersion)); |
1323 | 1286 | ||
1324 | this.storeLastKnownModRevision(modKey); | 1287 | this.storeLastKnownModRevision(modKey); |
1325 | - logger.info("Config upgrade succeeded for mod " + modName); | 1288 | + LiteLoader.getLogger().info("Config upgrade succeeded for mod " + modName); |
1326 | } | 1289 | } |
1327 | } | 1290 | } |
1328 | catch (Throwable th) | 1291 | catch (Throwable th) |
1329 | { | 1292 | { |
1330 | - logger.warning("Error performing settings upgrade for " + modName + ". Settings may not be properly migrated"); | 1293 | + LiteLoader.getLogger().warning("Error performing settings upgrade for " + modName + ". Settings may not be properly migrated"); |
1331 | } | 1294 | } |
1332 | 1295 | ||
1333 | mod.init(this.modsFolder); | 1296 | mod.init(this.modsFolder); |
1334 | 1297 | ||
1335 | - if (mod instanceof Tickable) | ||
1336 | - { | ||
1337 | - this.addTickListener((Tickable)mod); | ||
1338 | - } | ||
1339 | - | ||
1340 | - if (mod instanceof GameLoopListener) | ||
1341 | - { | ||
1342 | - this.addLoopListener((GameLoopListener)mod); | ||
1343 | - } | ||
1344 | - | ||
1345 | - if (mod instanceof InitCompleteListener) | ||
1346 | - { | ||
1347 | - this.addInitListener((InitCompleteListener)mod); | ||
1348 | - } | ||
1349 | - | ||
1350 | - if (mod instanceof RenderListener) | ||
1351 | - { | ||
1352 | - this.addRenderListener((RenderListener)mod); | ||
1353 | - } | ||
1354 | - | ||
1355 | - if (mod instanceof PostRenderListener) | ||
1356 | - { | ||
1357 | - this.addPostRenderListener((PostRenderListener)mod); | ||
1358 | - } | ||
1359 | - | ||
1360 | - if (mod instanceof ChatFilter) | ||
1361 | - { | ||
1362 | - this.addChatFilter((ChatFilter)mod); | ||
1363 | - } | ||
1364 | - | ||
1365 | - if (mod instanceof ChatListener) | ||
1366 | - { | ||
1367 | - if (mod instanceof ChatFilter) | ||
1368 | - { | ||
1369 | - this.logger.warning(String.format("Interface error initialising mod '%1s'. A mod implementing ChatFilter and ChatListener is not supported! Remove one of these interfaces", modName)); | ||
1370 | - } | ||
1371 | - else | ||
1372 | - { | ||
1373 | - this.addChatListener((ChatListener)mod); | ||
1374 | - } | ||
1375 | - } | ||
1376 | - | ||
1377 | - if (mod instanceof ChatRenderListener) | ||
1378 | - { | ||
1379 | - this.addChatRenderListener((ChatRenderListener)mod); | ||
1380 | - } | ||
1381 | - | ||
1382 | - if (mod instanceof PreLoginListener) | ||
1383 | - { | ||
1384 | - this.addPreLoginListener((PreLoginListener)mod); | ||
1385 | - } | ||
1386 | - | ||
1387 | - if (mod instanceof LoginListener) | ||
1388 | - { | ||
1389 | - this.addLoginListener((LoginListener)mod); | ||
1390 | - } | ||
1391 | - | ||
1392 | - if (mod instanceof PluginChannelListener) | ||
1393 | - { | ||
1394 | - this.addPluginChannelListener((PluginChannelListener)mod); | ||
1395 | - } | 1298 | + this.events.addListener(mod); |
1396 | 1299 | ||
1397 | if (mod instanceof Permissible) | 1300 | if (mod instanceof Permissible) |
1398 | { | 1301 | { |
@@ -1405,7 +1308,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1405,7 +1308,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1405 | } | 1308 | } |
1406 | catch (Throwable th) | 1309 | catch (Throwable th) |
1407 | { | 1310 | { |
1408 | - logger.log(Level.WARNING, "Error initialising mod '" + modName, th); | 1311 | + LiteLoader.getLogger().log(Level.WARNING, "Error initialising mod '" + modName, th); |
1409 | iter.remove(); | 1312 | iter.remove(); |
1410 | } | 1313 | } |
1411 | } | 1314 | } |
@@ -1414,198 +1317,6 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1414,198 +1317,6 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1414 | } | 1317 | } |
1415 | 1318 | ||
1416 | /** | 1319 | /** |
1417 | - * Initialise mod hooks | ||
1418 | - */ | ||
1419 | - private void initHooks() | ||
1420 | - { | ||
1421 | - try | ||
1422 | - { | ||
1423 | - // Chat hook | ||
1424 | - if ((this.chatListeners.size() > 0 || this.chatFilters.size() > 0) && !this.chatHooked) | ||
1425 | - { | ||
1426 | - this.chatHooked = true; | ||
1427 | - HookChat.register(); | ||
1428 | - HookChat.registerPacketHandler(this); | ||
1429 | - } | ||
1430 | - | ||
1431 | - // Login hook | ||
1432 | - if ((this.preLoginListeners.size() > 0 || this.loginListeners.size() > 0) && !this.loginHooked) | ||
1433 | - { | ||
1434 | - this.loginHooked = true; | ||
1435 | - ModUtilities.registerPacketOverride(1, HookLogin.class); | ||
1436 | - HookLogin.loader = this; | ||
1437 | - } | ||
1438 | - | ||
1439 | - // Plugin channels hook | ||
1440 | - if (this.pluginChannelListeners.size() > 0 && !this.pluginChannelHooked) | ||
1441 | - { | ||
1442 | - this.pluginChannelHooked = true; | ||
1443 | - HookPluginChannels.register(); | ||
1444 | - HookPluginChannels.registerPacketHandler(this); | ||
1445 | - } | ||
1446 | - | ||
1447 | - // Tick hook | ||
1448 | - if (!this.tickHooked) | ||
1449 | - { | ||
1450 | - this.tickHooked = true; | ||
1451 | - PrivateFields.minecraftProfiler.setFinal(this.minecraft, this.profilerHook); | ||
1452 | - } | ||
1453 | - | ||
1454 | - // Sanity hook | ||
1455 | - PlayerUsageSnooper snooper = this.minecraft.getPlayerUsageSnooper(); | ||
1456 | - PrivateFields.playerStatsCollector.setFinal(snooper, this); | ||
1457 | - } | ||
1458 | - catch (Exception ex) | ||
1459 | - { | ||
1460 | - logger.log(Level.WARNING, "Error creating hooks", ex); | ||
1461 | - ex.printStackTrace(); | ||
1462 | - } | ||
1463 | - } | ||
1464 | - | ||
1465 | - /** | ||
1466 | - * @param tickable | ||
1467 | - */ | ||
1468 | - public void addTickListener(Tickable tickable) | ||
1469 | - { | ||
1470 | - if (!this.tickListeners.contains(tickable)) | ||
1471 | - { | ||
1472 | - this.tickListeners.add(tickable); | ||
1473 | - if (this.loaderStartupComplete) | ||
1474 | - this.initHooks(); | ||
1475 | - } | ||
1476 | - } | ||
1477 | - | ||
1478 | - /** | ||
1479 | - * @param loopListener | ||
1480 | - */ | ||
1481 | - public void addLoopListener(GameLoopListener loopListener) | ||
1482 | - { | ||
1483 | - if (!this.loopListeners.contains(loopListener)) | ||
1484 | - { | ||
1485 | - this.loopListeners.add(loopListener); | ||
1486 | - if (this.loaderStartupComplete) | ||
1487 | - this.initHooks(); | ||
1488 | - } | ||
1489 | - } | ||
1490 | - | ||
1491 | - /** | ||
1492 | - * @param initCompleteListener | ||
1493 | - */ | ||
1494 | - public void addInitListener(InitCompleteListener initCompleteListener) | ||
1495 | - { | ||
1496 | - if (!this.initListeners.contains(initCompleteListener)) | ||
1497 | - { | ||
1498 | - this.initListeners.add(initCompleteListener); | ||
1499 | - if (this.loaderStartupComplete) | ||
1500 | - this.initHooks(); | ||
1501 | - } | ||
1502 | - } | ||
1503 | - | ||
1504 | - /** | ||
1505 | - * @param tickable | ||
1506 | - */ | ||
1507 | - public void addRenderListener(RenderListener tickable) | ||
1508 | - { | ||
1509 | - if (!this.renderListeners.contains(tickable)) | ||
1510 | - { | ||
1511 | - this.renderListeners.add(tickable); | ||
1512 | - if (this.loaderStartupComplete) | ||
1513 | - this.initHooks(); | ||
1514 | - } | ||
1515 | - } | ||
1516 | - | ||
1517 | - /** | ||
1518 | - * @param tickable | ||
1519 | - */ | ||
1520 | - public void addPostRenderListener(PostRenderListener tickable) | ||
1521 | - { | ||
1522 | - if (!this.postRenderListeners.contains(tickable)) | ||
1523 | - { | ||
1524 | - this.postRenderListeners.add(tickable); | ||
1525 | - if (this.loaderStartupComplete) | ||
1526 | - this.initHooks(); | ||
1527 | - } | ||
1528 | - } | ||
1529 | - | ||
1530 | - /** | ||
1531 | - * @param chatFilter | ||
1532 | - */ | ||
1533 | - public void addChatFilter(ChatFilter chatFilter) | ||
1534 | - { | ||
1535 | - if (!this.chatFilters.contains(chatFilter)) | ||
1536 | - { | ||
1537 | - this.chatFilters.add(chatFilter); | ||
1538 | - if (this.loaderStartupComplete) | ||
1539 | - this.initHooks(); | ||
1540 | - } | ||
1541 | - } | ||
1542 | - | ||
1543 | - /** | ||
1544 | - * @param chatListener | ||
1545 | - */ | ||
1546 | - public void addChatListener(ChatListener chatListener) | ||
1547 | - { | ||
1548 | - if (!this.chatListeners.contains(chatListener)) | ||
1549 | - { | ||
1550 | - this.chatListeners.add(chatListener); | ||
1551 | - if (this.loaderStartupComplete) | ||
1552 | - this.initHooks(); | ||
1553 | - } | ||
1554 | - } | ||
1555 | - | ||
1556 | - /** | ||
1557 | - * @param chatRenderListener | ||
1558 | - */ | ||
1559 | - public void addChatRenderListener(ChatRenderListener chatRenderListener) | ||
1560 | - { | ||
1561 | - if (!this.chatRenderListeners.contains(chatRenderListener)) | ||
1562 | - { | ||
1563 | - this.chatRenderListeners.add(chatRenderListener); | ||
1564 | - if (this.loaderStartupComplete) | ||
1565 | - this.initHooks(); | ||
1566 | - } | ||
1567 | - } | ||
1568 | - | ||
1569 | - /** | ||
1570 | - * @param loginListener | ||
1571 | - */ | ||
1572 | - public void addPreLoginListener(PreLoginListener loginListener) | ||
1573 | - { | ||
1574 | - if (!this.preLoginListeners.contains(loginListener)) | ||
1575 | - { | ||
1576 | - this.preLoginListeners.add(loginListener); | ||
1577 | - if (this.loaderStartupComplete) | ||
1578 | - this.initHooks(); | ||
1579 | - } | ||
1580 | - } | ||
1581 | - | ||
1582 | - /** | ||
1583 | - * @param loginListener | ||
1584 | - */ | ||
1585 | - public void addLoginListener(LoginListener loginListener) | ||
1586 | - { | ||
1587 | - if (!this.loginListeners.contains(loginListener)) | ||
1588 | - { | ||
1589 | - this.loginListeners.add(loginListener); | ||
1590 | - if (this.loaderStartupComplete) | ||
1591 | - this.initHooks(); | ||
1592 | - } | ||
1593 | - } | ||
1594 | - | ||
1595 | - /** | ||
1596 | - * @param pluginChannelListener | ||
1597 | - */ | ||
1598 | - public void addPluginChannelListener(PluginChannelListener pluginChannelListener) | ||
1599 | - { | ||
1600 | - if (!this.pluginChannelListeners.contains(pluginChannelListener)) | ||
1601 | - { | ||
1602 | - this.pluginChannelListeners.add(pluginChannelListener); | ||
1603 | - if (this.loaderStartupComplete) | ||
1604 | - this.initHooks(); | ||
1605 | - } | ||
1606 | - } | ||
1607 | - | ||
1608 | - /** | ||
1609 | * Enumerate classes on the classpath which are subclasses of the specified | 1320 | * Enumerate classes on the classpath which are subclasses of the specified |
1610 | * class | 1321 | * class |
1611 | * | 1322 | * |
@@ -1629,7 +1340,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1629,7 +1340,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1629 | } | 1340 | } |
1630 | catch (Throwable th) | 1341 | catch (Throwable th) |
1631 | { | 1342 | { |
1632 | - logger.log(Level.WARNING, "Enumeration error", th); | 1343 | + LiteLoader.getLogger().log(Level.WARNING, "Enumeration error", th); |
1633 | } | 1344 | } |
1634 | 1345 | ||
1635 | return classes; | 1346 | return classes; |
@@ -1747,72 +1458,32 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1747,72 +1458,32 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1747 | } | 1458 | } |
1748 | catch (Throwable th) | 1459 | catch (Throwable th) |
1749 | { | 1460 | { |
1750 | - logger.log(Level.WARNING, "checkAndAddClass error", th); | 1461 | + LiteLoader.getLogger().log(Level.WARNING, "checkAndAddClass error", th); |
1751 | } | 1462 | } |
1752 | } | 1463 | } |
1753 | - | ||
1754 | - /** | ||
1755 | - * Add a URL to the Minecraft classloader class path | ||
1756 | - * | ||
1757 | - * @param classUrl URL of the resource to add | ||
1758 | - */ | ||
1759 | - private boolean addURLToClassPath(URL classUrl) | 1464 | + |
1465 | + public void refreshResources() | ||
1760 | { | 1466 | { |
1761 | - try | ||
1762 | - { | ||
1763 | - if (Minecraft.class.getClassLoader() instanceof URLClassLoader && this.mAddUrl != null && this.mAddUrl.isAccessible()) | ||
1764 | - { | ||
1765 | - URLClassLoader classLoader = (URLClassLoader)Minecraft.class.getClassLoader(); | ||
1766 | - this.mAddUrl.invoke(classLoader, classUrl); | ||
1767 | - return true; | ||
1768 | - } | ||
1769 | - } | ||
1770 | - catch (Throwable th) | 1467 | + if (this.pendingResourceReload) |
1771 | { | 1468 | { |
1772 | - logger.log(Level.WARNING, "Error adding class path entry", th); | 1469 | + this.pendingResourceReload = false; |
1470 | + this.minecraft.refreshResources(); | ||
1773 | } | 1471 | } |
1774 | - | ||
1775 | - return false; | ||
1776 | } | 1472 | } |
1777 | 1473 | ||
1778 | - /** | ||
1779 | - * Late initialisation callback | ||
1780 | - */ | ||
1781 | public void onInit() | 1474 | public void onInit() |
1782 | { | 1475 | { |
1783 | - if (this.pendingResourceReload) | ||
1784 | - { | ||
1785 | - this.pendingResourceReload = false; | ||
1786 | - this.minecraft.func_110436_a(); // TODO adamsrc -> refreshResourcePacks | ||
1787 | - } | ||
1788 | - | ||
1789 | - if (!this.lateInitDone) | ||
1790 | - { | ||
1791 | - this.lateInitDone = true; | ||
1792 | - | ||
1793 | - for (InitCompleteListener initMod : this.initListeners) | ||
1794 | - { | ||
1795 | - try | ||
1796 | - { | ||
1797 | - logger.info("Calling late init for mod " + initMod.getName()); | ||
1798 | - initMod.onInitCompleted(this.minecraft, this); | ||
1799 | - } | ||
1800 | - catch (Throwable th) | ||
1801 | - { | ||
1802 | - logger.log(Level.WARNING, "Error initialising mod " + initMod.getName(), th); | ||
1803 | - } | ||
1804 | - } | ||
1805 | - } | ||
1806 | - | ||
1807 | if (this.soundManagerReloadInhibitor != null && this.soundManagerReloadInhibitor.isInhibited()) | 1476 | if (this.soundManagerReloadInhibitor != null && this.soundManagerReloadInhibitor.isInhibited()) |
1808 | { | 1477 | { |
1809 | this.soundManagerReloadInhibitor.unInhibit(true); | 1478 | this.soundManagerReloadInhibitor.unInhibit(true); |
1810 | } | 1479 | } |
1811 | } | 1480 | } |
1812 | - | ||
1813 | - /** | ||
1814 | - * Callback from the tick hook, pre render | ||
1815 | - */ | 1481 | + |
1482 | + public void onLogin(NetHandler netHandler, Packet1Login loginPacket) | ||
1483 | + { | ||
1484 | + this.permissionsManager.onLogin(netHandler, loginPacket); | ||
1485 | + } | ||
1486 | + | ||
1816 | public void onRender() | 1487 | public void onRender() |
1817 | { | 1488 | { |
1818 | if (this.paginateControls && this.minecraft.currentScreen != null && this.minecraft.currentScreen.getClass().equals(GuiControls.class)) | 1489 | if (this.paginateControls && this.minecraft.currentScreen != null && this.minecraft.currentScreen.getClass().equals(GuiControls.class)) |
@@ -1827,431 +1498,191 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1827,431 +1498,191 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
1827 | { | 1498 | { |
1828 | } | 1499 | } |
1829 | } | 1500 | } |
1830 | - | ||
1831 | - for (RenderListener renderListener : this.renderListeners) | ||
1832 | - renderListener.onRender(); | ||
1833 | } | 1501 | } |
1834 | - | ||
1835 | - /** | ||
1836 | - * Callback from the tick hook, post render entities | ||
1837 | - */ | ||
1838 | - public void postRenderEntities() | ||
1839 | - { | ||
1840 | - float partialTicks = (this.minecraftTimer != null) ? this.minecraftTimer.elapsedPartialTicks : 0.0F; | ||
1841 | - | ||
1842 | - for (PostRenderListener renderListener : this.postRenderListeners) | ||
1843 | - renderListener.onPostRenderEntities(partialTicks); | ||
1844 | - } | ||
1845 | - | ||
1846 | - /** | ||
1847 | - * Callback from the tick hook, post render | ||
1848 | - */ | ||
1849 | - public void postRender() | ||
1850 | - { | ||
1851 | - float partialTicks = (this.minecraftTimer != null) ? this.minecraftTimer.elapsedPartialTicks : 0.0F; | ||
1852 | - | ||
1853 | - for (PostRenderListener renderListener : this.postRenderListeners) | ||
1854 | - renderListener.onPostRender(partialTicks); | ||
1855 | - } | ||
1856 | - | ||
1857 | - /** | ||
1858 | - * Called immediately before the current GUI is rendered | ||
1859 | - */ | ||
1860 | - public void onBeforeGuiRender() | ||
1861 | - { | ||
1862 | - for (RenderListener renderListener : this.renderListeners) | ||
1863 | - renderListener.onRenderGui(this.minecraft.currentScreen); | ||
1864 | - } | ||
1865 | - | ||
1866 | - /** | ||
1867 | - * Called immediately after the world/camera transform is initialised | ||
1868 | - */ | ||
1869 | - public void onSetupCameraTransform() | ||
1870 | - { | ||
1871 | - for (RenderListener renderListener : this.renderListeners) | ||
1872 | - renderListener.onSetupCameraTransform(); | ||
1873 | - } | ||
1874 | - | ||
1875 | - /** | ||
1876 | - * Called immediately before the chat log is rendered | ||
1877 | - */ | ||
1878 | - public void onBeforeChatRender() | ||
1879 | - { | ||
1880 | - this.currentResolution = new ScaledResolution(this.minecraft.gameSettings, this.minecraft.displayWidth, this.minecraft.displayHeight); | ||
1881 | - int screenWidth = this.currentResolution.getScaledWidth(); | ||
1882 | - int screenHeight = this.currentResolution.getScaledHeight(); | ||
1883 | - | ||
1884 | - GuiNewChat chat = this.minecraft.ingameGUI.getChatGUI(); | ||
1885 | - | ||
1886 | - for (ChatRenderListener chatRenderListener : this.chatRenderListeners) | ||
1887 | - chatRenderListener.onPreRenderChat(screenWidth, screenHeight, chat); | ||
1888 | - } | ||
1889 | - | ||
1890 | - /** | ||
1891 | - * Called immediately after the chat log is rendered | ||
1892 | - */ | ||
1893 | - public void onAfterChatRender() | 1502 | + |
1503 | + public void onTick(float partialTicks, boolean inGame) | ||
1894 | { | 1504 | { |
1895 | - int screenWidth = this.currentResolution.getScaledWidth(); | ||
1896 | - int screenHeight = this.currentResolution.getScaledHeight(); | ||
1897 | - | ||
1898 | - GuiNewChat chat = this.minecraft.ingameGUI.getChatGUI(); | 1505 | + // Tick the permissions manager |
1506 | + permissionsManager.onTick(this.minecraft, partialTicks, inGame); | ||
1899 | 1507 | ||
1900 | - for (ChatRenderListener chatRenderListener : this.chatRenderListeners) | ||
1901 | - chatRenderListener.onPostRenderChat(screenWidth, screenHeight, chat); | 1508 | + this.checkAndStoreKeyBindings(); |
1902 | } | 1509 | } |
1903 | 1510 | ||
1904 | - /** | ||
1905 | - * Callback from the tick hook, called every frame when the timer is updated | ||
1906 | - */ | ||
1907 | - public void onTimerUpdate() | ||
1908 | - { | ||
1909 | - for (GameLoopListener loopListener : this.loopListeners) | ||
1910 | - loopListener.onRunGameLoop(this.minecraft); | ||
1911 | - } | ||
1912 | - | ||
1913 | - /** | ||
1914 | - * Callback from the tick hook, ticks all tickable mods | ||
1915 | - * | ||
1916 | - * @param tick True if this is a new tick (otherwise it's just a new frame) | ||
1917 | - */ | ||
1918 | - public void onTick(Profiler profiler, boolean tick) | 1511 | + public void registerModKey(KeyBinding binding) |
1919 | { | 1512 | { |
1920 | - float partialTicks = 0.0F; | ||
1921 | - | ||
1922 | - // Try to get the minecraft timer object and determine the value of the | ||
1923 | - // partialTicks | ||
1924 | - if (tick || this.minecraftTimer == null) | ||
1925 | - { | ||
1926 | - this.minecraftTimer = PrivateFields.minecraftTimer.get(this.minecraft); | ||
1927 | - } | ||
1928 | - | ||
1929 | - // Hooray, we got the timer reference | ||
1930 | - if (this.minecraftTimer != null) | ||
1931 | - { | ||
1932 | - partialTicks = this.minecraftTimer.renderPartialTicks; | ||
1933 | - tick = this.minecraftTimer.elapsedTicks > 0; | ||
1934 | - } | ||
1935 | - | ||
1936 | - // Flag indicates whether we are in game at the moment | ||
1937 | - boolean inGame = this.minecraft.renderViewEntity != null && this.minecraft.renderViewEntity.worldObj != null; | 1513 | + LinkedList<KeyBinding> keyBindings = new LinkedList<KeyBinding>(); |
1514 | + keyBindings.addAll(Arrays.asList(this.minecraft.gameSettings.keyBindings)); | ||
1938 | 1515 | ||
1939 | - if (tick) | 1516 | + if (!keyBindings.contains(binding)) |
1940 | { | 1517 | { |
1941 | - // Tick the permissions manager | ||
1942 | - permissionsManager.onTick(this.minecraft, partialTicks, inGame); | 1518 | + if (this.keyMapSettings.containsKey(binding.keyDescription)) |
1519 | + { | ||
1520 | + try | ||
1521 | + { | ||
1522 | + binding.keyCode = Integer.parseInt(this.keyMapSettings.getProperty(binding.keyDescription, String.valueOf(binding.keyCode))); | ||
1523 | + } | ||
1524 | + catch (NumberFormatException ex) {} | ||
1525 | + } | ||
1526 | + | ||
1527 | + keyBindings.add(binding); | ||
1528 | + this.minecraft.gameSettings.keyBindings = keyBindings.toArray(new KeyBinding[0]); | ||
1529 | + this.modKeyBindings.add(binding); | ||
1943 | 1530 | ||
1944 | - this.checkAndStoreKeyBindings(); | ||
1945 | - } | ||
1946 | - | ||
1947 | - // Iterate tickable mods | ||
1948 | - for (Tickable tickable : this.tickListeners) | ||
1949 | - { | ||
1950 | - profiler.startSection(tickable.getClass().getSimpleName()); | ||
1951 | - tickable.onTick(this.minecraft, partialTicks, inGame, tick); | ||
1952 | - profiler.endSection(); | 1531 | + this.updateBinding(binding); |
1532 | + this.storeBindings(); | ||
1953 | } | 1533 | } |
1954 | } | 1534 | } |
1955 | 1535 | ||
1956 | /** | 1536 | /** |
1957 | - * Callback from the chat hook | ||
1958 | - * | ||
1959 | - * @param chatPacket | ||
1960 | - * @return | 1537 | + * Checks for changed mod keybindings and stores any that have changed |
1961 | */ | 1538 | */ |
1962 | - public boolean onChat(Packet3Chat chatPacket) | 1539 | + private void checkAndStoreKeyBindings() |
1963 | { | 1540 | { |
1964 | - if (chatPacket.message == null) | ||
1965 | - return true; | ||
1966 | - | ||
1967 | - ChatMessageComponent chat = ChatMessageComponent.func_111078_c(chatPacket.message); | ||
1968 | - String message = chat.func_111068_a(true); | 1541 | + boolean updated = false; |
1969 | 1542 | ||
1970 | - // Chat filters get a stab at the chat first, if any filter returns | ||
1971 | - // false the chat is discarded | ||
1972 | - for (ChatFilter chatFilter : this.chatFilters) | 1543 | + for (KeyBinding binding : this.modKeyBindings) |
1973 | { | 1544 | { |
1974 | - if (chatFilter.onChat(chatPacket, chat, message)) | ||
1975 | - { | ||
1976 | - chat = ChatMessageComponent.func_111078_c(chatPacket.message); | ||
1977 | - message = chat.func_111068_a(true); | ||
1978 | - } | ||
1979 | - else | 1545 | + if (binding.keyCode != this.storedModKeyBindings.get(binding)) |
1980 | { | 1546 | { |
1981 | - return false; | 1547 | + this.updateBinding(binding); |
1548 | + updated = true; | ||
1982 | } | 1549 | } |
1983 | } | 1550 | } |
1984 | 1551 | ||
1985 | - // Chat listeners get the chat if no filter removed it | ||
1986 | - for (ChatListener chatListener : this.chatListeners) | ||
1987 | - chatListener.onChat(chat, message); | ||
1988 | - | ||
1989 | - return true; | 1552 | + if (updated) |
1553 | + this.storeBindings(); | ||
1990 | } | 1554 | } |
1991 | 1555 | ||
1992 | /** | 1556 | /** |
1993 | - * Pre-login callback from the login hook | ||
1994 | - * | ||
1995 | - * @param netHandler | ||
1996 | - * @param hookLogin | ||
1997 | - * @return | 1557 | + * @param binding |
1998 | */ | 1558 | */ |
1999 | - public boolean onPreLogin(NetHandler netHandler, Packet1Login loginPacket) | 1559 | + private void updateBinding(KeyBinding binding) |
2000 | { | 1560 | { |
2001 | - boolean cancelled = false; | ||
2002 | - | ||
2003 | - for (PreLoginListener loginListener : this.preLoginListeners) | ||
2004 | - { | ||
2005 | - cancelled |= !loginListener.onPreLogin(netHandler, loginPacket); | ||
2006 | - } | ||
2007 | - | ||
2008 | - return !cancelled; | 1561 | + this.keyMapSettings.setProperty(binding.keyDescription, String.valueOf(binding.keyCode)); |
1562 | + this.storedModKeyBindings.put(binding, Integer.valueOf(binding.keyCode)); | ||
2009 | } | 1563 | } |
2010 | - | 1564 | + |
2011 | /** | 1565 | /** |
2012 | - * Callback from the login hook | ||
2013 | - * | ||
2014 | - * @param netHandler | ||
2015 | - * @param loginPacket | 1566 | + * Writes mod bindings to disk |
2016 | */ | 1567 | */ |
2017 | - public void onConnectToServer(NetHandler netHandler, Packet1Login loginPacket) | 1568 | + protected void storeBindings() |
2018 | { | 1569 | { |
2019 | - permissionsManager.onLogin(netHandler, loginPacket); | ||
2020 | - | ||
2021 | - for (LoginListener loginListener : this.loginListeners) | ||
2022 | - loginListener.onLogin(netHandler, loginPacket); | ||
2023 | - | ||
2024 | - this.setupPluginChannels(); | 1570 | + try |
1571 | + { | ||
1572 | + this.keyMapSettings.store(new FileWriter(this.keyMapSettingsFile), "Mod key mappings for LiteLoader mods, stored here to avoid losing settings stored in options.txt"); | ||
1573 | + } | ||
1574 | + catch (IOException ex) {} | ||
2025 | } | 1575 | } |
2026 | 1576 | ||
2027 | /** | 1577 | /** |
2028 | - * Callback for the plugin channel hook | 1578 | + * Set the brand in ClientBrandRetriever to the specified brand |
2029 | * | 1579 | * |
2030 | - * @param hookPluginChannels | 1580 | + * @param brand |
2031 | */ | 1581 | */ |
2032 | - public void onPluginChannelMessage(HookPluginChannels hookPluginChannels) | 1582 | + private void setBranding(String brand) |
2033 | { | 1583 | { |
2034 | - if (hookPluginChannels != null && hookPluginChannels.channel != null && this.pluginChannels.containsKey(hookPluginChannels.channel)) | 1584 | + try |
2035 | { | 1585 | { |
2036 | - try | ||
2037 | - { | ||
2038 | - permissionsManager.onCustomPayload(hookPluginChannels.channel, hookPluginChannels.length, hookPluginChannels.data); | ||
2039 | - } | ||
2040 | - catch (Exception ex) | ||
2041 | - { | ||
2042 | - } | 1586 | + String oldBrand = ClientBrandRetriever.getClientModName(); |
2043 | 1587 | ||
2044 | - for (PluginChannelListener pluginChannelListener : this.pluginChannels.get(hookPluginChannels.channel)) | 1588 | + if (oldBrand.equals("vanilla")) |
2045 | { | 1589 | { |
1590 | + char[] newValue = brand.toCharArray(); | ||
1591 | + | ||
1592 | + Field stringValue = String.class.getDeclaredField("value"); | ||
1593 | + stringValue.setAccessible(true); | ||
1594 | + stringValue.set(oldBrand, newValue); | ||
1595 | + | ||
2046 | try | 1596 | try |
2047 | { | 1597 | { |
2048 | - pluginChannelListener.onCustomPayload(hookPluginChannels.channel, hookPluginChannels.length, hookPluginChannels.data); | ||
2049 | - } | ||
2050 | - catch (Exception ex) | ||
2051 | - { | 1598 | + Field stringCount = String.class.getDeclaredField("count"); |
1599 | + stringCount.setAccessible(true); | ||
1600 | + stringCount.set(oldBrand, newValue.length); | ||
2052 | } | 1601 | } |
1602 | + catch (NoSuchFieldException ex) {} // java 1.7 doesn't have this member | ||
2053 | } | 1603 | } |
2054 | } | 1604 | } |
1605 | + catch (Exception ex) | ||
1606 | + { | ||
1607 | + LiteLoader.getLogger().log(Level.WARNING, "Setting branding failed", ex); | ||
1608 | + } | ||
2055 | } | 1609 | } |
1610 | + | ||
1611 | + // ----------------------------------------------------------------------------------------------------------- | ||
1612 | + // TODO Remove delegates below after 1.6.3 | ||
1613 | + // ----------------------------------------------------------------------------------------------------------- | ||
2056 | 1614 | ||
2057 | /** | 1615 | /** |
2058 | - * Delegate to ModUtilities.sendPluginChannelMessage | 1616 | + * Delegate to PluginChannels.sendMessage. Deprecated and will be removed |
2059 | * | 1617 | * |
2060 | * @param channel Channel to send data to | 1618 | * @param channel Channel to send data to |
2061 | * @param data Data to send | 1619 | * @param data Data to send |
1620 | + * | ||
1621 | + * @deprecated User PluginChannels.sendMessage(channel, data) instead. | ||
2062 | */ | 1622 | */ |
1623 | + @Deprecated | ||
2063 | public void sendPluginChannelMessage(String channel, byte[] data) | 1624 | public void sendPluginChannelMessage(String channel, byte[] data) |
2064 | { | 1625 | { |
2065 | - ModUtilities.sendPluginChannelMessage(channel, data); | 1626 | + PluginChannels.sendMessage(channel, data); |
2066 | } | 1627 | } |
2067 | - | ||
2068 | - /** | ||
2069 | - * Query loaded mods for registered channels | ||
2070 | - */ | ||
2071 | - protected void setupPluginChannels() | 1628 | + |
1629 | + @Deprecated | ||
1630 | + public void addTickListener(Tickable tickable) | ||
2072 | { | 1631 | { |
2073 | - // Clear any channels from before | ||
2074 | - this.pluginChannels.clear(); | ||
2075 | - | ||
2076 | - // Add the permissions manager channels | ||
2077 | - this.addPluginChannelsFor(permissionsManager); | ||
2078 | - | ||
2079 | - // Enumerate mods for plugin channels | ||
2080 | - for (PluginChannelListener pluginChannelListener : this.pluginChannelListeners) | ||
2081 | - { | ||
2082 | - this.addPluginChannelsFor(pluginChannelListener); | ||
2083 | - } | ||
2084 | - | ||
2085 | - // If any mods have registered channels, send the REGISTER packet | ||
2086 | - if (this.pluginChannels.keySet().size() > 0) | ||
2087 | - { | ||
2088 | - StringBuilder channelList = new StringBuilder(); | ||
2089 | - boolean separator = false; | ||
2090 | - | ||
2091 | - for (String channel : this.pluginChannels.keySet()) | ||
2092 | - { | ||
2093 | - if (separator) | ||
2094 | - channelList.append("\u0000"); | ||
2095 | - channelList.append(channel); | ||
2096 | - separator = true; | ||
2097 | - } | ||
2098 | - | ||
2099 | - byte[] registrationData = channelList.toString().getBytes(Charset.forName("UTF8")); | ||
2100 | - | ||
2101 | - this.sendPluginChannelMessage("REGISTER", registrationData); | ||
2102 | - } | 1632 | + this.events.addTickListener(tickable); |
2103 | } | 1633 | } |
2104 | 1634 | ||
2105 | - /** | ||
2106 | - * Adds plugin channels for the specified listener to the local channels | ||
2107 | - * collection | ||
2108 | - * | ||
2109 | - * @param pluginChannelListener | ||
2110 | - */ | ||
2111 | - private void addPluginChannelsFor(PluginChannelListener pluginChannelListener) | 1635 | + @Deprecated |
1636 | + public void addLoopListener(GameLoopListener loopListener) | ||
2112 | { | 1637 | { |
2113 | - List<String> channels = pluginChannelListener.getChannels(); | ||
2114 | - | ||
2115 | - if (channels != null) | ||
2116 | - { | ||
2117 | - for (String channel : channels) | ||
2118 | - { | ||
2119 | - if (channel.length() > 16 || channel.toUpperCase().equals("REGISTER") || channel.toUpperCase().equals("UNREGISTER")) | ||
2120 | - continue; | ||
2121 | - | ||
2122 | - if (!this.pluginChannels.containsKey(channel)) | ||
2123 | - { | ||
2124 | - this.pluginChannels.put(channel, new LinkedList<PluginChannelListener>()); | ||
2125 | - } | ||
2126 | - | ||
2127 | - this.pluginChannels.get(channel).add(pluginChannelListener); | ||
2128 | - } | ||
2129 | - } | 1638 | + this.events.addLoopListener(loopListener); |
2130 | } | 1639 | } |
2131 | 1640 | ||
2132 | - /* | ||
2133 | - * (non-Javadoc) | ||
2134 | - * | ||
2135 | - * @see | ||
2136 | - * net.minecraft.src.IPlayerUsage#addServerStatsToSnooper(net.minecraft. | ||
2137 | - * src.PlayerUsageSnooper) | ||
2138 | - */ | ||
2139 | - @Override | ||
2140 | - public void addServerStatsToSnooper(PlayerUsageSnooper var1) | 1641 | + @Deprecated |
1642 | + public void addInitListener(InitCompleteListener initCompleteListener) | ||
2141 | { | 1643 | { |
2142 | - this.minecraft.addServerStatsToSnooper(var1); | 1644 | + this.events.addInitListener(initCompleteListener); |
2143 | } | 1645 | } |
2144 | 1646 | ||
2145 | - /* | ||
2146 | - * (non-Javadoc) | ||
2147 | - * | ||
2148 | - * @see | ||
2149 | - * net.minecraft.src.IPlayerUsage#addServerTypeToSnooper(net.minecraft.src | ||
2150 | - * .PlayerUsageSnooper) | ||
2151 | - */ | ||
2152 | - @Override | ||
2153 | - public void addServerTypeToSnooper(PlayerUsageSnooper var1) | 1647 | + @Deprecated |
1648 | + public void addRenderListener(RenderListener renderListener) | ||
2154 | { | 1649 | { |
2155 | - this.sanityCheck(); | ||
2156 | - this.minecraft.addServerTypeToSnooper(var1); | 1650 | + this.events.addRenderListener(renderListener); |
2157 | } | 1651 | } |
2158 | 1652 | ||
2159 | - /* | ||
2160 | - * (non-Javadoc) | ||
2161 | - * | ||
2162 | - * @see net.minecraft.src.IPlayerUsage#isSnooperEnabled() | ||
2163 | - */ | ||
2164 | - @Override | ||
2165 | - public boolean isSnooperEnabled() | 1653 | + @Deprecated |
1654 | + public void addPostRenderListener(PostRenderListener postRenderListener) | ||
2166 | { | 1655 | { |
2167 | - return this.minecraft.isSnooperEnabled(); | 1656 | + this.events.addPostRenderListener(postRenderListener); |
2168 | } | 1657 | } |
2169 | 1658 | ||
2170 | - /* | ||
2171 | - * (non-Javadoc) | ||
2172 | - * | ||
2173 | - * @see net.minecraft.src.IPlayerUsage#getLogAgent() | ||
2174 | - */ | ||
2175 | - @Override | ||
2176 | - public ILogAgent getLogAgent() | 1659 | + @Deprecated |
1660 | + public void addChatFilter(ChatFilter chatFilter) | ||
2177 | { | 1661 | { |
2178 | - return this.minecraft.getLogAgent(); | 1662 | + this.events.addChatFilter(chatFilter); |
2179 | } | 1663 | } |
2180 | 1664 | ||
2181 | - /** | ||
2182 | - * Check that the profiler hook hasn't been overridden by something else | ||
2183 | - */ | ||
2184 | - private void sanityCheck() | 1665 | + @Deprecated |
1666 | + public void addChatListener(ChatListener chatListener) | ||
2185 | { | 1667 | { |
2186 | - if (this.tickHooked && this.minecraft.mcProfiler != this.profilerHook) | ||
2187 | - { | ||
2188 | - PrivateFields.minecraftProfiler.setFinal(this.minecraft, this.profilerHook); | ||
2189 | - } | ||
2190 | - } | ||
2191 | - | ||
2192 | - public void registerModKey(KeyBinding binding) | ||
2193 | - { | ||
2194 | - LinkedList<KeyBinding> keyBindings = new LinkedList<KeyBinding>(); | ||
2195 | - keyBindings.addAll(Arrays.asList(this.minecraft.gameSettings.keyBindings)); | ||
2196 | - | ||
2197 | - if (!keyBindings.contains(binding)) | ||
2198 | - { | ||
2199 | - if (this.keyMapSettings.containsKey(binding.keyDescription)) | ||
2200 | - { | ||
2201 | - try | ||
2202 | - { | ||
2203 | - binding.keyCode = Integer.parseInt(this.keyMapSettings.getProperty(binding.keyDescription, String.valueOf(binding.keyCode))); | ||
2204 | - } | ||
2205 | - catch (NumberFormatException ex) {} | ||
2206 | - } | ||
2207 | - | ||
2208 | - keyBindings.add(binding); | ||
2209 | - this.minecraft.gameSettings.keyBindings = keyBindings.toArray(new KeyBinding[0]); | ||
2210 | - this.modKeys.add(binding); | ||
2211 | - | ||
2212 | - this.updateBinding(binding); | ||
2213 | - this.storeBindings(); | ||
2214 | - } | 1668 | + this.events.addChatListener(chatListener); |
2215 | } | 1669 | } |
2216 | 1670 | ||
2217 | - /** | ||
2218 | - * Checks for changed mod keybindings and stores any that have changed | ||
2219 | - */ | ||
2220 | - private void checkAndStoreKeyBindings() | 1671 | + @Deprecated |
1672 | + public void addChatRenderListener(ChatRenderListener chatRenderListener) | ||
2221 | { | 1673 | { |
2222 | - boolean updated = false; | ||
2223 | - | ||
2224 | - for (KeyBinding binding : this.modKeys) | ||
2225 | - { | ||
2226 | - if (binding.keyCode != this.storedModKeyBindings.get(binding)) | ||
2227 | - { | ||
2228 | - this.updateBinding(binding); | ||
2229 | - updated = true; | ||
2230 | - } | ||
2231 | - } | ||
2232 | - | ||
2233 | - if (updated) | ||
2234 | - this.storeBindings(); | 1674 | + this.events.addChatRenderListener(chatRenderListener); |
2235 | } | 1675 | } |
2236 | 1676 | ||
2237 | - /** | ||
2238 | - * @param binding | ||
2239 | - */ | ||
2240 | - private void updateBinding(KeyBinding binding) | 1677 | + @Deprecated |
1678 | + public void addPreLoginListener(PreLoginListener loginListener) | ||
2241 | { | 1679 | { |
2242 | - this.keyMapSettings.setProperty(binding.keyDescription, String.valueOf(binding.keyCode)); | ||
2243 | - this.storedModKeyBindings.put(binding, Integer.valueOf(binding.keyCode)); | 1680 | + this.events.addPreLoginListener(loginListener); |
2244 | } | 1681 | } |
2245 | 1682 | ||
2246 | - /** | ||
2247 | - * Writes mod bindings to disk | ||
2248 | - */ | ||
2249 | - protected void storeBindings() | 1683 | + @Deprecated |
1684 | + public void addLoginListener(LoginListener loginListener) | ||
2250 | { | 1685 | { |
2251 | - try | ||
2252 | - { | ||
2253 | - this.keyMapSettings.store(new FileWriter(this.keyMapSettingsFile), "Mod key mappings for LiteLoader mods, stored here to avoid losing settings stored in options.txt"); | ||
2254 | - } | ||
2255 | - catch (IOException ex) {} | 1686 | + this.events.addLoginListener(loginListener); |
2256 | } | 1687 | } |
2257 | } | 1688 | } |
2258 | \ No newline at end of file | 1689 | \ No newline at end of file |
java/com/mumfrey/liteloader/core/LiteLoaderVersion.java
@@ -7,7 +7,7 @@ import java.util.Set; | @@ -7,7 +7,7 @@ import java.util.Set; | ||
7 | * LiteLoader version table | 7 | * LiteLoader version table |
8 | * | 8 | * |
9 | * @author Adam Mummery-Smith | 9 | * @author Adam Mummery-Smith |
10 | - * @version 1.6.2_04 | 10 | + * @version 1.6.3 |
11 | */ | 11 | */ |
12 | public enum LiteLoaderVersion | 12 | public enum LiteLoaderVersion |
13 | { | 13 | { |
@@ -17,8 +17,9 @@ public enum LiteLoaderVersion | @@ -17,8 +17,9 @@ public enum LiteLoaderVersion | ||
17 | MC_1_6_1_R0(11, "1.6.1", "1.6.1", "1.6.1", "1.6.r1"), | 17 | MC_1_6_1_R0(11, "1.6.1", "1.6.1", "1.6.1", "1.6.r1"), |
18 | MC_1_6_2_R0(12, "1.6.2", "1.6.2", "1.6.2", "1.6.r2"), | 18 | MC_1_6_2_R0(12, "1.6.2", "1.6.2", "1.6.2", "1.6.r2"), |
19 | MC_1_6_2_R1(13, "1.6.2", "1.6.2_02", "1.6.2", "1.6.r2"), | 19 | MC_1_6_2_R1(13, "1.6.2", "1.6.2_02", "1.6.2", "1.6.r2"), |
20 | - MC_1_6_2_R2(13, "1.6.2", "1.6.2_03", "1.6.2", "1.6.r2"), | ||
21 | - MC_1_6_2_R3(13, "1.6.2", "1.6.2_04", "1.6.2", "1.6.r2"); | 20 | + MC_1_6_2_R2(14, "1.6.2", "1.6.2_03", "1.6.2", "1.6.r2"), |
21 | + MC_1_6_2_R3(15, "1.6.2", "1.6.2_04", "1.6.2", "1.6.r2"), | ||
22 | + MC_1_6_3_R0(16, "1.6.3", "1.6.3", "1.6.3", "1.6.r3"); | ||
22 | 23 | ||
23 | private int revision; | 24 | private int revision; |
24 | 25 |
java/com/mumfrey/liteloader/core/ModFile.java
@@ -34,7 +34,7 @@ public class ModFile extends File | @@ -34,7 +34,7 @@ public class ModFile extends File | ||
34 | /** | 34 | /** |
35 | * True if parsed from JSON, false if fallback mode using legacy version.txt | 35 | * True if parsed from JSON, false if fallback mode using legacy version.txt |
36 | */ | 36 | */ |
37 | - protected boolean json = false; | 37 | +// protected boolean json = false; |
38 | 38 | ||
39 | /** | 39 | /** |
40 | * Name of the mod specified in the JSON file, this can be any string but should be the same between mod versions | 40 | * Name of the mod specified in the JSON file, this can be any string but should be the same between mod versions |
@@ -88,8 +88,8 @@ public class ModFile extends File | @@ -88,8 +88,8 @@ public class ModFile extends File | ||
88 | protected void parseVersionFile(String strVersionData) | 88 | protected void parseVersionFile(String strVersionData) |
89 | { | 89 | { |
90 | // Assume that it's json if the file starts with a brace | 90 | // Assume that it's json if the file starts with a brace |
91 | - if (strVersionData.trim().startsWith("{")) | ||
92 | - { | 91 | +// if (strVersionData.trim().startsWith("{")) |
92 | +// { | ||
93 | try | 93 | try |
94 | { | 94 | { |
95 | this.metaData = ModFile.gson.fromJson(strVersionData, HashMap.class); | 95 | this.metaData = ModFile.gson.fromJson(strVersionData, HashMap.class); |
@@ -120,14 +120,14 @@ public class ModFile extends File | @@ -120,14 +120,14 @@ public class ModFile extends File | ||
120 | } | 120 | } |
121 | 121 | ||
122 | this.valid = true; | 122 | this.valid = true; |
123 | - this.json = true; | ||
124 | - } | ||
125 | - else | ||
126 | - { | ||
127 | - // Legacy version.txt file | ||
128 | - this.version = strVersionData; | ||
129 | - this.valid = true; | ||
130 | - } | 123 | +// this.json = true; |
124 | +// } | ||
125 | +// else | ||
126 | +// { | ||
127 | +// // Legacy version.txt file | ||
128 | +// this.version = strVersionData; | ||
129 | +// this.valid = true; | ||
130 | +// } | ||
131 | 131 | ||
132 | if (this.modName == null) | 132 | if (this.modName == null) |
133 | { | 133 | { |
@@ -145,10 +145,10 @@ public class ModFile extends File | @@ -145,10 +145,10 @@ public class ModFile extends File | ||
145 | return this.valid; | 145 | return this.valid; |
146 | } | 146 | } |
147 | 147 | ||
148 | - public boolean isJson() | ||
149 | - { | ||
150 | - return this.json; | ||
151 | - } | 148 | +// public boolean isJson() |
149 | +// { | ||
150 | +// return this.json; | ||
151 | +// } | ||
152 | 152 | ||
153 | public String getVersion() | 153 | public String getVersion() |
154 | { | 154 | { |
@@ -180,6 +180,7 @@ public class ModFile extends File | @@ -180,6 +180,7 @@ public class ModFile extends File | ||
180 | { | 180 | { |
181 | if (this.resourcePack == null) | 181 | if (this.resourcePack == null) |
182 | { | 182 | { |
183 | + LiteLoader.getLogger().info(String.format("Registering \"%s\" as mod resource pack with identifier \"%s\"", this.getName(), name)); | ||
183 | this.resourcePack = new ModResourcePack(name, this); | 184 | this.resourcePack = new ModResourcePack(name, this); |
184 | return LiteLoader.getInstance().registerModResourcePack(this.resourcePack); | 185 | return LiteLoader.getInstance().registerModResourcePack(this.resourcePack); |
185 | } | 186 | } |
java/com/mumfrey/liteloader/core/PluginChannels.java
0 → 100644
1 | +package com.mumfrey.liteloader.core; | ||
2 | + | ||
3 | +import java.nio.charset.Charset; | ||
4 | +import java.util.HashMap; | ||
5 | +import java.util.LinkedList; | ||
6 | +import java.util.List; | ||
7 | + | ||
8 | +import net.minecraft.src.Minecraft; | ||
9 | +import net.minecraft.src.NetHandler; | ||
10 | +import net.minecraft.src.Packet1Login; | ||
11 | +import net.minecraft.src.Packet250CustomPayload; | ||
12 | + | ||
13 | +import com.mumfrey.liteloader.PluginChannelListener; | ||
14 | +import com.mumfrey.liteloader.core.hooks.HookPluginChannels; | ||
15 | +import com.mumfrey.liteloader.permissions.PermissionsManagerClient; | ||
16 | + | ||
17 | +/** | ||
18 | + * Manages plugin channel connections and subscriptions for LiteLoader | ||
19 | + * | ||
20 | + * @author Adam Mummery-Smith | ||
21 | + */ | ||
22 | +public class PluginChannels | ||
23 | +{ | ||
24 | + // reserved channel consts | ||
25 | + private static final String CHANNEL_REGISTER = "REGISTER"; | ||
26 | + private static final String CHANNEL_UNREGISTER = "UNREGISTER"; | ||
27 | + | ||
28 | + /** | ||
29 | + * Reference to the loader | ||
30 | + */ | ||
31 | + private LiteLoader loader; | ||
32 | + | ||
33 | + /** | ||
34 | + * True if we have initialised the hook | ||
35 | + */ | ||
36 | + private boolean hookInitDone; | ||
37 | + | ||
38 | + /** | ||
39 | + * Mapping of plugin channel names to listeners | ||
40 | + */ | ||
41 | + private HashMap<String, LinkedList<PluginChannelListener>> pluginChannels = new HashMap<String, LinkedList<PluginChannelListener>>(); | ||
42 | + | ||
43 | + /** | ||
44 | + * List of mods which implement PluginChannelListener interface | ||
45 | + */ | ||
46 | + private LinkedList<PluginChannelListener> pluginChannelListeners = new LinkedList<PluginChannelListener>(); | ||
47 | + | ||
48 | + /** | ||
49 | + * @param loader | ||
50 | + */ | ||
51 | + public PluginChannels(LiteLoader loader) | ||
52 | + { | ||
53 | + this.loader = loader; | ||
54 | + } | ||
55 | + | ||
56 | + /** | ||
57 | + * | ||
58 | + */ | ||
59 | + public void initHook() | ||
60 | + { | ||
61 | + // Plugin channels hook | ||
62 | + if (this.pluginChannelListeners.size() > 0 && !this.hookInitDone) | ||
63 | + { | ||
64 | + HookPluginChannels.register(); | ||
65 | + HookPluginChannels.registerPacketHandler(this); | ||
66 | + this.hookInitDone = true; | ||
67 | + } | ||
68 | + } | ||
69 | + | ||
70 | + | ||
71 | + /** | ||
72 | + * @param pluginChannelListener | ||
73 | + */ | ||
74 | + public void addPluginChannelListener(PluginChannelListener pluginChannelListener) | ||
75 | + { | ||
76 | + if (!this.pluginChannelListeners.contains(pluginChannelListener)) | ||
77 | + { | ||
78 | + this.pluginChannelListeners.add(pluginChannelListener); | ||
79 | + if (this.hookInitDone) | ||
80 | + this.initHook(); | ||
81 | + } | ||
82 | + } | ||
83 | + | ||
84 | + /** | ||
85 | + * @param netHandler | ||
86 | + * @param loginPacket | ||
87 | + */ | ||
88 | + public void onConnectToServer(NetHandler netHandler, Packet1Login loginPacket) | ||
89 | + { | ||
90 | + this.setupPluginChannels(); | ||
91 | + } | ||
92 | + | ||
93 | + /** | ||
94 | + * Callback for the plugin channel hook | ||
95 | + * | ||
96 | + * @param customPayload | ||
97 | + */ | ||
98 | + public void onPluginChannelMessage(Packet250CustomPayload customPayload) | ||
99 | + { | ||
100 | + if (customPayload != null && customPayload.channel != null && this.pluginChannels.containsKey(customPayload.channel)) | ||
101 | + { | ||
102 | + try | ||
103 | + { | ||
104 | + PermissionsManagerClient permissionsManager = this.loader.getPermissionsManager(); | ||
105 | + if (permissionsManager != null) | ||
106 | + { | ||
107 | + permissionsManager.onCustomPayload(customPayload.channel, customPayload.length, customPayload.data); | ||
108 | + } | ||
109 | + } | ||
110 | + catch (Exception ex) {} | ||
111 | + | ||
112 | + for (PluginChannelListener pluginChannelListener : this.pluginChannels.get(customPayload.channel)) | ||
113 | + { | ||
114 | + try | ||
115 | + { | ||
116 | + pluginChannelListener.onCustomPayload(customPayload.channel, customPayload.length, customPayload.data); | ||
117 | + } | ||
118 | + catch (Exception ex) {} | ||
119 | + } | ||
120 | + } | ||
121 | + } | ||
122 | + | ||
123 | + /** | ||
124 | + * Query loaded mods for registered channels | ||
125 | + */ | ||
126 | + protected void setupPluginChannels() | ||
127 | + { | ||
128 | + // Clear any channels from before | ||
129 | + this.pluginChannels.clear(); | ||
130 | + | ||
131 | + // Add the permissions manager channels | ||
132 | + this.addPluginChannelsFor(this.loader.getPermissionsManager()); | ||
133 | + | ||
134 | + // Enumerate mods for plugin channels | ||
135 | + for (PluginChannelListener pluginChannelListener : this.pluginChannelListeners) | ||
136 | + { | ||
137 | + this.addPluginChannelsFor(pluginChannelListener); | ||
138 | + } | ||
139 | + | ||
140 | + // If any mods have registered channels, send the REGISTER packet | ||
141 | + if (this.pluginChannels.keySet().size() > 0) | ||
142 | + { | ||
143 | + StringBuilder channelList = new StringBuilder(); | ||
144 | + boolean separator = false; | ||
145 | + | ||
146 | + for (String channel : this.pluginChannels.keySet()) | ||
147 | + { | ||
148 | + if (separator) channelList.append("\u0000"); | ||
149 | + channelList.append(channel); | ||
150 | + separator = true; | ||
151 | + } | ||
152 | + | ||
153 | + byte[] registrationData = channelList.toString().getBytes(Charset.forName("UTF8")); | ||
154 | + PluginChannels.sendMessage(CHANNEL_REGISTER, registrationData); | ||
155 | + } | ||
156 | + } | ||
157 | + | ||
158 | + /** | ||
159 | + * Adds plugin channels for the specified listener to the local channels | ||
160 | + * collection | ||
161 | + * | ||
162 | + * @param pluginChannelListener | ||
163 | + */ | ||
164 | + private void addPluginChannelsFor(PluginChannelListener pluginChannelListener) | ||
165 | + { | ||
166 | + List<String> channels = pluginChannelListener.getChannels(); | ||
167 | + | ||
168 | + if (channels != null) | ||
169 | + { | ||
170 | + for (String channel : channels) | ||
171 | + { | ||
172 | + if (channel.length() > 16 || channel.toUpperCase().equals(CHANNEL_REGISTER) || channel.toUpperCase().equals(CHANNEL_UNREGISTER)) | ||
173 | + continue; | ||
174 | + | ||
175 | + if (!this.pluginChannels.containsKey(channel)) | ||
176 | + { | ||
177 | + this.pluginChannels.put(channel, new LinkedList<PluginChannelListener>()); | ||
178 | + } | ||
179 | + | ||
180 | + this.pluginChannels.get(channel).add(pluginChannelListener); | ||
181 | + } | ||
182 | + } | ||
183 | + } | ||
184 | + | ||
185 | + public static void sendMessage(String channel, byte[] data) | ||
186 | + { | ||
187 | + if (channel == null || channel.length() > 16) | ||
188 | + throw new RuntimeException("Invalid channel name specified"); | ||
189 | + | ||
190 | + try | ||
191 | + { | ||
192 | + Minecraft minecraft = Minecraft.getMinecraft(); | ||
193 | + | ||
194 | + if (minecraft.thePlayer != null && minecraft.thePlayer.sendQueue != null) | ||
195 | + { | ||
196 | + Packet250CustomPayload payload = new Packet250CustomPayload(channel, data); | ||
197 | + minecraft.thePlayer.sendQueue.addToSendQueue(payload); | ||
198 | + } | ||
199 | + } | ||
200 | + catch (Exception ex) {} | ||
201 | + } | ||
202 | +} |
java/com/mumfrey/liteloader/core/SoundManagerReloadInhibitor.java
@@ -103,7 +103,7 @@ public class SoundManagerReloadInhibitor | @@ -103,7 +103,7 @@ public class SoundManagerReloadInhibitor | ||
103 | if (reload) | 103 | if (reload) |
104 | { | 104 | { |
105 | LiteLoader.getLogger().info("Reloading sound manager"); | 105 | LiteLoader.getLogger().info("Reloading sound manager"); |
106 | - this.soundManager.func_110549_a(this.resourceManager); // TODO adamsrc -> onReload | 106 | + this.soundManager.onResourceManagerReload(this.resourceManager); |
107 | } | 107 | } |
108 | 108 | ||
109 | this.inhibited = false; | 109 | this.inhibited = false; |
java/com/mumfrey/liteloader/core/exceptions/ProfilerCrossThreadAccessException.java
0 → 100644
1 | +package com.mumfrey.liteloader.core.exceptions; | ||
2 | + | ||
3 | +/** | ||
4 | + * Exception to throw if startSection or endSection are called from a thread other than | ||
5 | + * the Minecraft main thread. This should NEVER happen and is an attempt to identify the | ||
6 | + * culprit of some profiler stack corruption causes. | ||
7 | + * | ||
8 | + * @author Adam Mummery-Smith | ||
9 | + */ | ||
10 | +public class ProfilerCrossThreadAccessException extends RuntimeException | ||
11 | +{ | ||
12 | + private static final long serialVersionUID = 3225047722943528251L; | ||
13 | + | ||
14 | + public ProfilerCrossThreadAccessException(String message) | ||
15 | + { | ||
16 | + super("Calling thread name \"" + message + "\""); | ||
17 | + } | ||
18 | +} |
java/com/mumfrey/liteloader/core/ProfilerStackCorruptionException.java renamed to java/com/mumfrey/liteloader/core/exceptions/ProfilerStackCorruptionException.java
java/com/mumfrey/liteloader/core/HookChat.java renamed to java/com/mumfrey/liteloader/core/hooks/HookChat.java
1 | -package com.mumfrey.liteloader.core; | 1 | +package com.mumfrey.liteloader.core.hooks; |
2 | 2 | ||
3 | import java.io.DataInput; | 3 | import java.io.DataInput; |
4 | import java.io.DataOutput; | 4 | import java.io.DataOutput; |
@@ -10,6 +10,7 @@ import net.minecraft.src.NetHandler; | @@ -10,6 +10,7 @@ import net.minecraft.src.NetHandler; | ||
10 | import net.minecraft.src.Packet; | 10 | import net.minecraft.src.Packet; |
11 | import net.minecraft.src.Packet3Chat; | 11 | import net.minecraft.src.Packet3Chat; |
12 | 12 | ||
13 | +import com.mumfrey.liteloader.core.Events; | ||
13 | import com.mumfrey.liteloader.util.PrivateFields; | 14 | import com.mumfrey.liteloader.util.PrivateFields; |
14 | 15 | ||
15 | /** | 16 | /** |
@@ -30,7 +31,7 @@ public class HookChat extends Packet3Chat | @@ -30,7 +31,7 @@ public class HookChat extends Packet3Chat | ||
30 | /** | 31 | /** |
31 | * Handler module which is registered to handle inbound chat packets | 32 | * Handler module which is registered to handle inbound chat packets |
32 | */ | 33 | */ |
33 | - private static LiteLoader packetHandler; | 34 | + private static Events events; |
34 | 35 | ||
35 | /** | 36 | /** |
36 | * Class which was overridden and will be instanced for new packets | 37 | * Class which was overridden and will be instanced for new packets |
@@ -106,7 +107,7 @@ public class HookChat extends Packet3Chat | @@ -106,7 +107,7 @@ public class HookChat extends Packet3Chat | ||
106 | @Override | 107 | @Override |
107 | public void processPacket(NetHandler nethandler) | 108 | public void processPacket(NetHandler nethandler) |
108 | { | 109 | { |
109 | - if (packetHandler == null || packetHandler.onChat(this)) | 110 | + if (events == null || events.onChat(this)) |
110 | { | 111 | { |
111 | if (proxyPacket != null) | 112 | if (proxyPacket != null) |
112 | proxyPacket.processPacket(nethandler); | 113 | proxyPacket.processPacket(nethandler); |
@@ -128,9 +129,9 @@ public class HookChat extends Packet3Chat | @@ -128,9 +129,9 @@ public class HookChat extends Packet3Chat | ||
128 | * Register the specified handler as the packet handler for this packet | 129 | * Register the specified handler as the packet handler for this packet |
129 | * @param handler | 130 | * @param handler |
130 | */ | 131 | */ |
131 | - public static void registerPacketHandler(LiteLoader handler) | 132 | + public static void registerPacketHandler(Events handler) |
132 | { | 133 | { |
133 | - packetHandler = handler; | 134 | + events = handler; |
134 | } | 135 | } |
135 | 136 | ||
136 | /** | 137 | /** |
java/com/mumfrey/liteloader/core/HookLogin.java renamed to java/com/mumfrey/liteloader/core/hooks/HookLogin.java
1 | -package com.mumfrey.liteloader.core; | 1 | +package com.mumfrey.liteloader.core.hooks; |
2 | + | ||
3 | +import com.mumfrey.liteloader.core.Events; | ||
2 | 4 | ||
3 | import net.minecraft.src.EnumGameType; | 5 | import net.minecraft.src.EnumGameType; |
4 | import net.minecraft.src.NetHandler; | 6 | import net.minecraft.src.NetHandler; |
@@ -7,7 +9,7 @@ import net.minecraft.src.WorldType; | @@ -7,7 +9,7 @@ import net.minecraft.src.WorldType; | ||
7 | 9 | ||
8 | public class HookLogin extends Packet1Login | 10 | public class HookLogin extends Packet1Login |
9 | { | 11 | { |
10 | - public static LiteLoader loader; | 12 | + public static Events events; |
11 | 13 | ||
12 | public HookLogin() | 14 | public HookLogin() |
13 | { | 15 | { |
@@ -25,11 +27,11 @@ public class HookLogin extends Packet1Login | @@ -25,11 +27,11 @@ public class HookLogin extends Packet1Login | ||
25 | @Override | 27 | @Override |
26 | public void processPacket(NetHandler par1NetHandler) | 28 | public void processPacket(NetHandler par1NetHandler) |
27 | { | 29 | { |
28 | - if (loader == null || loader.onPreLogin(par1NetHandler, this)) | 30 | + if (events == null || events.onPreLogin(par1NetHandler, this)) |
29 | { | 31 | { |
30 | super.processPacket(par1NetHandler); | 32 | super.processPacket(par1NetHandler); |
31 | 33 | ||
32 | - if (loader != null) loader.onConnectToServer(par1NetHandler, this); | 34 | + if (events != null) events.onConnectToServer(par1NetHandler, this); |
33 | } | 35 | } |
34 | } | 36 | } |
35 | } | 37 | } |
java/com/mumfrey/liteloader/core/HookPluginChannels.java renamed to java/com/mumfrey/liteloader/core/hooks/HookPluginChannels.java
1 | -package com.mumfrey.liteloader.core; | 1 | +package com.mumfrey.liteloader.core.hooks; |
2 | 2 | ||
3 | import java.io.DataInput; | 3 | import java.io.DataInput; |
4 | import java.io.DataOutput; | 4 | import java.io.DataOutput; |
@@ -10,6 +10,7 @@ import net.minecraft.src.NetHandler; | @@ -10,6 +10,7 @@ import net.minecraft.src.NetHandler; | ||
10 | import net.minecraft.src.Packet; | 10 | import net.minecraft.src.Packet; |
11 | import net.minecraft.src.Packet250CustomPayload; | 11 | import net.minecraft.src.Packet250CustomPayload; |
12 | 12 | ||
13 | +import com.mumfrey.liteloader.core.PluginChannels; | ||
13 | import com.mumfrey.liteloader.util.PrivateFields; | 14 | import com.mumfrey.liteloader.util.PrivateFields; |
14 | 15 | ||
15 | public class HookPluginChannels extends Packet250CustomPayload | 16 | public class HookPluginChannels extends Packet250CustomPayload |
@@ -22,7 +23,7 @@ public class HookPluginChannels extends Packet250CustomPayload | @@ -22,7 +23,7 @@ public class HookPluginChannels extends Packet250CustomPayload | ||
22 | /** | 23 | /** |
23 | * Handler module which is registered to handle inbound chat packets | 24 | * Handler module which is registered to handle inbound chat packets |
24 | */ | 25 | */ |
25 | - private static LiteLoader packetHandler; | 26 | + private static PluginChannels events; |
26 | 27 | ||
27 | /** | 28 | /** |
28 | * Class which was overridden and will be instanced for new packets | 29 | * Class which was overridden and will be instanced for new packets |
@@ -40,9 +41,9 @@ public class HookPluginChannels extends Packet250CustomPayload | @@ -40,9 +41,9 @@ public class HookPluginChannels extends Packet250CustomPayload | ||
40 | 41 | ||
41 | try | 42 | try |
42 | { | 43 | { |
43 | - if (proxyClass != null) | 44 | + if (HookPluginChannels.proxyClass != null) |
44 | { | 45 | { |
45 | - proxyPacket = proxyClass.newInstance(); | 46 | + proxyPacket = HookPluginChannels.proxyClass.newInstance(); |
46 | } | 47 | } |
47 | } | 48 | } |
48 | catch (Exception ex) {} | 49 | catch (Exception ex) {} |
@@ -54,9 +55,9 @@ public class HookPluginChannels extends Packet250CustomPayload | @@ -54,9 +55,9 @@ public class HookPluginChannels extends Packet250CustomPayload | ||
54 | 55 | ||
55 | try | 56 | try |
56 | { | 57 | { |
57 | - if (proxyClass != null) | 58 | + if (HookPluginChannels.proxyClass != null) |
58 | { | 59 | { |
59 | - proxyPacket = proxyClass.newInstance(); | 60 | + proxyPacket = HookPluginChannels.proxyClass.newInstance(); |
60 | 61 | ||
61 | if (proxyPacket instanceof Packet250CustomPayload) | 62 | if (proxyPacket instanceof Packet250CustomPayload) |
62 | { | 63 | { |
@@ -101,9 +102,9 @@ public class HookPluginChannels extends Packet250CustomPayload | @@ -101,9 +102,9 @@ public class HookPluginChannels extends Packet250CustomPayload | ||
101 | else | 102 | else |
102 | super.processPacket(nethandler); | 103 | super.processPacket(nethandler); |
103 | 104 | ||
104 | - if (packetHandler != null) | 105 | + if (HookPluginChannels.events != null) |
105 | { | 106 | { |
106 | - packetHandler.onPluginChannelMessage(this); | 107 | + HookPluginChannels.events.onPluginChannelMessage(this); |
107 | } | 108 | } |
108 | } | 109 | } |
109 | 110 | ||
@@ -120,9 +121,9 @@ public class HookPluginChannels extends Packet250CustomPayload | @@ -120,9 +121,9 @@ public class HookPluginChannels extends Packet250CustomPayload | ||
120 | * Register the specified handler as the packet handler for this packet | 121 | * Register the specified handler as the packet handler for this packet |
121 | * @param handler | 122 | * @param handler |
122 | */ | 123 | */ |
123 | - public static void registerPacketHandler(LiteLoader handler) | 124 | + public static void registerPacketHandler(PluginChannels handler) |
124 | { | 125 | { |
125 | - packetHandler = handler; | 126 | + HookPluginChannels.events = handler; |
126 | } | 127 | } |
127 | 128 | ||
128 | /** | 129 | /** |
@@ -142,25 +143,26 @@ public class HookPluginChannels extends Packet250CustomPayload | @@ -142,25 +143,26 @@ public class HookPluginChannels extends Packet250CustomPayload | ||
142 | @SuppressWarnings({ "unchecked", "rawtypes" }) | 143 | @SuppressWarnings({ "unchecked", "rawtypes" }) |
143 | public static void register(boolean force) | 144 | public static void register(boolean force) |
144 | { | 145 | { |
145 | - if (!registered || force) | 146 | + if (!HookPluginChannels.registered || force) |
146 | { | 147 | { |
147 | try | 148 | try |
148 | { | 149 | { |
150 | + int packetId = 250; | ||
149 | IntHashMap packetIdToClassMap = Packet.packetIdToClassMap; | 151 | IntHashMap packetIdToClassMap = Packet.packetIdToClassMap; |
150 | - proxyClass = (Class<? extends Packet>)packetIdToClassMap.lookup(250); | 152 | + HookPluginChannels.proxyClass = (Class<? extends Packet>)packetIdToClassMap.lookup(packetId); |
151 | 153 | ||
152 | - if (proxyClass.equals(Packet250CustomPayload.class)) | 154 | + if (HookPluginChannels.proxyClass.equals(Packet250CustomPayload.class)) |
153 | { | 155 | { |
154 | - proxyClass = null; | 156 | + HookPluginChannels.proxyClass = null; |
155 | } | 157 | } |
156 | 158 | ||
157 | - packetIdToClassMap.removeObject(250); | ||
158 | - packetIdToClassMap.addKey(250, HookPluginChannels.class); | 159 | + packetIdToClassMap.removeObject(packetId); |
160 | + packetIdToClassMap.addKey(packetId, HookPluginChannels.class); | ||
159 | 161 | ||
160 | Map packetClassToIdMap = PrivateFields.StaticFields.packetClassToIdMap.get(); | 162 | Map packetClassToIdMap = PrivateFields.StaticFields.packetClassToIdMap.get(); |
161 | - packetClassToIdMap.put(HookPluginChannels.class, Integer.valueOf(250)); | 163 | + packetClassToIdMap.put(HookPluginChannels.class, Integer.valueOf(packetId)); |
162 | 164 | ||
163 | - registered = true; | 165 | + HookPluginChannels.registered = true; |
164 | } | 166 | } |
165 | catch (Exception ex) | 167 | catch (Exception ex) |
166 | { | 168 | { |
java/com/mumfrey/liteloader/core/HookProfiler.java renamed to java/com/mumfrey/liteloader/core/hooks/HookProfiler.java
1 | -package com.mumfrey.liteloader.core; | 1 | +package com.mumfrey.liteloader.core.hooks; |
2 | 2 | ||
3 | import java.lang.reflect.Field; | 3 | import java.lang.reflect.Field; |
4 | import java.lang.reflect.Method; | 4 | import java.lang.reflect.Method; |
@@ -6,6 +6,11 @@ import java.util.LinkedList; | @@ -6,6 +6,11 @@ import java.util.LinkedList; | ||
6 | import java.util.NoSuchElementException; | 6 | import java.util.NoSuchElementException; |
7 | import java.util.logging.Logger; | 7 | import java.util.logging.Logger; |
8 | 8 | ||
9 | +import com.mumfrey.liteloader.core.Events; | ||
10 | +import com.mumfrey.liteloader.core.LiteLoader; | ||
11 | +import com.mumfrey.liteloader.core.exceptions.ProfilerCrossThreadAccessException; | ||
12 | +import com.mumfrey.liteloader.core.exceptions.ProfilerStackCorruptionException; | ||
13 | + | ||
9 | import net.minecraft.src.Minecraft; | 14 | import net.minecraft.src.Minecraft; |
10 | import net.minecraft.src.GameSettings; | 15 | import net.minecraft.src.GameSettings; |
11 | import net.minecraft.src.Profiler; | 16 | import net.minecraft.src.Profiler; |
@@ -18,14 +23,19 @@ import net.minecraft.src.Profiler; | @@ -18,14 +23,19 @@ import net.minecraft.src.Profiler; | ||
18 | public class HookProfiler extends Profiler | 23 | public class HookProfiler extends Profiler |
19 | { | 24 | { |
20 | /** | 25 | /** |
26 | + * Cross-thread sanity check | ||
27 | + */ | ||
28 | + private final Thread minecraftThread; | ||
29 | + | ||
30 | + /** | ||
21 | * Logger instance | 31 | * Logger instance |
22 | */ | 32 | */ |
23 | private Logger logger; | 33 | private Logger logger; |
24 | 34 | ||
25 | /** | 35 | /** |
26 | - * LiteLoader instance which will receive callbacks | 36 | + * Event manager instance which will receive callbacks |
27 | */ | 37 | */ |
28 | - private LiteLoader loader; | 38 | + private Events events; |
29 | 39 | ||
30 | /** | 40 | /** |
31 | * Section list, used as a kind of stack to determine where we are in the profiler stack | 41 | * Section list, used as a kind of stack to determine where we are in the profiler stack |
@@ -55,18 +65,20 @@ public class HookProfiler extends Profiler | @@ -55,18 +65,20 @@ public class HookProfiler extends Profiler | ||
55 | /** | 65 | /** |
56 | * .ctor | 66 | * .ctor |
57 | * | 67 | * |
58 | - * @param core LiteLoader object which will get callbacks | 68 | + * @param events LiteLoader object which will get callbacks |
59 | * @param logger Logger instance | 69 | * @param logger Logger instance |
60 | */ | 70 | */ |
61 | - public HookProfiler(LiteLoader core, Logger logger) | 71 | + public HookProfiler(Events events) |
62 | { | 72 | { |
63 | this.mc = Minecraft.getMinecraft(); | 73 | this.mc = Minecraft.getMinecraft(); |
64 | 74 | ||
65 | - this.loader = core; | ||
66 | - this.logger = logger; | 75 | + this.events = events; |
76 | + this.logger = LiteLoader.getLogger(); | ||
67 | 77 | ||
68 | // Detect optifine (duh!) | 78 | // Detect optifine (duh!) |
69 | this.detectOptifine(); | 79 | this.detectOptifine(); |
80 | + | ||
81 | + this.minecraftThread = Thread.currentThread(); | ||
70 | } | 82 | } |
71 | 83 | ||
72 | /** | 84 | /** |
@@ -126,35 +138,40 @@ public class HookProfiler extends Profiler | @@ -126,35 +138,40 @@ public class HookProfiler extends Profiler | ||
126 | @Override | 138 | @Override |
127 | public void startSection(String sectionName) | 139 | public void startSection(String sectionName) |
128 | { | 140 | { |
141 | + if (Thread.currentThread() != this.minecraftThread) | ||
142 | + { | ||
143 | + throw new ProfilerCrossThreadAccessException(Thread.currentThread().getName()); | ||
144 | + } | ||
145 | + | ||
129 | if (!this.initDone) | 146 | if (!this.initDone) |
130 | { | 147 | { |
131 | this.initDone = true; | 148 | this.initDone = true; |
132 | - this.loader.onInit(); | 149 | + this.events.onInit(); |
133 | } | 150 | } |
134 | 151 | ||
135 | if ("gameRenderer".equals(sectionName) && "root".equals(this.sectionStack.getLast())) | 152 | if ("gameRenderer".equals(sectionName) && "root".equals(this.sectionStack.getLast())) |
136 | { | 153 | { |
137 | - this.loader.onRender(); | 154 | + this.events.onRender(); |
138 | } | 155 | } |
139 | - | ||
140 | - if ("frustrum".equals(sectionName) && "level".equals(this.sectionStack.getLast())) | 156 | + else if ("frustrum".equals(sectionName) && "level".equals(this.sectionStack.getLast())) |
141 | { | 157 | { |
142 | - this.loader.onSetupCameraTransform(); | 158 | + this.events.onSetupCameraTransform(); |
143 | } | 159 | } |
144 | - | ||
145 | - if ("litParticles".equals(sectionName)) | 160 | + else if ("litParticles".equals(sectionName)) |
146 | { | 161 | { |
147 | - this.loader.postRenderEntities(); | 162 | + this.events.postRenderEntities(); |
148 | } | 163 | } |
149 | - | ||
150 | - if ("tick".equals(sectionName) && "root".equals(this.sectionStack.getLast())) | 164 | + else if ("tick".equals(sectionName) && "root".equals(this.sectionStack.getLast())) |
151 | { | 165 | { |
152 | - this.loader.onTimerUpdate(); | 166 | + this.events.onTimerUpdate(); |
153 | } | 167 | } |
154 | - | ||
155 | - if ("chat".equals(sectionName)) | 168 | + else if ("chat".equals(sectionName)) |
156 | { | 169 | { |
157 | - this.loader.onBeforeChatRender(); | 170 | + this.events.onRenderChat(); |
171 | + } | ||
172 | + else if ("gui".equals(sectionName) && "gameRenderer".equals(this.sectionStack.getLast())) | ||
173 | + { | ||
174 | + this.events.onRenderHUD(); | ||
158 | } | 175 | } |
159 | 176 | ||
160 | if ("animateTick".equals(sectionName)) this.tick = true; | 177 | if ("animateTick".equals(sectionName)) this.tick = true; |
@@ -184,6 +201,11 @@ public class HookProfiler extends Profiler | @@ -184,6 +201,11 @@ public class HookProfiler extends Profiler | ||
184 | @Override | 201 | @Override |
185 | public void endSection() | 202 | public void endSection() |
186 | { | 203 | { |
204 | + if (Thread.currentThread() != this.minecraftThread) | ||
205 | + { | ||
206 | + throw new ProfilerCrossThreadAccessException(Thread.currentThread().getName()); | ||
207 | + } | ||
208 | + | ||
187 | super.endSection(); | 209 | super.endSection(); |
188 | 210 | ||
189 | try | 211 | try |
@@ -191,26 +213,34 @@ public class HookProfiler extends Profiler | @@ -191,26 +213,34 @@ public class HookProfiler extends Profiler | ||
191 | String endingSection = this.sectionStack.size() > 0 ? this.sectionStack.removeLast() : null; | 213 | String endingSection = this.sectionStack.size() > 0 ? this.sectionStack.removeLast() : null; |
192 | String nextSection = this.sectionStack.size() > 0 ? this.sectionStack.getLast() : null; | 214 | String nextSection = this.sectionStack.size() > 0 ? this.sectionStack.getLast() : null; |
193 | 215 | ||
194 | - if ("gameRenderer".equals(endingSection) && "root".equals(this.sectionStack.getLast())) | 216 | + if ("gameRenderer".equals(endingSection) && "root".equals(nextSection)) |
195 | { | 217 | { |
196 | super.startSection("litetick"); | 218 | super.startSection("litetick"); |
197 | 219 | ||
198 | - this.loader.onTick(this, this.tick); | 220 | + this.events.onTick(this, this.tick); |
199 | this.tick = false; | 221 | this.tick = false; |
200 | 222 | ||
201 | super.endSection(); | 223 | super.endSection(); |
202 | } | 224 | } |
203 | - else if (("mouse".equals(endingSection) && "gameRenderer".equals(nextSection) && (this.mc.skipRenderWorld || this.mc.theWorld == null)) || ("gui".equals(endingSection) && "gameRenderer".equals(nextSection) && this.mc.theWorld != null)) | ||
204 | - { | ||
205 | - this.loader.onBeforeGuiRender(); | ||
206 | - } | ||
207 | - else if ("hand".equals(endingSection) && "level".equals(this.sectionStack.getLast())) | 225 | + else |
208 | { | 226 | { |
209 | - this.loader.postRender(); | ||
210 | - } | ||
211 | - else if ("chat".equals(endingSection)) | ||
212 | - { | ||
213 | - this.loader.onAfterChatRender(); | 227 | + if ("gui".equals(endingSection) && "gameRenderer".equals(nextSection) && this.mc.theWorld != null) |
228 | + { | ||
229 | + this.events.postRenderHUD(); | ||
230 | + this.events.preRenderGUI(); | ||
231 | + } | ||
232 | + else if ("mouse".equals(endingSection) && "gameRenderer".equals(nextSection) && (this.mc.skipRenderWorld || this.mc.theWorld == null)) | ||
233 | + { | ||
234 | + this.events.preRenderGUI(); | ||
235 | + } | ||
236 | + else if ("hand".equals(endingSection) && "level".equals(nextSection)) | ||
237 | + { | ||
238 | + this.events.postRender(); | ||
239 | + } | ||
240 | + else if ("chat".equals(endingSection)) | ||
241 | + { | ||
242 | + this.events.postRenderChat(); | ||
243 | + } | ||
214 | } | 244 | } |
215 | } | 245 | } |
216 | catch (NoSuchElementException ex) | 246 | catch (NoSuchElementException ex) |
@@ -219,4 +249,14 @@ public class HookProfiler extends Profiler | @@ -219,4 +249,14 @@ public class HookProfiler extends Profiler | ||
219 | throw new ProfilerStackCorruptionException("Corrupted Profiler stack detected"); | 249 | throw new ProfilerStackCorruptionException("Corrupted Profiler stack detected"); |
220 | } | 250 | } |
221 | } | 251 | } |
252 | +// | ||
253 | +// @Override | ||
254 | +// public void dumpState() | ||
255 | +// { | ||
256 | +// String endingSection = this.sectionStack.size() > 0 ? this.sectionStack.getLast() : null; | ||
257 | +// String nextSection = this.sectionStack.size() > 1 ? this.sectionStack.get(sectionStack.size() - 2) : null; | ||
258 | +// | ||
259 | +// System.out.println("endingSection=" + endingSection + " nextSection=" + nextSection); | ||
260 | +// } | ||
261 | + | ||
222 | } | 262 | } |
java/com/mumfrey/liteloader/gui/GuiControlsPaginated.java
@@ -105,17 +105,17 @@ public class GuiControlsPaginated extends GuiScreen | @@ -105,17 +105,17 @@ public class GuiControlsPaginated extends GuiScreen | ||
105 | { | 105 | { |
106 | this.getLegacyControlList().add(this.btnNext = new GuiButton(201, this.getWidth() / 2 - 51, buttonY, 50, 20, ">>")); | 106 | this.getLegacyControlList().add(this.btnNext = new GuiButton(201, this.getWidth() / 2 - 51, buttonY, 50, 20, ">>")); |
107 | this.getLegacyControlList().add(this.btnPrevious = new GuiButton(202, this.getWidth() / 2 - 103, buttonY, 50, 20, "<<")); | 107 | this.getLegacyControlList().add(this.btnPrevious = new GuiButton(202, this.getWidth() / 2 - 103, buttonY, 50, 20, "<<")); |
108 | - this.getLegacyControlList().add(new GuiButton(200, this.getWidth() / 2 + 1, buttonY, 100, 20, I18n.func_135053_a("gui.done"))); // TODO adamsrc -> translate | 108 | + this.getLegacyControlList().add(new GuiButton(200, this.getWidth() / 2 + 1, buttonY, 100, 20, I18n.getString("gui.done"))); |
109 | 109 | ||
110 | this.btnNext.enabled = this.startIndex < this.endIndex; | 110 | this.btnNext.enabled = this.startIndex < this.endIndex; |
111 | this.btnPrevious.enabled = this.startIndex > 0; | 111 | this.btnPrevious.enabled = this.startIndex > 0; |
112 | } | 112 | } |
113 | else | 113 | else |
114 | { | 114 | { |
115 | - this.getLegacyControlList().add(new GuiButton(200, this.getWidth() / 2 - 100, buttonY, I18n.func_135053_a("gui.done"))); // TODO adamsrc -> translate | 115 | + this.getLegacyControlList().add(new GuiButton(200, this.getWidth() / 2 - 100, buttonY, I18n.getString("gui.done"))); |
116 | } | 116 | } |
117 | 117 | ||
118 | - this.screenTitle = I18n.func_135053_a("controls.title"); // TODO adamsrc -> translate | 118 | + this.screenTitle = I18n.getString("controls.title"); |
119 | } | 119 | } |
120 | 120 | ||
121 | /** | 121 | /** |
java/com/mumfrey/liteloader/launch/LiteLoaderTransformer.java
0 → 100644
1 | +package com.mumfrey.liteloader.launch; | ||
2 | + | ||
3 | +import java.io.File; | ||
4 | +import java.lang.reflect.Method; | ||
5 | +import java.util.List; | ||
6 | +import java.util.logging.Level; | ||
7 | +import java.util.logging.Logger; | ||
8 | + | ||
9 | +import net.minecraft.launchwrapper.IClassTransformer; | ||
10 | +import net.minecraft.launchwrapper.LaunchClassLoader; | ||
11 | + | ||
12 | +public class LiteLoaderTransformer implements IClassTransformer | ||
13 | +{ | ||
14 | + private static final String classMappingRenderLightningBolt = "net.minecraft.src.RenderLightningBolt"; | ||
15 | + | ||
16 | + // TODO Obfuscation 1.6.3 | ||
17 | + private static final String classMappingRenderLightningBoltObf = "bha"; | ||
18 | + | ||
19 | + private static Logger logger = Logger.getLogger("liteloader"); | ||
20 | + | ||
21 | + public static LaunchClassLoader launchClassLoader; | ||
22 | + | ||
23 | + public static List<String> modsToLoad; | ||
24 | + | ||
25 | + public static File gameDirectory; | ||
26 | + | ||
27 | + public static File assetsDirectory; | ||
28 | + | ||
29 | + public static String profile; | ||
30 | + | ||
31 | + @Override | ||
32 | + public byte[] transform(String name, String transformedName, byte[] basicClass) | ||
33 | + { | ||
34 | + if (classMappingRenderLightningBolt.equals(name) || classMappingRenderLightningBoltObf.equals(name)) | ||
35 | + { | ||
36 | + logger.info("Beginning LiteLoader Init..."); | ||
37 | + | ||
38 | + try | ||
39 | + { | ||
40 | + Class<?> loaderClass = Class.forName("com.mumfrey.liteloader.core.LiteLoader", false, LiteLoaderTransformer.launchClassLoader); | ||
41 | + Method mInit = loaderClass.getDeclaredMethod("init", File.class, File.class, String.class, List.class, LaunchClassLoader.class); | ||
42 | + mInit.setAccessible(true); | ||
43 | + mInit.invoke(null, LiteLoaderTransformer.gameDirectory, LiteLoaderTransformer.assetsDirectory, LiteLoaderTransformer.profile, LiteLoaderTransformer.modsToLoad, LiteLoaderTransformer.launchClassLoader); | ||
44 | + } | ||
45 | + catch (Throwable th) | ||
46 | + { | ||
47 | + logger.log(Level.SEVERE, String.format("Error initialising LiteLoader: %s", th.getMessage()), th); | ||
48 | + } | ||
49 | + } | ||
50 | + | ||
51 | + return basicClass; | ||
52 | + } | ||
53 | +} |
java/com/mumfrey/liteloader/launch/LiteLoaderTweaker.java
0 → 100644
1 | +package com.mumfrey.liteloader.launch; | ||
2 | + | ||
3 | +import java.io.File; | ||
4 | +import java.util.ArrayList; | ||
5 | +import java.util.HashMap; | ||
6 | +import java.util.List; | ||
7 | +import java.util.Map; | ||
8 | +import java.util.Map.Entry; | ||
9 | + | ||
10 | +import joptsimple.ArgumentAcceptingOptionSpec; | ||
11 | +import joptsimple.NonOptionArgumentSpec; | ||
12 | +import joptsimple.OptionParser; | ||
13 | +import joptsimple.OptionSet; | ||
14 | +import net.minecraft.launchwrapper.ITweaker; | ||
15 | +import net.minecraft.launchwrapper.Launch; | ||
16 | +import net.minecraft.launchwrapper.LaunchClassLoader; | ||
17 | + | ||
18 | +/** | ||
19 | + * | ||
20 | + * @author Adam Mummery-Smith | ||
21 | + */ | ||
22 | +public class LiteLoaderTweaker implements ITweaker | ||
23 | +{ | ||
24 | + public static final String VERSION = "1.6.3"; | ||
25 | + | ||
26 | + private File gameDirectory; | ||
27 | + | ||
28 | + private File assetsDirectory; | ||
29 | + | ||
30 | + private String profile; | ||
31 | + | ||
32 | + private List<String> unClassifiedArgs = new ArrayList<String>(); | ||
33 | + | ||
34 | + private Map<String, String> classifiedArgs = new HashMap<String, String>(); | ||
35 | + | ||
36 | + private ArgumentAcceptingOptionSpec<String> modsOption; | ||
37 | + private OptionSet parsedOptions; | ||
38 | + | ||
39 | + private List<String> passThroughArgs; | ||
40 | + | ||
41 | + @Override | ||
42 | + public void acceptOptions(List<String> args, File gameDirectory, File assetsDirectory, String profile) | ||
43 | + { | ||
44 | + this.gameDirectory = gameDirectory; | ||
45 | + this.assetsDirectory = assetsDirectory; | ||
46 | + this.profile = profile; | ||
47 | + | ||
48 | + LiteLoaderTransformer.gameDirectory = gameDirectory; | ||
49 | + LiteLoaderTransformer.assetsDirectory = assetsDirectory; | ||
50 | + LiteLoaderTransformer.profile = profile; | ||
51 | + | ||
52 | + OptionParser optionParser = new OptionParser(); | ||
53 | + this.modsOption = optionParser.accepts("mods", "Comma-separated list of mods to load").withRequiredArg().ofType(String.class).withValuesSeparatedBy(','); | ||
54 | + optionParser.allowsUnrecognizedOptions(); | ||
55 | + NonOptionArgumentSpec<String> nonOptions = optionParser.nonOptions(); | ||
56 | + | ||
57 | + this.parsedOptions = optionParser.parse(args.toArray(new String[args.size()])); | ||
58 | + this.passThroughArgs = this.parsedOptions.valuesOf(nonOptions); | ||
59 | + | ||
60 | + // Parse out the arguments ourself because joptsimple doesn't really provide a good way to | ||
61 | + // add arguments to the unparsed argument list after parsing | ||
62 | + this.parseArgs(this.passThroughArgs); | ||
63 | + | ||
64 | + // Put required arguments to the blackboard if they don't already exist there | ||
65 | + this.provideRequiredArgs(gameDirectory, assetsDirectory); | ||
66 | + | ||
67 | + if (this.parsedOptions.has(this.modsOption)) | ||
68 | + { | ||
69 | + LiteLoaderTransformer.modsToLoad = this.modsOption.values(this.parsedOptions); | ||
70 | + } | ||
71 | + } | ||
72 | + | ||
73 | + /** | ||
74 | + * @param gameDirectory | ||
75 | + * @param assetsDirectory | ||
76 | + */ | ||
77 | + public void provideRequiredArgs(File gameDirectory, File assetsDirectory) | ||
78 | + { | ||
79 | + @SuppressWarnings("unchecked") | ||
80 | + final List<String> argumentList = (List<String>)Launch.blackboard.get("ArgumentList"); | ||
81 | + | ||
82 | + if (argumentList != null) | ||
83 | + { | ||
84 | + if (!argumentList.contains("--version")) | ||
85 | + { | ||
86 | + argumentList.add("--version"); | ||
87 | + argumentList.add(this.VERSION); | ||
88 | + } | ||
89 | + | ||
90 | + if (!argumentList.contains("--gameDir") && gameDirectory != null) | ||
91 | + { | ||
92 | + argumentList.add("--gameDir"); | ||
93 | + argumentList.add(gameDirectory.getAbsolutePath()); | ||
94 | + } | ||
95 | + | ||
96 | + if (!argumentList.contains("--assetsDir") && assetsDirectory != null) | ||
97 | + { | ||
98 | + argumentList.add("--assetsDir"); | ||
99 | + argumentList.add(assetsDirectory.getAbsolutePath()); | ||
100 | + } | ||
101 | + } | ||
102 | + } | ||
103 | + | ||
104 | + private void parseArgs(List<String> args) | ||
105 | + { | ||
106 | + String classifier = null; | ||
107 | + | ||
108 | + for (String arg : args) | ||
109 | + { | ||
110 | + if (arg.startsWith("-")) | ||
111 | + { | ||
112 | + if (classifier != null) | ||
113 | + classifier = this.addClassifiedArg(classifier, ""); | ||
114 | + else if (arg.contains("=")) | ||
115 | + classifier = this.addClassifiedArg(arg.substring(0, arg.indexOf('=')), arg.substring(arg.indexOf('=') + 1)); | ||
116 | + else | ||
117 | + classifier = arg; | ||
118 | + } | ||
119 | + else | ||
120 | + { | ||
121 | + if (classifier != null) | ||
122 | + classifier = this.addClassifiedArg(classifier, arg); | ||
123 | + else | ||
124 | + this.unClassifiedArgs.add(arg); | ||
125 | + } | ||
126 | + } | ||
127 | + } | ||
128 | + | ||
129 | + private String addClassifiedArg(String classifiedArg, String arg) | ||
130 | + { | ||
131 | + this.classifiedArgs.put(classifiedArg, arg); | ||
132 | + return null; | ||
133 | + } | ||
134 | + | ||
135 | + @Override | ||
136 | + public void injectIntoClassLoader(LaunchClassLoader classLoader) | ||
137 | + { | ||
138 | + LiteLoaderTransformer.launchClassLoader = classLoader; | ||
139 | + classLoader.registerTransformer("com.mumfrey.liteloader.launch.LiteLoaderTransformer"); | ||
140 | + } | ||
141 | + | ||
142 | + @Override | ||
143 | + public String getLaunchTarget() | ||
144 | + { | ||
145 | + return "net.minecraft.client.main.Main"; | ||
146 | + } | ||
147 | + | ||
148 | + @Override | ||
149 | + public String[] getLaunchArguments() | ||
150 | + { | ||
151 | + List<String> args = new ArrayList<String>(); | ||
152 | + | ||
153 | + for (String unClassifiedArg : this.unClassifiedArgs) | ||
154 | + args.add(unClassifiedArg); | ||
155 | + | ||
156 | + for (Entry<String, String> classifiedArg : this.classifiedArgs.entrySet()) | ||
157 | + { | ||
158 | + args.add(classifiedArg.getKey().trim()); | ||
159 | + args.add(classifiedArg.getValue().trim()); | ||
160 | + } | ||
161 | + | ||
162 | + return args.toArray(new String[args.size()]); | ||
163 | + } | ||
164 | + | ||
165 | + public File getGameDirectory() | ||
166 | + { | ||
167 | + return this.gameDirectory; | ||
168 | + } | ||
169 | + | ||
170 | + public File getAssetsDirectory() | ||
171 | + { | ||
172 | + return this.assetsDirectory; | ||
173 | + } | ||
174 | + | ||
175 | + public String getProfile() | ||
176 | + { | ||
177 | + return this.profile; | ||
178 | + } | ||
179 | +} |
java/com/mumfrey/liteloader/core/LiteLoaderLogFormatter.java renamed to java/com/mumfrey/liteloader/log/LiteLoaderLogFormatter.java
1 | -package com.mumfrey.liteloader.core; | 1 | +package com.mumfrey.liteloader.log; |
2 | 2 | ||
3 | import java.io.PrintWriter; | 3 | import java.io.PrintWriter; |
4 | import java.io.StringWriter; | 4 | import java.io.StringWriter; |
@@ -7,7 +7,7 @@ import java.util.logging.Formatter; | @@ -7,7 +7,7 @@ import java.util.logging.Formatter; | ||
7 | import java.util.logging.Level; | 7 | import java.util.logging.Level; |
8 | import java.util.logging.LogRecord; | 8 | import java.util.logging.LogRecord; |
9 | 9 | ||
10 | -final class LiteLoaderLogFormatter extends Formatter | 10 | +public class LiteLoaderLogFormatter extends Formatter |
11 | { | 11 | { |
12 | private SimpleDateFormat simpleDateFormatLogFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | 12 | private SimpleDateFormat simpleDateFormatLogFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
13 | 13 | ||
@@ -29,9 +29,9 @@ final class LiteLoaderLogFormatter extends Formatter | @@ -29,9 +29,9 @@ final class LiteLoaderLogFormatter extends Formatter | ||
29 | 29 | ||
30 | if (th != null) | 30 | if (th != null) |
31 | { | 31 | { |
32 | - StringWriter var5 = new StringWriter(); | ||
33 | - th.printStackTrace(new PrintWriter(var5)); | ||
34 | - sb.append(var5.toString()); | 32 | + StringWriter stringWriter = new StringWriter(); |
33 | + th.printStackTrace(new PrintWriter(stringWriter)); | ||
34 | + sb.append(stringWriter.toString()); | ||
35 | } | 35 | } |
36 | 36 | ||
37 | return sb.toString(); | 37 | return sb.toString(); |
java/com/mumfrey/liteloader/permissions/PermissionsManagerClient.java
@@ -16,7 +16,7 @@ import net.minecraft.src.Packet1Login; | @@ -16,7 +16,7 @@ import net.minecraft.src.Packet1Login; | ||
16 | 16 | ||
17 | import com.mumfrey.liteloader.Permissible; | 17 | import com.mumfrey.liteloader.Permissible; |
18 | import com.mumfrey.liteloader.PluginChannelListener; | 18 | import com.mumfrey.liteloader.PluginChannelListener; |
19 | -import com.mumfrey.liteloader.util.ModUtilities; | 19 | +import com.mumfrey.liteloader.core.PluginChannels; |
20 | 20 | ||
21 | /** | 21 | /** |
22 | * This class manages permissions on the client, it is a singleton class which can manage permissions for multiple | 22 | * This class manages permissions on the client, it is a singleton class which can manage permissions for multiple |
@@ -220,7 +220,7 @@ public class PermissionsManagerClient implements PermissionsManager, PluginChann | @@ -220,7 +220,7 @@ public class PermissionsManagerClient implements PermissionsManager, PluginChann | ||
220 | if (!query.modName.equals("all") || query.permissions.size() > 0) | 220 | if (!query.modName.equals("all") || query.permissions.size() > 0) |
221 | { | 221 | { |
222 | byte[] data = query.getBytes(); | 222 | byte[] data = query.getBytes(); |
223 | - ModUtilities.sendPluginChannelMessage(ReplicatedPermissionsContainer.CHANNEL, data); | 223 | + PluginChannels.sendMessage(ReplicatedPermissionsContainer.CHANNEL, data); |
224 | } | 224 | } |
225 | } | 225 | } |
226 | } | 226 | } |
java/com/mumfrey/liteloader/resources/ModResourcePack.java
@@ -28,29 +28,29 @@ public class ModResourcePack extends FileResourcePack | @@ -28,29 +28,29 @@ public class ModResourcePack extends FileResourcePack | ||
28 | super(modFile); | 28 | super(modFile); |
29 | this.name = name; | 29 | this.name = name; |
30 | } | 30 | } |
31 | - | ||
32 | - /* (non-Javadoc) | ||
33 | - * @see net.minecraft.src.AbstractResourcePack#getMetadataSection(net.minecraft.src.MetadataSerializer, java.lang.String) | ||
34 | - */ | ||
35 | - @Override | ||
36 | - public MetadataSection func_135058_a(MetadataSerializer metadataSerializer, String metadataSectionName) throws IOException // TODO adamsrc -> getMetadataSection | ||
37 | - { | ||
38 | - try | 31 | + |
32 | + /* (non-Javadoc) | ||
33 | + * @see net.minecraft.src.AbstractResourcePack#getMetadataSection(net.minecraft.src.MetadataSerializer, java.lang.String) | ||
34 | + */ | ||
35 | + @Override | ||
36 | + public MetadataSection getPackMetadata(MetadataSerializer metadataSerializer, String metadataSectionName) throws IOException | ||
37 | + { | ||
38 | + try | ||
39 | { | 39 | { |
40 | - // This will fail when fetching pack.mcmeta if there isn't one in the mod file, since we don't care we | ||
41 | - // just catch the exception and return null instead | ||
42 | - return super.func_135058_a(metadataSerializer, metadataSectionName); // TODO adamsrc -> getMetadataSection | 40 | + // This will fail when fetching pack.mcmeta if there isn't one in the mod file, since we don't care we |
41 | + // just catch the exception and return null instead | ||
42 | + return super.getPackMetadata(metadataSerializer, metadataSectionName); | ||
43 | } | 43 | } |
44 | catch (Exception ex) {} | 44 | catch (Exception ex) {} |
45 | - | ||
46 | - return null; | ||
47 | - } | 45 | + |
46 | + return null; | ||
47 | + } | ||
48 | 48 | ||
49 | /* (non-Javadoc) | 49 | /* (non-Javadoc) |
50 | * @see net.minecraft.src.AbstractResourcePack#getName() | 50 | * @see net.minecraft.src.AbstractResourcePack#getName() |
51 | */ | 51 | */ |
52 | @Override | 52 | @Override |
53 | - public String func_130077_b() // TODO adamsrc -> getName() | 53 | + public String getPackName() |
54 | { | 54 | { |
55 | return this.name; | 55 | return this.name; |
56 | } | 56 | } |
java/com/mumfrey/liteloader/resources/ModResourcePackDir.java
@@ -28,29 +28,29 @@ public class ModResourcePackDir extends FolderResourcePack | @@ -28,29 +28,29 @@ public class ModResourcePackDir extends FolderResourcePack | ||
28 | super(modFile); | 28 | super(modFile); |
29 | this.name = name; | 29 | this.name = name; |
30 | } | 30 | } |
31 | - | ||
32 | - /* (non-Javadoc) | ||
33 | - * @see net.minecraft.src.AbstractResourcePack#getMetadataSection(net.minecraft.src.MetadataSerializer, java.lang.String) | ||
34 | - */ | ||
35 | - @Override | ||
36 | - public MetadataSection func_135058_a(MetadataSerializer metadataSerializer, String metadataSectionName) throws IOException // TODO adamsrc -> getMetadataSection | ||
37 | - { | ||
38 | - try | 31 | + |
32 | + /* (non-Javadoc) | ||
33 | + * @see net.minecraft.src.AbstractResourcePack#getMetadataSection(net.minecraft.src.MetadataSerializer, java.lang.String) | ||
34 | + */ | ||
35 | + @Override | ||
36 | + public MetadataSection getPackMetadata(MetadataSerializer metadataSerializer, String metadataSectionName) throws IOException | ||
37 | + { | ||
38 | + try | ||
39 | { | 39 | { |
40 | - // This will fail when fetching pack.mcmeta if there isn't one in the mod file, since we don't care we | ||
41 | - // just catch the exception and return null instead | ||
42 | - return super.func_135058_a(metadataSerializer, metadataSectionName); // TODO adamsrc -> getMetadataSection | 40 | + // This will fail when fetching pack.mcmeta if there isn't one in the mod file, since we don't care we |
41 | + // just catch the exception and return null instead | ||
42 | + return super.getPackMetadata(metadataSerializer, metadataSectionName); | ||
43 | } | 43 | } |
44 | catch (Exception ex) {} | 44 | catch (Exception ex) {} |
45 | - | ||
46 | - return null; | ||
47 | - } | 45 | + |
46 | + return null; | ||
47 | + } | ||
48 | 48 | ||
49 | /* (non-Javadoc) | 49 | /* (non-Javadoc) |
50 | * @see net.minecraft.src.AbstractResourcePack#getName() | 50 | * @see net.minecraft.src.AbstractResourcePack#getName() |
51 | */ | 51 | */ |
52 | @Override | 52 | @Override |
53 | - public String func_130077_b() // TODO adamsrc -> getName() | 53 | + public String getPackName() |
54 | { | 54 | { |
55 | return this.name; | 55 | return this.name; |
56 | } | 56 | } |
java/com/mumfrey/liteloader/util/ModUtilities.java
@@ -7,9 +7,9 @@ import java.util.Map; | @@ -7,9 +7,9 @@ import java.util.Map; | ||
7 | import java.util.Set; | 7 | import java.util.Set; |
8 | 8 | ||
9 | import com.mumfrey.liteloader.core.LiteLoader; | 9 | import com.mumfrey.liteloader.core.LiteLoader; |
10 | +import com.mumfrey.liteloader.core.PluginChannels; | ||
10 | 11 | ||
11 | import net.minecraft.client.ClientBrandRetriever; | 12 | import net.minecraft.client.ClientBrandRetriever; |
12 | -import net.minecraft.src.Minecraft; | ||
13 | import net.minecraft.src.*; | 13 | import net.minecraft.src.*; |
14 | 14 | ||
15 | public abstract class ModUtilities | 15 | public abstract class ModUtilities |
@@ -27,7 +27,7 @@ public abstract class ModUtilities | @@ -27,7 +27,7 @@ public abstract class ModUtilities | ||
27 | static | 27 | static |
28 | { | 28 | { |
29 | // Check for FML | 29 | // Check for FML |
30 | - forgeModLoader = ClientBrandRetriever.getClientModName().contains("fml"); | 30 | + ModUtilities.forgeModLoader = ClientBrandRetriever.getClientModName().contains("fml"); |
31 | } | 31 | } |
32 | 32 | ||
33 | /** | 33 | /** |
@@ -53,6 +53,11 @@ public abstract class ModUtilities | @@ -53,6 +53,11 @@ public abstract class ModUtilities | ||
53 | @SuppressWarnings("unchecked") | 53 | @SuppressWarnings("unchecked") |
54 | public static boolean registerPacketOverride(int packetId, Class<? extends Packet> newPacket) | 54 | public static boolean registerPacketOverride(int packetId, Class<? extends Packet> newPacket) |
55 | { | 55 | { |
56 | + if (packetId == 250) | ||
57 | + { | ||
58 | + throw new RuntimeException("Cannot override packet 250, register a plugin channel listener instead"); | ||
59 | + } | ||
60 | + | ||
56 | if (overriddenPackets.contains(Integer.valueOf(packetId))) | 61 | if (overriddenPackets.contains(Integer.valueOf(packetId))) |
57 | { | 62 | { |
58 | LiteLoader.getLogger().warning(String.format("Packet with ID %s was already overridden by another mod, one or mods may not function correctly", packetId)); | 63 | LiteLoader.getLogger().warning(String.format("Packet with ID %s was already overridden by another mod, one or mods may not function correctly", packetId)); |
@@ -72,7 +77,7 @@ public abstract class ModUtilities | @@ -72,7 +77,7 @@ public abstract class ModUtilities | ||
72 | } | 77 | } |
73 | catch (Exception ex) | 78 | catch (Exception ex) |
74 | { | 79 | { |
75 | - LiteLoader.logger.warning("Error registering packet override for packet id " + packetId + ": " + ex.getMessage()); | 80 | + LiteLoader.getLogger().warning("Error registering packet override for packet id " + packetId + ": " + ex.getMessage()); |
76 | return false; | 81 | return false; |
77 | } | 82 | } |
78 | } | 83 | } |
@@ -82,23 +87,13 @@ public abstract class ModUtilities | @@ -82,23 +87,13 @@ public abstract class ModUtilities | ||
82 | * | 87 | * |
83 | * @param channel Channel to send the data | 88 | * @param channel Channel to send the data |
84 | * @param data | 89 | * @param data |
90 | + * | ||
91 | + * @deprecated User PluginChannels.sendMessage(channel, data) instead. | ||
85 | */ | 92 | */ |
93 | + @Deprecated | ||
86 | public static void sendPluginChannelMessage(String channel, byte[] data) | 94 | public static void sendPluginChannelMessage(String channel, byte[] data) |
87 | { | 95 | { |
88 | - if (channel == null || channel.length() > 16) | ||
89 | - throw new RuntimeException("Invalid channel name specified"); | ||
90 | - | ||
91 | - try | ||
92 | - { | ||
93 | - Minecraft minecraft = Minecraft.getMinecraft(); | ||
94 | - | ||
95 | - if (minecraft.thePlayer != null) | ||
96 | - { | ||
97 | - Packet250CustomPayload payload = new Packet250CustomPayload(channel, data); | ||
98 | - minecraft.thePlayer.sendQueue.addToSendQueue(payload); | ||
99 | - } | ||
100 | - } | ||
101 | - catch (Exception ex) {} | 96 | + PluginChannels.sendMessage(channel, data); |
102 | } | 97 | } |
103 | 98 | ||
104 | /** | 99 | /** |
java/com/mumfrey/liteloader/util/PrivateFields.java
@@ -15,7 +15,7 @@ import net.minecraft.src.*; | @@ -15,7 +15,7 @@ import net.minecraft.src.*; | ||
15 | * @param <P> Parent class type, the type of the class that owns the field | 15 | * @param <P> Parent class type, the type of the class that owns the field |
16 | * @param <T> Field type, the type of the field value | 16 | * @param <T> Field type, the type of the field value |
17 | * | 17 | * |
18 | - * TODO Obfuscation - updated 1.6.2 | 18 | + * TODO Obfuscation - updated 1.6.3 |
19 | */ | 19 | */ |
20 | @SuppressWarnings("rawtypes") | 20 | @SuppressWarnings("rawtypes") |
21 | public class PrivateFields<P, T> | 21 | public class PrivateFields<P, T> |
@@ -147,6 +147,6 @@ public class PrivateFields<P, T> | @@ -147,6 +147,6 @@ public class PrivateFields<P, T> | ||
147 | public static final PrivateFields<RenderManager, Map> entityRenderMap = new PrivateFields<RenderManager, Map> (RenderManager.class, "entityRenderMap", "q", "field_78729_o"); // RenderManager/entityRenderMap | 147 | public static final PrivateFields<RenderManager, Map> entityRenderMap = new PrivateFields<RenderManager, Map> (RenderManager.class, "entityRenderMap", "q", "field_78729_o"); // RenderManager/entityRenderMap |
148 | public static final PrivateFields<GuiControls, GuiScreen> guiControlsParentScreen = new PrivateFields<GuiControls, GuiScreen> (GuiControls.class, "parentScreen", "b", "field_73909_b"); // GuiControls/parentScreen | 148 | public static final PrivateFields<GuiControls, GuiScreen> guiControlsParentScreen = new PrivateFields<GuiControls, GuiScreen> (GuiControls.class, "parentScreen", "b", "field_73909_b"); // GuiControls/parentScreen |
149 | public static final PrivateFields<PlayerUsageSnooper, IPlayerUsage> playerStatsCollector = new PrivateFields<PlayerUsageSnooper, IPlayerUsage>(PlayerUsageSnooper.class, "playerStatsCollector", "d", "field_76478_d"); // PlayerUsageSnooper/playerStatsCollector | 149 | public static final PrivateFields<PlayerUsageSnooper, IPlayerUsage> playerStatsCollector = new PrivateFields<PlayerUsageSnooper, IPlayerUsage>(PlayerUsageSnooper.class, "playerStatsCollector", "d", "field_76478_d"); // PlayerUsageSnooper/playerStatsCollector |
150 | - public static final PrivateFields<SimpleReloadableResourceManager, List<ResourceManagerReloadListener>> reloadListeners = new PrivateFields<SimpleReloadableResourceManager, List<ResourceManagerReloadListener>>(SimpleReloadableResourceManager.class, "field_110546_b", "c", "field_110546_b"); // SimpleReloadableResourceManager/field_110546_b | 150 | + public static final PrivateFields<SimpleReloadableResourceManager, List<ResourceManagerReloadListener>> reloadListeners = new PrivateFields<SimpleReloadableResourceManager, List<ResourceManagerReloadListener>>(SimpleReloadableResourceManager.class, "reloadListeners", "c", "field_110546_b"); // SimpleReloadableResourceManager/reloadListeners |
151 | } | 151 | } |
152 | 152 |
java/com/mumfrey/liteloader/util/log/ConsoleHandler.java
@@ -24,15 +24,13 @@ public class ConsoleHandler extends StreamHandler | @@ -24,15 +24,13 @@ public class ConsoleHandler extends StreamHandler | ||
24 | * initialized the <tt>LogRecord</tt> and forwarded it here. | 24 | * initialized the <tt>LogRecord</tt> and forwarded it here. |
25 | * <p> | 25 | * <p> |
26 | * | 26 | * |
27 | - * @param record | ||
28 | - * description of the log event. A null record is silently | ||
29 | - * ignored and is not published | 27 | + * @param record description of the log event. A null record is silently ignored and is not published |
30 | */ | 28 | */ |
31 | @Override | 29 | @Override |
32 | public synchronized void publish(LogRecord record) | 30 | public synchronized void publish(LogRecord record) |
33 | { | 31 | { |
34 | super.publish(record); | 32 | super.publish(record); |
35 | - flush(); | 33 | + this.flush(); |
36 | } | 34 | } |
37 | 35 | ||
38 | /** | 36 | /** |
@@ -42,6 +40,6 @@ public class ConsoleHandler extends StreamHandler | @@ -42,6 +40,6 @@ public class ConsoleHandler extends StreamHandler | ||
42 | @Override | 40 | @Override |
43 | public synchronized void close() | 41 | public synchronized void close() |
44 | { | 42 | { |
45 | - flush(); | 43 | + this.flush(); |
46 | } | 44 | } |
47 | } | 45 | } |
java/net/minecraft/src/CallableJVMFlags.java
@@ -11,48 +11,48 @@ import com.mumfrey.liteloader.core.CallableLiteLoaderMods; | @@ -11,48 +11,48 @@ import com.mumfrey.liteloader.core.CallableLiteLoaderMods; | ||
11 | 11 | ||
12 | class CallableJVMFlags implements Callable<String> | 12 | class CallableJVMFlags implements Callable<String> |
13 | { | 13 | { |
14 | - /** Reference to the CrashReport object. */ | ||
15 | - final CrashReport theCrashReport; | ||
16 | - | ||
17 | - CallableJVMFlags(CrashReport par1CrashReport) | ||
18 | - { | ||
19 | - this.theCrashReport = par1CrashReport; | ||
20 | - par1CrashReport.func_85056_g().addCrashSectionCallable("Mod Pack", new CallableLiteLoaderBrand(par1CrashReport)); | ||
21 | - par1CrashReport.func_85056_g().addCrashSectionCallable("LiteLoader Mods", new CallableLiteLoaderMods(par1CrashReport)); | ||
22 | - } | ||
23 | - | ||
24 | - /** | ||
25 | - * Returns the number of JVM Flags along with the passed JVM Flags. | ||
26 | - */ | ||
27 | - public String getJVMFlagsAsString() | ||
28 | - { | ||
29 | - RuntimeMXBean var1 = ManagementFactory.getRuntimeMXBean(); | ||
30 | - List<String> var2 = var1.getInputArguments(); | ||
31 | - int var3 = 0; | ||
32 | - StringBuilder var4 = new StringBuilder(); | ||
33 | - Iterator<String> var5 = var2.iterator(); | ||
34 | - | ||
35 | - while (var5.hasNext()) | ||
36 | - { | ||
37 | - String var6 = var5.next(); | ||
38 | - | ||
39 | - if (var6.startsWith("-X")) | ||
40 | - { | ||
41 | - if (var3++ > 0) | ||
42 | - { | ||
43 | - var4.append(" "); | ||
44 | - } | ||
45 | - | ||
46 | - var4.append(var6); | ||
47 | - } | ||
48 | - } | ||
49 | - | ||
50 | - return String.format("%d total; %s", new Object[] {Integer.valueOf(var3), var4.toString()}); | ||
51 | - } | ||
52 | - | ||
53 | - @Override | 14 | + /** Reference to the CrashReport object. */ |
15 | + final CrashReport theCrashReport; | ||
16 | + | ||
17 | + CallableJVMFlags(CrashReport par1CrashReport) | ||
18 | + { | ||
19 | + this.theCrashReport = par1CrashReport; | ||
20 | + par1CrashReport.getCategory().addCrashSectionCallable("Mod Pack", new CallableLiteLoaderBrand(par1CrashReport)); | ||
21 | + par1CrashReport.getCategory().addCrashSectionCallable("LiteLoader Mods", new CallableLiteLoaderMods(par1CrashReport)); | ||
22 | + } | ||
23 | + | ||
24 | + /** | ||
25 | + * Returns the number of JVM Flags along with the passed JVM Flags. | ||
26 | + */ | ||
27 | + public String getJVMFlagsAsString() | ||
28 | + { | ||
29 | + RuntimeMXBean var1 = ManagementFactory.getRuntimeMXBean(); | ||
30 | + List<String> var2 = var1.getInputArguments(); | ||
31 | + int var3 = 0; | ||
32 | + StringBuilder var4 = new StringBuilder(); | ||
33 | + Iterator<String> var5 = var2.iterator(); | ||
34 | + | ||
35 | + while (var5.hasNext()) | ||
36 | + { | ||
37 | + String var6 = var5.next(); | ||
38 | + | ||
39 | + if (var6.startsWith("-X")) | ||
40 | + { | ||
41 | + if (var3++ > 0) | ||
42 | + { | ||
43 | + var4.append(" "); | ||
44 | + } | ||
45 | + | ||
46 | + var4.append(var6); | ||
47 | + } | ||
48 | + } | ||
49 | + | ||
50 | + return String.format("%d total; %s", new Object[] {Integer.valueOf(var3), var4.toString()}); | ||
51 | + } | ||
52 | + | ||
53 | + @Override | ||
54 | public String call() | 54 | public String call() |
55 | - { | ||
56 | - return this.getJVMFlagsAsString(); | ||
57 | - } | 55 | + { |
56 | + return this.getJVMFlagsAsString(); | ||
57 | + } | ||
58 | } | 58 | } |
javadoc/jopt-simple-4.5-javadoc.jar
0 → 100644
No preview for this file type
lib/jopt-simple-4.5.jar
0 → 100644
No preview for this file type
lib/launchwrapper-1.7.jar
0 → 100644
No preview for this file type
run/com/mumfrey/liteloader/debug/Start.java
0 → 100644
1 | +package com.mumfrey.liteloader.debug; | ||
2 | +import java.io.BufferedReader; | ||
3 | +import java.io.DataInputStream; | ||
4 | +import java.io.DataOutputStream; | ||
5 | +import java.io.File; | ||
6 | +import java.io.IOException; | ||
7 | +import java.io.InputStreamReader; | ||
8 | +import java.io.UnsupportedEncodingException; | ||
9 | +import java.net.URL; | ||
10 | +import java.net.URLEncoder; | ||
11 | +import java.security.PublicKey; | ||
12 | +import java.security.cert.Certificate; | ||
13 | + | ||
14 | +import javax.net.ssl.HttpsURLConnection; | ||
15 | + | ||
16 | +import com.mumfrey.liteloader.launch.LiteLoaderTweaker; | ||
17 | + | ||
18 | +import net.minecraft.launchwrapper.Launch; | ||
19 | + | ||
20 | +/** | ||
21 | + * Wrapper class for LaunchWrapper Main class, which logs into minecraft.net first so that online shizzle can be tested | ||
22 | + * | ||
23 | + * @author Adam Mummery-Smith | ||
24 | + * @version 0.4 | ||
25 | + */ | ||
26 | +public abstract class Start | ||
27 | +{ | ||
28 | + /** | ||
29 | + * Username specified on the command line | ||
30 | + */ | ||
31 | + public static String userName = ""; | ||
32 | + | ||
33 | + /** | ||
34 | + * Latest minecraft version as recieved from minecraft.net | ||
35 | + */ | ||
36 | + public static String latestVersion = ""; | ||
37 | + | ||
38 | + /** | ||
39 | + * Download ticket issued to us by minecraft.net | ||
40 | + */ | ||
41 | + public static String downloadTicket = ""; | ||
42 | + | ||
43 | + /** | ||
44 | + * Session ID retrieved during login ("-" means no session, eg. offline) | ||
45 | + */ | ||
46 | + public static String sessionId = "-"; | ||
47 | + | ||
48 | + /** | ||
49 | + * Encoded certificate data in case the user forgets to extract minecraft.key ! | ||
50 | + */ | ||
51 | + private static int[] certificateData = { | ||
52 | + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, | ||
53 | + 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc6, 0xf3, 0xde, | ||
54 | + 0xfd, 0xef, 0xa9, 0x62, 0x9c, 0xe0, 0x51, 0x28, 0x9b, 0xfb, 0x46, 0xbc, 0xf4, 0x1a, 0x03, 0x0d, 0x6f, 0x69, | ||
55 | + 0xf1, 0x98, 0x2a, 0xa6, 0x35, 0xb9, 0x62, 0xd6, 0x36, 0x6b, 0x64, 0x53, 0x87, 0x93, 0xd6, 0xa9, 0xd3, 0x46, | ||
56 | + 0xd7, 0x93, 0x4f, 0x1d, 0x8e, 0x50, 0x50, 0x7d, 0x51, 0x80, 0xd1, 0x29, 0x8f, 0x83, 0x37, 0xb6, 0x67, 0xfd, | ||
57 | + 0xde, 0xa3, 0xdf, 0x02, 0xda, 0x52, 0xba, 0x1c, 0x3a, 0x3e, 0x6f, 0xe4, 0xb6, 0xc8, 0x55, 0x75, 0x91, 0xf8, | ||
58 | + 0x6b, 0x2a, 0x51, 0x5a, 0xad, 0xf6, 0x26, 0x9b, 0xff, 0xcf, 0x67, 0x15, 0xa0, 0xb9, 0x5a, 0xb8, 0xca, 0xaf, | ||
59 | + 0x8f, 0xef, 0x9a, 0x15, 0x45, 0x9f, 0x87, 0xd0, 0x82, 0x89, 0x55, 0x45, 0x91, 0x7e, 0x90, 0x03, 0x84, 0x45, | ||
60 | + 0x6b, 0xdf, 0xeb, 0xa4, 0x95, 0x71, 0x74, 0xbd, 0x0f, 0x8b, 0xf7, 0xa8, 0xc4, 0xfa, 0xd5, 0x7d, 0x6f, 0xff, | ||
61 | + 0x01, 0xc0, 0x4a, 0x64, 0xd2, 0x73, 0x02, 0xf1, 0x4f, 0x72, 0x87, 0x48, 0x80, 0xa2, 0x0c, 0x9c, 0x3c, 0xd5, | ||
62 | + 0xad, 0xbe, 0xfb, 0xf0, 0x38, 0x34, 0xaf, 0x25, 0x10, 0xef, 0x96, 0xaf, 0x8c, 0x3d, 0xfa, 0x48, 0x54, 0x5f, | ||
63 | + 0xe4, 0x11, 0x43, 0xa2, 0x74, 0xe9, 0xc4, 0x28, 0xa9, 0x06, 0x3d, 0xcc, 0xbd, 0xc0, 0xbe, 0x48, 0xb4, 0x22, | ||
64 | + 0xd6, 0xd2, 0x34, 0xee, 0x2f, 0x07, 0x76, 0xe7, 0x33, 0x9f, 0x0d, 0xe5, 0x9e, 0x34, 0x8a, 0xc6, 0xec, 0x2b, | ||
65 | + 0x75, 0x15, 0x3a, 0x2f, 0xa8, 0xa6, 0x9a, 0x77, 0x68, 0x17, 0xf2, 0x90, 0x65, 0x5b, 0xef, 0x52, 0x33, 0xaa, | ||
66 | + 0x4b, 0x05, 0xf3, 0x08, 0x80, 0x0e, 0xdf, 0x0d, 0xfb, 0x8b, 0x67, 0x0e, 0x17, 0x54, 0x25, 0x9f, 0x75, 0xa9, | ||
67 | + 0xf8, 0x66, 0x28, 0xeb, 0x70, 0x31, 0x49, 0xac, 0xe3, 0x9d, 0xb1, 0x10, 0xc8, 0xfd, 0xfd, 0x8d, 0x23, 0x6c, | ||
68 | + 0xef, 0x02, 0x03, 0x01, 0x00, 0x01 | ||
69 | + }; | ||
70 | + | ||
71 | + /** | ||
72 | + * Entry point. Validates the parameters and performs the login | ||
73 | + * | ||
74 | + * @param args | ||
75 | + */ | ||
76 | + public static void main(String[] args) | ||
77 | + { | ||
78 | + // Check we have enough arguments | ||
79 | + if (args.length < 2) | ||
80 | + { | ||
81 | + Start.showError("Invalid parameters specified for start, use: <username> <password> to log in to minecraft.net"); | ||
82 | + userName = args.length < 1 ? System.getProperty("user.name") : args[0]; | ||
83 | + } | ||
84 | + else | ||
85 | + { | ||
86 | + // Assign username as the first argument | ||
87 | + userName = args[0]; | ||
88 | + | ||
89 | + // Perform the login if the second parameter is not "-" (indicating offline) | ||
90 | + if (!args[1].equals("-") && login(args[0], args[1], 13, true)) | ||
91 | + { | ||
92 | + Start.showMessage(String.format("Successfully logged in as %s with session ID %s", userName, sessionId)); | ||
93 | + args[0] = userName; | ||
94 | + args[1] = sessionId; | ||
95 | + } | ||
96 | + } | ||
97 | + | ||
98 | + Start.showMessage(String.format("Launching game as %s", userName)); | ||
99 | + | ||
100 | + File gameDir = new File(System.getProperty("user.dir")); | ||
101 | + File assetsDir = new File(gameDir, "assets"); | ||
102 | + | ||
103 | + args = new String[] { | ||
104 | + "--tweakClass", LiteLoaderTweaker.class.getName(), | ||
105 | + "--username", userName, | ||
106 | + "--session", sessionId, | ||
107 | + "--version", "mcp", | ||
108 | + "--gameDir", gameDir.getAbsolutePath(), | ||
109 | + "--assetsDir", assetsDir.getAbsolutePath() | ||
110 | + }; | ||
111 | + | ||
112 | + Launch.main(args); | ||
113 | + } | ||
114 | + | ||
115 | + /** | ||
116 | + * Do login to minecraft.net. Based on the login method in the Launcher | ||
117 | + * | ||
118 | + * @param user Username | ||
119 | + * @param password Password | ||
120 | + * @param masqueradeLauncher Version Launcher version to masquerade as | ||
121 | + * @param validateCertificate True to validate the minecraft.net certificate. False if you can't be bothered or don't care :) | ||
122 | + * @return True if the login succeeded | ||
123 | + */ | ||
124 | + private static boolean login(String user, String password, int masqueradeLauncherVersion, boolean validateCertificate) | ||
125 | + { | ||
126 | + try | ||
127 | + { | ||
128 | + String parameters = String.format("user=%s&password=%s&version=%s",URLEncoder.encode(user, "UTF-8"), URLEncoder.encode(password, "UTF-8"), masqueradeLauncherVersion); | ||
129 | + | ||
130 | + Start.showMessage("Attempting to login to minecraft.net..."); | ||
131 | + String result = excutePost("https://login.minecraft.net/", parameters, validateCertificate); | ||
132 | + | ||
133 | + if (result == null) | ||
134 | + { | ||
135 | + Start.showError("Can't connect to minecraft.net"); | ||
136 | + return false; | ||
137 | + } | ||
138 | + | ||
139 | + if (!result.contains(":")) | ||
140 | + { | ||
141 | + Start.showError(result); | ||
142 | + return false; | ||
143 | + } | ||
144 | + | ||
145 | + try | ||
146 | + { | ||
147 | + String values[] = result.split(":"); | ||
148 | + | ||
149 | + latestVersion = values[0].trim(); | ||
150 | + downloadTicket = values[1].trim(); | ||
151 | + userName = values[2].trim(); | ||
152 | + sessionId = values[3].trim(); | ||
153 | + | ||
154 | + return true; | ||
155 | + } | ||
156 | + catch(Exception e) | ||
157 | + { | ||
158 | + e.printStackTrace(); | ||
159 | + return false; | ||
160 | + } | ||
161 | + } | ||
162 | + catch (UnsupportedEncodingException e) | ||
163 | + { | ||
164 | + Start.showError("Error encoding POST data, check your parameters"); | ||
165 | + return false; | ||
166 | + } | ||
167 | + } | ||
168 | + | ||
169 | + /** | ||
170 | + * Execute a HTTPS POST. Based on code in the Minecraft launcher | ||
171 | + * | ||
172 | + * @param targetURL POST url | ||
173 | + * @param postData POST query string | ||
174 | + * @param validateCertificate True if the certificate should be validated against the local cache | ||
175 | + * @return Response data or null if the query fails | ||
176 | + */ | ||
177 | + private static String excutePost(String targetURL, String postData, boolean validateCertificate) | ||
178 | + { | ||
179 | + HttpsURLConnection https = null; | ||
180 | + String responseData; | ||
181 | + | ||
182 | + try | ||
183 | + { | ||
184 | + URL url = new URL(targetURL); | ||
185 | + | ||
186 | + // Play that funky music white boy | ||
187 | + https = (HttpsURLConnection)url.openConnection(); | ||
188 | + https.setRequestMethod("POST"); | ||
189 | + https.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); | ||
190 | + https.setRequestProperty("Content-Length", Integer.toString(postData.getBytes().length)); | ||
191 | + https.setRequestProperty("Content-Language", "en-US"); | ||
192 | + https.setUseCaches(false); | ||
193 | + https.setDoInput(true); | ||
194 | + https.setDoOutput(true); | ||
195 | + https.setConnectTimeout(1000); | ||
196 | + https.connect(); | ||
197 | + | ||
198 | + // Validate the cert we received with the HTTPS response, if the user wants to | ||
199 | + if (validateCertificate) | ||
200 | + { | ||
201 | + Certificate certificates[] = https.getServerCertificates(); | ||
202 | + | ||
203 | + byte bytes[] = new byte[294]; | ||
204 | + | ||
205 | + try | ||
206 | + { | ||
207 | + DataInputStream keyReaderStream = new DataInputStream(Start.class.getResourceAsStream("/minecraft.key")); | ||
208 | + keyReaderStream.readFully(bytes); | ||
209 | + keyReaderStream.close(); | ||
210 | + } | ||
211 | + catch (NullPointerException ex) | ||
212 | + { | ||
213 | + // Error loading from the key file (probably the user forgot to put minecraft.key in the bin folder) | ||
214 | + Start.showError("Missing minecraft.key, reverting to internal cache"); | ||
215 | + | ||
216 | + for (int certIndex = 0; certIndex < 294; certIndex++) | ||
217 | + bytes[certIndex] = (byte)(certificateData[certIndex] & 0xFF); | ||
218 | + } | ||
219 | + | ||
220 | + PublicKey publicKey = certificates[0].getPublicKey(); | ||
221 | + byte data[] = publicKey.getEncoded(); | ||
222 | + | ||
223 | + for (int i = 0; i < data.length; i++) | ||
224 | + { | ||
225 | + if(data[i] != bytes[i]) | ||
226 | + { | ||
227 | + Start.showError("Public key mismatch on " + targetURL); | ||
228 | + return null; | ||
229 | + } | ||
230 | + } | ||
231 | + | ||
232 | + Start.showMessage("Certificate validated ok for " + targetURL); | ||
233 | + } | ||
234 | + | ||
235 | + // Write ze postdata to ze server | ||
236 | + DataOutputStream postDataStream = new DataOutputStream(https.getOutputStream()); | ||
237 | + postDataStream.writeBytes(postData); | ||
238 | + postDataStream.flush(); | ||
239 | + postDataStream.close(); | ||
240 | + | ||
241 | + // Get and concat the response | ||
242 | + BufferedReader reader = new BufferedReader(new InputStreamReader(https.getInputStream())); | ||
243 | + StringBuffer responseBuffer = new StringBuffer(); | ||
244 | + | ||
245 | + String readLine; | ||
246 | + while((readLine = reader.readLine()) != null) | ||
247 | + { | ||
248 | + responseBuffer.append(readLine); | ||
249 | + responseBuffer.append('\r'); | ||
250 | + } | ||
251 | + | ||
252 | + reader.close(); | ||
253 | + responseData = responseBuffer.toString(); | ||
254 | + | ||
255 | + https.disconnect(); | ||
256 | + https = null; | ||
257 | + } | ||
258 | + catch (IOException e) | ||
259 | + { | ||
260 | + e.printStackTrace(); | ||
261 | + | ||
262 | + if(https != null) | ||
263 | + https.disconnect(); | ||
264 | + | ||
265 | + return null; | ||
266 | + } | ||
267 | + finally | ||
268 | + { | ||
269 | + if(https != null) | ||
270 | + { | ||
271 | + https.disconnect(); | ||
272 | + } | ||
273 | + } | ||
274 | + | ||
275 | + return responseData; | ||
276 | + } | ||
277 | + | ||
278 | + /** | ||
279 | + * Show a message on stdout | ||
280 | + * | ||
281 | + * @param message | ||
282 | + */ | ||
283 | + private static void showMessage(String message) | ||
284 | + { | ||
285 | + System.out.println("[START] [INFO] " + message); | ||
286 | + } | ||
287 | + | ||
288 | + /** | ||
289 | + * Show a message on stderr | ||
290 | + * | ||
291 | + * @param message | ||
292 | + */ | ||
293 | + private static void showError(String message) | ||
294 | + { | ||
295 | + System.err.println("[START] [ERROR] " + message); | ||
296 | + } | ||
297 | +} |
run/minecraft.key
0 → 100644
No preview for this file type