Commit c15092b2a462c27877e0cf2c4f155a9853516ffb

Authored by Mumfrey
1 parent 2953b223

merging 1.7.2 development branch into trunk

Showing 35 changed files with 1917 additions and 743 deletions

Too many changes to show.

To preserve performance only 35 of 129 files are displayed.

.classpath
... ... @@ -6,15 +6,17 @@
6 6 <classpathentry combineaccessrules="false" exported="true" kind="src" path="/Client"/>
7 7 <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
8 8 <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/org/lwjgl/lwjgl/lwjgl/2.9.0/lwjgl-2.9.0.jar"/>
9   - <classpathentry kind="lib" path="/Client/jars/libraries/com/google/code/gson/gson/2.2.2/gson-2.2.2.jar"/>
10   - <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/code/gson/gson/2.2.4/gson-2.2.4.jar"/>
  10 + <classpathentry kind="lib" path="/Client/jars/libraries/com/google/guava/guava/15.0/guava-15.0.jar"/>
11 11 <classpathentry kind="lib" path="/Client/jars/libraries/commons-io/commons-io/2.4/commons-io-2.4.jar"/>
12   - <classpathentry exported="true" kind="lib" path="lib/launchwrapper-1.8.jar"/>
  12 + <classpathentry exported="true" kind="lib" path="lib/launchwrapper-1.9.jar" sourcepath="externals/launchwrapper/src"/>
13 13 <classpathentry exported="true" kind="lib" path="lib/asm-debug-all-4.1.jar"/>
14   - <classpathentry exported="true" kind="lib" path="lib/authlib-1.3.jar" sourcepath="/AuthLib/java"/>
15 14 <classpathentry kind="lib" path="/Client/jars/libraries/org/apache/commons/commons-lang3/3.1/commons-lang3-3.1.jar"/>
16   - <classpathentry exported="true" kind="lib" path="lib/log4j-api-2.0-beta9.jar"/>
17   - <classpathentry exported="true" kind="lib" path="lib/log4j-core-2.0-beta9.jar"/>
18 15 <classpathentry kind="lib" path="/Client/jars/libraries/net/sf/jopt-simple/jopt-simple/4.5/jopt-simple-4.5.jar"/>
  16 + <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/io/netty/netty-all/4.0.10.Final/netty-all-4.0.10.Final.jar"/>
  17 + <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/com/mojang/authlib/1.3/authlib-1.3.jar"/>
  18 + <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/org/apache/logging/log4j/log4j-api/2.0-beta9/log4j-api-2.0-beta9.jar"/>
  19 + <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/org/apache/logging/log4j/log4j-core/2.0-beta9/log4j-core-2.0-beta9.jar"/>
  20 + <classpathentry kind="lib" path="/Client/jars/libraries/net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar"/>
19 21 <classpathentry kind="output" path="bin"/>
20 22 </classpath>
... ...
.settings/org.eclipse.core.resources.prefs 0 → 100644
  1 +eclipse.preferences.version=1
  2 +encoding//resources/assets/liteloader/lang/en_US.lang=UTF-8
... ...
.settings/org.eclipse.jdt.ui.prefs
1   -#Fri Aug 17 17:54:35 BST 2012
2 1 eclipse.preferences.version=1
3 2 formatter_settings_version=11
... ...
ant/build_liteloader.xml
1 1 <?xml version="1.0" encoding="UTF-8" ?>
2   -<project name="liteloader" basedir="." default="rebuild">
  2 +<project name="liteloader" basedir="." default="development">
3 3  
4 4 <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpath="tasks/ant-contrib.jar" />
5 5  
6 6 <!-- Versions !!IMPORTANT -->
7   - <property name="version" value="1.6.4_02" />
8   - <property name="mcversion" value="1.6.4" />
  7 + <property name="version" value="1.7.2_02" />
  8 + <property name="mcversion" value="1.7.2" />
9 9 <property name="author" value="Mumfrey" />
10 10  
11 11 <!-- Project definitions and dependencies -->
... ... @@ -28,41 +28,51 @@
28 28  
29 29 <property name="python" location="${mcp.dir}/runtime/bin/python/python_mcp.exe" />
30 30  
31   - <target name="findmcp">
32   - <echo level="info" message="Searching for clean MCP source..." />
33   - <condition property="mcpsrc.exists">
34   - <available file="${mcp.dir}/src/mcp" type="dir"/>
35   - </condition>
36   - </target>
37   -
  31 + <target name="findmcp">
  32 + <echo level="info" message="Searching for clean MCP source..." />
  33 + <condition property="mcpsrc.exists">
  34 + <available file="${mcp.dir}/src/mcp" type="dir"/>
  35 + </condition>
  36 + </target>
  37 +
  38 + <target name="setup_development">
  39 + <property name="skipremoval" value="DEV" />
  40 + </target>
  41 +
  42 + <target name="setup_production">
  43 + <property name="skipremoval" value="" />
  44 + </target>
  45 +
38 46 <!-- Main target -->
39   - <target name="rebuild" depends="findmcp, setdirsold, setdirsnew, build" description="Entry point" />
  47 + <target name="development" depends="setup_development, findmcp, setdirsold, setdirsnew, build" description="Entry point for MCP and upstream builds" />
  48 +
  49 + <target name="production" depends="setup_production, findmcp, setdirsold, setdirsnew, build" description="Entry point for production builds" />
40 50  
41 51 <target name="setdirsnew" description="Set the MCP source directories for the new layout" unless="mcpsrc.exists">
42 52 <echo level="info" message="Setting MCP source directories for NEW configuration" />
43   - <property name="src" location="${build}/src"/>
44   - <property name="mc.src" location="${mcp.dir}/src/minecraft" />
  53 + <property name="src" location="${build}/src"/>
  54 + <property name="mc.src" location="${mcp.dir}/src/minecraft" />
45 55 <echo append="false" file="${temp}/build.cfg" message="[OUTPUT]&#x0A;SrcClient = build/src" />
46   - </target>
  56 + </target>
47 57  
48 58 <target name="setdirsold" description="Set the MCP source directories for the old layout" if="mcpsrc.exists">
49   - <echo level="warning" message="--------------------------------------------------------------------------------" />
50   - <echo level="warning" message=" " />
51   - <echo level="warning" message=" Setting MCP source directories for OLD configuration!" />
52   - <echo level="warning" message=" " />
53   - <echo level="warning" message=" Renaming the MCP 'src' directory is no longer required and support for this" />
54   - <echo level="warning" message=" be removed in a future version." />
55   - <echo level="warning" message=" " />
56   - <echo level="warning" message="--------------------------------------------------------------------------------" />
57   - <property name="src" location="${mcp.dir}/src/minecraft"/>
58   - <property name="mc.src" location="${mcp.dir}/src/mcp" />
59   - </target>
  59 + <echo level="warning" message="--------------------------------------------------------------------------------" />
  60 + <echo level="warning" message=" " />
  61 + <echo level="warning" message=" Setting MCP source directories for OLD configuration!" />
  62 + <echo level="warning" message=" " />
  63 + <echo level="warning" message=" Renaming the MCP 'src' directory is no longer required and support for this" />
  64 + <echo level="warning" message=" be removed in a future version." />
  65 + <echo level="warning" message=" " />
  66 + <echo level="warning" message="--------------------------------------------------------------------------------" />
  67 + <property name="src" location="${mcp.dir}/src/minecraft"/>
  68 + <property name="mc.src" location="${mcp.dir}/src/mcp" />
  69 + </target>
60 70  
61 71 <target name="build" description="Perform all tasks for a build" depends="init, recompile, reobfuscate, savemd5, stage, zip" >
62 72 </target>
63 73  
64 74 <target name="clean">
65   - <echo level="info" message="Cleaning output directories" />
  75 + <echo level="info" message="Cleaning output directories" />
66 76  
67 77 <delete dir="${src}" />
68 78 <delete dir="${mcp.dir}/reobf" />
... ... @@ -76,41 +86,46 @@
76 86 <exclude name="**/debug/*.java" />
77 87 </fileset>
78 88 <fileset dir="${eclipse}/${lib}/src" />
  89 + <filterchain>
  90 + <linecontains negate="true">
  91 + <contains value="@MCPONLY${skipremoval}" />
  92 + </linecontains>
  93 + </filterchain>
79 94 </copy>
80 95 </target>
81 96  
82 97 <target name="contributeresources" description="Contribute resources to the staging path">
83 98 <echo level="info" message="Contributing project resources for ${lib}" />
84 99 <copy todir="${stage.dir}" verbose="false" failonerror="false">
85   - <fileset dir="${eclipse}/${lib}/resources" excludes=".svn/**">
86   - <exclude name="**/Thumbs.db" />
87   - <exclude name="**/minecraft.key" />
88   - </fileset>
  100 + <fileset dir="${eclipse}/${lib}/resources" excludes=".svn/**">
  101 + <exclude name="**/Thumbs.db" />
  102 + <exclude name="**/minecraft.key" />
  103 + </fileset>
89 104 </copy>
90 105 </target>
91 106  
92 107 <target name="findmd5dir">
93   - <echo level="info" message="Searching for existing MD5 directory..." />
  108 + <echo level="info" message="Searching for existing MD5 directory..." />
94 109 <condition property="md5dir.exists">
95 110 <available file="${md5.dir}" type="dir"/>
96 111 </condition>
97 112 </target>
98 113  
99 114 <target name="findmd5" depends="findmd5dir">
100   - <echo level="info" message="Searching for existing MD5 sets..." />
101   - <condition property="md5set.exists">
102   - <available file="${md5.dir}/client_${md5set}.md5" type="file"/>
103   - </condition>
  115 + <echo level="info" message="Searching for existing MD5 sets..." />
  116 + <condition property="md5set.exists">
  117 + <available file="${md5.dir}/client_${md5set}.md5" type="file"/>
  118 + </condition>
104 119 </target>
105 120  
106 121 <target name="seedmd5" depends="findmd5" unless="md5set.exists">
107   - <echo level="info" message="MD5 sets not found, seeding..." />
  122 + <echo level="info" message="MD5 sets not found, seeding..." />
108 123 <ant target="genmd5" antfile="seed_md5.xml" inheritall="true" />
109 124 </target>
110 125  
111   - <target name="notifymd5ok" depends="findmd5" if="md5set.exists">
112   - <echo level="info" message="MD5 sets already exist, skipping MD5 set seeding" />
113   - </target>
  126 + <target name="notifymd5ok" depends="findmd5" if="md5set.exists">
  127 + <echo level="info" message="MD5 sets already exist, skipping MD5 set seeding" />
  128 + </target>
114 129  
115 130 <target name="preparemd5" description="Copy patched MD5 to the temp directory" depends="seedmd5, notifymd5ok, clean">
116 131 <echo level="info" message="Prepare exclusion MD5s, using exclusion set &quot;${md5set}&quot;" />
... ... @@ -186,7 +201,8 @@
186 201  
187 202 <copy todir="${stage.dir}">
188 203 <fileset dir="${mcp.dir}/reobf/minecraft" excludes=".svn/**, *.txt">
189   - <exclude name="/*.class" />
  204 + <exclude name="/*.class" />
  205 + <exclude name="/com/mumfrey/liteloader/core/gen/**" />
190 206 </fileset>
191 207 </copy>
192 208  
... ... @@ -220,7 +236,7 @@
220 236  
221 237 <property environment="env" />
222 238  
223   - <target name="deploy" depends="rebuild" description="Deploy artifact to local minecraft installation in APPDATA">
  239 + <target name="deploy" depends="production" description="Deploy artifact to local minecraft installation in APPDATA">
224 240 <mkdir dir="${env.APPDATA}/.minecraft/libraries/com/mumfrey/liteloader/1.7.2"/>
225 241 <copy todir="${env.APPDATA}/.minecraft/libraries/com/mumfrey/liteloader/1.7.2" file="${dist.dir}/${ant.project.name}-${mcversion}.${filetype}" failonerror="false" overwrite="true" />
226 242 </target>
... ...
ant/seed_md5.xml
1 1 <?xml version="1.0" encoding="UTF-8" ?>
2 2 <project name="mcp" basedir="." default="genmd5">
3 3  
4   - <!-- ========================================================================== -->
5   - <!-- DO NOT RUN THIS SCRIPT DIRECTLY -->
6   - <!-- ========================================================================== -->
7   -
8   - <!-- This script is called by the LiteLoader build script if the initial MD5s -->
9   - <!-- are missing. If you want to fire this script then delete the 'md5' folder -->
10   - <!-- before running the LiteLoader build. -->
11   -
12   - <target name="genmd5" description="Seed the initial MCP md5 set">
13   - <echo level="info" message="MCP md5set was not found, making a clean compile" />
14   - <antcall target="clean" />
15   - <antcall target="init" />
16   - <antcall target="recompile" />
17   - <antcall target="reobfuscate" />
18   - <antcall target="savemd5" />
  4 + <!-- ========================================================================== -->
  5 + <!-- DO NOT RUN THIS SCRIPT DIRECTLY -->
  6 + <!-- ========================================================================== -->
  7 +
  8 + <!-- This script is called by the LiteLoader build script if the initial MD5s -->
  9 + <!-- are missing. If you want to fire this script then delete the 'md5' folder -->
  10 + <!-- before running the LiteLoader build. -->
  11 +
  12 + <target name="genmd5" description="Seed the initial MCP md5 set">
  13 + <echo level="info" message="MCP md5set was not found, making a clean compile" />
  14 + <antcall target="clean" />
  15 + <antcall target="init" />
  16 + <antcall target="recompile" />
  17 + <antcall target="reobfuscate" />
  18 + <antcall target="savemd5" />
19 19 </target>
20 20  
21 21 <target name="clean">
22   - <echo level="info" message="Cleaning output directories" />
  22 + <echo level="info" message="Cleaning output directories" />
23 23  
24   - <delete dir="${src}" />
25   - <delete dir="${mcp.dir}/reobf" />
26   - </target>
  24 + <delete dir="${src}" />
  25 + <delete dir="${mcp.dir}/reobf" />
  26 + </target>
27 27  
28 28 <target name="init" description="Initialize environment">
29   - <echo level="info" message="Initialising environment" />
  29 + <echo level="info" message="Initialising environment" />
30 30  
31   - <mkdir dir="${md5.dir}" />
  31 + <mkdir dir="${md5.dir}" />
32 32  
33   - <copy todir="${src}" verbose="false" overwrite="true">
34   - <fileset dir="${mc.src}" />
35   - </copy>
  33 + <copy todir="${src}" verbose="false" overwrite="true">
  34 + <fileset dir="${mc.src}" />
  35 + </copy>
36 36 </target>
37 37  
38 38 <target name="recompile" description="MCP recompile">
39   - <echo level="info" message="Compiling MCP sources" />
  39 + <echo level="info" message="Compiling MCP sources" />
40 40  
41 41 <exec executable="${python}" dir="${mcp.dir}">
42 42 <arg value="runtime/recompile.py" />
... ... @@ -46,17 +46,17 @@
46 46 </target>
47 47  
48 48 <target name="reobfuscate" description="MCP reobfuscate">
49   - <echo level="info" message="Obfuscating classes" />
  49 + <echo level="info" message="Obfuscating classes" />
50 50  
51 51 <exec executable="${python}" dir="${mcp.dir}">
52 52 <arg value="runtime/reobfuscate.py" />
53   - <arg value="--client" />
  53 + <arg value="--client" />
54 54 <arg value="%*" />
55 55 </exec>
56 56 </target>
57 57  
58   - <target name="savemd5" description="Put post-obfuscation MD5 to stored md5 set" if="outmd5set">
59   - <echo level="info" message="Storing obfuscated MD5s" />
  58 + <target name="savemd5" description="Put post-obfuscation MD5 to stored md5 set" if="outmd5set">
  59 + <echo level="info" message="Storing obfuscated MD5s" />
60 60  
61 61 <copy file="${temp}/client_reobf.md5" tofile="${md5.dir}/client_mcp.md5" overwrite="true" verbose="true" />
62 62 </target>
... ...
debug/com/mumfrey/liteloader/debug/LoginManager.java
... ... @@ -8,7 +8,6 @@ import java.net.Proxy;
8 8 import java.util.HashMap;
9 9 import java.util.Map;
10 10 import java.util.UUID;
11   -import java.util.logging.Logger;
12 11  
13 12 import javax.swing.JOptionPane;
14 13  
... ... @@ -22,6 +21,7 @@ import com.mojang.authlib.exceptions.AuthenticationException;
22 21 import com.mojang.authlib.exceptions.InvalidCredentialsException;
23 22 import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService;
24 23 import com.mojang.authlib.yggdrasil.YggdrasilUserAuthentication;
  24 +import com.mumfrey.liteloader.util.log.LiteLoaderLogger;
