Commit cf4e662ff064db44d1acd9f50cf1d1b3b63f63cb
1 parent
62a9bc25
LiteLoader 1.6.4_02 - experimental - make enable/disable mods public, minor refactoring
Showing
3 changed files
with
188 additions
and
94 deletions
java/com/mumfrey/liteloader/core/LiteLoader.java
| ... | ... | @@ -133,7 +133,7 @@ public final class LiteLoader |
| 133 | 133 | private String loadedModsList = "none"; |
| 134 | 134 | |
| 135 | 135 | /** |
| 136 | - * Global list of mods which we can loaded | |
| 136 | + * Global list of mods which we can load | |
| 137 | 137 | */ |
| 138 | 138 | private final LinkedList<LiteMod> mods = new LinkedList<LiteMod>(); |
| 139 | 139 | |
| ... | ... | @@ -354,7 +354,7 @@ public final class LiteLoader |
| 354 | 354 | this.events.initHooks(); |
| 355 | 355 | this.startupComplete = true; |
| 356 | 356 | |
| 357 | - this.enabledModsList.save(); | |
| 357 | + this.enabledModsList.saveTo(this.enabledModsFile); | |
| 358 | 358 | this.bootstrap.writeProperties(); |
| 359 | 359 | } |
| 360 | 360 | |
| ... | ... | @@ -572,23 +572,6 @@ public final class LiteLoader |
| 572 | 572 | } |
| 573 | 573 | |
| 574 | 574 | /** |
| 575 | - * Used by the version upgrade code, gets a version of the mod name suitable | |
| 576 | - * for inclusion in the properties file | |
| 577 | - * | |
| 578 | - * @param modName | |
| 579 | - * @return | |
| 580 | - */ | |
| 581 | - private String getModNameForConfig(Class<? extends LiteMod> modClass, String modName) | |
| 582 | - { | |
| 583 | - if (modName == null || modName.isEmpty()) | |
| 584 | - { | |
| 585 | - modName = modClass.getSimpleName().toLowerCase(); | |
| 586 | - } | |
| 587 | - | |
| 588 | - return String.format("version.%s", modName.toLowerCase().replaceAll("[^a-z0-9_\\-\\.]", "")); | |
| 589 | - } | |
| 590 | - | |
| 591 | - /** | |
| 592 | 575 | * Get a reference to a loaded mod, if the mod exists |
| 593 | 576 | * |
| 594 | 577 | * @param modName Mod's name, meta name or class name |
| ... | ... | @@ -713,8 +696,83 @@ public final class LiteLoader |
| 713 | 696 | { |
| 714 | 697 | return this.enumerator.getModMetaName(modClass); |
| 715 | 698 | } |
| 699 | + | |
| 700 | + /** | |
| 701 | + * Get the mod "name" metadata key, this is used for versioning, exclusivity, and enablement checks | |
| 702 | + * | |
| 703 | + * @param modClass | |
| 704 | + * @return | |
| 705 | + */ | |
| 706 | + public Class<? extends LiteMod> getModFromMetaName(String modName) | |
| 707 | + { | |
| 708 | + if (modName == null) return null; | |
| 709 | + | |
| 710 | + for (LiteMod mod : this.mods) | |
| 711 | + { | |
| 712 | + if (modName.equalsIgnoreCase(this.enumerator.getModMetaName(mod.getClass()))) | |
| 713 | + { | |
| 714 | + return mod.getClass(); | |
| 715 | + } | |
| 716 | + } | |
| 717 | + | |
| 718 | + return null; | |
| 719 | + } | |
| 720 | + | |
| 721 | + /** | |
| 722 | + * @param modMetaName Mod meta name to enable | |
| 723 | + */ | |
| 724 | + public void enableMod(String modMetaName) | |
| 725 | + { | |
| 726 | + this.setModEnabled(modMetaName, true); | |
| 727 | + } | |
| 728 | + | |
| 729 | + /** | |
| 730 | + * @param modMetaName Mod meta name to disable | |
| 731 | + */ | |
| 732 | + public void disableMod(String modMetaName) | |
| 733 | + { | |
| 734 | + this.setModEnabled(modMetaName, false); | |
| 735 | + } | |
| 736 | + | |
| 737 | + /** | |
| 738 | + * @param modMetaName Mod meta name to enable/disable | |
| 739 | + * @param enabled | |
| 740 | + */ | |
| 741 | + public void setModEnabled(String modMetaName, boolean enabled) | |
| 742 | + { | |
| 743 | + this.enabledModsList.setEnabled(this.bootstrap.getProfile(), modMetaName, enabled); | |
| 744 | + this.enabledModsList.saveTo(this.enabledModsFile); | |
| 745 | + } | |
| 716 | 746 | |
| 717 | 747 | /** |
| 748 | + * @param modName | |
| 749 | + * @return | |
| 750 | + */ | |
| 751 | + public boolean isModEnabled(String modName) | |
| 752 | + { | |
| 753 | + return this.enabledModsList.isEnabled(LiteLoader.getProfile(), modName); | |
| 754 | + } | |
| 755 | + | |
| 756 | + /** | |
| 757 | + * @param modName | |
| 758 | + * @return | |
| 759 | + */ | |
| 760 | + public boolean isModActive(String modName) | |
| 761 | + { | |
| 762 | + if (modName == null) return false; | |
| 763 | + | |
| 764 | + for (LiteMod mod : this.loadedMods) | |
| 765 | + { | |
| 766 | + if (modName.equalsIgnoreCase(this.enumerator.getModMetaName(mod.getClass()))) | |
| 767 | + { | |
| 768 | + return true; | |
| 769 | + } | |
| 770 | + } | |
| 771 | + | |
| 772 | + return false; | |
| 773 | + } | |
| 774 | + | |
| 775 | + /** | |
| 718 | 776 | * Create mod instances from the enumerated classes |
| 719 | 777 | * |
| 720 | 778 | * @param modsToLoad List of mods to load |
| ... | ... | @@ -740,32 +798,7 @@ public final class LiteLoader |
| 740 | 798 | String metaName = this.getModMetaName(mod); |
| 741 | 799 | if (metaName == null || this.enabledModsList.isEnabled(this.bootstrap.getProfile(), metaName)) |
| 742 | 800 | { |
| 743 | - LiteLoader.logInfo("Loading mod from %s", mod.getName()); | |
| 744 | - | |
| 745 | - LiteMod newMod = mod.newInstance(); | |
| 746 | - | |
| 747 | - this.mods.add(newMod); | |
| 748 | - String modName = newMod.getName(); | |
| 749 | - if (modName == null && metaName != null) modName = metaName; | |
| 750 | - LiteLoader.logInfo("Successfully added mod %s version %s", modName, newMod.getVersion()); | |
| 751 | - | |
| 752 | - // Get the mod file and register it as a resource pack if it exists | |
| 753 | - ModFile modFile = this.enumerator.getModFile(mod); | |
| 754 | - if (modFile != null) | |
| 755 | - { | |
| 756 | - this.disabledMods.remove(modFile); | |
| 757 | - | |
| 758 | - LiteLoader.logInfo("Adding \"%s\" to active resource pack set", modFile.getAbsolutePath()); | |
| 759 | - if (modName != null) | |
| 760 | - { | |
| 761 | - modFile.initResourcePack(modName); | |
| 762 | - | |
| 763 | - if (modFile.hasResourcePack() && this.registerModResourcePack((ResourcePack)modFile.getResourcePack())) | |
| 764 | - { | |
| 765 | - LiteLoader.logInfo("Successfully added \"%s\" to active resource pack set", modFile.getAbsolutePath()); | |
| 766 | - } | |
| 767 | - } | |
| 768 | - } | |
| 801 | + this.loadMod(metaName, mod); | |
| 769 | 802 | } |
| 770 | 803 | else |
| 771 | 804 | { |
| ... | ... | @@ -782,6 +815,42 @@ public final class LiteLoader |
| 782 | 815 | } |
| 783 | 816 | |
| 784 | 817 | /** |
| 818 | + * @param metaName | |
| 819 | + * @param mod | |
| 820 | + * @throws InstantiationException | |
| 821 | + * @throws IllegalAccessException | |
| 822 | + */ | |
| 823 | + protected void loadMod(String metaName, Class<? extends LiteMod> mod) throws InstantiationException, IllegalAccessException | |
| 824 | + { | |
| 825 | + LiteLoader.logInfo("Loading mod from %s", mod.getName()); | |
| 826 | + | |
| 827 | + LiteMod newMod = mod.newInstance(); | |
| 828 | + | |
| 829 | + this.mods.add(newMod); | |
| 830 | + String modName = newMod.getName(); | |
| 831 | + if (modName == null && metaName != null) modName = metaName; | |
| 832 | + LiteLoader.logInfo("Successfully added mod %s version %s", modName, newMod.getVersion()); | |
| 833 | + | |
| 834 | + // Get the mod file and register it as a resource pack if it exists | |
| 835 | + ModFile modFile = this.enumerator.getModFile(mod); | |
| 836 | + if (modFile != null) | |
| 837 | + { | |
| 838 | + this.disabledMods.remove(modFile); | |
| 839 | + | |
| 840 | + LiteLoader.logInfo("Adding \"%s\" to active resource pack set", modFile.getAbsolutePath()); | |
| 841 | + if (modName != null) | |
| 842 | + { | |
| 843 | + modFile.initResourcePack(modName); | |
| 844 | + | |
| 845 | + if (modFile.hasResourcePack() && this.registerModResourcePack((ResourcePack)modFile.getResourcePack())) | |
| 846 | + { | |
| 847 | + LiteLoader.logInfo("Successfully added \"%s\" to active resource pack set", modFile.getAbsolutePath()); | |
| 848 | + } | |
| 849 | + } | |
| 850 | + } | |
| 851 | + } | |
| 852 | + | |
| 853 | + /** | |
| 785 | 854 | * Initialise the mods which were loaded |
| 786 | 855 | */ |
| 787 | 856 | private void initMods() |
| ... | ... | @@ -792,54 +861,87 @@ public final class LiteLoader |
| 792 | 861 | for (Iterator<LiteMod> iter = this.mods.iterator(); iter.hasNext();) |
| 793 | 862 | { |
| 794 | 863 | LiteMod mod = iter.next(); |
| 795 | - String modName = mod.getName(); | |
| 796 | 864 | |
| 797 | 865 | try |
| 798 | 866 | { |
| 799 | - LiteLoader.logInfo("Initialising mod %s version %s", modName, mod.getVersion()); | |
| 800 | - | |
| 801 | - try | |
| 802 | - { | |
| 803 | - String modKey = this.getModNameForConfig(mod.getClass(), modName); | |
| 804 | - LiteLoaderVersion lastModVersion = LiteLoaderVersion.getVersionFromRevision(this.bootstrap.getLastKnownModRevision(modKey)); | |
| 805 | - | |
| 806 | - if (LiteLoaderBootstrap.VERSION.getLoaderRevision() > lastModVersion.getLoaderRevision()) | |
| 807 | - { | |
| 808 | - LiteLoader.logInfo("Performing config upgrade for mod %s. Upgrading %s to %s...", modName, lastModVersion, LiteLoaderBootstrap.VERSION); | |
| 809 | - mod.upgradeSettings(LiteLoaderBootstrap.VERSION.getMinecraftVersion(), this.versionConfigFolder, this.inflectVersionedConfigPath(lastModVersion)); | |
| 810 | - | |
| 811 | - this.bootstrap.storeLastKnownModRevision(modKey); | |
| 812 | - LiteLoader.logInfo("Config upgrade succeeded for mod %s", modName); | |
| 813 | - } | |
| 814 | - } | |
| 815 | - catch (Throwable th) | |
| 816 | - { | |
| 817 | - LiteLoader.logWarning("Error performing settings upgrade for %s. Settings may not be properly migrated", modName); | |
| 818 | - } | |
| 819 | - | |
| 820 | - // pre-1.6.4_01 this was being called with the wrong path, I hope this doesn't break anything | |
| 821 | - mod.init(this.commonConfigFolder); | |
| 822 | - | |
| 823 | - this.events.addListener(mod); | |
| 824 | - | |
| 825 | - if (mod instanceof Permissible) | |
| 826 | - { | |
| 827 | - this.permissionsManager.registerPermissible((Permissible)mod); | |
| 828 | - } | |
| 829 | - | |
| 830 | - this.loadedMods.add(mod); | |
| 831 | - this.loadedModsList += String.format("\n - %s version %s", modName, mod.getVersion()); | |
| 867 | + this.initMod(mod); | |
| 832 | 868 | loadedModsCount++; |
| 833 | 869 | } |
| 834 | 870 | catch (Throwable th) |
| 835 | 871 | { |
| 836 | - LiteLoader.getLogger().log(Level.WARNING, "Error initialising mod '" + modName, th); | |
| 872 | + LiteLoader.getLogger().log(Level.WARNING, "Error initialising mod '" + mod.getName() + "'", th); | |
| 837 | 873 | iter.remove(); |
| 838 | 874 | } |
| 839 | 875 | } |
| 840 | 876 | |
| 841 | 877 | this.loadedModsList = String.format("%s loaded mod(s)%s", loadedModsCount, this.loadedModsList); |
| 842 | 878 | } |
| 879 | + | |
| 880 | + /** | |
| 881 | + * @param mod | |
| 882 | + */ | |
| 883 | + protected void initMod(LiteMod mod) | |
| 884 | + { | |
| 885 | + LiteLoader.logInfo("Initialising mod %s version %s", mod.getName(), mod.getVersion()); | |
| 886 | + | |
| 887 | + try | |
| 888 | + { | |
| 889 | + this.handleModVersionUpgrade(mod); | |
| 890 | + } | |
| 891 | + catch (Throwable th) | |
| 892 | + { | |
| 893 | + LiteLoader.logWarning("Error performing settings upgrade for %s. Settings may not be properly migrated", mod.getName()); | |
| 894 | + } | |
| 895 | + | |
| 896 | + // initialise the mod | |
| 897 | + mod.init(this.commonConfigFolder); | |
| 898 | + | |
| 899 | + // add the mod to all relevant listener queues | |
| 900 | + this.events.addListener(mod); | |
| 901 | + | |
| 902 | + if (mod instanceof Permissible) | |
| 903 | + { | |
| 904 | + this.permissionsManager.registerPermissible((Permissible)mod); | |
| 905 | + } | |
| 906 | + | |
| 907 | + this.loadedMods.add(mod); | |
| 908 | + this.loadedModsList += String.format("\n - %s version %s", mod.getName(), mod.getVersion()); | |
| 909 | + } | |
| 910 | + | |
| 911 | + /** | |
| 912 | + * @param mod | |
| 913 | + */ | |
| 914 | + protected void handleModVersionUpgrade(LiteMod mod) | |
| 915 | + { | |
| 916 | + String modKey = this.getModNameForConfig(mod.getClass(), mod.getName()); | |
| 917 | + LiteLoaderVersion lastModVersion = LiteLoaderVersion.getVersionFromRevision(this.bootstrap.getLastKnownModRevision(modKey)); | |
| 918 | + | |
| 919 | + if (LiteLoaderBootstrap.VERSION.getLoaderRevision() > lastModVersion.getLoaderRevision()) | |
| 920 | + { | |
| 921 | + LiteLoader.logInfo("Performing config upgrade for mod %s. Upgrading %s to %s...", mod.getName(), lastModVersion, LiteLoaderBootstrap.VERSION); | |
| 922 | + mod.upgradeSettings(LiteLoaderBootstrap.VERSION.getMinecraftVersion(), this.versionConfigFolder, this.inflectVersionedConfigPath(lastModVersion)); | |
| 923 | + | |
| 924 | + this.bootstrap.storeLastKnownModRevision(modKey); | |
| 925 | + LiteLoader.logInfo("Config upgrade succeeded for mod %s", mod.getName()); | |
| 926 | + } | |
| 927 | + } | |
| 928 | + | |
| 929 | + /** | |
| 930 | + * Used by the version upgrade code, gets a version of the mod name suitable | |
| 931 | + * for inclusion in the properties file | |
| 932 | + * | |
| 933 | + * @param modName | |
| 934 | + * @return | |
| 935 | + */ | |
| 936 | + private String getModNameForConfig(Class<? extends LiteMod> modClass, String modName) | |
| 937 | + { | |
| 938 | + if (modName == null || modName.isEmpty()) | |
| 939 | + { | |
| 940 | + modName = modClass.getSimpleName().toLowerCase(); | |
| 941 | + } | |
| 942 | + | |
| 943 | + return String.format("version.%s", modName.toLowerCase().replaceAll("[^a-z0-9_\\-\\.]", "")); | |
| 944 | + } | |
| 843 | 945 | |
| 844 | 946 | /** |
| 845 | 947 | * Called before mod late initialisation, refresh the resources that have been added so that mods can use them | ... | ... |
java/com/mumfrey/liteloader/core/LiteLoaderEnumerator.java
| ... | ... | @@ -186,7 +186,7 @@ class LiteLoaderEnumerator implements FilenameFilter |
| 186 | 186 | if (!this.modFiles.containsKey(modClassName)) return null; |
| 187 | 187 | return this.modFiles.get(modClassName).getModName().toLowerCase(); |
| 188 | 188 | } |
| 189 | - | |
| 189 | + | |
| 190 | 190 | /** |
| 191 | 191 | * Get the discovery settings from the properties file |
| 192 | 192 | */ |
| ... | ... | @@ -238,15 +238,15 @@ class LiteLoaderEnumerator implements FilenameFilter |
| 238 | 238 | { |
| 239 | 239 | LiteLoaderEnumerator.logInfo("Mods folder found, searching %s", modsFolder.getPath()); |
| 240 | 240 | this.findModFiles(modsFolder, false); |
| 241 | - LiteLoaderEnumerator.logInfo("Found %d mod file(s)", this.allModFiles.size()); | |
| 242 | 241 | |
| 243 | 242 | File versionedModsFolder = new File(modsFolder, LiteLoaderBootstrap.VERSION.getMinecraftVersion()); |
| 244 | 243 | if (versionedModsFolder.exists() && versionedModsFolder.isDirectory()) |
| 245 | 244 | { |
| 246 | 245 | LiteLoaderEnumerator.logInfo("Versioned mods folder found, searching %s", versionedModsFolder.getPath()); |
| 247 | 246 | this.findModFiles(versionedModsFolder, true); |
| 248 | - LiteLoaderEnumerator.logInfo("Found %d mod file(s)", this.allModFiles.size()); | |
| 249 | 247 | } |
| 248 | + | |
| 249 | + LiteLoaderEnumerator.logInfo("Found %d mod file(s)", this.allModFiles.size()); | |
| 250 | 250 | } |
| 251 | 251 | } |
| 252 | 252 | } | ... | ... |
java/com/mumfrey/liteloader/gui/GuiModListEntry.java
| ... | ... | @@ -21,11 +21,6 @@ public class GuiModListEntry extends Gui |
| 21 | 21 | private static final int PANEL_SPACING = 4; |
| 22 | 22 | |
| 23 | 23 | /** |
| 24 | - * Enabled mods list, keep a reference so that we can toggle mod enablement when required | |
| 25 | - */ | |
| 26 | - private EnabledModsList enabledModsList; | |
| 27 | - | |
| 28 | - /** | |
| 29 | 24 | * For text display |
| 30 | 25 | */ |
| 31 | 26 | private FontRenderer fontRenderer; |
| ... | ... | @@ -91,7 +86,6 @@ public class GuiModListEntry extends Gui |
| 91 | 86 | */ |
| 92 | 87 | GuiModListEntry(LiteLoader loader, EnabledModsList enabledMods, FontRenderer fontRenderer, LiteMod mod) |
| 93 | 88 | { |
| 94 | - this.enabledModsList = enabledMods; | |
| 95 | 89 | this.fontRenderer = fontRenderer; |
| 96 | 90 | this.metaName = loader.getModMetaName(mod.getClass()); |
| 97 | 91 | this.name = mod.getName(); |
| ... | ... | @@ -100,7 +94,7 @@ public class GuiModListEntry extends Gui |
| 100 | 94 | this.url = loader.getModMetaData(mod.getClass(), "url", null); |
| 101 | 95 | this.description = loader.getModMetaData(mod.getClass(), "description", ""); |
| 102 | 96 | this.enabled = true; |
| 103 | - this.canBeToggled = this.metaName != null && this.enabledModsList.saveAllowed(); | |
| 97 | + this.canBeToggled = this.metaName != null && enabledMods.saveAllowed(); | |
| 104 | 98 | this.willBeEnabled = true; |
| 105 | 99 | } |
| 106 | 100 | |
| ... | ... | @@ -114,7 +108,6 @@ public class GuiModListEntry extends Gui |
| 114 | 108 | */ |
| 115 | 109 | GuiModListEntry(LiteLoader loader, EnabledModsList enabledMods, FontRenderer fontRenderer, ModFile file) |
| 116 | 110 | { |
| 117 | - this.enabledModsList = enabledMods; | |
| 118 | 111 | this.fontRenderer = fontRenderer; |
| 119 | 112 | this.metaName = file.getModName().toLowerCase(); |
| 120 | 113 | this.name = file instanceof ClassPathMod ? file.getModName() : file.getName(); |
| ... | ... | @@ -123,7 +116,7 @@ public class GuiModListEntry extends Gui |
| 123 | 116 | this.url = file.getMetaValue("url", null); |
| 124 | 117 | this.description = file.getMetaValue("description", ""); |
| 125 | 118 | this.enabled = false; |
| 126 | - this.canBeToggled = this.enabledModsList.saveAllowed(); | |
| 119 | + this.canBeToggled = enabledMods.saveAllowed(); | |
| 127 | 120 | this.willBeEnabled = enabledMods.isEnabled(loader.getProfile(), this.metaName); |
| 128 | 121 | } |
| 129 | 122 | |
| ... | ... | @@ -202,8 +195,7 @@ public class GuiModListEntry extends Gui |
| 202 | 195 | if (this.canBeToggled) |
| 203 | 196 | { |
| 204 | 197 | this.willBeEnabled = !this.willBeEnabled; |
| 205 | - this.enabledModsList.setEnabled(LiteLoader.getProfile(), this.metaName, this.willBeEnabled); | |
| 206 | - this.enabledModsList.save(); | |
| 198 | + LiteLoader.getInstance().setModEnabled(this.metaName, this.willBeEnabled); | |
| 207 | 199 | } |
| 208 | 200 | } |
| 209 | 201 | ... | ... |