Commit 71879cd01475b79460697b9f8c167835b7306866
1 parent
58356f00
LiteLoader 1.6.2_04 - fixed non-saving key bindings and added getLoadedMods() fu…
…nction to list all successfully loaded mods
Showing
5 changed files
with
142 additions
and
36 deletions
java/com/mumfrey/liteloader/core/LiteLoader.java
| 1 | package com.mumfrey.liteloader.core; | 1 | package com.mumfrey.liteloader.core; |
| 2 | 2 | ||
| 3 | -import java.io.BufferedReader; | ||
| 4 | -import java.io.File; | ||
| 5 | -import java.io.FileInputStream; | ||
| 6 | -import java.io.FileNotFoundException; | ||
| 7 | -import java.io.FileWriter; | ||
| 8 | -import java.io.FilenameFilter; | ||
| 9 | -import java.io.IOException; | ||
| 10 | -import java.io.InputStream; | ||
| 11 | -import java.io.InputStreamReader; | ||
| 12 | -import java.io.PrintStream; | ||
| 13 | -import java.io.UnsupportedEncodingException; | 3 | +import java.io.*; |
| 14 | import java.lang.reflect.Method; | 4 | import java.lang.reflect.Method; |
| 15 | import java.net.MalformedURLException; | 5 | import java.net.MalformedURLException; |
| 16 | import java.net.URISyntaxException; | 6 | import java.net.URISyntaxException; |
| @@ -19,6 +9,8 @@ import java.net.URLClassLoader; | @@ -19,6 +9,8 @@ import java.net.URLClassLoader; | ||
| 19 | import java.net.URLDecoder; | 9 | import java.net.URLDecoder; |
| 20 | import java.nio.charset.Charset; | 10 | import java.nio.charset.Charset; |
| 21 | import java.util.ArrayList; | 11 | import java.util.ArrayList; |
| 12 | +import java.util.Arrays; | ||
| 13 | +import java.util.Collections; | ||
| 22 | import java.util.HashMap; | 14 | import java.util.HashMap; |
| 23 | import java.util.Iterator; | 15 | import java.util.Iterator; |
| 24 | import java.util.LinkedList; | 16 | import java.util.LinkedList; |
| @@ -63,14 +55,14 @@ import com.mumfrey.liteloader.util.PrivateFields; | @@ -63,14 +55,14 @@ import com.mumfrey.liteloader.util.PrivateFields; | ||
| 63 | * lightweight mods | 55 | * lightweight mods |
| 64 | * | 56 | * |
| 65 | * @author Adam Mummery-Smith | 57 | * @author Adam Mummery-Smith |
| 66 | - * @version 1.6.2_03 | 58 | + * @version 1.6.2_04 |
| 67 | */ | 59 | */ |
| 68 | public final class LiteLoader implements FilenameFilter, IPlayerUsage | 60 | public final class LiteLoader implements FilenameFilter, IPlayerUsage |
| 69 | { | 61 | { |
| 70 | /** | 62 | /** |
| 71 | * Liteloader version | 63 | * Liteloader version |
| 72 | */ | 64 | */ |
| 73 | - private static final LiteLoaderVersion VERSION = LiteLoaderVersion.MC_1_6_2_R2; | 65 | + private static final LiteLoaderVersion VERSION = LiteLoaderVersion.MC_1_6_2_R3; |
| 74 | 66 | ||
| 75 | /** | 67 | /** |
| 76 | * Maximum recursion depth for mod discovery | 68 | * Maximum recursion depth for mod discovery |
| @@ -191,11 +183,16 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -191,11 +183,16 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
| 191 | private String loadedModsList = "none"; | 183 | private String loadedModsList = "none"; |
| 192 | 184 | ||
| 193 | /** | 185 | /** |
| 194 | - * Global list of mods which we have loaded | 186 | + * Global list of mods which we can loaded |
| 195 | */ | 187 | */ |
| 196 | private LinkedList<LiteMod> mods = new LinkedList<LiteMod>(); | 188 | private LinkedList<LiteMod> mods = new LinkedList<LiteMod>(); |
| 197 | 189 | ||
| 198 | /** | 190 | /** |
| 191 | + * Global list of mods which we have loaded | ||
| 192 | + */ | ||
| 193 | + private LinkedList<LiteMod> loadedMods = new LinkedList<LiteMod>(); | ||
| 194 | + | ||
| 195 | + /** | ||
| 199 | * List of mods which implement Tickable interface and will receive tick | 196 | * List of mods which implement Tickable interface and will receive tick |
| 200 | * events | 197 | * events |
| 201 | */ | 198 | */ |
| @@ -294,12 +291,42 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -294,12 +291,42 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
| 294 | */ | 291 | */ |
| 295 | private static PermissionsManagerClient permissionsManager = PermissionsManagerClient.getInstance(); | 292 | private static PermissionsManagerClient permissionsManager = PermissionsManagerClient.getInstance(); |
| 296 | 293 | ||
| 294 | + /** | ||
| 295 | + * True while initialising mods if we need to do a resource manager reload once the process is completed | ||
| 296 | + */ | ||
| 297 | private boolean pendingResourceReload; | 297 | private boolean pendingResourceReload; |
| 298 | 298 | ||
| 299 | + /** | ||
| 300 | + * Read from the properties file, if true we will inhibit the sound manager reload during startup to avoid getting in trouble with OpenAL | ||
| 301 | + */ | ||
| 299 | private boolean inhibitSoundManagerReload = true; | 302 | private boolean inhibitSoundManagerReload = true; |
| 300 | 303 | ||
| 304 | + /** | ||
| 305 | + * 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 | ||
| 306 | + */ | ||
| 301 | private SoundManagerReloadInhibitor soundManagerReloadInhibitor; | 307 | private SoundManagerReloadInhibitor soundManagerReloadInhibitor; |
| 302 | 308 | ||
| 309 | + /** | ||
| 310 | + * File in which we will store mod key mappings | ||
| 311 | + */ | ||
| 312 | + private File keyMapSettingsFile = null; | ||
| 313 | + | ||
| 314 | + /** | ||
| 315 | + * Properties object which stores mod key mappings | ||
| 316 | + */ | ||
| 317 | + private Properties keyMapSettings = new Properties(); | ||
| 318 | + | ||
| 319 | + /** | ||
| 320 | + * List of all registered mod keys | ||
| 321 | + */ | ||
| 322 | + private List<KeyBinding> modKeys = new ArrayList<KeyBinding>(); | ||
| 323 | + | ||
| 324 | + /** | ||
| 325 | + * Map of mod key bindings to their key codes, stored so that we don't need to cast from | ||
| 326 | + * string in the properties file every tick | ||
| 327 | + */ | ||
| 328 | + private Map<KeyBinding, Integer> storedModKeyBindings = new HashMap<KeyBinding, Integer>(); | ||
| 329 | + | ||
| 303 | public static final void init(File gameDirectory, File assetsDirectory, String profile, List<String> modNameFilter) | 330 | public static final void init(File gameDirectory, File assetsDirectory, String profile, List<String> modNameFilter) |
| 304 | { | 331 | { |
| 305 | if (instance == null) | 332 | if (instance == null) |
| @@ -579,6 +606,17 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -579,6 +606,17 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
| 579 | { | 606 | { |
| 580 | this.localProperties = new Properties(this.internalProperties); | 607 | this.localProperties = new Properties(this.internalProperties); |
| 581 | } | 608 | } |
| 609 | + | ||
| 610 | + this.keyMapSettingsFile = new File(this.configBaseFolder, "litemodkeys.properties"); | ||
| 611 | + | ||
| 612 | + if (this.keyMapSettingsFile.exists()) | ||
| 613 | + { | ||
| 614 | + try | ||
| 615 | + { | ||
| 616 | + this.keyMapSettings.load(new FileReader(this.keyMapSettingsFile)); | ||
| 617 | + } | ||
| 618 | + catch (Exception ex) {} | ||
| 619 | + } | ||
| 582 | } | 620 | } |
| 583 | 621 | ||
| 584 | /** | 622 | /** |
| @@ -707,7 +745,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -707,7 +745,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
| 707 | } | 745 | } |
| 708 | 746 | ||
| 709 | /** | 747 | /** |
| 710 | - * Used for crash reporting | 748 | + * Used for crash reporting, returns a text list of all loaded mods |
| 711 | * | 749 | * |
| 712 | * @return List of loaded mods as a string | 750 | * @return List of loaded mods as a string |
| 713 | */ | 751 | */ |
| @@ -717,6 +755,14 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -717,6 +755,14 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
| 717 | } | 755 | } |
| 718 | 756 | ||
| 719 | /** | 757 | /** |
| 758 | + * Get a list containing all loaded mods | ||
| 759 | + */ | ||
| 760 | + public List<LiteMod> getLoadedMods() | ||
| 761 | + { | ||
| 762 | + return Collections.unmodifiableList(this.loadedMods); | ||
| 763 | + } | ||
| 764 | + | ||
| 765 | + /** | ||
| 720 | * Used to get the name of the modpack being used | 766 | * Used to get the name of the modpack being used |
| 721 | * | 767 | * |
| 722 | * @return name of the modpack in use or null if no pack | 768 | * @return name of the modpack in use or null if no pack |
| @@ -1192,7 +1238,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1192,7 +1238,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
| 1192 | logger.info("Discovered " + this.modsToLoad.size() + " total mod(s)"); | 1238 | logger.info("Discovered " + this.modsToLoad.size() + " total mod(s)"); |
| 1193 | 1239 | ||
| 1194 | this.pendingResourceReload = false; | 1240 | this.pendingResourceReload = false; |
| 1195 | - this.soundManagerReloadInhibitor = new SoundManagerReloadInhibitor((SimpleReloadableResourceManager)minecraft.getResourceManager(), minecraft.sndManager); | 1241 | + this.soundManagerReloadInhibitor = new SoundManagerReloadInhibitor((SimpleReloadableResourceManager)minecraft.func_110442_L(), minecraft.sndManager); // TODO adamsrc -> getResourceManager |
| 1196 | if (this.inhibitSoundManagerReload) this.soundManagerReloadInhibitor.inhibit(); | 1242 | if (this.inhibitSoundManagerReload) this.soundManagerReloadInhibitor.inhibit(); |
| 1197 | 1243 | ||
| 1198 | for (Class<? extends LiteMod> mod : this.modsToLoad.values()) | 1244 | for (Class<? extends LiteMod> mod : this.modsToLoad.values()) |
| @@ -1353,6 +1399,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1353,6 +1399,7 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
| 1353 | permissionsManager.registerPermissible((Permissible)mod); | 1399 | permissionsManager.registerPermissible((Permissible)mod); |
| 1354 | } | 1400 | } |
| 1355 | 1401 | ||
| 1402 | + this.loadedMods.add(mod); | ||
| 1356 | this.loadedModsList += String.format("\n - %s version %s", modName, mod.getVersion()); | 1403 | this.loadedModsList += String.format("\n - %s version %s", modName, mod.getVersion()); |
| 1357 | loadedModsCount++; | 1404 | loadedModsCount++; |
| 1358 | } | 1405 | } |
| @@ -1889,9 +1936,13 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -1889,9 +1936,13 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
| 1889 | // Flag indicates whether we are in game at the moment | 1936 | // Flag indicates whether we are in game at the moment |
| 1890 | boolean inGame = this.minecraft.renderViewEntity != null && this.minecraft.renderViewEntity.worldObj != null; | 1937 | boolean inGame = this.minecraft.renderViewEntity != null && this.minecraft.renderViewEntity.worldObj != null; |
| 1891 | 1938 | ||
| 1892 | - // Tick the permissions manager | ||
| 1893 | if (tick) | 1939 | if (tick) |
| 1940 | + { | ||
| 1941 | + // Tick the permissions manager | ||
| 1894 | permissionsManager.onTick(this.minecraft, partialTicks, inGame); | 1942 | permissionsManager.onTick(this.minecraft, partialTicks, inGame); |
| 1943 | + | ||
| 1944 | + this.checkAndStoreKeyBindings(); | ||
| 1945 | + } | ||
| 1895 | 1946 | ||
| 1896 | // Iterate tickable mods | 1947 | // Iterate tickable mods |
| 1897 | for (Tickable tickable : this.tickListeners) | 1948 | for (Tickable tickable : this.tickListeners) |
| @@ -2137,4 +2188,70 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | @@ -2137,4 +2188,70 @@ public final class LiteLoader implements FilenameFilter, IPlayerUsage | ||
| 2137 | PrivateFields.minecraftProfiler.setFinal(this.minecraft, this.profilerHook); | 2188 | PrivateFields.minecraftProfiler.setFinal(this.minecraft, this.profilerHook); |
| 2138 | } | 2189 | } |
| 2139 | } | 2190 | } |
| 2191 | + | ||
| 2192 | + public void registerModKey(KeyBinding binding) | ||
| 2193 | + { | ||
| 2194 | + LinkedList<KeyBinding> keyBindings = new LinkedList<KeyBinding>(); | ||
| 2195 | + keyBindings.addAll(Arrays.asList(this.minecraft.gameSettings.keyBindings)); | ||
| 2196 | + | ||
| 2197 | + if (!keyBindings.contains(binding)) | ||
| 2198 | + { | ||
| 2199 | + if (this.keyMapSettings.containsKey(binding.keyDescription)) | ||
| 2200 | + { | ||
| 2201 | + try | ||
| 2202 | + { | ||
| 2203 | + binding.keyCode = Integer.parseInt(this.keyMapSettings.getProperty(binding.keyDescription, String.valueOf(binding.keyCode))); | ||
| 2204 | + } | ||
| 2205 | + catch (NumberFormatException ex) {} | ||
| 2206 | + } | ||
| 2207 | + | ||
| 2208 | + keyBindings.add(binding); | ||
| 2209 | + this.minecraft.gameSettings.keyBindings = keyBindings.toArray(new KeyBinding[0]); | ||
| 2210 | + this.modKeys.add(binding); | ||
| 2211 | + | ||
| 2212 | + this.updateBinding(binding); | ||
| 2213 | + this.storeBindings(); | ||
| 2214 | + } | ||
| 2215 | + } | ||
| 2216 | + | ||
| 2217 | + /** | ||
| 2218 | + * Checks for changed mod keybindings and stores any that have changed | ||
| 2219 | + */ | ||
| 2220 | + private void checkAndStoreKeyBindings() | ||
| 2221 | + { | ||
| 2222 | + boolean updated = false; | ||
| 2223 | + | ||
| 2224 | + for (KeyBinding binding : this.modKeys) | ||
| 2225 | + { | ||
| 2226 | + if (binding.keyCode != this.storedModKeyBindings.get(binding)) | ||
| 2227 | + { | ||
| 2228 | + this.updateBinding(binding); | ||
| 2229 | + updated = true; | ||
| 2230 | + } | ||
| 2231 | + } | ||
| 2232 | + | ||
| 2233 | + if (updated) | ||
| 2234 | + this.storeBindings(); | ||
| 2235 | + } | ||
| 2236 | + | ||
| 2237 | + /** | ||
| 2238 | + * @param binding | ||
| 2239 | + */ | ||
| 2240 | + private void updateBinding(KeyBinding binding) | ||
| 2241 | + { | ||
| 2242 | + this.keyMapSettings.setProperty(binding.keyDescription, String.valueOf(binding.keyCode)); | ||
| 2243 | + this.storedModKeyBindings.put(binding, Integer.valueOf(binding.keyCode)); | ||
| 2244 | + } | ||
| 2245 | + | ||
| 2246 | + /** | ||
| 2247 | + * Writes mod bindings to disk | ||
| 2248 | + */ | ||
| 2249 | + protected void storeBindings() | ||
| 2250 | + { | ||
| 2251 | + try | ||
| 2252 | + { | ||
| 2253 | + this.keyMapSettings.store(new FileWriter(this.keyMapSettingsFile), "Mod key mappings for LiteLoader mods, stored here to avoid losing settings stored in options.txt"); | ||
| 2254 | + } | ||
| 2255 | + catch (IOException ex) {} | ||
| 2256 | + } | ||
| 2140 | } | 2257 | } |
| 2141 | \ No newline at end of file | 2258 | \ No newline at end of file |
java/com/mumfrey/liteloader/core/LiteLoaderVersion.java
| @@ -7,7 +7,7 @@ import java.util.Set; | @@ -7,7 +7,7 @@ import java.util.Set; | ||
| 7 | * LiteLoader version table | 7 | * LiteLoader version table |
| 8 | * | 8 | * |
| 9 | * @author Adam Mummery-Smith | 9 | * @author Adam Mummery-Smith |
| 10 | - * @version 1.6.2_02 | 10 | + * @version 1.6.2_04 |
| 11 | */ | 11 | */ |
| 12 | public enum LiteLoaderVersion | 12 | public enum LiteLoaderVersion |
| 13 | { | 13 | { |
| @@ -17,7 +17,8 @@ public enum LiteLoaderVersion | @@ -17,7 +17,8 @@ public enum LiteLoaderVersion | ||
| 17 | MC_1_6_1_R0(11, "1.6.1", "1.6.1", "1.6.1", "1.6.r1"), | 17 | MC_1_6_1_R0(11, "1.6.1", "1.6.1", "1.6.1", "1.6.r1"), |
| 18 | MC_1_6_2_R0(12, "1.6.2", "1.6.2", "1.6.2", "1.6.r2"), | 18 | MC_1_6_2_R0(12, "1.6.2", "1.6.2", "1.6.2", "1.6.r2"), |
| 19 | MC_1_6_2_R1(13, "1.6.2", "1.6.2_02", "1.6.2", "1.6.r2"), | 19 | MC_1_6_2_R1(13, "1.6.2", "1.6.2_02", "1.6.2", "1.6.r2"), |
| 20 | - MC_1_6_2_R2(13, "1.6.2", "1.6.2_03", "1.6.2", "1.6.r2"); | 20 | + MC_1_6_2_R2(13, "1.6.2", "1.6.2_03", "1.6.2", "1.6.r2"), |
| 21 | + MC_1_6_2_R3(13, "1.6.2", "1.6.2_04", "1.6.2", "1.6.r2"); | ||
| 21 | 22 | ||
| 22 | private int revision; | 23 | private int revision; |
| 23 | 24 |
java/com/mumfrey/liteloader/core/SoundManagerReloadInhibitor.java
| @@ -103,7 +103,7 @@ public class SoundManagerReloadInhibitor | @@ -103,7 +103,7 @@ public class SoundManagerReloadInhibitor | ||
| 103 | if (reload) | 103 | if (reload) |
| 104 | { | 104 | { |
| 105 | LiteLoader.getLogger().info("Reloading sound manager"); | 105 | LiteLoader.getLogger().info("Reloading sound manager"); |
| 106 | - this.soundManager.onReload(this.resourceManager); | 106 | + this.soundManager.func_110549_a(this.resourceManager); // TODO adamsrc -> onReload |
| 107 | } | 107 | } |
| 108 | 108 | ||
| 109 | this.inhibited = false; | 109 | this.inhibited = false; |
java/com/mumfrey/liteloader/gui/GuiControlsPaginated.java
| @@ -105,17 +105,17 @@ public class GuiControlsPaginated extends GuiScreen | @@ -105,17 +105,17 @@ public class GuiControlsPaginated extends GuiScreen | ||
| 105 | { | 105 | { |
| 106 | this.getLegacyControlList().add(this.btnNext = new GuiButton(201, this.getWidth() / 2 - 51, buttonY, 50, 20, ">>")); | 106 | this.getLegacyControlList().add(this.btnNext = new GuiButton(201, this.getWidth() / 2 - 51, buttonY, 50, 20, ">>")); |
| 107 | this.getLegacyControlList().add(this.btnPrevious = new GuiButton(202, this.getWidth() / 2 - 103, buttonY, 50, 20, "<<")); | 107 | this.getLegacyControlList().add(this.btnPrevious = new GuiButton(202, this.getWidth() / 2 - 103, buttonY, 50, 20, "<<")); |
| 108 | - this.getLegacyControlList().add(new GuiButton(200, this.getWidth() / 2 + 1, buttonY, 100, 20, I18n.func_135053_a("gui.done"))); | 108 | + this.getLegacyControlList().add(new GuiButton(200, this.getWidth() / 2 + 1, buttonY, 100, 20, I18n.func_135053_a("gui.done"))); // TODO adamsrc -> translate |
| 109 | 109 | ||
| 110 | this.btnNext.enabled = this.startIndex < this.endIndex; | 110 | this.btnNext.enabled = this.startIndex < this.endIndex; |
| 111 | this.btnPrevious.enabled = this.startIndex > 0; | 111 | this.btnPrevious.enabled = this.startIndex > 0; |
| 112 | } | 112 | } |
| 113 | else | 113 | else |
| 114 | { | 114 | { |
| 115 | - this.getLegacyControlList().add(new GuiButton(200, this.getWidth() / 2 - 100, buttonY, I18n.func_135053_a("gui.done"))); | 115 | + this.getLegacyControlList().add(new GuiButton(200, this.getWidth() / 2 - 100, buttonY, I18n.func_135053_a("gui.done"))); // TODO adamsrc -> translate |
| 116 | } | 116 | } |
| 117 | 117 | ||
| 118 | - this.screenTitle = I18n.func_135053_a("controls.title"); | 118 | + this.screenTitle = I18n.func_135053_a("controls.title"); // TODO adamsrc -> translate |
| 119 | } | 119 | } |
| 120 | 120 | ||
| 121 | /** | 121 | /** |
java/com/mumfrey/liteloader/util/ModUtilities.java
| @@ -120,19 +120,7 @@ public abstract class ModUtilities | @@ -120,19 +120,7 @@ public abstract class ModUtilities | ||
| 120 | */ | 120 | */ |
| 121 | public static void registerKey(KeyBinding newBinding) | 121 | public static void registerKey(KeyBinding newBinding) |
| 122 | { | 122 | { |
| 123 | - Minecraft mc = Minecraft.getMinecraft(); | ||
| 124 | - | ||
| 125 | - if (mc == null || mc.gameSettings == null) return; | ||
| 126 | - | ||
| 127 | - LinkedList<KeyBinding> keyBindings = new LinkedList<KeyBinding>(); | ||
| 128 | - keyBindings.addAll(Arrays.asList(mc.gameSettings.keyBindings)); | ||
| 129 | - | ||
| 130 | - if (!keyBindings.contains(newBinding)) | ||
| 131 | - { | ||
| 132 | - keyBindings.add(newBinding); | ||
| 133 | - mc.gameSettings.keyBindings = keyBindings.toArray(new KeyBinding[0]); | ||
| 134 | - mc.gameSettings.loadOptions(); | ||
| 135 | - } | 123 | + LiteLoader.getInstance().registerModKey(newBinding); |
| 136 | } | 124 | } |
| 137 | 125 | ||
| 138 | /** | 126 | /** |