25 25  
26 26 /**
27 27 * Manages login requests against Yggdrasil for use in MCP
... ... @@ -31,11 +31,6 @@ import com.mojang.authlib.yggdrasil.YggdrasilUserAuthentication;
31 31 public class LoginManager
32 32 {
33 33 /**
34   - * Logger instance
35   - */
36   - private static Logger logger = Logger.getLogger("liteloader");
37   -
38   - /**
39 34 * Gson instance for serialising and deserialising the authentication data
40 35 */
41 36 private static Gson gson = new GsonBuilder().setPrettyPrinting().create();
... ... @@ -120,7 +115,7 @@ public class LoginManager
120 115  
121 116 if (authData != null && authData.validate())
122 117 {
123   - this.logInfo("Initialising Yggdrasil authentication service with client token: %s", authData.getClientToken());
  118 + LiteLoaderLogger.info("Initialising Yggdrasil authentication service with client token: %s", authData.getClientToken());
124 119 this.authService = new YggdrasilAuthenticationService(Proxy.NO_PROXY, authData.getClientToken());
125 120 this.authentication = new YggdrasilUserAuthentication(this.authService, Agent.MINECRAFT);
126 121 authData.loadFromStorage(this.authentication);
... ... @@ -187,30 +182,30 @@ public class LoginManager
187 182 {
188 183 if (this.offline || remainingTries == 0)
189 184 {
190   - this.logInfo("LoginManager is set to work offline, skipping login");
  185 + LiteLoaderLogger.info("LoginManager is set to work offline, skipping login");
191 186 return false;
192 187 }
193 188  
194   - this.logInfo("Remaining login tries: %s", remainingTries > 0 ? remainingTries : "unlimited");
  189 + LiteLoaderLogger.info("Remaining login tries: %s", remainingTries > 0 ? remainingTries : "unlimited");
195 190  
196 191 try
197 192 {
198   - this.logInfo("Attempting login, contacting Mojang auth servers...");
  193 + LiteLoaderLogger.info("Attempting login, contacting Mojang auth servers...");
199 194  
200 195 this.authentication.logIn();
201 196  
202 197 if (this.authentication.isLoggedIn())
203 198 {
204   - this.logInfo("LoginManager logged in successfully. Can play online = %s", this.authentication.canPlayOnline());
  199 + LiteLoaderLogger.info("LoginManager logged in successfully. Can play online = %s", this.authentication.canPlayOnline());
205 200 this.save();
206 201 return true;
207 202 }
208 203  
209   - this.logInfo("LoginManager failed to log in, unspecified status.");
  204 + LiteLoaderLogger.info("LoginManager failed to log in, unspecified status.");
210 205 }
211 206 catch (InvalidCredentialsException ex)
212 207 {
213   - this.logInfo("Authentication agent reported invalid credentials: %s", ex.getMessage());
  208 + LiteLoaderLogger.info("Authentication agent reported invalid credentials: %s", ex.getMessage());
214 209 this.resetAuth();
215 210  
216 211 if (remainingTries > 1)
... ... @@ -229,7 +224,7 @@ public class LoginManager
229 224  
230 225 if (!dialogResult)
231 226 {
232   - this.logInfo("User cancelled login dialog");
  227 + LiteLoaderLogger.info("User cancelled login dialog");
233 228 return false;
234 229 }
235 230  
... ... @@ -292,6 +287,15 @@ public class LoginManager
292 287 }
293 288  
294 289 /**
  290 + * Get the profile name (minecraft player name) from login
  291 + */
  292 + public String getUUID()
  293 + {
  294 + GameProfile selectedProfile = this.authentication.getSelectedProfile();
  295 + return selectedProfile != null ? selectedProfile.getId() : this.defaultDisplayName;
  296 + }
  297 +
  298 + /**
295 299 * Get the session token
296 300 */
297 301 public String getAuthenticatedToken()
... ... @@ -300,11 +304,6 @@ public class LoginManager
300 304 return accessToken != null ? accessToken : "-";
301 305 }
302 306  
303   - private void logInfo(String message, Object... params)
304   - {
305   - LoginManager.logger.info(String.format(message, params));
306   - }
307   -
308 307 /**
309 308 * Struct for Gson serialisation of authenticaion settings
310 309 *
... ...
debug/com/mumfrey/liteloader/debug/LoginPanel.java
1 1 package com.mumfrey.liteloader.debug;
2 2  
3   -import javax.swing.JPanel;
4   -
5   -import java.awt.Color;
6   -import java.awt.Dimension;
7   -import java.awt.BorderLayout;
8   -
9   -import javax.swing.JLabel;
10   -
11   -import java.awt.Font;
12   -
13   -import javax.swing.border.EmptyBorder;
14   -import javax.swing.border.TitledBorder;
15   -import javax.swing.JDialog;
16   -import javax.swing.UIManager;
17   -import javax.swing.JCheckBox;
18   -
19   -import java.awt.Component;
20   -import java.awt.Container;
21   -import java.awt.FlowLayout;
22   -import java.awt.FocusTraversalPolicy;
23   -import java.awt.TextField;
24   -import java.awt.GridBagLayout;
25   -import java.awt.GridBagConstraints;
26   -import java.awt.Insets;
  3 +import static javax.swing.WindowConstants.*;
27 4  
28   -import javax.swing.JButton;
29   -
30   -import java.awt.event.ActionListener;
  5 +import java.awt.*;
31 6 import java.awt.event.ActionEvent;
  7 +import java.awt.event.ActionListener;
32 8 import java.awt.event.WindowAdapter;
33 9 import java.awt.event.WindowEvent;
34 10 import java.util.ArrayList;
35 11 import java.util.List;
36 12  
37   -import static javax.swing.WindowConstants.DISPOSE_ON_CLOSE;
  13 +import javax.swing.JButton;
  14 +import javax.swing.JCheckBox;
  15 +import javax.swing.JDialog;
  16 +import javax.swing.JLabel;
  17 +import javax.swing.JPanel;
  18 +import javax.swing.UIManager;
  19 +import javax.swing.border.EmptyBorder;
  20 +import javax.swing.border.TitledBorder;
38 21  
39 22 /**
40 23 * JPanel displayed in a JDialog to prompt the user for login credentials for minecraft
... ...
debug/com/mumfrey/liteloader/debug/Start.java
1 1 package com.mumfrey.liteloader.debug;
2 2 import java.io.File;
3   -import java.util.logging.ConsoleHandler;
4   -import java.util.logging.Handler;
5   -import java.util.logging.Logger;
  3 +import java.util.ArrayList;
  4 +import java.util.List;
6 5  
7 6 import net.minecraft.launchwrapper.Launch;
8 7  
9 8 import com.mumfrey.liteloader.launch.LiteLoaderTweaker;
10   -import com.mumfrey.liteloader.util.log.LiteLoaderLogFormatter;
  9 +import com.mumfrey.liteloader.util.log.LiteLoaderLogger;
11 10  
12 11 /**
13 12 * Wrapper class for LaunchWrapper Main class, which logs into minecraft.net first so that online shizzle can be tested
14 13 *
15 14 * @author Adam Mummery-Smith
16   - * @version 0.6
  15 + * @version 0.6.2
17 16 */
18 17 public abstract class Start
19 18 {
20   - private static Logger logger = Logger.getLogger("liteloader");
  19 + private static final String FML_TWEAKER_NAME = "cpw.mods.fml.common.launcher.FMLTweaker";
21 20  
22 21 /**
23 22 * Entry point.
... ... @@ -26,8 +25,21 @@ public abstract class Start
26 25 */
27 26 public static void main(String[] args)
28 27 {
29   - Start.prepareLogger();
  28 + System.setProperty("mcpenv", "true");
30 29  
  30 + boolean fmlDetected = false;
  31 + List<String> argsList = new ArrayList<String>();
  32 +
  33 + // Detect the FML tweaker specified on the command line, this likely means someone has pulled us
  34 + // into a Forge MCP workspace
  35 + for (String arg : args) fmlDetected |= FML_TWEAKER_NAME.equals(arg);
  36 +
  37 + if (fmlDetected)
  38 + {
  39 + args = new String[0];
  40 + argsList.add("--tweakClass");argsList.add(FML_TWEAKER_NAME);
  41 + }
  42 +
31 43 String usernameFromCmdLine = (args.length > 0) ? args[0] : null;
32 44 String passwordFromCmdLine = (args.length > 1) ? args[1] : null;
33 45  
... ... @@ -35,31 +47,19 @@ public abstract class Start
35 47 LoginManager loginManager = new LoginManager(loginJson);
36 48 loginManager.login(usernameFromCmdLine, passwordFromCmdLine, 5);
37 49  
38   - Start.logger.info(String.format("Launching game as %s", loginManager.getProfileName()));
  50 + LiteLoaderLogger.info("Launching game as %s", loginManager.getProfileName());
39 51  
40 52 File gameDir = new File(System.getProperty("user.dir"));
41   - File assetsDir = new File(gameDir, "assets");
42   -
43   - args = new String[] {
44   - "--tweakClass", LiteLoaderTweaker.class.getName(),
45   - "--username", loginManager.getProfileName(),
46   - "--session", loginManager.getAuthenticatedToken(),
47   - "--version", "mcp",
48   - "--gameDir", gameDir.getAbsolutePath(),
49   - "--assetsDir", assetsDir.getAbsolutePath()
50   - };
51   -
52   - Launch.main(args);
53   - }
54   -
55   - private static void prepareLogger()
56   - {
57   - System.setProperty("liteloaderFormatLog", "true");
  53 + File assetsDir = new File(gameDir, "assets/virtual/legacy");
  54 +
  55 + argsList.add("--tweakClass"); argsList.add(LiteLoaderTweaker.class.getName());
  56 + argsList.add("--username"); argsList.add(loginManager.getProfileName());
  57 + argsList.add("--uuid"); argsList.add(loginManager.getUUID());
  58 + argsList.add("--accessToken"); argsList.add(loginManager.getAuthenticatedToken());
  59 + argsList.add("--version"); argsList.add("mcp");
  60 + argsList.add("--gameDir"); argsList.add(gameDir.getAbsolutePath());
  61 + argsList.add("--assetsDir"); argsList.add(assetsDir.getAbsolutePath());
58 62  
59   - for (Handler handler : Start.logger.getParent().getHandlers())
60   - {
61   - if (handler instanceof ConsoleHandler)
62   - handler.setFormatter(new LiteLoaderLogFormatter(false));
63   - }
  63 + Launch.main(argsList.toArray(args));
64 64 }
65 65 }
... ...
java/com/mumfrey/liteloader/ChatFilter.java
1 1 package com.mumfrey.liteloader;
2 2  
3   -import net.minecraft.src.ChatMessageComponent;
4   -import net.minecraft.src.Packet3Chat;
  3 +import net.minecraft.network.play.server.S02PacketChat;
  4 +import net.minecraft.util.IChatComponent;
  5 +
5 6  
6 7 /**
7 8 * Interface for mods which can filter inbound chat
... ... @@ -18,5 +19,5 @@ public interface ChatFilter extends LiteMod
18 19 * @param message Chat message parsed from the chat message component
19 20 * @return True to keep the packet, false to discard
20 21 */
21   - public abstract boolean onChat(Packet3Chat chatPacket, ChatMessageComponent chat, String message);
  22 + public abstract boolean onChat(S02PacketChat chatPacket, IChatComponent chat, String message);
22 23 }
... ...
java/com/mumfrey/liteloader/ChatListener.java
1 1 package com.mumfrey.liteloader;
2 2  
3   -import net.minecraft.src.ChatMessageComponent;
  3 +import net.minecraft.util.IChatComponent;
  4 +
4 5  
5 6 /**
6 7 * Interface for mods which receive inbound chat
... ... @@ -15,5 +16,5 @@ public interface ChatListener extends LiteMod
15 16 * @param chat ChatMessageComponent parsed from the chat packet
16 17 * @param message Chat message parsed from the chat message component
17 18 */
18   - public abstract void onChat(ChatMessageComponent chat, String message);
  19 + public abstract void onChat(IChatComponent chat, String message);
19 20 }
... ...
java/com/mumfrey/liteloader/ChatRenderListener.java
1 1 package com.mumfrey.liteloader;
2 2  
3   -import net.minecraft.src.GuiNewChat;
  3 +import net.minecraft.client.gui.GuiNewChat;
4 4  
5 5 /**
6 6 * Interface for mods which want to alter the chat display
... ...
java/com/mumfrey/liteloader/GameLoopListener.java
1 1 package com.mumfrey.liteloader;
2 2  
3   -import net.minecraft.src.Minecraft;
  3 +import net.minecraft.client.Minecraft;
4 4  
5 5 /**
6 6 * Interface for mods which want a frame notification every single game loop
... ...
java/com/mumfrey/liteloader/InitCompleteListener.java
1 1 package com.mumfrey.liteloader;
2 2  
3   -import net.minecraft.src.Minecraft;
  3 +import net.minecraft.client.Minecraft;
4 4  
5 5 import com.mumfrey.liteloader.core.LiteLoader;
6 6  
... ...
java/com/mumfrey/liteloader/PreLoginListener.java renamed to java/com/mumfrey/liteloader/JoinGameListener.java
1 1 package com.mumfrey.liteloader;
2 2  
3   -import net.minecraft.src.NetHandler;
4   -import net.minecraft.src.Packet1Login;
  3 +import net.minecraft.network.INetHandler;
  4 +import net.minecraft.network.play.server.S01PacketJoinGame;
  5 +
5 6  
6 7 /**
7 8 * Interface for mods which wish to be notified when the player connects to a server (or local game)
8 9 *
9 10 * @author Adam Mummery-Smith
10 11 */
11   -public interface PreLoginListener extends LiteMod
  12 +public interface JoinGameListener extends LiteMod
12 13 {
13 14 /**
14   - * Called on login
  15 + * Called on join game
15 16 *
16 17 * @param netHandler Net handler
17   - * @param loginPacket Login packet
  18 + * @param joinGamePacket Join game packet
18 19 */
19   - public abstract boolean onPreLogin(NetHandler netHandler, Packet1Login loginPacket);
  20 + public abstract void onJoinGame(INetHandler netHandler, S01PacketJoinGame joinGamePacket);
20 21 }
... ...
java/com/mumfrey/liteloader/OutboundChatListener.java 0 → 100644
  1 +package com.mumfrey.liteloader;
  2 +
  3 +import net.minecraft.network.play.client.C01PacketChatMessage;
  4 +
  5 +/**
  6 + * Interface for mods which want to monitor outbound chat
  7 + *
  8 + * @author Adam Mummery-Smith
  9 + */
  10 +public interface OutboundChatListener extends LiteMod
  11 +{
  12 + /**
  13 + * Raised when a new chat packet is created (not necessarily transmitted, something could be trolling us)
  14 + *
  15 + * @param packet
  16 + * @param message
  17 + */
  18 + public abstract void onSendChatMessage(C01PacketChatMessage packet, String message);
  19 +}
... ...
java/com/mumfrey/liteloader/PluginChannelListener.java
1 1 package com.mumfrey.liteloader;
2 2  
3   -import java.util.List;
  3 +import com.mumfrey.liteloader.core.CommonPluginChannelListener;
4 4  
5 5 /**
6 6 * Interface for mods which want to use plugin channels
7 7 *
8 8 * @author Adam Mummery-Smith
9 9 */
10   -public interface PluginChannelListener extends LoginListener
  10 +public interface PluginChannelListener extends CommonPluginChannelListener, JoinGameListener
11 11 {
12 12 /**
13   - * Return a list of the plugin channels the mod wants to register
14   - *
15   - * @return
16   - */
17   - public abstract List<String> getChannels();
18   -
19   - /**
20 13 * Called when a custom payload packet arrives on a channel this mod has registered
21 14 *
22 15 * @param channel Channel on which the custom payload was received
... ...
java/com/mumfrey/liteloader/PostLoginListener.java 0 → 100644
  1 +package com.mumfrey.liteloader;
  2 +
  3 +import net.minecraft.network.login.INetHandlerLoginClient;
  4 +import net.minecraft.network.login.server.S02PacketLoginSuccess;
  5 +
  6 +/**
  7 + *
  8 + * @author Adam Mummery-Smith
  9 + */
  10 +public interface PostLoginListener extends LiteMod
  11 +{
  12 + public abstract void onPostLogin(INetHandlerLoginClient netHandler, S02PacketLoginSuccess packet);
  13 +}
... ...
java/com/mumfrey/liteloader/LoginListener.java renamed to java/com/mumfrey/liteloader/PreJoinGameListener.java
1 1 package com.mumfrey.liteloader;
2 2  
3   -import net.minecraft.src.NetHandler;
4   -import net.minecraft.src.Packet1Login;
  3 +import net.minecraft.network.INetHandler;
  4 +import net.minecraft.network.play.server.S01PacketJoinGame;
  5 +
5 6  
6 7 /**
7 8 * Interface for mods which wish to be notified when the player connects to a server (or local game)
8 9 *
9 10 * @author Adam Mummery-Smith
10 11 */
11   -public interface LoginListener extends LiteMod
  12 +public interface PreJoinGameListener extends LiteMod
12 13 {
13 14 /**
14 15 * Called on login
15 16 *
16 17 * @param netHandler Net handler
17   - * @param loginPacket Login packet
  18 + * @param joinGamePacket Join game packet
18 19 */
19   - public abstract void onLogin(NetHandler netHandler, Packet1Login loginPacket);
  20 + public abstract boolean onPreJoinGame(INetHandler netHandler, S01PacketJoinGame joinGamePacket);
20 21 }
... ...
java/com/mumfrey/liteloader/RenderListener.java
1 1 package com.mumfrey.liteloader;
2 2  
3   -import net.minecraft.src.GuiScreen;
  3 +import net.minecraft.client.gui.GuiScreen;
4 4  
5 5 /**
6 6 * Interface for objects which want a pre-render callback
... ...
java/com/mumfrey/liteloader/ServerChatFilter.java 0 → 100644
  1 +package com.mumfrey.liteloader;
  2 +
  3 +import net.minecraft.entity.player.EntityPlayerMP;
  4 +import net.minecraft.network.play.client.C01PacketChatMessage;
  5 +
  6 +/**
  7 + * Interface for mods which can filter inbound chat
  8 + *
  9 + * @author Adam Mummery-Smith
  10 + */
  11 +public interface ServerChatFilter extends LiteMod
  12 +{
  13 + /**
  14 + * Chat filter function, return false to filter this packet, true to pass the packet
  15 + *
  16 + * @param chatPacket Chat packet to examine
  17 + * @param message Chat message
  18 + * @return True to keep the packet, false to discard
  19 + */
  20 + public abstract boolean onChat(EntityPlayerMP player, C01PacketChatMessage chatPacket, String message);
  21 +}
... ...
java/com/mumfrey/liteloader/ServerCommandProvider.java 0 → 100644
  1 +package com.mumfrey.liteloader;
  2 +
  3 +import net.minecraft.command.ServerCommandManager;
  4 +
  5 +
  6 +/**
  7 + * Interface for mods which provide commands to the local integrated server
  8 + *
  9 + * @author Adam Mummery-Smith
  10 + */
  11 +public interface ServerCommandProvider extends LiteMod
  12 +{
  13 + /**
  14 + * Allows the mod to provide commands to the server command manager my invoking commandManager.registerCommand() to
  15 + * provide new commands for single player and lan worlds
  16 + *
  17 + * @param commandManager
  18 + */
  19 + public abstract void provideCommands(ServerCommandManager commandManager);
  20 +}
... ...
java/com/mumfrey/liteloader/ServerPlayerListener.java 0 → 100644
  1 +package com.mumfrey.liteloader;
  2 +
  3 +import net.minecraft.entity.player.EntityPlayerMP;
  4 +
  5 +import com.mojang.authlib.GameProfile;
  6 +
  7 +/**
  8 + * Interface for mods which want to handle players joining and leaving a LAN game (or single player game)
  9 + *
  10 + * @author Adam Mummery-Smith
  11 + */
  12 +public interface ServerPlayerListener extends LiteMod
  13 +{
  14 + /**
  15 + * Called when a player connects to the server and the EntityPlayerMP instance is created, the player has not logged
  16 + * in at this point and may be disconnected if login fails
  17 + *
  18 + * @param player Player attempting to connect
  19 + * @param profile Player's GameProfile from the authentication service
  20 + */
  21 + public abstract void onPlayerConnect(EntityPlayerMP player, GameProfile profile);
  22 +
  23 + /**
  24 + * Called once the player has successfully logged in and all player variables are initialised and replicated
  25 + *
  26 + * @param player Player connected
  27 + */
  28 + public abstract void onPlayerLoggedIn(EntityPlayerMP player);
  29 +
  30 + /**
  31 + * Called when a player respawns. This event is raised when a player respawns after dying or conquers the end
  32 + *
  33 + * @param player New player instance
  34 + * @param oldPlayer Old player instance being discarded
  35 + * @param newDimension Dimension the player is respawning in
  36 + * @param playerWonTheGame True if the player conquered the end (this respawn is NOT as the result of a death)
  37 + */
  38 + public abstract void onPlayerRespawn(EntityPlayerMP player, EntityPlayerMP oldPlayer, int newDimension, boolean playerWonTheGame);
  39 +
  40 + /**
  41 + * Called when a player disconnects from the game
  42 + *
  43 + * @param player Player disconnecting
  44 + */
  45 + public abstract void onPlayerLogout(EntityPlayerMP player);
  46 +}
... ...
java/com/mumfrey/liteloader/ServerPluginChannelListener.java 0 → 100644
  1 +package com.mumfrey.liteloader;
  2 +
  3 +import net.minecraft.entity.player.EntityPlayerMP;
  4 +
  5 +import com.mumfrey.liteloader.core.CommonPluginChannelListener;
  6 +
  7 +/**
  8 + * Interface for mods which want to use plugin channels on the (integrated) server side
  9 + *
  10 + * @author Adam Mummery-Smith
  11 + */
  12 +public interface ServerPluginChannelListener extends CommonPluginChannelListener
  13 +{
  14 + /**
  15 + * Called when a custom payload packet arrives on a channel this mod has registered
  16 + *
  17 + * @param channel Channel on which the custom payload was received
  18 + * @param length Length of the custom payload data
  19 + * @param data Custom payload data
  20 + */
  21 + public abstract void onCustomPayload(EntityPlayerMP sender, String channel, int length, byte[] data);
  22 +}
... ...
java/com/mumfrey/liteloader/Tickable.java
1 1 package com.mumfrey.liteloader;
2 2  
3   -import net.minecraft.src.Minecraft;
  3 +import net.minecraft.client.Minecraft;
4 4  
5 5 /**
6 6 * Interface for mods which want tick events
... ...
java/com/mumfrey/liteloader/core/ClientPluginChannels.java 0 → 100644
  1 +package com.mumfrey.liteloader.core;
  2 +
  3 +import net.minecraft.client.Minecraft;
  4 +import net.minecraft.client.network.NetHandlerLoginClient;
  5 +import net.minecraft.network.INetHandler;
  6 +import net.minecraft.network.NetworkManager;
  7 +import net.minecraft.network.login.INetHandlerLoginClient;
  8 +import net.minecraft.network.login.server.S02PacketLoginSuccess;
  9 +import net.minecraft.network.play.INetHandlerPlayClient;
  10 +import net.minecraft.network.play.client.C17PacketCustomPayload;
  11 +import net.minecraft.network.play.server.S01PacketJoinGame;
  12 +import net.minecraft.network.play.server.S3FPacketCustomPayload;
  13 +
  14 +import com.mumfrey.liteloader.LiteMod;
  15 +import com.mumfrey.liteloader.PluginChannelListener;
  16 +import com.mumfrey.liteloader.core.exceptions.UnregisteredChannelException;
  17 +import com.mumfrey.liteloader.permissions.PermissionsManagerClient;
  18 +import com.mumfrey.liteloader.util.PrivateFields;
  19 +import com.mumfrey.liteloader.util.log.LiteLoaderLogger;
  20 +
  21 +/**
  22 + * Handler for client plugin channels
  23 + *
  24 + * @author Adam Mummery-Smith
  25 + */
  26 +public class ClientPluginChannels extends PluginChannels<PluginChannelListener>
  27 +{
  28 + private static ClientPluginChannels instance;
  29 +
  30 + ClientPluginChannels()
  31 + {
  32 + super();
  33 +
  34 + ClientPluginChannels.instance = this;
  35 + }
  36 +
  37 + static ClientPluginChannels getInstance()
  38 + {
  39 + return instance;
  40 + }
  41 +
  42 + /**
  43 + * @param listener
  44 + */
  45 + void addListener(LiteMod listener)
  46 + {
  47 + if (listener instanceof PluginChannelListener)
  48 + {
  49 + this.addPluginChannelListener((PluginChannelListener)listener);
  50 + }
  51 + }
  52 +
  53 + /**
  54 + * @param netHandler
  55 + * @param loginPacket
  56 + */
  57 + void onPostLogin(INetHandlerLoginClient netHandler, S02PacketLoginSuccess loginPacket)
  58 + {
  59 + this.clearPluginChannels(netHandler);
  60 + }
  61 +
  62 + /**
  63 + * @param netHandler
  64 + * @param loginPacket
  65 + */
  66 + void onJoinGame(INetHandler netHandler, S01PacketJoinGame loginPacket)
  67 + {
  68 + this.sendRegisteredPluginChannels(netHandler);
  69 + }
  70 +
  71 + /**
  72 + * Callback for the plugin channel hook
  73 + *
  74 + * @param customPayload
  75 + */
  76 + public void onPluginChannelMessage(S3FPacketCustomPayload customPayload)
  77 + {
  78 + if (customPayload != null && customPayload.func_149169_c() != null) // getChannel
  79 + {
  80 + String channel = customPayload.func_149169_c(); // getChannel
  81 + byte[] data = customPayload.func_149168_d(); // getData
  82 +
  83 + if (PluginChannels.CHANNEL_REGISTER.equals(channel))
  84 + {
  85 + this.onRegisterPacketReceived(data);
  86 + }
  87 + else if (this.pluginChannels.containsKey(channel))
  88 + {
  89 + try
  90 + {
  91 + PermissionsManagerClient permissionsManager = LiteLoader.getPermissionsManager();
  92 + if (permissionsManager != null)
  93 + {
  94 + permissionsManager.onCustomPayload(channel, data.length, data);
  95 + }
  96 + }
  97 + catch (Exception ex) {}
  98 +
  99 + this.onModPacketReceived(channel, data, data.length);
  100 + }
  101 + }
  102 + }
  103 +
  104 + /**
  105 + * @param channel
  106 + * @param data
  107 + * @param length
  108 + */
  109 + protected void onModPacketReceived(String channel, byte[] data, int length)
  110 + {
  111 + for (PluginChannelListener pluginChannelListener : this.pluginChannels.get(channel))
  112 + {
  113 + try
  114 + {
  115 + pluginChannelListener.onCustomPayload(channel, length, data);
  116 + throw new RuntimeException();
  117 + }
  118 + catch (Exception ex)
  119 + {
  120 + int failCount = 1;
  121 + if (this.faultingPluginChannelListeners.containsKey(pluginChannelListener))
  122 + failCount = this.faultingPluginChannelListeners.get(pluginChannelListener).intValue() + 1;
  123 +
  124 + if (failCount >= PluginChannels.WARN_FAULT_THRESHOLD)
  125 + {
  126 + LiteLoaderLogger.warning("Plugin channel listener %s exceeded fault threshold on channel %s with %s", pluginChannelListener.getName(), channel, ex.getClass().getSimpleName());
  127 + this.faultingPluginChannelListeners.remove(pluginChannelListener);
  128 + }
  129 + else
  130 + {
  131 + this.faultingPluginChannelListeners.put(pluginChannelListener, Integer.valueOf(failCount));
  132 + }
  133 + }
  134 + }
  135 + }
  136 +
  137 + protected void sendRegisteredPluginChannels(INetHandler netHandler)
  138 + {
  139 + // Add the permissions manager channels
  140 + this.addPluginChannelsFor(LiteLoader.getPermissionsManager());
  141 +
  142 + try
  143 + {
  144 + byte[] registrationData = this.getRegistrationData();
  145 + if (registrationData != null)
  146 + {
  147 + this.sendRegistrationData(netHandler, registrationData);
  148 + }
  149 + }
  150 + catch (Exception ex)
  151 + {
  152 + LiteLoaderLogger.warning(ex, "Error dispatching REGISTER packet to server %s", ex.getClass().getSimpleName());
  153 + }
  154 + }
  155 +
  156 + /**
  157 + * @param netHandler
  158 + * @param registrationData
  159 + */
  160 + protected void sendRegistrationData(INetHandler netHandler, byte[] registrationData)
  161 + {
  162 + if (netHandler instanceof INetHandlerLoginClient)
  163 + {
  164 + NetworkManager networkManager = PrivateFields.netManager.get(((NetHandlerLoginClient)netHandler));
  165 + networkManager.scheduleOutboundPacket(new C17PacketCustomPayload(CHANNEL_REGISTER, registrationData));
  166 + }
  167 + else if (netHandler instanceof INetHandlerPlayClient)
  168 + {
  169 + ClientPluginChannels.dispatch(new C17PacketCustomPayload(CHANNEL_REGISTER, registrationData));
  170 + }
  171 + }
  172 +
  173 + /**
  174 + * @param channel
  175 + * @param data
  176 + */
  177 + static boolean dispatch(C17PacketCustomPayload payload)
  178 + {
  179 + try
  180 + {
  181 + Minecraft minecraft = Minecraft.getMinecraft();
  182 +
  183 + if (minecraft.thePlayer != null && minecraft.thePlayer.sendQueue != null)
  184 + {
  185 + minecraft.thePlayer.sendQueue.addToSendQueue(payload);
  186 + return true;
  187 + }
  188 + }
  189 + catch (Exception ex) {}
  190 +
  191 + return false;
  192 + }
  193 +
  194 + /**
  195 + * Send a message to the server on a plugin channel
  196 + *
  197 + * @param channel Channel to send, must not be a reserved channel name
  198 + * @param data
  199 + */
  200 + public static boolean sendMessage(String channel, byte[] data, ChannelPolicy policy)
  201 + {
  202 + if (!policy.allows(ClientPluginChannels.getInstance(), channel))
  203 + {
  204 + if (policy.isSilent()) return false;
  205 + throw new UnregisteredChannelException(channel);
  206 + }
  207 +
  208 + if (channel == null || channel.length() > 16 || CHANNEL_REGISTER.equals(channel) || CHANNEL_UNREGISTER.equals(channel))
  209 + throw new RuntimeException("Invalid channel name specified");
  210 +
  211 + C17PacketCustomPayload payload = new C17PacketCustomPayload(channel, data);
  212 + return ClientPluginChannels.dispatch(payload);
  213 + }
  214 +}
... ...
java/com/mumfrey/liteloader/core/CommonPluginChannelListener.java 0 → 100644
  1 +package com.mumfrey.liteloader.core;
  2 +
  3 +import java.util.List;
  4 +
  5 +import com.mumfrey.liteloader.LiteMod;
  6 +
  7 +/**
  8 + * Common interface for the client/server plugin channel listeners. DO NOT IMPLEMENT THIS INTERFACE DIRECTLY, nothing will happen!
  9 + *
  10 + * @author Adam Mummery-Smith
  11 + */
  12 +public interface CommonPluginChannelListener extends LiteMod
  13 +{
  14 + /**
  15 + * Return a list of the plugin channels the mod wants to register
  16 + *
  17 + * @return
  18 + */
  19 + public abstract List<String> getChannels();
  20 +}
... ...
java/com/mumfrey/liteloader/core/EnabledModsList.java
... ... @@ -54,33 +54,33 @@ public class EnabledModsList
54 54 * Check whether a particular mod is enabled
55 55 *
56 56 * @param profileName
57   - * @param name
  57 + * @param identifier
58 58 * @return
59 59 */
60   - public boolean isEnabled(String profileName, String name)
  60 + public boolean isEnabled(String profileName, String identifier)
61 61 {
62 62 Map<String, Boolean> profile = this.getProfile(profileName);
63   - name = name.toLowerCase().trim();
  63 + identifier = identifier.toLowerCase().trim();
64 64  
65   - if (!profile.containsKey(name))
  65 + if (!profile.containsKey(identifier))
66 66 {
67   - profile.put(name, this.defaultEnabledValue);
  67 + profile.put(identifier, this.defaultEnabledValue);
68 68 }
69 69  
70   - return profile.get(name);
  70 + return profile.get(identifier);
71 71 }
72 72  
73 73 /**
74 74 * Set the enablement state of a mod in the specified profile
75 75 *
76 76 * @param profileName
77   - * @param name
  77 + * @param identifier
78 78 * @param enabled
79 79 */
80   - public void setEnabled(String profileName, String name, boolean enabled)
  80 + public void setEnabled(String profileName, String identifier, boolean enabled)
81 81 {
82 82 Map<String, Boolean> profile = this.getProfile(profileName);
83   - profile.put(name.toLowerCase().trim(), Boolean.valueOf(enabled));
  83 + profile.put(identifier.toLowerCase().trim(), Boolean.valueOf(enabled));
84 84  
85 85 this.allowSave = true;
86 86 }
... ...
java/com/mumfrey/liteloader/core/EnumeratorModule.java 0 → 100644
  1 +package com.mumfrey.liteloader.core;
  2 +
  3 +import net.minecraft.launchwrapper.LaunchClassLoader;
  4 +
  5 +/**
  6 + * Interface for objects which can enumerate mods in places
  7 + *
  8 + * @author Adam Mummery-Smith
  9 + *
  10 + * @param <T>
  11 + */
  12 +public interface EnumeratorModule<T>
  13 +{
  14 + /**
  15 + * @param enumerator
  16 + */
  17 + public abstract void init(PluggableEnumerator enumerator);
  18 +
  19 + /**
  20 + * @param enumerator
  21 + */
  22 + public abstract void writeSettings(PluggableEnumerator enumerator);
  23 +
  24 + /**
  25 + * Find loadable mods in this enumerator's domain
  26 + *
  27 + * @param enumerator
  28 + * @param enabledModsList
  29 + * @param profile
  30 + */
  31 + public abstract void enumerate(PluggableEnumerator enumerator, EnabledModsList enabledModsList, String profile);
  32 +
  33 + /**
  34 + * @param enumerator
  35 + * @param classLoader
  36 + * @param enabledModsList
  37 + * @param profile
  38 + */
  39 + public abstract void injectIntoClassLoader(PluggableEnumerator enumerator, LaunchClassLoader classLoader, EnabledModsList enabledModsList, String profile);
  40 +
  41 + /**
  42 + * @param enumerator
  43 + * @param classLoader
  44 + */
  45 + public abstract void registerMods(PluggableEnumerator enumerator, LaunchClassLoader classLoader);
  46 +}
0 47 \ No newline at end of file
... ...
java/com/mumfrey/liteloader/core/EnumeratorModuleClassPath.java 0 → 100644
  1 +package com.mumfrey.liteloader.core;
  2 +
  3 +import java.io.File;
  4 +import java.util.ArrayList;
  5 +import java.util.List;
  6 +
  7 +import net.minecraft.launchwrapper.LaunchClassLoader;
  8 +
  9 +import com.mumfrey.liteloader.util.log.LiteLoaderLogger;
  10 +
  11 +/**
  12 + * Enumerator module which searches for mods on the classpath
  13 + *
  14 + * @author Adam Mummery-Smith
  15 + */
  16 +public class EnumeratorModuleClassPath implements EnumeratorModule<File>
  17 +{
  18 + /**
  19 + * Array of class path entries specified to the JVM instance
  20 + */
  21 + private final String[] classPathEntries;
  22 +
  23 + /**
  24 + * URLs to add once init is completed
  25 + */
  26 + private final List<LoadableMod<File>> loadableMods = new ArrayList<LoadableMod<File>>();
  27 +
  28 + private boolean loadTweaks;
  29 +
  30 + /**
  31 + * @param parent
  32 + * @param searchProtectionDomain
  33 + * @param searchClassPath
  34 + * @param loadTweaks
  35 + */
  36 + public EnumeratorModuleClassPath(boolean loadTweaks)
  37 + {
  38 + // Read the JVM class path into the local array
  39 + this.classPathEntries = this.readClassPath();
  40 +
  41 + this.loadTweaks = loadTweaks;
  42 + }
  43 +
  44 + @Override
  45 + public String toString()
  46 + {
  47 + return "<Java Class Path>";
  48 + }
  49 +
  50 + @Override
  51 + public void init(PluggableEnumerator enumerator)
  52 + {
  53 + }
  54 +
  55 + @Override
  56 + public void writeSettings(PluggableEnumerator enumerator)
  57 + {
  58 + }
  59 +
  60 + /**
  61 + * Reads the class path entries that were supplied to the JVM and returns them as an array
  62 + */
  63 + private String[] readClassPath()
  64 + {
  65 + LiteLoaderLogger.info("Enumerating class path...");
  66 +
  67 + String classPath = System.getProperty("java.class.path");
  68 + String classPathSeparator = System.getProperty("path.separator");
  69 + String[] classPathEntries = classPath.split(classPathSeparator);
  70 +
  71 + LiteLoaderLogger.info("Class path separator=\"%s\"", classPathSeparator);
  72 + LiteLoaderLogger.info("Class path entries=(\n classpathEntry=%s\n)", classPath.replace(classPathSeparator, "\n classpathEntry="));
  73 + return classPathEntries;
  74 + }
  75 +
  76 + @Override
  77 + public void enumerate(PluggableEnumerator enumerator, EnabledModsList enabledModsList, String profile)
  78 + {
  79 + if (this.loadTweaks)
  80 + {
  81 + LiteLoaderLogger.info("Discovering tweaks on class path...");
  82 +
  83 + for (String classPathPart : this.classPathEntries)
  84 + {
  85 + File packagePath = new File(classPathPart);
  86 + if (packagePath.exists())
  87 + {
  88 + LoadableModClassPath classPathMod = new LoadableModClassPath(packagePath);
  89 + if (enumerator.isContainerEnabled(classPathMod))
  90 + {
  91 + this.loadableMods.add(classPathMod);
  92 + if (classPathMod.hasTweakClass() || classPathMod.hasClassTransformers())
  93 + {
  94 + enumerator.registerTweakContainer(classPathMod);
  95 + }
  96 + }
  97 + else
  98 + {
  99 + LiteLoaderLogger.info("Mod %s is disabled or missing a required dependency, not injecting tranformers", classPathMod.getIdentifier());
  100 + }
  101 + }
  102 + }
  103 + }
  104 + }
  105 +
  106 + @Override
  107 + public void injectIntoClassLoader(PluggableEnumerator enumerator, LaunchClassLoader classLoader, EnabledModsList enabledModsList, String profile)
  108 + {
  109 + }
  110 +
  111 + /**
  112 + * @param classLoader
  113 + */
  114 + @Override
  115 + public void registerMods(PluggableEnumerator enumerator, LaunchClassLoader classLoader)
  116 + {
  117 + LiteLoaderLogger.info("Discovering mods on class path...");
  118 +
  119 + for (LoadableMod<File> classPathMod : this.loadableMods)
  120 + {
  121 + LiteLoaderLogger.info("Searching %s...", classPathMod);
  122 + enumerator.registerModsFrom(classPathMod, true);
  123 + }
  124 + }
  125 +}
... ...
java/com/mumfrey/liteloader/core/EnumeratorModuleFolder.java 0 → 100644
  1 +package com.mumfrey.liteloader.core;
  2 +
  3 +import java.io.File;
  4 +import java.io.FilenameFilter;
  5 +import java.io.IOException;
  6 +import java.net.MalformedURLException;
  7 +import java.util.ArrayList;
  8 +import java.util.HashMap;
  9 +import java.util.List;
  10 +import java.util.Map;
  11 +import java.util.TreeSet;
  12 +import java.util.Map.Entry;
  13 +import java.util.zip.ZipEntry;
  14 +import java.util.zip.ZipFile;
  15 +
  16 +import net.minecraft.launchwrapper.LaunchClassLoader;
  17 +
  18 +import com.mumfrey.liteloader.util.log.LiteLoaderLogger;
  19 +
  20 +/**
  21 + * Enumerator module which searches for mods and tweaks in a folder
  22 + *
  23 + * @author Adam Mummery-Smith
  24 + */
  25 +public class EnumeratorModuleFolder implements FilenameFilter, EnumeratorModule<File>
  26 +{
  27 + private static final String OPTION_SEARCH_ZIPFILES = "search.zipfiles";
  28 + private static final String OPTION_SEARCH_JARFILES = "search.jarfiles";
  29 +
  30 + /**
  31 + * Ordered sets used to sort mods by version/revision
  32 + */
  33 + private final Map<String, TreeSet<LoadableMod<File>>> versionOrderingSets = new HashMap<String, TreeSet<LoadableMod<File>>>();
  34 +
  35 + /**
  36 + * Mods to add once init is completed
  37 + */
  38 + private final List<LoadableMod<File>> loadableMods = new ArrayList<LoadableMod<File>>();
  39 +
  40 + private File directory;
  41 +
  42 + private boolean readZipFiles;
  43 + private boolean readJarFiles;
  44 + private boolean loadTweaks;
  45 +
  46 + /**
  47 + * True if this is a general, unversioned folder and the enumerator should only add files which have valid version metadata
  48 + */
  49 + private final boolean requireMetaData;
  50 +
  51 + public EnumeratorModuleFolder(File directory, boolean loadTweaks, boolean requireMetaData)
  52 + {
  53 + this.directory = directory;
  54 + this.loadTweaks = loadTweaks;
  55 + this.requireMetaData = requireMetaData;
  56 + }
  57 +
  58 + @Override
  59 + public void init(PluggableEnumerator enumerator)
  60 + {
  61 + this.readZipFiles = enumerator.getAndStoreBooleanProperty(OPTION_SEARCH_ZIPFILES, false);
  62 + this.readJarFiles = enumerator.getAndStoreBooleanProperty(OPTION_SEARCH_JARFILES, true);
  63 + }
  64 +
  65 + /**
  66 + * Write settings
  67 + */
  68 + @Override
  69 + public void writeSettings(PluggableEnumerator enumerator)
  70 + {
  71 + enumerator.setBooleanProperty(OPTION_SEARCH_ZIPFILES, this.readZipFiles);
  72 + enumerator.setBooleanProperty(OPTION_SEARCH_JARFILES, this.readJarFiles);
  73 + }
  74 +
  75 + @Override
  76 + public String toString()
  77 + {
  78 + return this.directory.getAbsolutePath();
  79 + }
  80 +
  81 + /**
  82 + * @return
  83 + */
  84 + public File getDirectory()
  85 + {
  86 + return this.directory;
  87 + }
  88 +
  89 + /* (non-Javadoc)
  90 + * @see com.mumfrey.liteloader.core.Enumerator#getLoadableMods()
  91 + */
  92 + public List<LoadableMod<File>> getLoadableMods()
  93 + {
  94 + return this.loadableMods;
  95 + }
  96 +
  97 + /**
  98 + * For FilenameFilter interface
  99 + *
  100 + * @see java.io.FilenameFilter#accept(java.io.File, java.lang.String)
  101 + */
  102 + @Override
  103 + public boolean accept(File dir, String fileName)
  104 + {
  105 + fileName = fileName.toLowerCase();
  106 + return fileName.endsWith(".litemod")
  107 + || (this.readZipFiles && fileName.endsWith(".zip"))
  108 + || (this.readJarFiles && fileName.endsWith(".jar"));
  109 + }
  110 +
  111 + /* (non-Javadoc)
  112 + * @see com.mumfrey.liteloader.core.Enumerator#enumerate(com.mumfrey.liteloader.core.EnabledModsList, java.lang.String)
  113 + */
  114 + @Override
  115 + public void enumerate(PluggableEnumerator enumerator, EnabledModsList enabledModsList, String profile)
  116 + {
  117 + if (this.directory.exists() && this.directory.isDirectory())
  118 + {
  119 + LiteLoaderLogger.info("Discovering valid mod files in folder %s", this.directory.getPath());
  120 +
  121 + this.findValidFiles(enumerator, enabledModsList, profile);
  122 + this.sortAndAllocateFiles(enumerator, enabledModsList, profile);
  123 + this.versionOrderingSets.clear();
  124 + }
  125 + }
  126 +
  127 + /**
  128 + * @param enabledModsList
  129 + * @param profile
  130 + */
  131 + private void findValidFiles(PluggableEnumerator enumerator, EnabledModsList enabledModsList, String profile)
  132 + {
  133 + for (File candidateFile : this.directory.listFiles(this))
  134 + {
  135 + ZipFile candidateZip = null;
  136 +
  137 + try
  138 + {
  139 + candidateZip = new ZipFile(candidateFile);
  140 + ZipEntry versionEntry = candidateZip.getEntry(LoadableMod.METADATA_FILENAME);
  141 + ZipEntry legacyVersionEntry = candidateZip.getEntry(LoadableMod.LEGACY_METADATA_FILENAME);
  142 +
  143 + // Check for a version file
  144 + if (versionEntry != null)
  145 + {
  146 + String strVersion = null;
  147 + try
  148 + {
  149 + strVersion = LoadableModFile.zipEntryToString(candidateZip, versionEntry);
  150 + }
  151 + catch (IOException ex)
  152 + {
  153 + LiteLoaderLogger.warning("Error reading version data from %s", candidateZip.getName());
  154 + }
  155 +
  156 + if (strVersion != null)
  157 + {
  158 + this.addModFile(candidateFile, strVersion);
  159 + }
  160 + }
  161 + else if (legacyVersionEntry != null)
  162 + {
  163 + LiteLoaderLogger.warning("%s is no longer supported, ignoring outdated mod file: %s", LoadableMod.LEGACY_METADATA_FILENAME, candidateFile.getAbsolutePath());
  164 + }
  165 + else if (!this.requireMetaData && this.loadTweaks && this.readJarFiles && candidateFile.getName().toLowerCase().endsWith(".jar"))
  166 + {
  167 + LoadableFile container = new LoadableFile(candidateFile);
  168 + enumerator.registerTweakContainer(container);
  169 + }
  170 + }
  171 + catch (Exception ex)
  172 + {
  173 + LiteLoaderLogger.info("Error enumerating '%s': Invalid zip file or error reading file", candidateFile.getAbsolutePath());
  174 + }
  175 + finally
  176 + {
  177 + if (candidateZip != null)
  178 + {
  179 + try
  180 + {
  181 + candidateZip.close();
  182 + }
  183 + catch (IOException ex) {}
  184 + }
  185 + }
  186 + }
  187 + }
  188 +
  189 + /**
  190 + * @param candidateFile
  191 + * @param strVersion
  192 + */
  193 + private void addModFile(File candidateFile, String strVersion)
  194 + {
  195 + LoadableModFile modFile = new LoadableModFile(candidateFile, strVersion);
  196 +
  197 + if (modFile.hasValidMetaData())
  198 + {
  199 + // Only add the mod if the version matches, we add candidates to the versionOrderingSets in
  200 + // order to determine the most recent version available.
  201 + if (LiteLoaderVersion.CURRENT.isVersionSupported(modFile.getTargetVersion()))
  202 + {
  203 + if (!this.versionOrderingSets.containsKey(modFile.getName()))
  204 + {
  205 + this.versionOrderingSets.put(modFile.getModName(), new TreeSet<LoadableMod<File>>());
  206 + }
  207 +
  208 + LiteLoaderLogger.info("Considering valid mod file: %s", modFile.getAbsolutePath());
  209 + this.versionOrderingSets.get(modFile.getModName()).add(modFile);
  210 + }
  211 + else
  212 + {
  213 + LiteLoaderLogger.info("Not adding invalid or outdated mod file: %s", candidateFile.getAbsolutePath());
  214 + }
  215 + }
  216 + }
  217 +
  218 + /**
  219 + * @param enumerator
  220 + * @param enabledModsList
  221 + * @param enabledModsList
  222 + * @param profile
  223 + * @param profile
  224 + */
  225 + @SuppressWarnings("unchecked")
  226 + private void sortAndAllocateFiles(PluggableEnumerator enumerator, EnabledModsList enabledModsList, String profile)
  227 + {
  228 + // Copy the first entry in every version set into the modfiles list
  229 + for (Entry<String, TreeSet<LoadableMod<File>>> modFileEntry : this.versionOrderingSets.entrySet())
  230 + {
  231 + LoadableMod<File> newestVersion = modFileEntry.getValue().iterator().next();
  232 +
  233 + if (enumerator.isContainerEnabled(newestVersion))
  234 + {
  235 + LiteLoaderLogger.info("Adding newest valid mod file '%s' at revision %.4f", newestVersion.getLocation(), newestVersion.getRevision());
  236 + this.loadableMods.add(newestVersion);
  237 + }
  238 + else
  239 + {
  240 + LiteLoaderLogger.info("Not adding valid mod file '%s', the specified mod is disabled or missing a required dependency", newestVersion.getLocation());
  241 + }
  242 +
  243 + if (this.loadTweaks)
  244 + {
  245 + try
  246 + {
  247 + if (newestVersion instanceof TweakContainer)
  248 + {
  249 + enumerator.registerTweakContainer((TweakContainer<File>)newestVersion);
  250 + }
  251 + }
  252 + catch (Throwable th)
  253 + {
  254 + LiteLoaderLogger.warning("Error adding tweaks from '%s'", newestVersion.getLocation());
  255 + }
  256 + }
  257 + }
  258 + }
  259 +
  260 + @Override
  261 + public void injectIntoClassLoader(PluggableEnumerator enumerator, LaunchClassLoader classLoader, EnabledModsList enabledModsList, String profile)
  262 + {
  263 + LiteLoaderLogger.info("Injecting external mods into class path...");
  264 +
  265 + for (LoadableMod<?> loadableMod : this.loadableMods)
  266 + {
  267 + try
  268 + {
  269 + if (loadableMod.injectIntoClassPath(classLoader, false))
  270 + {
  271 + LiteLoaderLogger.info("Successfully injected mod file '%s' into classpath", loadableMod.getLocation());
  272 + }
  273 + }
  274 + catch (MalformedURLException ex)
  275 + {
  276 + LiteLoaderLogger.warning("Error injecting '%s' into classPath. The mod will not be loaded", loadableMod.getLocation());
  277 + }
  278 + }
  279 + }
  280 +
  281 + @Override
  282 + public void registerMods(PluggableEnumerator enumerator, LaunchClassLoader classLoader)
  283 + {
  284 + LiteLoaderLogger.info("Discovering mods in valid mod files...");
  285 +
  286 + for (LoadableMod<?> modFile : this.loadableMods)
  287 + {
  288 + LiteLoaderLogger.info("Searching %s...", modFile.getLocation());
  289 + enumerator.registerModsFrom(modFile, true);
  290 + }
  291 + }
  292 +}
... ...
java/com/mumfrey/liteloader/core/EnumeratorModuleProtectionDomain.java 0 → 100644
  1 +package com.mumfrey.liteloader.core;
  2 +
  3 +import java.io.File;
  4 +import java.net.URL;
  5 +import java.net.URLDecoder;
  6 +
  7 +import net.minecraft.launchwrapper.LaunchClassLoader;
  8 +
  9 +import com.mumfrey.liteloader.util.log.LiteLoaderLogger;
  10 +
  11 +/**
  12 + * Enumerator module which searches for mods on the classpath
  13 + *
  14 + * @author Adam Mummery-Smith
  15 + */
  16 +public class EnumeratorModuleProtectionDomain implements EnumeratorModule<File>
  17 +{
  18 + private LoadableMod<File> codeSource;
  19 +
  20 + /**
  21 + * @param parent
  22 + * @param searchProtectionDomain
  23 + * @param searchClassPath
  24 + * @param loadTweaks
  25 + */
  26 + public EnumeratorModuleProtectionDomain(boolean loadTweaks)
  27 + {
  28 + this.initPackagePath();
  29 + }
  30 +
  31 + @Override
  32 + public String toString()
  33 + {
  34 + return this.codeSource != null ? this.codeSource.getName() : "<None>";
  35 + }
  36 +
  37 + private void initPackagePath()
  38 + {
  39 + try
  40 + {
  41 + URL protectionDomainLocation = EnumeratorModuleProtectionDomain.class.getProtectionDomain().getCodeSource().getLocation();
  42 + if (protectionDomainLocation != null)
  43 + {
  44 + LiteLoaderLogger.info("Determining code source using protection domain");
  45 + if (protectionDomainLocation.toString().indexOf('!') > -1 && protectionDomainLocation.toString().startsWith("jar:"))
  46 + {
  47 + LiteLoaderLogger.info("Protection domain references a jar file");
  48 + protectionDomainLocation = new URL(protectionDomainLocation.toString().substring(4, protectionDomainLocation.toString().indexOf('!')));
  49 + }
  50 +
  51 + File packagePath = new File(protectionDomainLocation.toURI());
  52 + if (packagePath.isFile() && packagePath.getName().endsWith(".class"))
  53 + {
  54 + packagePath = packagePath.getParentFile();
  55 + }
  56 +
  57 + this.codeSource = new LoadableModClassPath(packagePath);
  58 + }
  59 + else
  60 + {
  61 + LiteLoaderLogger.info("Determining code source using resource");
  62 + String reflectionClassPath = EnumeratorModuleProtectionDomain.class.getResource("/net/minecraft/client/main/Main.class").getPath();
  63 +
  64 + if (reflectionClassPath.indexOf('!') > -1)
  65 + {
  66 + reflectionClassPath = URLDecoder.decode(reflectionClassPath, "UTF-8");
  67 + this.codeSource = new LoadableModClassPath(new File(reflectionClassPath.substring(5, reflectionClassPath.indexOf('!'))));
  68 + }
  69 + }
  70 + }
  71 + catch (Throwable th)
  72 + {
  73 + LiteLoaderLogger.warning("Error determining local protection domain: %s", th.getMessage());
  74 + }
  75 + }
  76 +
  77 + @Override
  78 + public void init(PluggableEnumerator enumerator)
  79 + {
  80 + }
  81 +
  82 + @Override
  83 + public void writeSettings(PluggableEnumerator enumerator)
  84 + {
  85 + }
  86 +
  87 + @Override
  88 + public void enumerate(PluggableEnumerator enumerator, EnabledModsList enabledModsList, String profile)
  89 + {
  90 + }
  91 +
  92 + @Override
  93 + public void injectIntoClassLoader(PluggableEnumerator enumerator, LaunchClassLoader classLoader, EnabledModsList enabledModsList, String profile)
  94 + {
  95 + }
  96 +
  97 + /**
  98 + * @param classLoader
  99 + */
  100 + @Override
  101 + public void registerMods(PluggableEnumerator enumerator, LaunchClassLoader classLoader)
  102 + {
  103 + LiteLoaderLogger.info("Discovering mods in protection domain...");
  104 +
  105 + try
  106 + {
  107 + if (this.codeSource != null)
  108 + {
  109 + enumerator.registerModsFrom(this.codeSource, false);
  110 + }
  111 + }
  112 + catch (Throwable th)
  113 + {
  114 + LiteLoaderLogger.warning("Error loading from local class path: %s", th.getMessage());
  115 + }
  116 + }
  117 +}
... ...
java/com/mumfrey/liteloader/core/Events.java
1 1 package com.mumfrey.liteloader.core;
2 2  
3 3 import java.util.LinkedList;
4   -import java.util.logging.Level;
5 4  
6   -import org.lwjgl.input.Mouse;
  5 +import net.minecraft.client.Minecraft;
  6 +import net.minecraft.client.gui.GuiNewChat;
  7 +import net.minecraft.client.gui.ScaledResolution;
  8 +import net.minecraft.command.ICommandManager;
  9 +import net.minecraft.command.ServerCommandManager;
  10 +import net.minecraft.entity.player.EntityPlayerMP;
  11 +import net.minecraft.network.INetHandler;
  12 +import net.minecraft.network.NetHandlerPlayServer;
  13 +import net.minecraft.network.NetworkManager;
  14 +import net.minecraft.network.login.INetHandlerLoginClient;
  15 +import net.minecraft.network.login.server.S02PacketLoginSuccess;
  16 +import net.minecraft.network.play.INetHandlerPlayServer;
  17 +import net.minecraft.network.play.client.C01PacketChatMessage;
  18 +import net.minecraft.network.play.server.S01PacketJoinGame;
  19 +import net.minecraft.network.play.server.S02PacketChat;
  20 +import net.minecraft.profiler.Profiler;
  21 +import net.minecraft.server.integrated.IntegratedServer;
  22 +import net.minecraft.server.management.ServerConfigurationManager;
  23 +import net.minecraft.util.IChatComponent;
  24 +import net.minecraft.util.Timer;
  25 +import net.minecraft.world.WorldSettings;
7 26  
8   -import net.minecraft.src.*;
  27 +import org.lwjgl.input.Mouse;
9 28  
  29 +import com.mojang.authlib.GameProfile;
10 30 import com.mumfrey.liteloader.*;
11   -import com.mumfrey.liteloader.Tickable;
12   -import com.mumfrey.liteloader.core.hooks.HookProfiler;
  31 +import com.mumfrey.liteloader.core.gen.GenProfiler;
  32 +import com.mumfrey.liteloader.core.overlays.IMinecraft;
13 33 import com.mumfrey.liteloader.util.PrivateFields;
  34 +import com.mumfrey.liteloader.util.log.LiteLoaderLogger;
14 35  
15 36 /**
16 37 *
17 38 * @author Adam Mummery-Smith
18 39 */
19   -public class Events implements IPlayerUsage
  40 +public class Events
20 41 {
21 42 /**
22 43 * Reference to the loader instance
... ... @@ -29,9 +50,14 @@ public class Events implements IPlayerUsage
29 50 private final Minecraft minecraft;
30 51  
31 52 /**
32   - * Plugin channel manager
  53 + * Client plugin channel manager
  54 + */
  55 + private final ClientPluginChannels clientPluginChannels;
  56 +
  57 + /**
  58 + * Server plugin channel manager
33 59 */
34   - private final PluginChannels pluginChannels;
  60 + private final ServerPluginChannels serverPluginChannels;
35 61  
36 62 /**
37 63 * Reference to the minecraft timer
... ... @@ -41,12 +67,12 @@ public class Events implements IPlayerUsage
41 67 /**
42 68 * Flags which keep track of whether hooks have been applied
43 69 */
44   - private boolean hookInitDone, lateInitDone, tickHooked;
  70 + private boolean hookInitDone, lateInitDone, profilerHooked;
45 71  
46 72 /**
47 73 * Profiler hook objects
48 74 */
49   - private final HookProfiler profilerHook = new HookProfiler(this);
  75 + private Profiler genProfiler = null;
50 76  
51 77 /**
52 78 * ScaledResolution used by the pre-chat and post-chat render callbacks
... ... @@ -117,16 +143,41 @@ public class Events implements IPlayerUsage
117 143 private LinkedList<ChatFilter> chatFilters = new LinkedList<ChatFilter>();
118 144  
119 145 /**
  146 + * List of mods which implement PostLoginListener and want to be notified post login
  147 + */
  148 + private LinkedList<PostLoginListener> postLoginListeners = new LinkedList<PostLoginListener>();
  149 +
  150 + /**
120 151 * List of mods which implement LoginListener interface and will receive
121 152 * client login events
122 153 */
123   - private LinkedList<LoginListener> loginListeners = new LinkedList<LoginListener>();
  154 + private LinkedList<JoinGameListener> joinGameListeners = new LinkedList<JoinGameListener>();
124 155  
125 156 /**
126 157 * List of mods which implement LoginListener interface and will receive
127 158 * client login events
128 159 */
129   - private LinkedList<PreLoginListener> preLoginListeners = new LinkedList<PreLoginListener>();
  160 + private LinkedList<PreJoinGameListener> preJoinGameListeners = new LinkedList<PreJoinGameListener>();
  161 +
  162 + /**
  163 + * List of mods which can filter server chat
  164 + */
  165 + private LinkedList<ServerChatFilter> serverChatFilters = new LinkedList<ServerChatFilter>();
  166 +
  167 + /**
  168 + * List of mods which provide server commands
  169 + */
  170 + private LinkedList<ServerCommandProvider> serverCommandProviders = new LinkedList<ServerCommandProvider>();
  171 +
  172 + /**
  173 + * List of mods which monitor server player events
  174 + */
  175 + private LinkedList<ServerPlayerListener> serverPlayerListeners = new LinkedList<ServerPlayerListener>();
  176 +
  177 + /**
  178 + * List of mods which monitor outbound chat
  179 + */
  180 + private LinkedList<OutboundChatListener> outboundChatListeners = new LinkedList<OutboundChatListener>();
130 181  
131 182 /**
132 183 * Hash code of the current world. We don't store the world reference here because we don't want
... ... @@ -141,11 +192,23 @@ public class Events implements IPlayerUsage
141 192 * @param minecraft
142 193 * @param pluginChannels
143 194 */
144   - Events(LiteLoader loader, Minecraft minecraft, PluginChannels pluginChannels)
  195 + Events(LiteLoader loader, Minecraft minecraft, ClientPluginChannels pluginChannels, ServerPluginChannels serverPluginChannels, boolean genMappings)
145 196 {
146 197 this.loader = loader;
147 198 this.minecraft = minecraft;
148   - this.pluginChannels = pluginChannels;
  199 + this.clientPluginChannels = pluginChannels;
  200 + this.serverPluginChannels = serverPluginChannels;
  201 + try
  202 + {
  203 + if (genMappings)
  204 + {
  205 + this.genProfiler = GenProfiler.class.newInstance();
  206 + }
  207 + }
  208 + catch (Throwable th)
  209 + {
  210 +// th.printStackTrace();
  211 + }
149 212 }
150 213  
151 214 /**
... ... @@ -189,7 +252,7 @@ public class Events implements IPlayerUsage
189 252 {
190 253 if (listener instanceof ChatFilter)
191 254 {
192   - 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()));
  255 + LiteLoaderLogger.warning("Interface error initialising mod '%1s'. A mod implementing ChatFilter and ChatListener is not supported! Remove one of these interfaces", listener.getName());
193 256 }
194 257 else
195 258 {
... ... @@ -207,47 +270,69 @@ public class Events implements IPlayerUsage
207 270 this.addHUDRenderListener((HUDRenderListener)listener);
208 271 }
209 272  
210   - if (listener instanceof PreLoginListener)
  273 + if (listener instanceof PreJoinGameListener)
  274 + {
  275 + this.addPreJoinGameListener((PreJoinGameListener)listener);
  276 + }
  277 +
  278 + if (listener instanceof JoinGameListener)
211 279 {
212   - this.addPreLoginListener((PreLoginListener)listener);
  280 + this.addJoinGameListener((JoinGameListener)listener);
213 281 }
214 282  
215   - if (listener instanceof LoginListener)
  283 + if (listener instanceof ServerChatFilter)
216 284 {
217   - this.addLoginListener((LoginListener)listener);
  285 + this.addServerChatFilter((ServerChatFilter)listener);
218 286 }
219 287  
220   - if (listener instanceof PluginChannelListener)
  288 + if (listener instanceof ServerCommandProvider)
221 289 {
222   - this.pluginChannels.addPluginChannelListener((PluginChannelListener)listener);
  290 + this.addServerCommandProvider((ServerCommandProvider)listener);
  291 + }
  292 +
  293 + if (listener instanceof ServerPlayerListener)
  294 + {
  295 + this.addServerPlayerListener((ServerPlayerListener)listener);
  296 + }
  297 +
  298 + if (listener instanceof OutboundChatListener)
  299 + {
  300 + this.addOutboundChatListener((OutboundChatListener)listener);
  301 + }
  302 +
  303 + this.clientPluginChannels.addListener(listener);
  304 + this.serverPluginChannels.addListener(listener);
  305 +
  306 + if (listener instanceof CommonPluginChannelListener && !(listener instanceof PluginChannelListener) && !(listener instanceof ServerPluginChannelListener))
  307 + {
  308 + LiteLoaderLogger.warning("Interface error for mod '%1s'. Implementing CommonPluginChannelListener has no effect! Use PluginChannelListener or ServerPluginChannelListener instead", listener.getName());
223 309 }
224 310 }
225 311  
226 312 /**
227   - * Initialise mod hooks
  313 + * Initialise hooks
228 314 */
229 315 public void initHooks()
230 316 {
231   - try
  317 + if (this.genProfiler != null)
232 318 {
233   - LiteLoader.getLogger().info("Event manager is registering hooks");
234   -
235   - // Tick hook
236   - if (!this.tickHooked)
  319 + try
237 320 {
238   - this.tickHooked = true;
239   - PrivateFields.minecraftProfiler.setFinal(this.minecraft, this.profilerHook);
  321 + LiteLoaderLogger.info("Event manager is registering the mapping generator hook");
  322 +
  323 + // Tick hook
  324 + if (!this.profilerHooked)
  325 + {
  326 + this.profilerHooked = true;
  327 + PrivateFields.minecraftProfiler.setFinal(this.minecraft, this.genProfiler);
  328 + }
240 329 }
241   -
242   - // Sanity hook
243   - PlayerUsageSnooper snooper = this.minecraft.getPlayerUsageSnooper();
244   - PrivateFields.playerStatsCollector.setFinal(snooper, this);
245   - }
246   - catch (Exception ex)
247   - {
248   - LiteLoader.getLogger().log(Level.WARNING, "Error creating hooks", ex);
249   - ex.printStackTrace();
250   - }
  330 + catch (Exception ex)
  331 + {
  332 + LiteLoaderLogger.warning(ex, "Error creating hook");
  333 + ex.printStackTrace();
  334 + }
  335 + }
251 336  
252 337 this.hookInitDone = true;
253 338 }
... ... @@ -325,8 +410,6 @@ public class Events implements IPlayerUsage
325 410 if (!this.chatFilters.contains(chatFilter))
326 411 {
327 412 this.chatFilters.add(chatFilter);
328   - if (this.hookInitDone)
329   - this.initHooks();
330 413 }
331 414 }
332 415  
... ... @@ -338,8 +421,6 @@ public class Events implements IPlayerUsage
338 421 if (!this.chatListeners.contains(chatListener))
339 422 {
340 423 this.chatListeners.add(chatListener);
341   - if (this.hookInitDone)
342   - this.initHooks();
343 424 }
344 425 }
345 426  
... ... @@ -370,28 +451,79 @@ public class Events implements IPlayerUsage
370 451 }
371 452  
372 453 /**
373   - * @param loginListener
  454 + * @param postLoginListener
374 455 */
375   - public void addPreLoginListener(PreLoginListener loginListener)
  456 + public void addPreJoinGameListener(PostLoginListener postLoginListener)
376 457 {
377   - if (!this.preLoginListeners.contains(loginListener))
  458 + if (!this.postLoginListeners.contains(postLoginListener))
378 459 {
379   - this.preLoginListeners.add(loginListener);
380   - if (this.hookInitDone)
381   - this.initHooks();
  460 + this.postLoginListeners.add(postLoginListener);
382 461 }
383 462 }
384 463  
385 464 /**
386   - * @param loginListener
  465 + * @param joinGameListener
387 466 */
388   - public void addLoginListener(LoginListener loginListener)
  467 + public void addPreJoinGameListener(PreJoinGameListener joinGameListener)
389 468 {
390   - if (!this.loginListeners.contains(loginListener))
  469 + if (!this.preJoinGameListeners.contains(joinGameListener))
391 470 {
392   - this.loginListeners.add(loginListener);
393   - if (this.hookInitDone)
394   - this.initHooks();
  471 + this.preJoinGameListeners.add(joinGameListener);
  472 + }
  473 + }
  474 +
  475 + /**
  476 + * @param joinGameListener
  477 + */
  478 + public void addJoinGameListener(JoinGameListener joinGameListener)
  479 + {
  480 + if (!this.joinGameListeners.contains(joinGameListener))
  481 + {
  482 + this.joinGameListeners.add(joinGameListener);
  483 + }
  484 + }
  485 +
  486 + /**
  487 + * @param serverChatFilter
  488 + */
  489 + public void addServerChatFilter(ServerChatFilter serverChatFilter)
  490 + {
  491 + if (!this.serverChatFilters.contains(serverChatFilter))
  492 + {
  493 + this.serverChatFilters.add(serverChatFilter);
  494 + }
  495 + }
  496 +
  497 + /**
  498 + * @param serverCommandProvider
  499 + */
  500 + public void addServerCommandProvider(ServerCommandProvider serverCommandProvider)
  501 + {
  502 + if (!this.serverCommandProviders.contains(serverCommandProvider))
  503 + {
  504 + this.serverCommandProviders.add(serverCommandProvider);
  505 + }
  506 + }
  507 +
  508 + /**
  509 + * @param serverPlayerListener
  510 + */
  511 + public void addServerPlayerListener(ServerPlayerListener serverPlayerListener)
  512 + {
  513 + if (!this.serverPlayerListeners.contains(serverPlayerListener))
  514 + {
  515 + this.serverPlayerListeners.add(serverPlayerListener);
  516 + }
  517 + }
  518 +
  519 + /**
  520 + * @param outboundChatListener
  521 + */
  522 + private void addOutboundChatListener(OutboundChatListener outboundChatListener)
  523 + {
  524 + if (!this.outboundChatListeners.contains(outboundChatListener))
  525 + {
  526 + this.outboundChatListeners.add(outboundChatListener);
395 527 }
396 528 }
397 529  
... ... @@ -410,12 +542,12 @@ public class Events implements IPlayerUsage
410 542 {
411 543 try
412 544 {
413   - LiteLoader.getLogger().info("Calling late init for mod " + initMod.getName());
  545 + LiteLoaderLogger.info("Calling late init for mod " + initMod.getName());
414 546 initMod.onInitCompleted(this.minecraft, this.loader);
415 547 }
416 548 catch (Throwable th)
417 549 {
418   - LiteLoader.getLogger().log(Level.WARNING, "Error initialising mod " + initMod.getName(), th);
  550 + LiteLoaderLogger.warning(th, "Error initialising mod %s", initMod.getName());
419 551 }
420 552 }
421 553 }
... ... @@ -432,8 +564,6 @@ public class Events implements IPlayerUsage
432 564 this.screenWidth = this.currentResolution.getScaledWidth();
433 565 this.screenHeight = this.currentResolution.getScaledHeight();
434 566  
435   - this.loader.onRender();
436   -
437 567 for (RenderListener renderListener : this.renderListeners)
438 568 renderListener.onRender();
439 569 }
... ... @@ -463,10 +593,13 @@ public class Events implements IPlayerUsage
463 593 /**
464 594 * Called immediately before the current GUI is rendered
465 595 */
466   - public void preRenderGUI()
  596 + public void preRenderGUI(int ref)
467 597 {
468   - for (RenderListener renderListener : this.renderListeners)
469   - renderListener.onRenderGui(this.minecraft.currentScreen);
  598 + if (!this.minecraft.skipRenderWorld && ref == (this.minecraft.theWorld == null ? 1 : 2))
  599 + {
  600 + for (RenderListener renderListener : this.renderListeners)
  601 + renderListener.onRenderGui(this.minecraft.currentScreen);
  602 + }
470 603 }
471 604  
472 605 /**
... ... @@ -538,15 +671,16 @@ public class Events implements IPlayerUsage
538 671 *
539 672 * @param clock True if this is a new tick (otherwise it's just a new frame)
540 673 */
541   - public void onTick(Profiler profiler, boolean clock)
  674 + public void onTick(boolean clock)
542 675 {
  676 + this.minecraft.mcProfiler.startSection("litemods");
543 677 float partialTicks = 0.0F;
544 678  
545 679 // Try to get the minecraft timer object and determine the value of the
546 680 // partialTicks
547 681 if (clock || this.minecraftTimer == null)
548 682 {
549   - this.minecraftTimer = PrivateFields.minecraftTimer.get(this.minecraft);
  683 + this.minecraftTimer = ((IMinecraft)this.minecraft).getTimer();
550 684 }
551 685  
552 686 // Hooray, we got the timer reference
... ... @@ -559,21 +693,21 @@ public class Events implements IPlayerUsage
559 693 // Flag indicates whether we are in game at the moment
560 694 boolean inGame = this.minecraft.renderViewEntity != null && this.minecraft.renderViewEntity.worldObj != null;
561 695  
562   - if (clock)
563   - {
564   - this.loader.onTick(partialTicks, inGame);
565   - }
  696 + this.minecraft.mcProfiler.startSection("loader");
  697 + this.loader.onTick(clock, partialTicks, inGame);
566 698  
567 699 int mouseX = Mouse.getX() * this.screenWidth / this.minecraft.displayWidth;
568 700 int mouseY = this.screenHeight - Mouse.getY() * this.screenHeight / this.minecraft.displayHeight - 1;
  701 + this.minecraft.mcProfiler.endStartSection("postrender");
569 702 this.loader.postRender(mouseX, mouseY, partialTicks);
  703 + this.minecraft.mcProfiler.endSection();
570 704  
571 705 // Iterate tickable mods
572 706 for (Tickable tickable : this.tickListeners)
573 707 {
574   - profiler.startSection(tickable.getClass().getSimpleName());
  708 + this.minecraft.mcProfiler.startSection(tickable.getClass().getSimpleName().toLowerCase());
575 709 tickable.onTick(this.minecraft, partialTicks, inGame, clock);
576   - profiler.endSection();
  710 + this.minecraft.mcProfiler.endSection();
577 711 }
578 712  
579 713 // Detected world change
... ... @@ -590,21 +724,23 @@ public class Events implements IPlayerUsage
590 724 this.worldHashCode = 0;
591 725 this.loader.onWorldChanged(null);
592 726 }
  727 +
  728 + this.minecraft.mcProfiler.endSection();
593 729 }
594 730  
595 731 /**
596   - * Callback from the reflective chat hook
  732 + * Callback from the chat hook
597 733 *
598 734 * @param chatPacket
599 735 * @return
600 736 */
601   - public boolean onChat(Packet3Chat chatPacket)
  737 + public boolean onChat(S02PacketChat chatPacket)
602 738 {
603   - if (chatPacket.message == null)
  739 + if (chatPacket.func_148915_c() == null)
604 740 return true;
605 741  
606   - ChatMessageComponent chat = ChatMessageComponent.createFromJson(chatPacket.message);
607   - String message = chat.toStringWithFormatting(true);
  742 + IChatComponent chat = chatPacket.func_148915_c();
  743 + String message = chat.getUnformattedText();
608 744  
609 745 // Chat filters get a stab at the chat first, if any filter returns
610 746 // false the chat is discarded
... ... @@ -612,8 +748,8 @@ public class Events implements IPlayerUsage
612 748 {
613 749 if (chatFilter.onChat(chatPacket, chat, message))
614 750 {
615   - chat = ChatMessageComponent.createFromJson(chatPacket.message);
616   - message = chat.toStringWithFormatting(true);
  751 + chat = chatPacket.func_148915_c();
  752 + message = chat.getUnformattedText();
617 753 }
618 754 else
619 755 {
... ... @@ -627,99 +763,157 @@ public class Events implements IPlayerUsage
627 763  
628 764 return true;
629 765 }
  766 +
  767 + /**
  768 + * @param packet
  769 + * @param message
  770 + */
  771 + public void onSendChatMessage(C01PacketChatMessage packet, String message)
  772 + {
  773 + for (OutboundChatListener outboundChatListener : this.outboundChatListeners)
  774 + {
  775 + outboundChatListener.onSendChatMessage(packet, message);
  776 + }
  777 + }
  778 +
  779 + /**
  780 + * @param netHandler
  781 + * @param loginPacket
  782 + */
  783 + public void onPostLogin(INetHandlerLoginClient netHandler, S02PacketLoginSuccess loginPacket)
  784 + {
  785 + this.clientPluginChannels.onPostLogin(netHandler, loginPacket);
  786 +
  787 + for (PostLoginListener loginListener : this.postLoginListeners)
  788 + loginListener.onPostLogin(netHandler, loginPacket);
  789 + }
630 790  
631 791 /**
632   - * Pre-login callback from the login hook
  792 + * Pre join game callback from the login hook
633 793 *
634 794 * @param netHandler
635 795 * @param hookLogin
636 796 * @return
637 797 */
638   - public boolean onPreLogin(NetHandler netHandler, Packet1Login loginPacket)
  798 + public boolean onPreJoinGame(INetHandler netHandler, S01PacketJoinGame loginPacket)
639 799 {
640 800 boolean cancelled = false;
641 801  
642   - for (PreLoginListener loginListener : this.preLoginListeners)
  802 + for (PreJoinGameListener joinGameListener : this.preJoinGameListeners)
643 803 {
644   - cancelled |= !loginListener.onPreLogin(netHandler, loginPacket);
  804 + cancelled |= !joinGameListener.onPreJoinGame(netHandler, loginPacket);
645 805 }
646 806  
647 807 return !cancelled;
648 808 }
649 809  
650 810 /**
651   - * Callback from the login hook
  811 + * Callback from the join game hook
652 812 *
653 813 * @param netHandler
654 814 * @param loginPacket
655 815 */
656   - public void onConnectToServer(NetHandler netHandler, Packet1Login loginPacket)
  816 + public void onJoinGame(INetHandler netHandler, S01PacketJoinGame loginPacket)
657 817 {
658   - this.loader.onLogin(netHandler, loginPacket);
  818 + this.loader.onJoinGame(netHandler, loginPacket);
  819 + this.clientPluginChannels.onJoinGame(netHandler, loginPacket);
659 820  
660   - for (LoginListener loginListener : this.loginListeners)
661   - loginListener.onLogin(netHandler, loginPacket);
662   -
663   - this.pluginChannels.onConnectToServer(netHandler, loginPacket);
  821 + for (JoinGameListener joinGameListener : this.joinGameListeners)
  822 + joinGameListener.onJoinGame(netHandler, loginPacket);
664 823 }
665 824  
666   - /*
667   - * (non-Javadoc)
  825 + /**
  826 + * Callback from the chat hook
  827 + * @param netHandler
668 828 *
669   - * @see
670   - * net.minecraft.src.IPlayerUsage#addServerStatsToSnooper(net.minecraft.
671   - * src.PlayerUsageSnooper)
  829 + * @param chatPacket
  830 + * @return
672 831 */
673   - @Override
674   - public void addServerStatsToSnooper(PlayerUsageSnooper var1)
  832 + public boolean onServerChat(INetHandlerPlayServer netHandler, C01PacketChatMessage chatPacket)
675 833 {
676   - this.minecraft.addServerStatsToSnooper(var1);
  834 + EntityPlayerMP player = netHandler instanceof NetHandlerPlayServer ? ((NetHandlerPlayServer)netHandler).playerEntity : null;
  835 +
  836 + for (ServerChatFilter chatFilter : this.serverChatFilters)
  837 + {
  838 + if (!chatFilter.onChat(player, chatPacket, chatPacket.func_149439_c()))
  839 + {
  840 + return false;
  841 + }
  842 + }
  843 +
  844 + return true;
677 845 }
678   -
679   - /*
680   - * (non-Javadoc)
681   - *
682   - * @see
683   - * net.minecraft.src.IPlayerUsage#addServerTypeToSnooper(net.minecraft.src
684   - * .PlayerUsageSnooper)
  846 +
  847 + /**
  848 + * @param instance
  849 + * @param folderName
  850 + * @param worldName
  851 + * @param worldSettings
  852 + */
  853 + public void onStartIntegratedServer(IntegratedServer instance, String folderName, String worldName, WorldSettings worldSettings)
  854 + {
  855 + ICommandManager commandManager = instance.getCommandManager();
  856 +
  857 + if (commandManager instanceof ServerCommandManager)
  858 + {
  859 + ServerCommandManager serverCommandManager = (ServerCommandManager)commandManager;
  860 +
  861 + for (ServerCommandProvider commandProvider : this.serverCommandProviders)
  862 + commandProvider.provideCommands(serverCommandManager);
  863 + }
  864 + }
  865 +
  866 + /**
  867 + * @param scm
  868 + * @param player
  869 + * @param profile
685 870 */
686   - @Override
687   - public void addServerTypeToSnooper(PlayerUsageSnooper var1)
  871 + public void onSpawnPlayer(ServerConfigurationManager scm, EntityPlayerMP player, GameProfile profile)
688 872 {
689   - this.sanityCheck();
690   - this.minecraft.addServerTypeToSnooper(var1);
  873 + for (ServerPlayerListener serverPlayerListener : this.serverPlayerListeners)
  874 + serverPlayerListener.onPlayerConnect(player, profile);
691 875 }
692 876  
693   - /*
694   - * (non-Javadoc)
695   - *
696   - * @see net.minecraft.src.IPlayerUsage#isSnooperEnabled()
  877 + /**
  878 + * @param scm
  879 + * @param player
697 880 */
698   - @Override
699   - public boolean isSnooperEnabled()
  881 + public void onPlayerLogin(ServerConfigurationManager scm, EntityPlayerMP player)
700 882 {
701   - return this.minecraft.isSnooperEnabled();
  883 + this.serverPluginChannels.onPlayerJoined(player);
702 884 }
703 885  
704   - /*
705   - * (non-Javadoc)
706   - *
707   - * @see net.minecraft.src.IPlayerUsage#getLogAgent()
  886 + /**
  887 + * @param scm
  888 + * @param netManager
  889 + * @param player
708 890 */
709   - @Override
710   - public ILogAgent getLogAgent()
  891 + public void onInitializePlayerConnection(ServerConfigurationManager scm, NetworkManager netManager, EntityPlayerMP player)
711 892 {
712   - return this.minecraft.getLogAgent();
  893 + for (ServerPlayerListener serverPlayerListener : this.serverPlayerListeners)
  894 + serverPlayerListener.onPlayerLoggedIn(player);
713 895 }
714   -
  896 +
715 897 /**
716   - * Check that the profiler hook hasn't been overridden by something else
  898 + * @param scm
  899 + * @param player
  900 + * @param oldPlayer
  901 + * @param dimension
  902 + * @param copy
717 903 */
718   - private void sanityCheck()
  904 + public void onRespawnPlayer(ServerConfigurationManager scm, EntityPlayerMP player, EntityPlayerMP oldPlayer, int dimension, boolean won)
719 905 {
720   - if (this.tickHooked && this.minecraft.mcProfiler != this.profilerHook)
721   - {
722   - PrivateFields.minecraftProfiler.setFinal(this.minecraft, this.profilerHook);
723   - }
  906 + for (ServerPlayerListener serverPlayerListener : this.serverPlayerListeners)
  907 + serverPlayerListener.onPlayerRespawn(player, oldPlayer, dimension, won);
  908 + }
  909 +
  910 + /**
  911 + * @param scm
  912 + * @param player
  913 + */
  914 + public void onPlayerLogout(ServerConfigurationManager scm, EntityPlayerMP player)
  915 + {
  916 + for (ServerPlayerListener serverPlayerListener : this.serverPlayerListeners)
  917 + serverPlayerListener.onPlayerLogout(player);
724 918 }
725 919 }
... ...
java/com/mumfrey/liteloader/core/Injectable.java 0 → 100644
  1 +package com.mumfrey.liteloader.core;
  2 +
  3 +import java.net.MalformedURLException;
  4 +import java.net.URL;
  5 +
  6 +import com.mumfrey.liteloader.launch.InjectionStrategy;
  7 +
  8 +import net.minecraft.launchwrapper.LaunchClassLoader;
  9 +
  10 +/**
  11 + * Interface for objects which can be injected into the classpath
  12 + *
  13 + * @author Adam Mummery-Smith
  14 + */
  15 +public interface Injectable
  16 +{
  17 + /**
  18 + * Get the URL of this injectable resource
  19 + * @throws MalformedURLException
  20 + */
  21 + public abstract URL getURL() throws MalformedURLException;
  22 +
  23 + /**
  24 + * Returns true if this object has been injected already
  25 + */
  26 + public abstract boolean isInjected();
  27 +
  28 + /**
  29 + * @param classLoader
  30 + * @param injectIntoParent
  31 + * @return
  32 + * @throws MalformedURLException
  33 + */
  34 + public abstract boolean injectIntoClassPath(LaunchClassLoader classLoader, boolean injectIntoParent) throws MalformedURLException;
  35 +
  36 + public abstract InjectionStrategy getInjectionStrategy();
  37 +}
... ...
java/com/mumfrey/liteloader/core/LiteLoader.java
1 1 package com.mumfrey.liteloader.core;
2 2  
3 3 import java.io.File;
4   -import java.io.FileReader;
5   -import java.io.FileWriter;
6   -import java.io.IOException;
7 4 import java.io.PrintStream;
8   -import java.util.ArrayList;
9   -import java.util.Arrays;
10   -import java.util.Collections;
11   -import java.util.HashMap;
12   -import java.util.Iterator;
13   -import java.util.LinkedList;
14   -import java.util.List;
15   -import java.util.Map;
16   -import java.util.Properties;
17   -import java.util.logging.Level;
18   -import java.util.logging.Logger;
  5 +import java.util.*;
19 6  
20 7 import javax.activity.InvalidActivityException;
21 8  
22   -import org.lwjgl.input.Keyboard;
23   -
  9 +import net.minecraft.client.Minecraft;
  10 +import net.minecraft.client.gui.GuiScreen;
  11 +import net.minecraft.client.resources.IResourcePack;
  12 +import net.minecraft.client.resources.SimpleReloadableResourceManager;
  13 +import net.minecraft.client.settings.KeyBinding;
  14 +import net.minecraft.crash.CrashReport;
24 15 import net.minecraft.launchwrapper.LaunchClassLoader;
25   -import net.minecraft.src.CrashReport;
26   -import net.minecraft.src.GuiControls;
27   -import net.minecraft.src.GuiMainMenu;
28   -import net.minecraft.src.GuiScreen;
29   -import net.minecraft.src.KeyBinding;
30   -import net.minecraft.src.Minecraft;
31   -import net.minecraft.src.NetHandler;
32   -import net.minecraft.src.Packet1Login;
33   -import net.minecraft.src.ResourcePack;
34   -import net.minecraft.src.SimpleReloadableResourceManager;
35   -import net.minecraft.src.World;
  16 +import net.minecraft.network.INetHandler;
  17 +import net.minecraft.network.play.server.S01PacketJoinGame;
  18 +import net.minecraft.world.World;
  19 +
  20 +import org.apache.logging.log4j.Logger;
  21 +import org.lwjgl.input.Keyboard;
36 22  
37   -import com.mumfrey.liteloader.*;
  23 +import com.mumfrey.liteloader.LiteMod;
  24 +import com.mumfrey.liteloader.core.overlays.IMinecraft;
  25 +import com.mumfrey.liteloader.crashreport.CallableLaunchWrapper;
38 26 import com.mumfrey.liteloader.crashreport.CallableLiteLoaderBrand;
39 27 import com.mumfrey.liteloader.crashreport.CallableLiteLoaderMods;
40   -import com.mumfrey.liteloader.gui.GuiControlsPaginated;
41 28 import com.mumfrey.liteloader.gui.GuiScreenModInfo;
42 29 import com.mumfrey.liteloader.modconfig.ConfigManager;
43 30 import com.mumfrey.liteloader.modconfig.Exposable;
44 31 import com.mumfrey.liteloader.permissions.PermissionsManagerClient;
45   -import com.mumfrey.liteloader.util.PrivateFields;
  32 +import com.mumfrey.liteloader.util.Input;
  33 +import com.mumfrey.liteloader.resources.InternalResourcePack;
  34 +import com.mumfrey.liteloader.util.log.LiteLoaderLogger;
46 35  
47 36 /**
48 37 * LiteLoader is a simple loader which loads and provides useful callbacks to
49 38 * lightweight mods
50 39 *
51 40 * @author Adam Mummery-Smith
52   - * @version 1.6.4_02
  41 + * @version 1.7.2_02
53 42 */
54 43 public final class LiteLoader
55 44 {
  45 + public static final String MOD_SYSTEM = "liteloader";
  46 +
56 47 private static final String OPTION_MOD_INFO_SCREEN = "modInfoScreen";
57 48 private static final String OPTION_SOUND_MANAGER_FIX = "soundManagerFix";
58   - private static final String OPTION_CONTROLS_PAGES = "controls.pages";
  49 + private static final String OPTION_GENERATE_MAPPINGS = "genMappings";
59 50  
60 51 /**
61 52 * LiteLoader is a singleton, this is the singleton instance
... ... @@ -65,7 +56,7 @@ public final class LiteLoader
65 56 /**
66 57 * Logger for LiteLoader events
67 58 */
68   - private static final Logger logger = Logger.getLogger("liteloader");
  59 + private static final Logger logger = LiteLoaderLogger.getLogger();
69 60  
70 61 /**
71 62 * Tweak system class loader
... ... @@ -73,11 +64,6 @@ public final class LiteLoader
73 64 private static LaunchClassLoader classLoader;
74 65  
75 66 /**
76   - * List of mods passed into the command line
77   - */
78   - private EnabledModsList enabledModsList = null;
79   -
80   - /**
81 67 * Mods folder which contains mods and legacy config files
82 68 */
83 69 private File modsFolder;
... ... @@ -99,22 +85,11 @@ public final class LiteLoader
99 85 private File versionConfigFolder;
100 86  
101 87 /**
102   - * JSON file containing the list of enabled/disabled mods by profile
103   - */
104   - private File enabledModsFile;
105   -
106   - /**
107 88 * Reference to the Minecraft game instance
108 89 */
109 90 private Minecraft minecraft;
110 91  
111 92 /**
112   - * Setting value, if true we will swap out the MC "Controls" GUI for our
113   - * custom, paginated one
114   - */
115   - private boolean paginateControls = true;
116   -
117   - /**
118 93 * Loader Bootstrap instance
119 94 */
120 95 private final LiteLoaderBootstrap bootstrap;
... ... @@ -125,9 +100,14 @@ public final class LiteLoader
125 100 private final LiteLoaderEnumerator enumerator;
126 101  
127 102 /**
  103 + * List of mods passed into the command line
  104 + */
  105 + private final EnabledModsList enabledModsList;
  106 +
  107 + /**
128 108 * Registered resource packs
129 109 */
130   - private final Map<String, ResourcePack> registeredResourcePacks = new HashMap<String, ResourcePack>();
  110 + private final Map<String, IResourcePack> registeredResourcePacks = new HashMap<String, IResourcePack>();
131 111  
132 112 /**
133 113 * List of loaded mods, for crash reporting
... ... @@ -147,7 +127,7 @@ public final class LiteLoader
147 127 /**
148 128 * Mods which are loaded but disabled
149 129 */
150   - private final LinkedList<ModFile> disabledMods = new LinkedList<ModFile>();
  130 + private final LinkedList<Loadable<?>> disabledMods = new LinkedList<Loadable<?>>();
151 131  
152 132 /**
153 133 * Event manager
... ... @@ -157,7 +137,12 @@ public final class LiteLoader
157 137 /**
158 138 * Plugin channel manager
159 139 */
160   - private final PluginChannels pluginChannels = new PluginChannels();
  140 + private final ClientPluginChannels clientPluginChannels = new ClientPluginChannels();
  141 +
  142 + /**
  143 + * Server channel manager
  144 + */
  145 + private final ServerPluginChannels serverPluginChannels = new ServerPluginChannels();
161 146  
162 147 /**
163 148 * Permission Manager
... ... @@ -170,9 +155,9 @@ public final class LiteLoader
170 155 private final ConfigManager configManager;
171 156  
172 157 /**
173   - * Flag which keeps track of whether late initialisation has been done
  158 + * Flag which keeps track of whether late initialisation has completed
174 159 */
175   - private boolean postInitStarted, startupComplete;
  160 + private boolean startupComplete;
176 161  
177 162 /**
178 163 * True while initialising mods if we need to do a resource manager reload once the process is completed
... ... @@ -187,29 +172,13 @@ public final class LiteLoader
187 172 /**
188 173 * If inhibit is enabled, this object is used to reflectively inhibit the sound manager's reload process during startup by removing it from the reloadables list
189 174 */
190   - private SoundManagerReloadInhibitor soundManagerReloadInhibitor;
191   -
192   - /**
193   - * File in which we will store mod key mappings
194   - */
195   - private File keyMapSettingsFile = null;
  175 + private SoundHandlerReloadInhibitor soundHandlerReloadInhibitor;
196 176  
197 177 /**
198   - * Properties object which stores mod key mappings
199   - */
200   - private Properties keyMapSettings = new Properties();
201   -
202   - /**
203   - * List of all registered mod keys
204   - */
205   - private List<KeyBinding> modKeyBindings = new ArrayList<KeyBinding>();
206   -
207   - /**
208   - * Map of mod key bindings to their key codes, stored so that we don't need to cast from
209   - * string in the properties file every tick
  178 + *
210 179 */
211   - private Map<KeyBinding, Integer> storedModKeyBindings = new HashMap<KeyBinding, Integer>();
212   -
  180 + private Input input;
  181 +
213 182 /**
214 183 * Setting which determines whether we show the "mod info" screen tab in the main menu
215 184 */
... ... @@ -228,53 +197,20 @@ public final class LiteLoader
228 197 private GuiScreenModInfo modInfoScreen;
229 198  
230 199 /**
231   - * Pre-init routine, called using reflection by the tweaker
232   - *
233   - * @param gameDirectory Game directory passed to the tweaker
234   - * @param assetsDirectory Assets directory passed to the tweaker
235   - * @param profile Launch profile name supplied with --version parameter
236   - * @param modNameFilter List of mod names parsed from the command line
237   - * @param classLoader LaunchClassLoader
238   - */
239   - static final void init(LiteLoaderBootstrap bootstrap, LiteLoaderEnumerator enumerator, List<String> modNameFilter, LaunchClassLoader classLoader)
240   - {
241   - if (LiteLoader.instance == null)
242   - {
243   - LiteLoader.classLoader = classLoader;
244   -
245   - LiteLoader.instance = new LiteLoader(bootstrap, enumerator, modNameFilter);
246   - LiteLoader.instance.onInit();
247   - }
248   - }
249   -
250   - /**
251   - * Post-init routine, initialises and loads mods enumerated in preInit
252   - */
253   - static final void postInit()
254   - {
255   - if (LiteLoader.instance != null)
256   - {
257   - final Minecraft minecraft = Minecraft.getMinecraft();
258   - LiteLoader.instance.onPostInit(minecraft);
259   - }
260   - }
261   -
262   - /**
263 200 * LiteLoader constructor
264 201 * @param profile
265 202 * @param modNameFilter
266 203 */
267   - private LiteLoader(LiteLoaderBootstrap bootstrap, LiteLoaderEnumerator enumerator, List<String> modNameFilter)
  204 + private LiteLoader(LiteLoaderBootstrap bootstrap, LiteLoaderEnumerator enumerator, EnabledModsList enabledModsList)
268 205 {
269 206 this.bootstrap = bootstrap;
270 207 this.enumerator = enumerator;
  208 + this.enabledModsList = enabledModsList;
271 209  
272 210 this.setupPaths(bootstrap);
273 211  
274   - this.enabledModsList = EnabledModsList.createFrom(this.enabledModsFile);
275   - this.enabledModsList.processModsList(bootstrap.getProfile(), modNameFilter);
276   -
277 212 this.configManager = new ConfigManager();
  213 + this.input = new Input(new File(this.commonConfigFolder, "liteloader.keys.properties"));
278 214 }
279 215  
280 216 /**
... ... @@ -286,15 +222,12 @@ public final class LiteLoader
286 222 this.configBaseFolder = bootstrap.getConfigBaseFolder();
287 223  
288 224 this.commonConfigFolder = new File(this.configBaseFolder, "common");
289   - this.versionConfigFolder = this.inflectVersionedConfigPath(LiteLoaderBootstrap.VERSION);
  225 + this.versionConfigFolder = this.inflectVersionedConfigPath(LiteLoaderVersion.CURRENT);
290 226  
291 227 if (!this.modsFolder.exists()) this.modsFolder.mkdirs();
292 228 if (!this.configBaseFolder.exists()) this.configBaseFolder.mkdirs();
293 229 if (!this.commonConfigFolder.exists()) this.commonConfigFolder.mkdirs();
294 230 if (!this.versionConfigFolder.exists()) this.versionConfigFolder.mkdirs();
295   -
296   - this.enabledModsFile = new File(this.configBaseFolder, "liteloader.profiles.json");
297   - this.keyMapSettingsFile = new File(this.configBaseFolder, "liteloader.keys.properties");
298 231 }
299 232  
300 233 /**
... ... @@ -310,48 +243,38 @@ public final class LiteLoader
310 243  
311 244 return new File(this.configBaseFolder, String.format("config.%s", version.getMinecraftVersion()));
312 245 }
313   -
314   - /**
  246 +
  247 + /**
315 248 * Set up reflection methods required by the loader
316 249 */
317   - private boolean onInit()
  250 + void init()
318 251 {
319 252 try
320 253 {
321   - if (this.keyMapSettingsFile.exists())
322   - {
323   - try
324   - {
325   - this.keyMapSettings.load(new FileReader(this.keyMapSettingsFile));
326   - }
327   - catch (Exception ex) {}
328   - }
  254 + this.input.init();
329 255  
330   - this.paginateControls = this.bootstrap.getAndStoreBooleanProperty(OPTION_CONTROLS_PAGES, true);
331 256 this.inhibitSoundManagerReload = this.bootstrap.getAndStoreBooleanProperty(OPTION_SOUND_MANAGER_FIX, true);
332 257 this.displayModInfoScreenTab = this.bootstrap.getAndStoreBooleanProperty(OPTION_MOD_INFO_SCREEN, true);
333 258  
334 259 this.enumerator.discoverModClasses();
  260 + this.disabledMods.addAll(this.enumerator.getDisabledMods());
335 261 }
336 262 catch (Throwable th)
337 263 {
338   - LiteLoader.getLogger().log(Level.SEVERE, "Error initialising LiteLoader", th);
339   - return false;
  264 + LiteLoaderLogger.severe("Error initialising LiteLoader", th);
340 265 }
341   -
342   - return true;
343 266 }
344 267  
345   - private void onPostInit(Minecraft minecraft)
  268 + void postInit()
346 269 {
347   - if (this.postInitStarted) return;
348   - this.postInitStarted = true;
349   -
350 270 // Cache local minecraft reference
351   - this.minecraft = minecraft;
352   -
  271 + this.minecraft = Minecraft.getMinecraft();
  272 +
  273 + // Add self as a resource pack for texture/lang resources
  274 + this.registerModResourcePack(new InternalResourcePack("LiteLoader", LiteLoader.class, "liteloader"));
  275 +
353 276 // Create the event broker
354   - this.events = new Events(this, this.minecraft, this.pluginChannels);
  277 + this.events = new Events(this, this.minecraft, this.clientPluginChannels, this.serverPluginChannels, this.bootstrap.getBooleanProperty(OPTION_GENERATE_MAPPINGS));
355 278  
356 279 // Spawn mod instances
357 280 this.loadMods();
... ... @@ -359,24 +282,27 @@ public final class LiteLoader
359 282 // Initialises enumerated mods
360 283 this.initMods();
361 284  
  285 + this.updateSharedModList();
  286 +
362 287 // Initialises the required hooks for loaded mods
363 288 this.events.initHooks();
364 289 this.startupComplete = true;
365 290  
366   - this.enabledModsList.saveTo(this.enabledModsFile);
  291 + // Save stuff
  292 + this.enabledModsList.save();
367 293 this.bootstrap.writeProperties();
368 294 }
369   -
  295 +
370 296 /* (non-Javadoc)
371   - * @see com.mumfrey.liteloader.core.ICustomResourcePackManager#registerModResourcePack(net.minecraft.src.ResourcePack)
  297 + * @see com.mumfrey.liteloader.core.ICustomResourcePackManager#registerModResourcePack(net.minecraft.client.resources.ResourcePack)
372 298 */
373   - public boolean registerModResourcePack(ResourcePack resourcePack)
  299 + public boolean registerModResourcePack(IResourcePack resourcePack)
374 300 {
375 301 if (!this.registeredResourcePacks.containsKey(resourcePack.getPackName()))
376 302 {
377 303 this.pendingResourceReload = true;
378 304  
379   - List<ResourcePack> defaultResourcePacks = PrivateFields.defaultResourcePacks.get(this.minecraft);
  305 + List<IResourcePack> defaultResourcePacks = ((IMinecraft)this.minecraft).getDefaultResourcePacks();
380 306 if (!defaultResourcePacks.contains(resourcePack))
381 307 {
382 308 defaultResourcePacks.add(resourcePack);
... ... @@ -389,15 +315,15 @@ public final class LiteLoader
389 315 }
390 316  
391 317 /* (non-Javadoc)
392   - * @see com.mumfrey.liteloader.core.ICustomResourcePackManager#unRegisterModResourcePack(net.minecraft.src.ResourcePack)
  318 + * @see com.mumfrey.liteloader.core.ICustomResourcePackManager#unRegisterModResourcePack(net.minecraft.client.resources.ResourcePack)
393 319 */
394   - public boolean unRegisterModResourcePack(ResourcePack resourcePack)
  320 + public boolean unRegisterModResourcePack(IResourcePack resourcePack)
395 321 {
396 322 if (this.registeredResourcePacks.containsValue(resourcePack))
397 323 {
398 324 this.pendingResourceReload = true;
399 325  
400   - List<ResourcePack> defaultResourcePacks = PrivateFields.defaultResourcePacks.get(this.minecraft);
  326 + List<IResourcePack> defaultResourcePacks = ((IMinecraft)this.minecraft).getDefaultResourcePacks();
401 327 this.registeredResourcePacks.remove(resourcePack.getPackName());
402 328 defaultResourcePacks.remove(resourcePack);
403 329 return true;
... ... @@ -422,7 +348,9 @@ public final class LiteLoader
422 348 * Get the LiteLoader logger object
423 349 *
424 350 * @return
  351 + * @deprecated use LiteLoaderLogger instead
425 352 */
  353 + @Deprecated
426 354 public static final Logger getLogger()
427 355 {
428 356 return LiteLoader.logger;
... ... @@ -441,11 +369,13 @@ public final class LiteLoader
441 369 /**
442 370 * Get the output stream which we are using for console output
443 371 *
444   - * @return
  372 + * @return System.err
  373 + * @deprecated use log4j instead
445 374 */
  375 + @Deprecated
446 376 public static final PrintStream getConsoleStream()
447 377 {
448   - return LiteLoaderBootstrap.getConsoleStream();
  378 + return System.err;
449 379 }
450 380  
451 381 /**
... ... @@ -455,7 +385,17 @@ public final class LiteLoader
455 385 */
456 386 public static final String getVersion()
457 387 {
458   - return LiteLoaderBootstrap.VERSION.getLoaderVersion();
  388 + return LiteLoaderVersion.CURRENT.getLoaderVersion();
  389 + }
  390 +
  391 + /**
  392 + * Get LiteLoader version
  393 + *
  394 + * @return
  395 + */
  396 + public static final String getVersionDisplayString()
  397 + {
  398 + return String.format("LiteLoader %s", LiteLoaderVersion.CURRENT.getLoaderVersion());
459 399 }
460 400  
461 401 /**
... ... @@ -465,7 +405,7 @@ public final class LiteLoader
465 405 */
466 406 public static final int getRevision()
467 407 {
468   - return LiteLoaderBootstrap.VERSION.getLoaderRevision();
  408 + return LiteLoaderVersion.CURRENT.getLoaderRevision();
469 409 }
470 410  
471 411 /**
... ... @@ -490,13 +430,43 @@ public final class LiteLoader
490 430 * Get the plugin channel manager
491 431 *
492 432 * @return
  433 + * @deprecated use LiteLoader.getClientPluginChannels()
493 434 */
494   - public static PluginChannels getPluginChannels()
  435 + @Deprecated
  436 + public static ClientPluginChannels getPluginChannels()
495 437 {
496   - return LiteLoader.getInstance().pluginChannels;
  438 + return LiteLoader.getInstance().clientPluginChannels;
497 439 }
498 440  
499 441 /**
  442 + * Get the client-side plugin channel manager
  443 + *
  444 + * @return
  445 + */
  446 + public static ClientPluginChannels getClientPluginChannels()
  447 + {
  448 + return LiteLoader.getInstance().clientPluginChannels;
  449 + }
  450 +
  451 + /**
  452 + * Get the server-side plugin channel manager
  453 + *
  454 + * @return
  455 + */
  456 + public static ServerPluginChannels getServerPluginChannels()
  457 + {
  458 + return LiteLoader.getInstance().serverPluginChannels;
  459 + }
  460 +
  461 + /**
  462 + * Get the input manager
  463 + */
  464 + public static Input getInput()
  465 + {
  466 + return LiteLoader.getInstance().input;
  467 + }
  468 +
  469 + /**
500 470 * Get the "mods" folder
501 471 */
502 472 public static File getModsFolder()
... ... @@ -545,6 +515,24 @@ public final class LiteLoader
545 515 }
546 516  
547 517 /**
  518 + * Used to get the name of the modpack being used
  519 + *
  520 + * @return name of the modpack in use or null if no pack
  521 + */
  522 + public static String getBranding()
  523 + {
  524 + return LiteLoader.getInstance().bootstrap.getBranding();
  525 + }
  526 +
  527 + /**
  528 + * @return
  529 + */
  530 + public static boolean isDevelopmentEnvironment()
  531 + {
  532 + return "true".equals(System.getProperty("mcpenv"));
  533 + }
  534 +
  535 + /**
548 536 * Used for crash reporting, returns a text list of all loaded mods
549 537 *
550 538 * @return List of loaded mods as a string
... ... @@ -565,25 +553,22 @@ public final class LiteLoader
565 553 /**
566 554 * Get a list containing all mod files which were NOT loaded
567 555 */
568   - public List<ModFile> getDisabledMods()
  556 + public List<Loadable<?>> getDisabledMods()
569 557 {
570 558 return Collections.unmodifiableList(this.disabledMods);
571 559 }
572   -
573 560 /**
574   - * Used to get the name of the modpack being used
575   - *
576   - * @return name of the modpack in use or null if no pack
  561 + * Get the list of injected tweak containers
577 562 */
578   - public String getBranding()
  563 + public Collection<Loadable<File>> getInjectedTweaks()
579 564 {
580   - return this.bootstrap.getBranding();
  565 + return Collections.unmodifiableCollection(this.enumerator.getInjectedTweaks());
581 566 }
582   -
  567 +
583 568 /**
584 569 * Get a reference to a loaded mod, if the mod exists
585 570 *
586   - * @param modName Mod's name, meta name or class name
  571 + * @param modName Mod's name, identifier or class name
587 572 * @return
588 573 * @throws InvalidActivityException
589 574 */
... ... @@ -602,9 +587,10 @@ public final class LiteLoader
602 587  
603 588 for (LiteMod mod : this.mods)
604 589 {
605   - String metaName = this.getModMetaName(mod.getClass());
  590 + Class<? extends LiteMod> modClass = mod.getClass();
  591 + String modId = this.getModIdentifier(modClass);
606 592  
607   - if (modName.equalsIgnoreCase(mod.getName()) || modName.equalsIgnoreCase(metaName) || modName.equalsIgnoreCase(mod.getClass().getSimpleName()))
  593 + if (modName.equalsIgnoreCase(mod.getName()) || modName.equalsIgnoreCase(modId) || modName.equalsIgnoreCase(modClass.getSimpleName()))
608 594 return (T)mod;
609 595 }
610 596  
... ... @@ -656,16 +642,16 @@ public final class LiteLoader
656 642 /**
657 643 * Get a metadata value for the specified mod
658 644 *
659   - * @param mod
  645 + * @param modNameOrId
660 646 * @param metaDataKey
661 647 * @param defaultValue
662 648 * @return
663 649 * @throws InvalidActivityException Thrown by getMod if init is not complete
664 650 * @throws IllegalArgumentException Thrown by getMod if argument is null
665 651 */
666   - public String getModMetaData(String mod, String metaDataKey, String defaultValue) throws InvalidActivityException, IllegalArgumentException
  652 + public String getModMetaData(String modNameOrId, String metaDataKey, String defaultValue) throws InvalidActivityException, IllegalArgumentException
667 653 {
668   - return this.getModMetaData(this.getMod(mod), metaDataKey, defaultValue);
  654 + return this.getModMetaData(this.getMod(modNameOrId), metaDataKey, defaultValue);
669 655 }
670 656  
671 657 /**
... ... @@ -685,40 +671,74 @@ public final class LiteLoader
685 671 /**
686 672 * Get a metadata value for the specified mod
687 673 *
688   - * @param modClassName
  674 + * @param modClass
689 675 * @param metaDataKey
690 676 * @param defaultValue
691 677 * @return
692 678 */
693 679 public String getModMetaData(Class<? extends LiteMod> modClass, String metaDataKey, String defaultValue)
694 680 {
  681 + if (modClass == null || metaDataKey == null) return defaultValue;
695 682 return this.enumerator.getModMetaData(modClass, metaDataKey, defaultValue);
696 683 }
697 684  
698 685 /**
699   - * Get the mod "name" metadata key, this is used for versioning, exclusivity, and enablement checks
  686 + * Get the mod identifier, this is used for versioning, exclusivity, and enablement checks
700 687 *
701 688 * @param modClass
702 689 * @return
703 690 */
704   - public String getModMetaName(Class<? extends LiteMod> modClass)
  691 + public String getModIdentifier(Class<? extends LiteMod> modClass)
705 692 {
706   - return this.enumerator.getModMetaName(modClass);
  693 + return this.enumerator.getModIdentifier(modClass);
707 694 }
708 695  
709 696 /**
710   - * Get the mod "name" metadata key, this is used for versioning, exclusivity, and enablement checks
  697 + * Get the mod identifier, this is used for versioning, exclusivity, and enablement checks
711 698 *
712 699 * @param modClass
713 700 * @return
714 701 */
715   - public Class<? extends LiteMod> getModFromMetaName(String modName)
  702 + public String getModIdentifier(LiteMod mod)
716 703 {
717   - if (modName == null) return null;
  704 + return mod == null ? null : this.enumerator.getModIdentifier(mod.getClass());
  705 + }
  706 +
  707 + /**
  708 + * Get the container (mod file, classpath jar or folder) for the specified mod
  709 + *
  710 + * @param modClass
  711 + * @return
  712 + */
  713 + public LoadableMod<?> getModContainer(Class<? extends LiteMod> modClass)
  714 + {
  715 + return this.enumerator.getModContainer(modClass);
  716 + }
  717 +
  718 + /**
  719 + * Get the container (mod file, classpath jar or folder) for the specified mod
  720 + *
  721 + * @param modClass
  722 + * @return
  723 + */
  724 + public LoadableMod<?> getModContainer(LiteMod mod)
  725 + {
  726 + return mod == null ? null : this.enumerator.getModContainer(mod.getClass());
  727 + }
  728 +
  729 + /**
  730 + * Get the mod which matches the specified identifier
  731 + *
  732 + * @param identifier
  733 + * @return
  734 + */
  735 + public Class<? extends LiteMod> getModFromIdentifier(String identifier)
  736 + {
  737 + if (identifier == null) return null;
718 738  
719 739 for (LiteMod mod : this.mods)
720 740 {
721   - if (modName.equalsIgnoreCase(this.enumerator.getModMetaName(mod.getClass())))
  741 + if (identifier.equalsIgnoreCase(this.enumerator.getModIdentifier(mod.getClass())))
722 742 {
723 743 return mod.getClass();
724 744 }
... ... @@ -728,29 +748,29 @@ public final class LiteLoader
728 748 }
729 749  
730 750 /**
731   - * @param modMetaName Mod meta name to enable
  751 + * @param identifier Identifier of the mod to enable
732 752 */
733   - public void enableMod(String modMetaName)
  753 + public void enableMod(String identifier)
734 754 {
735   - this.setModEnabled(modMetaName, true);
  755 + this.setModEnabled(identifier, true);
736 756 }
737 757  
738 758 /**
739   - * @param modMetaName Mod meta name to disable
  759 + * @param identifier Identifier of the mod to disable
740 760 */
741   - public void disableMod(String modMetaName)
  761 + public void disableMod(String identifier)
742 762 {
743   - this.setModEnabled(modMetaName, false);
  763 + this.setModEnabled(identifier, false);
744 764 }
745 765  
746 766 /**
747   - * @param modMetaName Mod meta name to enable/disable
  767 + * @param identifier Identifier of the mod to enable/disable
748 768 * @param enabled
749 769 */
750   - public void setModEnabled(String modMetaName, boolean enabled)
  770 + public void setModEnabled(String identifier, boolean enabled)
751 771 {
752   - this.enabledModsList.setEnabled(this.bootstrap.getProfile(), modMetaName, enabled);
753   - this.enabledModsList.saveTo(this.enabledModsFile);
  772 + this.enabledModsList.setEnabled(this.bootstrap.getProfile(), identifier, enabled);
  773 + this.enabledModsList.save();
754 774 }
755 775  
756 776 /**
... ... @@ -772,7 +792,7 @@ public final class LiteLoader
772 792  
773 793 for (LiteMod mod : this.loadedMods)
774 794 {
775   - if (modName.equalsIgnoreCase(this.enumerator.getModMetaName(mod.getClass())))
  795 + if (modName.equalsIgnoreCase(this.enumerator.getModIdentifier(mod.getClass())))
776 796 {
777 797 return true;
778 798 }
... ... @@ -810,70 +830,79 @@ public final class LiteLoader
810 830 {
811 831 if (!this.enumerator.hasModsToLoad())
812 832 {
813   - LiteLoader.logInfo("Mod class discovery failed or no mod classes were found. Not loading any mods.");
  833 + LiteLoaderLogger.info("Mod class discovery failed or no mod classes were found. Not loading any mods.");
814 834 return;
815 835 }
816 836  
817   - LiteLoader.logInfo("Discovered %d total mod(s)", this.enumerator.modsToLoadCount());
  837 + LiteLoaderLogger.info("Discovered %d total mod(s)", this.enumerator.modsToLoadCount());
818 838  
819 839 this.pendingResourceReload = false;
820   - this.soundManagerReloadInhibitor = new SoundManagerReloadInhibitor((SimpleReloadableResourceManager)this.minecraft.getResourceManager(), this.minecraft.sndManager);
821   - if (this.inhibitSoundManagerReload) this.soundManagerReloadInhibitor.inhibit();
  840 + this.soundHandlerReloadInhibitor = new SoundHandlerReloadInhibitor((SimpleReloadableResourceManager)this.minecraft.getResourceManager(), this.minecraft.getSoundHandler());
  841 + if (this.inhibitSoundManagerReload) this.soundHandlerReloadInhibitor.inhibit();
822 842  
823 843 for (Class<? extends LiteMod> mod : this.enumerator.getModsToLoad())
824 844 {
  845 + LoadableMod<?> container = this.enumerator.getModContainer(mod);
  846 +
825 847 try
826 848 {
827   - String metaName = this.getModMetaName(mod);
828   - if (metaName == null || this.enabledModsList.isEnabled(this.bootstrap.getProfile(), metaName))
  849 + String identifier = this.getModIdentifier(mod);
  850 + if (identifier == null || this.enabledModsList.isEnabled(this.bootstrap.getProfile(), identifier))
829 851 {
830   - this.loadMod(metaName, mod);
  852 + if (this.enumerator.checkDependencies(container))
  853 + {
  854 + this.loadMod(identifier, mod, container);
  855 + }
  856 + else
  857 + {
  858 + LiteLoaderLogger.info("Not loading mod %s, the mod was missing a required dependency", identifier);
  859 + if (container != LoadableMod.NONE && !this.disabledMods.contains(container)) this.disabledMods.add(container);
  860 + }
831 861 }
832 862 else
833 863 {
834   - LiteLoader.logInfo("Not loading mod %s, excluded by filter", metaName);
835   - this.disabledMods.add(this.enumerator.getModFile(mod));
  864 + LiteLoaderLogger.info("Not loading mod %s, excluded by filter", identifier);
  865 + if (container != LoadableMod.NONE && !this.disabledMods.contains(container)) this.disabledMods.add(container);
836 866 }
837 867 }
838 868 catch (Throwable th)
839 869 {
840   - th.printStackTrace(System.out);
841   - LiteLoader.getLogger().log(Level.WARNING, String.format("Error loading mod from %s", mod.getName()), th);
  870 + th.printStackTrace();
  871 + LiteLoaderLogger.warning(th, "Error loading mod from %s", mod.getName());
  872 + if (container != LoadableMod.NONE && !this.disabledMods.contains(container)) this.disabledMods.add(container);
842 873 }
843 874 }
844 875 }
845 876  
846 877 /**
847   - * @param metaName
  878 + * @param identifier
848 879 * @param mod
  880 + * @param container
849 881 * @throws InstantiationException
850 882 * @throws IllegalAccessException
851 883 */
852   - protected void loadMod(String metaName, Class<? extends LiteMod> mod) throws InstantiationException, IllegalAccessException
  884 + protected void loadMod(String identifier, Class<? extends LiteMod> mod, LoadableMod<?> container) throws InstantiationException, IllegalAccessException
853 885 {
854   - LiteLoader.logInfo("Loading mod from %s", mod.getName());
  886 + LiteLoaderLogger.info("Loading mod from %s", mod.getName());
855 887  
856 888 LiteMod newMod = mod.newInstance();
857 889  
858 890 this.mods.add(newMod);
859 891 String modName = newMod.getName();
860   - if (modName == null && metaName != null) modName = metaName;
861   - LiteLoader.logInfo("Successfully added mod %s version %s", modName, newMod.getVersion());
  892 + if (modName == null && identifier != null) modName = identifier;
  893 + LiteLoaderLogger.info("Successfully added mod %s version %s", modName, newMod.getVersion());
862 894  
863   - // Get the mod file and register it as a resource pack if it exists
864   - ModFile modFile = this.enumerator.getModFile(mod);
865   - if (modFile != null)
  895 + // Register the mod as a resource pack if the container exists
  896 + if (container != null)
866 897 {
867   - this.disabledMods.remove(modFile);
868   -
869   - LiteLoader.logInfo("Adding \"%s\" to active resource pack set", modFile.getAbsolutePath());
  898 + LiteLoaderLogger.info("Adding \"%s\" to active resource pack set", container.getLocation());
870 899 if (modName != null)
871 900 {
872   - modFile.initResourcePack(modName);
  901 + container.initResourcePack(modName);
873 902  
874   - if (modFile.hasResourcePack() && this.registerModResourcePack((ResourcePack)modFile.getResourcePack()))
  903 + if (container.hasResourcePack() && this.registerModResourcePack((IResourcePack)container.getResourcePack()))
875 904 {
876   - LiteLoader.logInfo("Successfully added \"%s\" to active resource pack set", modFile.getAbsolutePath());
  905 + LiteLoaderLogger.info("Successfully added \"%s\" to active resource pack set", container.getLocation());
877 906 }
878 907 }
879 908 }
... ... @@ -898,7 +927,7 @@ public final class LiteLoader
898 927 }
899 928 catch (Throwable th)
900 929 {
901   - LiteLoader.getLogger().log(Level.WARNING, "Error initialising mod '" + mod.getName() + "'", th);
  930 + LiteLoaderLogger.warning(th, "Error initialising mod '%s'", mod.getName());
902 931 iter.remove();
903 932 }
904 933 }
... ... @@ -911,7 +940,7 @@ public final class LiteLoader
911 940 */
912 941 protected void initMod(LiteMod mod)
913 942 {
914   - LiteLoader.logInfo("Initialising mod %s version %s", mod.getName(), mod.getVersion());
  943 + LiteLoaderLogger.info("Initialising mod %s version %s", mod.getName(), mod.getVersion());
915 944  
916 945 // register mod config panel if configurable
917 946 this.configManager.registerMod(mod);
... ... @@ -922,7 +951,7 @@ public final class LiteLoader
922 951 }
923 952 catch (Throwable th)
924 953 {
925   - LiteLoader.logWarning("Error performing settings upgrade for %s. Settings may not be properly migrated", mod.getName());
  954 + LiteLoaderLogger.warning("Error performing settings upgrade for %s. Settings may not be properly migrated", mod.getName());
926 955 }
927 956  
928 957 // Init mod config if there is any
... ... @@ -949,18 +978,18 @@ public final class LiteLoader
949 978 String modKey = this.getModNameForConfig(mod.getClass(), mod.getName());
950 979 LiteLoaderVersion lastModVersion = LiteLoaderVersion.getVersionFromRevision(this.bootstrap.getLastKnownModRevision(modKey));
951 980  
952   - if (LiteLoaderBootstrap.VERSION.getLoaderRevision() > lastModVersion.getLoaderRevision())
  981 + if (LiteLoaderVersion.CURRENT.getLoaderRevision() > lastModVersion.getLoaderRevision())
953 982 {
954   - LiteLoader.logInfo("Performing config upgrade for mod %s. Upgrading %s to %s...", mod.getName(), lastModVersion, LiteLoaderBootstrap.VERSION);
  983 + LiteLoaderLogger.info("Performing config upgrade for mod %s. Upgrading %s to %s...", mod.getName(), lastModVersion, LiteLoaderVersion.CURRENT);
955 984  
956 985 // Migrate versioned config if any is present
957 986 this.configManager.migrateModConfig(mod, this.versionConfigFolder, this.inflectVersionedConfigPath(lastModVersion));
958 987  
959 988 // Let the mod upgrade
960   - mod.upgradeSettings(LiteLoaderBootstrap.VERSION.getMinecraftVersion(), this.versionConfigFolder, this.inflectVersionedConfigPath(lastModVersion));
  989 + mod.upgradeSettings(LiteLoaderVersion.CURRENT.getMinecraftVersion(), this.versionConfigFolder, this.inflectVersionedConfigPath(lastModVersion));
961 990  
962 991 this.bootstrap.storeLastKnownModRevision(modKey);
963   - LiteLoader.logInfo("Config upgrade succeeded for mod %s", mod.getName());
  992 + LiteLoaderLogger.info("Config upgrade succeeded for mod %s", mod.getName());
964 993 }
965 994 }
966 995  
... ... @@ -1001,9 +1030,9 @@ public final class LiteLoader
1001 1030 // Set the loader branding in ClientBrandRetriever using reflection
1002 1031 LiteLoaderBootstrap.setBranding("LiteLoader");
1003 1032  
1004   - if (this.soundManagerReloadInhibitor != null && this.soundManagerReloadInhibitor.isInhibited())
  1033 + if (this.soundHandlerReloadInhibitor != null && this.soundHandlerReloadInhibitor.isInhibited())
1005 1034 {
1006   - this.soundManagerReloadInhibitor.unInhibit(true);
  1035 + this.soundHandlerReloadInhibitor.unInhibit(true);
1007 1036 }
1008 1037 }
1009 1038  
... ... @@ -1013,9 +1042,9 @@ public final class LiteLoader
1013 1042 * @param netHandler
1014 1043 * @param loginPacket
1015 1044 */
1016   - void onLogin(NetHandler netHandler, Packet1Login loginPacket)
  1045 + void onJoinGame(INetHandler netHandler, S01PacketJoinGame loginPacket)
1017 1046 {
1018   - this.permissionsManager.onLogin(netHandler, loginPacket);
  1047 + this.permissionsManager.onJoinGame(netHandler, loginPacket);
1019 1048 }
1020 1049  
1021 1050 /**
... ... @@ -1031,37 +1060,18 @@ public final class LiteLoader
1031 1060 this.permissionsManager.scheduleRefresh();
1032 1061 }
1033 1062 }
1034   -
1035   - /**
1036   - * On render callback
1037   - */
1038   - void onRender()
1039   - {
1040   - if (this.paginateControls && this.minecraft.currentScreen != null && this.minecraft.currentScreen.getClass().equals(GuiControls.class))
1041   - {
1042   - try
1043   - {
1044   - // Try to get the parent screen entry from the existing screen
1045   - GuiScreen parentScreen = PrivateFields.guiControlsParentScreen.get((GuiControls)this.minecraft.currentScreen);
1046   - this.minecraft.displayGuiScreen(new GuiControlsPaginated(parentScreen, this.minecraft.gameSettings));
1047   - }
1048   - catch (Exception ex)
1049   - {
1050   - }
1051   - }
1052   - }
1053 1063  
1054 1064 /**
1055 1065 * @param partialTicks
1056 1066 */
1057 1067 void postRender(int mouseX, int mouseY, float partialTicks)
1058 1068 {
1059   - if (this.minecraft.currentScreen instanceof GuiMainMenu && ((this.displayModInfoScreenTab && !this.hideModInfoScreenTab) || (this.modInfoScreen != null && this.modInfoScreen.isTweeningOrOpen())))
  1069 + if (GuiScreenModInfo.isSupportedOnScreen(this.minecraft.currentScreen) && ((this.displayModInfoScreenTab && !this.hideModInfoScreenTab) || (this.modInfoScreen != null && this.modInfoScreen.isTweeningOrOpen())))
1060 1070 {
1061 1071 // If we're at the main menu, prepare the overlay
1062   - if (this.modInfoScreen == null || this.modInfoScreen.getMenu() != this.minecraft.currentScreen)
  1072 + if (this.modInfoScreen == null || this.modInfoScreen.getScreen() != this.minecraft.currentScreen)
1063 1073 {
1064   - this.modInfoScreen = new GuiScreenModInfo(this.minecraft, (GuiMainMenu)this.minecraft.currentScreen, this, this.enabledModsList, this.configManager, this.hideModInfoScreenTab);
  1074 + this.modInfoScreen = new GuiScreenModInfo(this.minecraft, this.minecraft.currentScreen, this, this.enabledModsList, this.configManager, this.hideModInfoScreenTab);
1065 1075 }
1066 1076  
1067 1077 this.modInfoScreen.drawScreen(mouseX, mouseY, partialTicks);
... ... @@ -1072,9 +1082,9 @@ public final class LiteLoader
1072 1082 this.modInfoScreen.release();
1073 1083 this.modInfoScreen = null;
1074 1084 }
1075   - else if (this.minecraft.currentScreen instanceof GuiMainMenu && Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) && Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) && Keyboard.isKeyDown(Keyboard.KEY_TAB))
  1085 + else if (GuiScreenModInfo.isSupportedOnScreen(this.minecraft.currentScreen) && Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) && Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) && Keyboard.isKeyDown(Keyboard.KEY_TAB))
1076 1086 {
1077   - this.displayModInfoScreen((GuiMainMenu)this.minecraft.currentScreen);
  1087 + this.displayModInfoScreen(this.minecraft.currentScreen);
1078 1088 }
1079 1089 }
1080 1090  
... ... @@ -1082,32 +1092,39 @@ public final class LiteLoader
1082 1092 * @param partialTicks
1083 1093 * @param inGame
1084 1094 */
1085   - void onTick(float partialTicks, boolean inGame)
  1095 + void onTick(boolean clock, float partialTicks, boolean inGame)
1086 1096 {
1087   - // Tick the permissions manager
1088   - this.permissionsManager.onTick(this.minecraft, partialTicks, inGame);
1089   -
1090   - // Tick the config manager
1091   - this.configManager.onTick();
1092   -
1093   - this.checkAndStoreKeyBindings();
1094   -
1095   - if (this.modInfoScreen != null && this.minecraft.currentScreen != this.modInfoScreen)
  1097 + if (clock)
1096 1098 {
1097   - this.modInfoScreen.updateScreen();
1098   - }
1099   -
1100   - if (!PrivateFields.gameIsRunning.get(this.minecraft))
1101   - {
1102   - this.onShutDown();
  1099 + // Tick the permissions manager
  1100 + this.minecraft.mcProfiler.startSection("permissionsmanager");
  1101 + this.permissionsManager.onTick(this.minecraft, partialTicks, inGame);
  1102 +
  1103 + // Tick the config manager
  1104 + this.minecraft.mcProfiler.endStartSection("configmanager");
  1105 + this.configManager.onTick();
  1106 +
  1107 + if (this.modInfoScreen != null && this.minecraft.currentScreen != this.modInfoScreen)
  1108 + {
  1109 + this.modInfoScreen.updateScreen();
  1110 + }
  1111 +
  1112 + if (!((IMinecraft)this.minecraft).isRunning())
  1113 + {
  1114 + this.onShutDown();
  1115 + }
1103 1116 }
  1117 +
  1118 + this.minecraft.mcProfiler.endStartSection("keybindings");
  1119 + this.input.onTick(clock);
  1120 + this.minecraft.mcProfiler.endSection();
1104 1121 }
1105 1122  
1106 1123 private void onShutDown()
1107 1124 {
1108   - LiteLoader.logInfo("LiteLoader is shutting down, syncing configuration");
  1125 + LiteLoaderLogger.info("LiteLoader is shutting down, syncing configuration");
1109 1126  
1110   - this.storeBindings();
  1127 + this.input.storeBindings();
1111 1128 this.configManager.syncConfig();
1112 1129 }
1113 1130  
... ... @@ -1115,71 +1132,12 @@ public final class LiteLoader
1115 1132 * Register a key for a mod
1116 1133 *
1117 1134 * @param binding
  1135 + * @deprecated Deprecated : use LiteLoader.getInput().registerKeyBinding() instead
1118 1136 */
  1137 + @Deprecated
1119 1138 public void registerModKey(KeyBinding binding)
1120 1139 {
1121   - LinkedList<KeyBinding> keyBindings = new LinkedList<KeyBinding>();
1122   - keyBindings.addAll(Arrays.asList(this.minecraft.gameSettings.keyBindings));
1123   -
1124   - if (!keyBindings.contains(binding))
1125   - {
1126   - if (this.keyMapSettings.containsKey(binding.keyDescription))
1127   - {
1128   - try
1129   - {
1130   - binding.keyCode = Integer.parseInt(this.keyMapSettings.getProperty(binding.keyDescription, String.valueOf(binding.keyCode)));
1131   - }
1132   - catch (NumberFormatException ex) {}
1133   - }
1134   -
1135   - keyBindings.add(binding);
1136   - this.minecraft.gameSettings.keyBindings = keyBindings.toArray(new KeyBinding[0]);
1137   - this.modKeyBindings.add(binding);
1138   -
1139   - this.updateBinding(binding);
1140   - this.storeBindings();
1141   - }
1142   - }
1143   -
1144   - /**
1145   - * Checks for changed mod keybindings and stores any that have changed
1146   - */
1147   - private void checkAndStoreKeyBindings()
1148   - {
1149   - boolean updated = false;
1150   -
1151   - for (KeyBinding binding : this.modKeyBindings)
1152   - {
1153   - if (binding.keyCode != this.storedModKeyBindings.get(binding))
1154   - {
1155   - this.updateBinding(binding);
1156   - updated = true;
1157   - }
1158   - }
1159   -
1160   - if (updated)
1161   - this.storeBindings();
1162   - }
1163   -
1164   - /**
1165   - * @param binding
1166   - */
1167   - private void updateBinding(KeyBinding binding)
1168   - {
1169   - this.keyMapSettings.setProperty(binding.keyDescription, String.valueOf(binding.keyCode));
1170   - this.storedModKeyBindings.put(binding, Integer.valueOf(binding.keyCode));
1171   - }
1172   -
1173   - /**
1174   - * Writes mod bindings to disk
1175   - */
1176   - private void storeBindings()
1177   - {
1178   - try
1179   - {
1180   - this.keyMapSettings.store(new FileWriter(this.keyMapSettingsFile), "Mod key mappings for LiteLoader mods, stored here to avoid losing settings stored in options.txt");
1181   - }
1182   - catch (IOException ex) {}
  1140 + this.input.registerKeyBinding(binding);
1183 1141 }
1184 1142  
1185 1143 /**
... ... @@ -1209,24 +1167,17 @@ public final class LiteLoader
1209 1167 }
1210 1168  
1211 1169 /**
1212   - * Display the "mod info" overlay over the specified main menu GUI
  1170 + * Display the "mod info" overlay over the specified GUI
1213 1171 *
1214 1172 * @param parentScreen
1215 1173 */
1216   - public void displayModInfoScreen(GuiMainMenu parentScreen)
1217   - {
1218   - this.modInfoScreen = new GuiScreenModInfo(this.minecraft, parentScreen, this, this.enabledModsList, this.configManager, this.hideModInfoScreenTab);
1219   - this.minecraft.displayGuiScreen(this.modInfoScreen);
1220   - }
1221   -
1222   - private static void logInfo(String string, Object... args)
  1174 + public void displayModInfoScreen(GuiScreen parentScreen)
1223 1175 {
1224   - LiteLoader.logger.info(String.format(string, args));
1225   - }
1226   -
1227   - private static void logWarning(String string, Object... args)
1228   - {
1229   - LiteLoader.logger.warning(String.format(string, args));
  1176 + if (GuiScreenModInfo.isSupportedOnScreen(parentScreen))
  1177 + {
  1178 + this.modInfoScreen = new GuiScreenModInfo(this.minecraft, parentScreen, this, this.enabledModsList, this.configManager, this.hideModInfoScreenTab);
  1179 + this.minecraft.displayGuiScreen(this.modInfoScreen);
  1180 + }
1230 1181 }
1231 1182  
1232 1183 /**
... ... @@ -1239,6 +1190,46 @@ public final class LiteLoader
1239 1190 CrashReport crashReport = (CrashReport)objCrashReport;
1240 1191 crashReport.getCategory().addCrashSectionCallable("Mod Pack", new CallableLiteLoaderBrand(crashReport));
1241 1192 crashReport.getCategory().addCrashSectionCallable("LiteLoader Mods", new CallableLiteLoaderMods(crashReport));
  1193 + crashReport.getCategory().addCrashSectionCallable("LaunchWrapper", new CallableLaunchWrapper(crashReport));
1242 1194 }
1243 1195 }
  1196 +
  1197 + static final void init(LiteLoaderBootstrap bootstrap, LiteLoaderEnumerator enumerator, EnabledModsList enabledModsList, LaunchClassLoader classLoader)
  1198 + {
  1199 + if (LiteLoader.instance == null)
  1200 + {
  1201 + LiteLoader.classLoader = classLoader;
  1202 +
  1203 + LiteLoader.instance = new LiteLoader(bootstrap, enumerator, enabledModsList);
  1204 + LiteLoader.instance.init();
  1205 + }
  1206 + }
  1207 +
  1208 + private void updateSharedModList()
  1209 + {
  1210 + Map<String, Map<String, String>> modList = this.enumerator.getSharedModList();
  1211 + if (modList == null) return;
  1212 +
  1213 + for (LiteMod mod : this.mods)
  1214 + {
  1215 + String modKey = String.format("%s:%s", LiteLoader.MOD_SYSTEM, this.getModIdentifier(mod));
  1216 + modList.put(modKey, this.packModInfoToMap(mod));
  1217 + }
  1218 + }
  1219 +
  1220 + private Map<String, String> packModInfoToMap(LiteMod mod)
  1221 + {
  1222 + Map<String, String> modInfo = new HashMap<String, String>();
  1223 + LoadableMod<?> container = this.getModContainer(mod);
  1224 +
  1225 + modInfo.put("modsystem", LiteLoader.MOD_SYSTEM);
  1226 + modInfo.put("id", this.getModIdentifier(mod));
  1227 + modInfo.put("version", mod.getVersion());
  1228 + modInfo.put("name", mod.getName());
  1229 + modInfo.put("url", container.getMetaValue("url", ""));
  1230 + modInfo.put("authors", container.getAuthor());
  1231 + modInfo.put("description", container.getDescription(LiteLoaderEnumerator.getModClassName(mod)));
  1232 +
  1233 + return modInfo;
  1234 + }
1244 1235 }
1245 1236 \ No newline at end of file
... ...
java/com/mumfrey/liteloader/core/LiteLoaderBootstrap.java
... ... @@ -6,20 +6,21 @@ import java.io.FileNotFoundException;
6 6 import java.io.FileWriter;
7 7 import java.io.IOException;
8 8 import java.io.InputStream;
9   -import java.io.PrintStream;
  9 +import java.io.Serializable;
10 10 import java.lang.reflect.Field;
11 11 import java.util.List;
12 12 import java.util.Properties;
13   -import java.util.logging.FileHandler;
14   -import java.util.logging.Level;
15   -import java.util.logging.Logger;
16   -import java.util.logging.StreamHandler;
  13 +
  14 +import org.apache.logging.log4j.core.Layout;
  15 +import org.apache.logging.log4j.core.Logger;
  16 +import org.apache.logging.log4j.core.appender.FileAppender;
  17 +import org.apache.logging.log4j.core.layout.PatternLayout;
17 18  
18 19 import net.minecraft.client.ClientBrandRetriever;
19 20 import net.minecraft.launchwrapper.LaunchClassLoader;
20 21  
21 22 import com.mumfrey.liteloader.launch.ILoaderBootstrap;
22   -import com.mumfrey.liteloader.util.log.LiteLoaderLogFormatter;
  23 +import com.mumfrey.liteloader.util.log.LiteLoaderLogger;
23 24  
24 25 /**
25 26 * LiteLoaderBootstrap is a proxy class which handles the early part of the LiteLoader startup process which
... ... @@ -39,19 +40,9 @@ class LiteLoaderBootstrap implements ILoaderBootstrap
39 40 /**
40 41 * Liteloader version
41 42 */
42   - public static final LiteLoaderVersion VERSION = LiteLoaderVersion.MC_1_6_4_R2;
43   -
44   - /**
45   - * Local logger reference
46   - */
47   - private static final Logger logger = Logger.getLogger("liteloader");
  43 + public static final LiteLoaderVersion VERSION = LiteLoaderVersion.CURRENT;
48 44  
49 45 /**
50   - * True to use stdout instead of stderr
51   - */
52   - private static boolean useStdOut;
53   -
54   - /**
55 46 * Base game directory, passed in from the tweaker
56 47 */
57 48 private final File gameDirectory;
... ... @@ -72,6 +63,11 @@ class LiteLoaderBootstrap implements ILoaderBootstrap
72 63 private final File modsFolder;
73 64  
74 65 /**
  66 + * "Mods" folder to use
  67 + */
  68 + private final File versionedModsFolder;
  69 +
  70 + /**
75 71 * Base "liteconfig" folder under which all other lite mod configs and liteloader configs are placed
76 72 */
77 73 private final File configBaseFolder;
... ... @@ -85,6 +81,11 @@ class LiteLoaderBootstrap implements ILoaderBootstrap
85 81 * File containing the properties
86 82 */
87 83 private File propertiesFile;
  84 +
  85 + /**
  86 + * JSON file containing the list of enabled/disabled mods by profile
  87 + */
  88 + private File enabledModsFile;
88 89  
89 90 /**
90 91 * Internal properties loaded from inside the jar
... ... @@ -108,22 +109,30 @@ class LiteLoaderBootstrap implements ILoaderBootstrap
108 109 private LiteLoaderEnumerator enumerator;
109 110  
110 111 /**
  112 + * List of mods passed into the command line
  113 + */
  114 + private EnabledModsList enabledModsList;
  115 +
  116 + /**
111 117 * @param gameDirectory
112 118 * @param assetsDirectory
113 119 * @param profile
114 120 */
115 121 public LiteLoaderBootstrap(File gameDirectory, File assetsDirectory, String profile)
116 122 {
117   - this.gameDirectory = gameDirectory;
118   - this.assetsDirectory = assetsDirectory;
119   - this.profile = profile;
  123 + this.gameDirectory = gameDirectory;
  124 + this.assetsDirectory = assetsDirectory;
  125 + this.profile = profile;
120 126  
121   - this.modsFolder = new File(this.gameDirectory, "mods");
122   - this.configBaseFolder = new File(this.gameDirectory, "liteconfig");
123   - this.logFile = new File(this.configBaseFolder, "liteloader.log");
124   - this.propertiesFile = new File(this.configBaseFolder, "liteloader.properties");
  127 + this.modsFolder = new File(this.gameDirectory, "mods");
  128 + this.versionedModsFolder = new File(this.modsFolder, LiteLoaderVersion.CURRENT.getMinecraftVersion());
  129 + this.configBaseFolder = new File(this.gameDirectory, "liteconfig");
  130 + this.logFile = new File(this.configBaseFolder, "liteloader.log");
  131 + this.propertiesFile = new File(this.configBaseFolder, "liteloader.properties");
  132 + this.enabledModsFile = new File(this.configBaseFolder, "liteloader.profiles.json");
125 133  
126 134 if (!this.modsFolder.exists()) this.modsFolder.mkdirs();
  135 + if (!this.versionedModsFolder.exists()) this.versionedModsFolder.mkdirs();
127 136 if (!this.configBaseFolder.exists()) this.configBaseFolder.mkdirs();
128 137 }
129 138  
... ... @@ -131,45 +140,43 @@ class LiteLoaderBootstrap implements ILoaderBootstrap
131 140 * @see com.mumfrey.liteloader.launch.ILoaderBootstrap#preInit(net.minecraft.launchwrapper.LaunchClassLoader, boolean)
132 141 */
133 142 @Override
134   - public void preInit(LaunchClassLoader classLoader, boolean loadTweaks)
  143 + public void preInit(LaunchClassLoader classLoader, boolean loadTweaks, List<String> modsToLoad)
135 144 {
  145 + LiteLoaderLogger.info("LiteLoader begin PREINIT...");
  146 +
136 147 // Set up the bootstrap
137 148 if (!this.prepare()) return;
138 149  
139   - LiteLoaderBootstrap.logInfo("LiteLoader %s starting up...", LiteLoaderBootstrap.VERSION.getLoaderVersion());
  150 + LiteLoaderLogger.info("LiteLoader %s starting up...", LiteLoaderVersion.CURRENT.getLoaderVersion());
140 151  
141 152 // Print the branding version if any was provided
142 153 if (this.branding != null)
143 154 {
144   - LiteLoaderBootstrap.logInfo("Active Pack: %s", this.branding);
  155 + LiteLoaderLogger.info("Active Pack: %s", this.branding);
145 156 }
146 157  
147   - LiteLoaderBootstrap.logInfo("Java reports OS=\"%s\"", System.getProperty("os.name").toLowerCase());
  158 + LiteLoaderLogger.info("Java reports OS=\"%s\"", System.getProperty("os.name").toLowerCase());
148 159  
149   - this.enumerator = new LiteLoaderEnumerator(this, classLoader, loadTweaks);
150   - this.enumerator.discoverMods();
  160 + this.enabledModsList = EnabledModsList.createFrom(this.enabledModsFile);
  161 + this.enabledModsList.processModsList(this.profile, modsToLoad);
151 162  
152   - LiteLoaderBootstrap.logInfo("LiteLoader PreInit completed");
  163 + this.enumerator = new LiteLoaderEnumerator(this, classLoader, this.enabledModsList, loadTweaks);
  164 + this.enumerator.discoverMods();
  165 +
  166 + LiteLoaderLogger.info("LiteLoader PREINIT complete");
153 167 }
154 168  
155 169 /* (non-Javadoc)
156 170 * @see com.mumfrey.liteloader.launch.ILoaderBootstrap#init(java.util.List, net.minecraft.launchwrapper.LaunchClassLoader)
157 171 */
158 172 @Override
159   - public void init(List<String> modsToLoad, LaunchClassLoader classLoader)
  173 + public void init(LaunchClassLoader classLoader)
160 174 {
161 175 // PreInit failed
162 176 if (this.enumerator == null) return;
163 177  
164   - try
165   - {
166   - if (LiteLoaderBootstrap.logger.getHandlers().length < 1)
167   - this.prepareLogger();
168   - }
169   - catch (Exception ex) {}
170   -
171   - LiteLoaderBootstrap.logger.info("Beginning LiteLoader Init...");
172   - LiteLoader.init(this, this.enumerator, modsToLoad, classLoader);
  178 + LiteLoaderLogger.info("LiteLoader begin INIT...");
  179 + LiteLoader.init(this, this.enumerator, this.enabledModsList, classLoader);
173 180 }
174 181  
175 182 /* (non-Javadoc)
... ... @@ -181,15 +188,8 @@ class LiteLoaderBootstrap implements ILoaderBootstrap
181 188 // PreInit failed
182 189 if (this.enumerator == null) return;
183 190  
184   - try
185   - {
186   - if (LiteLoaderBootstrap.logger.getHandlers().length < 1)
187   - this.prepareLogger();
188   - }
189   - catch (Exception ex) {}
190   -
191   - LiteLoaderBootstrap.logger.info("Beginning LiteLoader PostInit...");
192   - LiteLoader.postInit();
  191 + LiteLoaderLogger.info("LiteLoader begin POSTINIT...");
  192 + LiteLoader.getInstance().postInit();
193 193 }
194 194  
195 195 /**
... ... @@ -217,7 +217,7 @@ class LiteLoaderBootstrap implements ILoaderBootstrap
217 217 }
218 218 catch (Throwable th)
219 219 {
220   - LiteLoaderBootstrap.logger.log(Level.SEVERE, "Error initialising LiteLoader Bootstrap", th);
  220 + LiteLoaderLogger.severe(th, "Error initialising LiteLoader Bootstrap");
221 221 return false;
222 222 }
223 223  
... ... @@ -230,26 +230,11 @@ class LiteLoaderBootstrap implements ILoaderBootstrap
230 230 */
231 231 private void prepareLogger() throws SecurityException, IOException
232 232 {
233   - LiteLoaderBootstrap.logger.setUseParentHandlers(false);
234   - LiteLoaderBootstrap.useStdOut = System.getProperty("liteloader.log", "stderr").equalsIgnoreCase("stdout") || this.localProperties.getProperty("log", "stderr").equalsIgnoreCase("stdout");
235   -
236   - StreamHandler consoleHandler = useStdOut ? new com.mumfrey.liteloader.util.log.ConsoleHandler() : new java.util.logging.ConsoleHandler();
237   - consoleHandler.setFormatter(new LiteLoaderLogFormatter(false));
238   - LiteLoaderBootstrap.logger.addHandler(consoleHandler);
239   -
240   - FileHandler logFileHandler = new FileHandler(this.logFile.getAbsolutePath());
241   - logFileHandler.setFormatter(new LiteLoaderLogFormatter(true));
242   - LiteLoaderBootstrap.logger.addHandler(logFileHandler);
243   - }
244   -
245   - /**
246   - * Get the output stream which we are using for console output
247   - *
248   - * @return
249   - */
250   - public static final PrintStream getConsoleStream()
251   - {
252   - return LiteLoaderBootstrap.useStdOut ? System.out : System.err;
  233 + Logger logger = LiteLoaderLogger.getLogger();
  234 + Layout<? extends Serializable> layout = PatternLayout.createLayout("[%d{HH:mm:ss}] [%t/%level]: %msg%n", logger.getContext().getConfiguration(), null, "UTF-8", "True");
  235 + FileAppender fileAppender = FileAppender.createAppender(this.logFile.getAbsolutePath(), "False", "False", "LiteLoader", "True", "True", "True", layout, null, "False", "", logger.getContext().getConfiguration());
  236 + fileAppender.start();
  237 + logger.addAppender(fileAppender);
253 238 }
254 239  
255 240 /**
... ... @@ -314,11 +299,11 @@ class LiteLoaderBootstrap implements ILoaderBootstrap
314 299 {
315 300 try
316 301 {
317   - this.localProperties.store(new FileWriter(this.propertiesFile), String.format("Properties for LiteLoader %s", LiteLoaderBootstrap.VERSION));
  302 + this.localProperties.store(new FileWriter(this.propertiesFile), String.format("Properties for LiteLoader %s", LiteLoaderVersion.CURRENT));
318 303 }
319 304 catch (Throwable th)
320 305 {
321   - LiteLoaderBootstrap.logger.log(Level.WARNING, "Error writing liteloader properties", th);
  306 + LiteLoaderLogger.warning(th, "Error writing liteloader properties");
322 307 }
323 308 }
324 309  
... ... @@ -355,6 +340,14 @@ class LiteLoaderBootstrap implements ILoaderBootstrap
355 340 }
356 341  
357 342 /**
  343 + * Get the mods folder
  344 + */
  345 + public File getVersionedModsFolder()
  346 + {
  347 + return this.versionedModsFolder;
  348 + }
  349 +
  350 + /**
358 351 * Get the base "liteconfig" folder
359 352 */
360 353 public File getConfigBaseFolder()
... ... @@ -369,6 +362,7 @@ class LiteLoaderBootstrap implements ILoaderBootstrap
369 362 * @param defaultValue
370 363 * @return
371 364 */
  365 + @Override
372 366 public boolean getAndStoreBooleanProperty(String propertyName, boolean defaultValue)
373 367 {
374 368 boolean result = this.localProperties.getProperty(propertyName, String.valueOf(defaultValue)).equalsIgnoreCase("true");
... ... @@ -377,11 +371,25 @@ class LiteLoaderBootstrap implements ILoaderBootstrap
377 371 }
378 372  
379 373 /**
  374 + * Get a boolean propery from the properties file and also write the new value back to the properties file
  375 + *
  376 + * @param propertyName
  377 + * @param defaultValue
  378 + * @return
  379 + */
  380 + @Override
  381 + public boolean getBooleanProperty(String propertyName)
  382 + {
  383 + return this.localProperties.getProperty(propertyName, "false").equalsIgnoreCase("true");
  384 + }
  385 +
  386 + /**
380 387 * Set a boolean property
381 388 *
382 389 * @param propertyName
383 390 * @param value
384 391 */
  392 + @Override
385 393 public void setBooleanProperty(String propertyName, boolean value)
386 394 {
387 395 this.localProperties.setProperty(propertyName, String.valueOf(value));
... ... @@ -396,7 +404,7 @@ class LiteLoaderBootstrap implements ILoaderBootstrap
396 404 {
397 405 if (this.localProperties != null)
398 406 {
399   - this.localProperties.setProperty(modKey, String.valueOf(LiteLoaderBootstrap.VERSION.getLoaderRevision()));
  407 + this.localProperties.setProperty(modKey, String.valueOf(LiteLoaderVersion.CURRENT.getLoaderRevision()));
400 408 this.writeProperties();
401 409 }
402 410 }
... ... @@ -458,16 +466,7 @@ class LiteLoaderBootstrap implements ILoaderBootstrap
458 466 }
459 467 catch (Throwable th)
460 468 {
461   - LiteLoaderBootstrap.logger.log(Level.WARNING, "Setting branding failed", th);
  469 + LiteLoaderLogger.warning(th, "Setting branding failed");
462 470 }
463 471 }
464   -
465   - /**
466   - * @param string
467   - * @param args
468   - */
469   - private static void logInfo(String string, Object... args)
470   - {
471   - LiteLoaderBootstrap.logger.info(String.format(string, args));
472   - }
473 472 }
... ...