diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/assets/AssetsMojangLoader.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/assets/AssetsMojangLoader.java index a016fe262..e93e9468c 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/assets/AssetsMojangLoader.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/assets/AssetsMojangLoader.java @@ -43,7 +43,7 @@ public class AssetsMojangLoader extends IAssetsHandler { } @Override - public OverridableSwingWorker getList(MinecraftVersion mv, IMinecraftAssetService mp) { + public OverridableSwingWorker getList(final MinecraftVersion mv, final IMinecraftAssetService mp) { return new OverridableSwingWorker() { @Override protected void work() throws Exception { diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/assets/MinecraftAssetService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/assets/MinecraftAssetService.java index 66c9dc6b7..861f1d746 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/assets/MinecraftAssetService.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/assets/MinecraftAssetService.java @@ -41,7 +41,7 @@ public class MinecraftAssetService extends IMinecraftAssetService { } @Override - public Task downloadAssets(String mcVersion) { + public Task downloadAssets(final String mcVersion) { return new Task() { @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/launch/LaunchOptions.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/launch/LaunchOptions.java index 4e16e890d..d8ec937d6 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/launch/LaunchOptions.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/launch/LaunchOptions.java @@ -29,7 +29,7 @@ import org.jackhuang.hellominecraft.utils.system.JdkVersion; */ public class LaunchOptions { - private String name, versionName, javaArgs, minecraftArgs, maxMemory, permSize, width, height, userProperties, serverIp; + private String name, versionName, javaArgs, minecraftArgs, maxMemory, permSize, width, height, serverIp; private String proxyHost, proxyPort, proxyUser, proxyPass, javaDir, launchVersion; private boolean fullscreen, debug, noJVMArgs, canceledWrapper; private JdkVersion java; @@ -114,16 +114,6 @@ public class LaunchOptions { this.height = height; } - public String getUserProperties() { - if (userProperties == null) - return ""; - return userProperties; - } - - public void setUserProperties(String userProperties) { - this.userProperties = userProperties; - } - public boolean isFullscreen() { return fullscreen; } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/mod/MinecraftModService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/mod/MinecraftModService.java index d52d13d0c..a1b9ca094 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/mod/MinecraftModService.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/mod/MinecraftModService.java @@ -74,7 +74,8 @@ public class MinecraftModService extends IMinecraftModService { } } Collections.sort(mods); - return modCache.put(id, mods); + modCache.put(id, mods); + return mods; } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/mod/ModpackManager.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/mod/ModpackManager.java index 472ce7e33..ff4c208eb 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/mod/ModpackManager.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/mod/ModpackManager.java @@ -33,12 +33,12 @@ import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftProvider; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion; import org.jackhuang.hellominecraft.utils.functions.BiFunction; +import org.jackhuang.hellominecraft.utils.functions.Predicate; import org.jackhuang.hellominecraft.utils.system.Compressor; import org.jackhuang.hellominecraft.utils.system.FileUtils; import org.jackhuang.hellominecraft.utils.system.ZipEngine; import org.jackhuang.hellominecraft.utils.tasks.Task; import org.jackhuang.hellominecraft.utils.version.MinecraftVersionRequest; -import org.jackhuang.hellominecraft.utils.views.wizard.spi.ResultProgressHandle; /** * A mod pack(*.zip) includes these things: @@ -60,7 +60,7 @@ import org.jackhuang.hellominecraft.utils.views.wizard.spi.ResultProgressHandle; */ public final class ModpackManager { - public static Task install(File input, IMinecraftService service, String id) { + public static Task install(final File input, final IMinecraftService service, final String id) { return new Task() { Collection c = new ArrayList<>(); @@ -87,12 +87,15 @@ public final class ModpackManager { } try { - AtomicInteger b = new AtomicInteger(0); + final AtomicInteger b = new AtomicInteger(0); HMCLog.log("Decompressing modpack"); - Compressor.unzip(input, versions, t -> { - if (t.equals("minecraft/pack.json")) - b.incrementAndGet(); - return true; + Compressor.unzip(input, versions, new Predicate() { + @Override + public boolean apply(String t) { + if (t.equals("minecraft/pack.json")) + b.incrementAndGet(); + return true; + } }, true); if (b.get() < 1) throw new FileNotFoundException(C.i18n("modpack.incorrect_format.no_json")); @@ -138,33 +141,39 @@ public final class ModpackManager { } - public static final List MODPACK_BLACK_LIST = Arrays.asList(new String[] { "usernamecache.json", "asm", "logs", "backups", "versions", "assets", "usercache.json", "libraries", "crash-reports", "launcher_profiles.json", "NVIDIA", "TCNodeTracker", "screenshots", "natives", "native" }); + public static final List MODPACK_BLACK_LIST = Arrays.asList(new String[] { "usernamecache.json", "asm", "logs", "backups", "versions", "assets", "usercache.json", "libraries", "crash-reports", "launcher_profiles.json", "NVIDIA", "TCNodeTracker", "screenshots", "natives", "native", "hmclversion.cfg", "pack.json" }); public static final List MODPACK_SUGGESTED_BLACK_LIST = Arrays.asList(new String[] { "saves", "servers.dat", "options.txt", "optionsshaders.txt", "mods/VoxelMods" }); /** * < String, Boolean, Boolean >: Folder/File name, Is Directory, * Return 0: non blocked, 1: non shown, 2: suggested, checked. */ - public static final BiFunction MODPACK_PREDICATE = (String x, Boolean y) -> { - if (ModpackManager.MODPACK_BLACK_LIST_PREDICATE.apply(x, y)) - return 1; - if (ModpackManager.MODPACK_SUGGESTED_BLACK_LIST_PREDICATE.apply(x, y)) - return 2; - return 0; + public static final BiFunction MODPACK_PREDICATE = new BiFunction() { + @Override + public Integer apply(String x, Boolean y) { + if (ModpackManager.MODPACK_BLACK_LIST_PREDICATE.apply(x, y)) + return 1; + if (ModpackManager.MODPACK_SUGGESTED_BLACK_LIST_PREDICATE.apply(x, y)) + return 2; + return 0; + } }; public static final BiFunction MODPACK_BLACK_LIST_PREDICATE = modpackPredicateMaker(MODPACK_BLACK_LIST); public static final BiFunction MODPACK_SUGGESTED_BLACK_LIST_PREDICATE = modpackPredicateMaker(MODPACK_SUGGESTED_BLACK_LIST); - private static BiFunction modpackPredicateMaker(List l) { - return (String x, Boolean y) -> { - for (String s : l) - if (y) { - if (x.startsWith(s + "/")) + private static BiFunction modpackPredicateMaker(final List l) { + return new BiFunction() { + @Override + public Boolean apply(String x, Boolean y) { + for (String s : l) + if (y) { + if (x.startsWith(s + "/")) + return true; + } else if (x.equals(s)) return true; - } else if (x.equals(s)) - return true; - return false; + return false; + } }; } @@ -179,29 +188,34 @@ public final class ModpackManager { * @throws IOException if create tmp directory failed */ public static void export(File output, IMinecraftProvider provider, String version, List blacklist) throws IOException, GameException { - ArrayList b = new ArrayList<>(MODPACK_BLACK_LIST); + final ArrayList b = new ArrayList<>(MODPACK_BLACK_LIST); if (blacklist != null) b.addAll(blacklist); + b.add(version + ".jar"); + b.add(version + ".json"); HMCLog.log("Compressing game files without some files in blacklist, including files or directories: usernamecache.json, asm, logs, backups, versions, assets, usercache.json, libraries, crash-reports, launcher_profiles.json, NVIDIA, TCNodeTracker"); ZipEngine zip = null; try { zip = new ZipEngine(output); - zip.putDirectory(provider.getRunDirectory(version), (String x, Boolean y) -> { - for (String s : b) - if (y) { - if (x.startsWith(s + "/")) + zip.putDirectory(provider.getRunDirectory(version), new BiFunction() { + @Override + public String apply(String x, Boolean y) { + for (String s : b) + if (y) { + if (x.startsWith(s + "/")) + return null; + } else if (x.equals(s)) return null; - } else if (x.equals(s)) - return null; - return "minecraft/" + x; + return "minecraft/" + x; + } }); MinecraftVersion mv = provider.getVersionById(version).resolve(provider); - mv.runDir = "version"; MinecraftVersionRequest r = MinecraftVersionRequest.minecraftVersion(provider.getMinecraftJar(version)); if (r.type != MinecraftVersionRequest.OK) throw new FileSystemException(C.i18n("modpack.cannot_read_version") + ": " + MinecraftVersionRequest.getResponse(r)); mv.jar = r.version; + mv.runDir = "version"; zip.putTextFile(C.gsonPrettyPrinting.toJson(mv), "minecraft/pack.json"); } finally { if (zip != null) diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/service/IMinecraftProvider.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/service/IMinecraftProvider.java index 5e924cff0..39aa1148c 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/service/IMinecraftProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/service/IMinecraftProvider.java @@ -21,8 +21,8 @@ import java.io.File; import java.util.Collection; import org.jackhuang.hellominecraft.launcher.core.GameException; import org.jackhuang.hellominecraft.launcher.core.version.DecompressLibraryJob; -import org.jackhuang.hellominecraft.launcher.core.version.GameDirType; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion; +import org.jackhuang.hellominecraft.utils.EventHandler; import org.jackhuang.hellominecraft.utils.functions.Consumer; /** @@ -54,6 +54,8 @@ public abstract class IMinecraftProvider { */ public abstract File getRunDirectory(String id); + public abstract File versionRoot(String id); + public File getRunDirectory(String id, String subFolder) { return new File(getRunDirectory(id), subFolder); } @@ -91,12 +93,6 @@ public abstract class IMinecraftProvider { */ public abstract File getMinecraftJar(String id); - protected GameDirType gameDirType = GameDirType.ROOT_FOLDER; - - public void setGameDirType(GameDirType gameDirType) { - this.gameDirType = gameDirType; - } - /** * Rename version * @@ -148,9 +144,15 @@ public abstract class IMinecraftProvider { /** * Refind the versions in this profile. + * Must call onRefreshingVersions, onRefreshedVersions, onLoadedVersion + * Events. */ public abstract void refreshVersions(); + public final EventHandler onRefreshingVersions = new EventHandler<>(this), + onRefreshedVersions = new EventHandler<>(this); + public final EventHandler onLoadedVersion = new EventHandler<>(this); + /** * Clean redundant files. */ @@ -163,4 +165,8 @@ public abstract class IMinecraftProvider { */ public abstract boolean onLaunch(); + public File baseDirectory() { + return service.baseDirectory(); + } + } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersionManager.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersionManager.java index e82ba3b65..1ab8f7a70 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersionManager.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersionManager.java @@ -68,6 +68,8 @@ public class MinecraftVersionManager extends IMinecraftProvider { @Override public void refreshVersions() { + onRefreshingVersions.execute(null); + try { MCUtils.tryWriteProfile(service.baseDirectory()); } catch (IOException ex) { @@ -140,15 +142,22 @@ public class MinecraftVersionManager extends IMinecraftProvider { for (MinecraftLibrary ml : mcVersion.libraries) ml.init(); versions.put(id, mcVersion); + onLoadedVersion.execute(id); } catch (Exception e) { HMCLog.warn("Ignoring: " + dir + ", the json of this Minecraft is malformed.", e); } } + onRefreshedVersions.execute(null); + } + + @Override + public File versionRoot(String id) { + return new File(service.baseDirectory(), "versions/" + id); } @Override public boolean removeVersionFromDisk(String name) { - File version = new File(service.baseDirectory(), "versions/" + name); + File version = versionRoot(name); if (!version.exists()) return true; @@ -159,12 +168,12 @@ public class MinecraftVersionManager extends IMinecraftProvider { @Override public boolean renameVersion(String from, String to) { try { - File fromJson = new File(service.baseDirectory(), "versions/" + from + "/" + from + ".json"); + File fromJson = new File(versionRoot(from), from + ".json"); MinecraftVersion mcVersion = C.gson.fromJson(FileUtils.readFileToString(fromJson), MinecraftVersion.class); mcVersion.id = to; FileUtils.writeQuietly(fromJson, C.gsonPrettyPrinting.toJson(mcVersion)); - File toDir = new File(service.baseDirectory(), "versions/" + to); - new File(service.baseDirectory(), "versions/" + from).renameTo(toDir); + File toDir = versionRoot(to); + versionRoot(from).renameTo(toDir); File toJson = new File(toDir, to + ".json"); File toJar = new File(toDir, to + ".jar"); new File(toDir, from + ".json").renameTo(toJson); @@ -180,14 +189,9 @@ public class MinecraftVersionManager extends IMinecraftProvider { @Override public File getRunDirectory(String id) { - if ("version".equals(versions.get(id).runDir)) - return new File(service.baseDirectory(), "versions/" + id + "/"); - switch (gameDirType) { - case VERSION_FOLDER: - return new File(service.baseDirectory(), "versions/" + id + "/"); - default: - return service.baseDirectory(); - } + if ("version".equals(getVersionById(id).runDir)) + return versionRoot(id); + return baseDirectory(); } @Override @@ -195,7 +199,7 @@ public class MinecraftVersionManager extends IMinecraftProvider { MinecraftVersion v = service.download().downloadMinecraft(id); if (callback != null) { callback.accept(v); - File mvt = new File(service.baseDirectory(), "versions/" + id + "/" + id + ".json"); + File mvt = new File(versionRoot(id), id + ".json"); FileUtils.writeQuietly(mvt, C.gsonPrettyPrinting.toJson(v)); } if (v != null) { @@ -265,9 +269,9 @@ public class MinecraftVersionManager extends IMinecraftProvider { @Override public void cleanFolder() { for (MinecraftVersion s : getVersions()) { - FileUtils.deleteDirectoryQuietly(new File(service.baseDirectory(), "versions" + File.separator + s.id + File.separator + s.id + "-natives")); + FileUtils.deleteDirectoryQuietly(new File(versionRoot(s.id), s.id + "-natives")); File f = getRunDirectory(s.id); - String[] dir = { "logs", "asm", "NVIDIA", "crash-reports", "server-resource-packs", "natives", "native" }; + String[] dir = { "asm", "NVIDIA", "server-resource-packs", "natives", "native" }; for (String str : dir) FileUtils.deleteDirectoryQuietly(new File(f, str)); String[] files = { "output-client.log", "usercache.json", "usernamecache.json", "hmclmc.log" }; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/DefaultMinecraftService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/DefaultMinecraftService.java similarity index 68% rename from HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/DefaultMinecraftService.java rename to HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/DefaultMinecraftService.java index 581a14859..b197128de 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/DefaultMinecraftService.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/DefaultMinecraftService.java @@ -15,11 +15,12 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see {http://www.gnu.org/licenses/}. */ -package org.jackhuang.hellominecraft.launcher.utils; +package org.jackhuang.hellominecraft.launcher.settings; import java.io.File; +import java.util.HashMap; +import java.util.Map; import org.jackhuang.hellominecraft.launcher.core.GameException; -import org.jackhuang.hellominecraft.launcher.settings.Profile; import org.jackhuang.hellominecraft.launcher.core.installers.MinecraftInstallerService; import org.jackhuang.hellominecraft.launcher.core.assets.MinecraftAssetService; import org.jackhuang.hellominecraft.launcher.core.auth.UserProfileProvider; @@ -34,7 +35,8 @@ import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftModService; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftProvider; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.launcher.core.mod.MinecraftModService; -import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersionManager; +import org.jackhuang.hellominecraft.utils.C; +import org.jackhuang.hellominecraft.utils.system.FileUtils; /** * @@ -44,15 +46,51 @@ public class DefaultMinecraftService extends IMinecraftService { File base; Profile p; + final Map versionSettings = new HashMap<>(); public DefaultMinecraftService(Profile p) { this.p = p; - this.provider = new MinecraftVersionManager(this); + this.provider = new HMCLGameProvider(this); provider.initializeMiencraft(); + provider.onRefreshingVersions.register((sender, x) -> { + versionSettings.clear(); + return true; + }); + provider.onLoadedVersion.register((sender, id) -> { + VersionSetting vs = new VersionSetting(); + File f = new File(provider.versionRoot(id), "hmclversion.cfg"); + if (f.exists()) { + String s = FileUtils.readFileToStringQuietly(f); + if (s != null) + vs = C.gson.fromJson(s, VersionSetting.class); + } + vs.id = id; + versionSettings.put(id, vs); + return true; + }); this.mms = new MinecraftModService(this); this.mds = new MinecraftDownloadService(this); this.mas = new MinecraftAssetService(this); this.mis = new MinecraftInstallerService(this); + + Runtime.getRuntime().addShutdownHook(new Thread() { + @Override + public void run() { + for (String key : versionSettings.keySet()) + saveVersionSetting(key); + } + }); + } + + public VersionSetting getVersionSetting(String id) { + return versionSettings.get(id); + } + + public void saveVersionSetting(String id) { + if (!versionSettings.containsKey(id)) + return; + File f = new File(provider.versionRoot(id), "hmclversion.cfg"); + FileUtils.writeQuietly(f, C.gson.toJson(versionSettings.get(id))); } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/DefaultPlugin.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/DefaultPlugin.java index 32970c59c..432269419 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/DefaultPlugin.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/DefaultPlugin.java @@ -17,10 +17,8 @@ */ package org.jackhuang.hellominecraft.launcher.settings; -import org.jackhuang.hellominecraft.launcher.utils.DefaultMinecraftService; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.launcher.api.IPlugin; -import org.jackhuang.hellominecraft.launcher.settings.Settings; import org.jackhuang.hellominecraft.launcher.core.auth.IAuthenticator; import org.jackhuang.hellominecraft.launcher.core.auth.OfflineAuthenticator; import org.jackhuang.hellominecraft.launcher.core.auth.SkinmeAuthenticator; @@ -54,11 +52,14 @@ public class DefaultPlugin implements IPlugin { SKINME_LOGIN = new SkinmeAuthenticator(clientToken); SKINME_LOGIN.onLoadSettings(Settings.getInstance().getAuthenticatorConfig(SKINME_LOGIN.id())); - Runtime.getRuntime().addShutdownHook(new Thread(() -> { - Settings.getInstance().setAuthenticatorConfig(OFFLINE_LOGIN.id(), OFFLINE_LOGIN.onSaveSettings()); - Settings.getInstance().setAuthenticatorConfig(YGGDRASIL_LOGIN.id(), YGGDRASIL_LOGIN.onSaveSettings()); - Settings.getInstance().setAuthenticatorConfig(SKINME_LOGIN.id(), SKINME_LOGIN.onSaveSettings()); - })); + Runtime.getRuntime().addShutdownHook(new Thread() { + @Override + public void run() { + Settings.getInstance().setAuthenticatorConfig(OFFLINE_LOGIN.id(), OFFLINE_LOGIN.onSaveSettings()); + Settings.getInstance().setAuthenticatorConfig(YGGDRASIL_LOGIN.id(), YGGDRASIL_LOGIN.onSaveSettings()); + Settings.getInstance().setAuthenticatorConfig(SKINME_LOGIN.id(), SKINME_LOGIN.onSaveSettings()); + } + }); apply.accept(OFFLINE_LOGIN); apply.accept(YGGDRASIL_LOGIN); apply.accept(SKINME_LOGIN); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/HMCLGameProvider.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/HMCLGameProvider.java new file mode 100644 index 000000000..54f56bb05 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/HMCLGameProvider.java @@ -0,0 +1,40 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2013 huangyuhui + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see {http://www.gnu.org/licenses/}. + */ +package org.jackhuang.hellominecraft.launcher.settings; + +import java.io.File; +import org.jackhuang.hellominecraft.launcher.core.version.GameDirType; +import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersionManager; + +/** + * + * @author huangyuhui + */ +public class HMCLGameProvider extends MinecraftVersionManager { + + public HMCLGameProvider(DefaultMinecraftService p) { + super(p); + } + + @Override + public File getRunDirectory(String id) { + return ((DefaultMinecraftService) service).getVersionSetting(id).getGameDirType() == GameDirType.VERSION_FOLDER + ? service.version().versionRoot(id) + : super.getRunDirectory(id); + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Profile.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Profile.java index bb1137f24..fe7feccbe 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Profile.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Profile.java @@ -18,22 +18,12 @@ package org.jackhuang.hellominecraft.launcher.settings; import java.io.File; -import java.io.IOException; -import org.jackhuang.hellominecraft.utils.C; -import org.jackhuang.hellominecraft.utils.logging.HMCLog; -import org.jackhuang.hellominecraft.launcher.Main; import org.jackhuang.hellominecraft.launcher.api.PluginManager; -import org.jackhuang.hellominecraft.launcher.core.LauncherVisibility; import org.jackhuang.hellominecraft.launcher.core.MCUtils; -import org.jackhuang.hellominecraft.launcher.core.launch.LaunchOptions; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.utils.system.IOUtils; -import org.jackhuang.hellominecraft.launcher.core.version.GameDirType; import org.jackhuang.hellominecraft.utils.StrUtils; -import org.jackhuang.hellominecraft.utils.Utils; import org.jackhuang.hellominecraft.utils.EventHandler; -import org.jackhuang.hellominecraft.utils.system.Java; -import org.jackhuang.hellominecraft.utils.system.JdkVersion; import org.jackhuang.hellominecraft.utils.system.OS; /** @@ -42,22 +32,7 @@ import org.jackhuang.hellominecraft.utils.system.OS; */ public final class Profile { - private String name, selectedMinecraftVersion = "", javaArgs, minecraftArgs, maxMemory, permSize, width, height, userProperties; - private String gameDir, javaDir, precalledCommand, serverIp, java; - private boolean fullscreen, debug, noJVMArgs, canceledWrapper; - - /** - * 0 - Close the launcher when the game starts.
- * 1 - Hide the launcher when the game starts.
- * 2 - Keep the launcher open.
- */ - private int launcherVisibility; - - /** - * 0 - .minecraft
- * 1 - .minecraft/versions/<version>/
- */ - private int gameDirType; + private String name, selectedMinecraftVersion = "", gameDir; protected transient IMinecraftService service; public transient final EventHandler propertyChanged = new EventHandler<>(this); @@ -69,14 +44,7 @@ public final class Profile { public Profile(String name) { this.name = name; gameDir = MCUtils.getInitGameDir().getPath(); - debug = fullscreen = canceledWrapper = false; - launcherVisibility = gameDirType = 0; PluginManager.NOW_PLUGIN.onInitializingProfile(this); - javaDir = java = minecraftArgs = serverIp = precalledCommand = ""; - } - - public void initialize(int gameDirType) { - this.gameDirType = gameDirType; } public Profile(Profile v) { @@ -85,22 +53,6 @@ public final class Profile { return; name = v.name; gameDir = v.gameDir; - maxMemory = v.maxMemory; - width = v.width; - height = v.height; - java = v.java; - fullscreen = v.fullscreen; - javaArgs = v.javaArgs; - javaDir = v.javaDir; - debug = v.debug; - minecraftArgs = v.minecraftArgs; - permSize = v.permSize; - gameDirType = v.gameDirType; - canceledWrapper = v.canceledWrapper; - noJVMArgs = v.noJVMArgs; - launcherVisibility = v.launcherVisibility; - precalledCommand = v.precalledCommand; - serverIp = v.serverIp; } public IMinecraftService service() { @@ -109,6 +61,14 @@ public final class Profile { return service; } + public VersionSetting getSelectedVersionSetting() { + return getVersionSetting(getSelectedVersion()); + } + + public VersionSetting getVersionSetting(String id) { + return ((DefaultMinecraftService) service()).getVersionSetting(id); + } + public String getSettingsSelectedMinecraftVersion() { return selectedMinecraftVersion; } @@ -157,60 +117,6 @@ public final class Profile { return this; } - public String getJavaDir() { - Java j = getJava(); - if (j.getHome() == null) - return javaDir; - else - return j.getJava(); - } - - public String getSettingsJavaDir() { - return javaDir; - } - - public File getJavaDirFile() { - return new File(getJavaDir()); - } - - public void setJavaDir(String javaDir) { - this.javaDir = javaDir; - propertyChanged.execute("javaDir"); - } - - public Java getJava() { - return Java.JAVA.get(getJavaIndexInAllJavas()); - } - - public int getJavaIndexInAllJavas() { - if (StrUtils.isBlank(java) && StrUtils.isNotBlank(javaDir)) - java = "Custom"; - int idx = Java.JAVA.indexOf(new Java(java, null)); - if (idx == -1) { - java = "Default"; - idx = 0; - } - return idx; - } - - public void setJava(Java java) { - if (java == null) - this.java = Java.JAVA.get(0).getName(); - else { - int idx = Java.JAVA.indexOf(java); - if (idx == -1) - return; - this.java = java.getName(); - } - propertyChanged.execute("java"); - } - - public File getFolder(String folder) { - if (getSelectedVersion() == null) - return new File(getCanonicalGameDirFile(), folder); - return service().version().getRunDirectory(getSelectedVersion(), folder); - } - public String getName() { return name; } @@ -220,207 +126,7 @@ public final class Profile { propertyChanged.execute("name"); } - public String getJavaArgs() { - if (StrUtils.isBlank(javaArgs)) - return ""; - return javaArgs; - } - - public void setJavaArgs(String javaArgs) { - this.javaArgs = javaArgs; - propertyChanged.execute("javaArgs"); - } - - public boolean hasJavaArgs() { - return StrUtils.isNotBlank(getJavaArgs().trim()); - } - - public String getMaxMemory() { - if (StrUtils.isBlank(maxMemory)) - return String.valueOf(Utils.getSuggestedMemorySize()); - return maxMemory; - } - - public void setMaxMemory(String maxMemory) { - this.maxMemory = maxMemory; - propertyChanged.execute("maxMemory"); - } - - public String getWidth() { - if (StrUtils.isBlank(width)) - return "854"; - return width; - } - - public void setWidth(String width) { - this.width = width; - propertyChanged.execute("width"); - } - - public String getHeight() { - if (StrUtils.isBlank(height)) - return "480"; - return height; - } - - public void setHeight(String height) { - this.height = height; - propertyChanged.execute("height"); - } - - public String getUserProperties() { - if (userProperties == null) - return ""; - return userProperties; - } - - public void setUserProperties(String userProperties) { - this.userProperties = userProperties; - propertyChanged.execute("userProperties"); - } - - public boolean isFullscreen() { - return fullscreen; - } - - public void setFullscreen(boolean fullscreen) { - this.fullscreen = fullscreen; - propertyChanged.execute("fullscreen"); - } - - public boolean isDebug() { - return debug; - } - - public void setDebug(boolean debug) { - this.debug = debug; - propertyChanged.execute("debug"); - } - - public LauncherVisibility getLauncherVisibility() { - return LauncherVisibility.values()[launcherVisibility]; - } - - public void setLauncherVisibility(LauncherVisibility launcherVisibility) { - this.launcherVisibility = launcherVisibility.ordinal(); - propertyChanged.execute("launcherVisibility"); - } - - public GameDirType getGameDirType() { - if (gameDirType < 0 || gameDirType > 1) - setGameDirType(GameDirType.ROOT_FOLDER); - return GameDirType.values()[gameDirType]; - } - - public void setGameDirType(GameDirType gameDirType) { - this.gameDirType = gameDirType.ordinal(); - service().version().setGameDirType(getGameDirType()); - propertyChanged.execute("gameDirType"); - } - - public String getPermSize() { - return permSize; - } - - public void setPermSize(String permSize) { - this.permSize = permSize; - propertyChanged.execute("permSize"); - } - - public boolean isNoJVMArgs() { - return noJVMArgs; - } - - public void setNoJVMArgs(boolean noJVMArgs) { - this.noJVMArgs = noJVMArgs; - propertyChanged.execute("noJVMArgs"); - } - - public String getMinecraftArgs() { - return minecraftArgs; - } - - public void setMinecraftArgs(String minecraftArgs) { - this.minecraftArgs = minecraftArgs; - propertyChanged.execute("minecraftArgs"); - } - - public boolean isCanceledWrapper() { - return canceledWrapper; - } - - public void setCanceledWrapper(boolean canceledWrapper) { - this.canceledWrapper = canceledWrapper; - propertyChanged.execute("canceledWrapper"); - } - - public String getPrecalledCommand() { - return precalledCommand; - } - - public void setPrecalledCommand(String precalledCommand) { - this.precalledCommand = precalledCommand; - propertyChanged.execute("precalledCommand"); - } - - public String getServerIp() { - return serverIp; - } - - public void setServerIp(String serverIp) { - this.serverIp = serverIp; - propertyChanged.execute("serverIp"); - } - public void checkFormat() { gameDir = gameDir.replace('/', OS.os().fileSeparator).replace('\\', OS.os().fileSeparator); } - - public LaunchOptions createLaunchOptions() { - LaunchOptions x = new LaunchOptions(); - x.setCanceledWrapper(isCanceledWrapper()); - x.setDebug(isDebug()); - x.setFullscreen(isFullscreen()); - x.setGameDir(getCanonicalGameDirFile()); - x.setGameDirType(getGameDirType()); - x.setHeight(getHeight()); - x.setJavaArgs(getJavaArgs()); - x.setLaunchVersion(getSelectedVersion()); - x.setMaxMemory(getMaxMemory()); - x.setMinecraftArgs(getMinecraftArgs()); - x.setName(getName()); - x.setNoJVMArgs(isNoJVMArgs()); - x.setPermSize(getPermSize()); - x.setPrecalledCommand(getPrecalledCommand()); - x.setProxyHost(Settings.getInstance().getProxyHost()); - x.setProxyPort(Settings.getInstance().getProxyPort()); - x.setProxyUser(Settings.getInstance().getProxyUserName()); - x.setProxyPass(Settings.getInstance().getProxyPassword()); - x.setServerIp(getServerIp()); - x.setUserProperties(getUserProperties()); - x.setVersionName(Main.makeTitle()); - x.setWidth(getWidth()); - - String str = getJavaDir(); - if (!getJavaDirFile().exists()) { - HMCLog.err(C.i18n("launch.wrong_javadir")); - setJava(null); - str = getJavaDir(); - } - JdkVersion jv = new JdkVersion(str); - if (Settings.getInstance().getJava().contains(jv)) - jv = Settings.getInstance().getJava().get(Settings.getInstance().getJava().indexOf(jv)); - else - try { - jv = JdkVersion.getJavaVersionFromExecutable(str); - Settings.getInstance().getJava().add(jv); - Settings.save(); - } catch (IOException ex) { - HMCLog.warn("Failed to get java version", ex); - jv = null; - } - x.setJava(jv); - x.setJavaDir(str); - return x; - } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Settings.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Settings.java index ccd35fe8f..3a0b11d9c 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Settings.java @@ -20,21 +20,20 @@ package org.jackhuang.hellominecraft.launcher.settings; import com.google.gson.JsonSyntaxException; import java.io.File; import java.io.IOException; -import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; -import java.util.List; import java.util.Map; import org.jackhuang.hellominecraft.utils.C; import org.jackhuang.hellominecraft.utils.logging.HMCLog; import org.jackhuang.hellominecraft.launcher.Main; import org.jackhuang.hellominecraft.launcher.core.download.DownloadType; import org.jackhuang.hellominecraft.utils.CollectionUtils; +import org.jackhuang.hellominecraft.utils.Event; import org.jackhuang.hellominecraft.utils.system.FileUtils; import org.jackhuang.hellominecraft.utils.system.IOUtils; import org.jackhuang.hellominecraft.utils.MessageBox; import org.jackhuang.hellominecraft.utils.UpdateChecker; import org.jackhuang.hellominecraft.utils.VersionNumber; +import org.jackhuang.hellominecraft.utils.functions.Predicate; /** * @@ -56,9 +55,12 @@ public final class Settings { static { SETTINGS = initSettings(); - SETTINGS.downloadTypeChangedEvent.register((s, t) -> { - DownloadType.setSuggestedDownloadType(t); - return true; + SETTINGS.downloadTypeChangedEvent.register(new Event() { + @Override + public boolean call(Object sender, DownloadType t) { + DownloadType.setSuggestedDownloadType(t); + return true; + } }); DownloadType.setSuggestedDownloadType(SETTINGS.getDownloadSource()); if (!getProfiles().containsKey(DEFAULT_PROFILE)) @@ -66,9 +68,12 @@ public final class Settings { for (Profile e : getProfiles().values()) { e.checkFormat(); - e.propertyChanged.register((sender, t) -> { - save(); - return true; + e.propertyChanged.register(new Event() { + @Override + public boolean call(Object sender, String t) { + save(); + return true; + } }); } } @@ -121,7 +126,12 @@ public final class Settings { } public static Collection getProfilesFiltered() { - return CollectionUtils.map(getProfiles().values(), (t) -> t != null && t.getName() != null); + return CollectionUtils.map(getProfiles().values(), new Predicate() { + @Override + public boolean apply(Profile t) { + return t != null && t.getName() != null; + } + }); } public static Profile getOneProfile() { diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/VersionSetting.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/VersionSetting.java new file mode 100644 index 000000000..4bd83aca4 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/VersionSetting.java @@ -0,0 +1,323 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2013 huangyuhui + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see {http://www.gnu.org/licenses/}. + */ +package org.jackhuang.hellominecraft.launcher.settings; + +import java.io.File; +import java.io.IOException; +import org.jackhuang.hellominecraft.launcher.Main; +import org.jackhuang.hellominecraft.launcher.core.LauncherVisibility; +import org.jackhuang.hellominecraft.launcher.core.launch.LaunchOptions; +import org.jackhuang.hellominecraft.launcher.core.version.GameDirType; +import org.jackhuang.hellominecraft.utils.C; +import org.jackhuang.hellominecraft.utils.EventHandler; +import org.jackhuang.hellominecraft.utils.StrUtils; +import org.jackhuang.hellominecraft.utils.Utils; +import org.jackhuang.hellominecraft.utils.logging.HMCLog; +import org.jackhuang.hellominecraft.utils.system.Java; +import org.jackhuang.hellominecraft.utils.system.JdkVersion; + +/** + * + * @author huangyuhui + */ +public class VersionSetting { + + public transient String id; + + private String javaArgs, minecraftArgs, maxMemory, permSize, width, height; + private String javaDir, precalledCommand, serverIp, java; + private boolean fullscreen, debug, noJVMArgs, canceledWrapper; + + /** + * 0 - Close the launcher when the game starts.
+ * 1 - Hide the launcher when the game starts.
+ * 2 - Keep the launcher open.
+ */ + private int launcherVisibility; + + /** + * 0 - .minecraft
+ * 1 - .minecraft/versions/<version>/
+ */ + private int gameDirType; + + public transient final EventHandler propertyChanged = new EventHandler<>(this); + + public VersionSetting() { + debug = fullscreen = canceledWrapper = false; + launcherVisibility = gameDirType = 0; + javaDir = java = minecraftArgs = serverIp = precalledCommand = ""; + } + + public VersionSetting(VersionSetting v) { + this(); + if (v == null) + return; + maxMemory = v.maxMemory; + width = v.width; + height = v.height; + java = v.java; + fullscreen = v.fullscreen; + javaArgs = v.javaArgs; + javaDir = v.javaDir; + debug = v.debug; + minecraftArgs = v.minecraftArgs; + permSize = v.permSize; + gameDirType = v.gameDirType; + canceledWrapper = v.canceledWrapper; + noJVMArgs = v.noJVMArgs; + launcherVisibility = v.launcherVisibility; + precalledCommand = v.precalledCommand; + serverIp = v.serverIp; + } + + public String getJavaDir() { + Java j = getJava(); + if (j.getHome() == null) + return javaDir; + else + return j.getJava(); + } + + public String getSettingsJavaDir() { + return javaDir; + } + + public File getJavaDirFile() { + return new File(getJavaDir()); + } + + public void setJavaDir(String javaDir) { + this.javaDir = javaDir; + propertyChanged.execute("javaDir"); + } + + public Java getJava() { + return Java.JAVA.get(getJavaIndexInAllJavas()); + } + + public int getJavaIndexInAllJavas() { + if (StrUtils.isBlank(java) && StrUtils.isNotBlank(javaDir)) + java = "Custom"; + int idx = Java.JAVA.indexOf(new Java(java, null)); + if (idx == -1) { + java = "Default"; + idx = 0; + } + return idx; + } + + public void setJava(Java java) { + if (java == null) + this.java = Java.JAVA.get(0).getName(); + else { + int idx = Java.JAVA.indexOf(java); + if (idx == -1) + return; + this.java = java.getName(); + } + propertyChanged.execute("java"); + } + + public String getJavaArgs() { + if (StrUtils.isBlank(javaArgs)) + return ""; + return javaArgs; + } + + public void setJavaArgs(String javaArgs) { + this.javaArgs = javaArgs; + propertyChanged.execute("javaArgs"); + } + + public boolean hasJavaArgs() { + return StrUtils.isNotBlank(getJavaArgs().trim()); + } + + public String getMaxMemory() { + if (StrUtils.isBlank(maxMemory)) + return String.valueOf(Utils.getSuggestedMemorySize()); + return maxMemory; + } + + public void setMaxMemory(String maxMemory) { + this.maxMemory = maxMemory; + propertyChanged.execute("maxMemory"); + } + + public String getWidth() { + if (StrUtils.isBlank(width)) + return "854"; + return width; + } + + public void setWidth(String width) { + this.width = width; + propertyChanged.execute("width"); + } + + public String getHeight() { + if (StrUtils.isBlank(height)) + return "480"; + return height; + } + + public void setHeight(String height) { + this.height = height; + propertyChanged.execute("height"); + } + + public boolean isFullscreen() { + return fullscreen; + } + + public void setFullscreen(boolean fullscreen) { + this.fullscreen = fullscreen; + propertyChanged.execute("fullscreen"); + } + + public boolean isDebug() { + return debug; + } + + public void setDebug(boolean debug) { + this.debug = debug; + propertyChanged.execute("debug"); + } + + public LauncherVisibility getLauncherVisibility() { + return LauncherVisibility.values()[launcherVisibility]; + } + + public void setLauncherVisibility(LauncherVisibility launcherVisibility) { + this.launcherVisibility = launcherVisibility.ordinal(); + propertyChanged.execute("launcherVisibility"); + } + + public GameDirType getGameDirType() { + if (gameDirType < 0 || gameDirType > 1) + setGameDirType(GameDirType.ROOT_FOLDER); + return GameDirType.values()[gameDirType]; + } + + public void setGameDirType(GameDirType gameDirType) { + this.gameDirType = gameDirType.ordinal(); + propertyChanged.execute("gameDirType"); + } + + public String getPermSize() { + return permSize; + } + + public void setPermSize(String permSize) { + this.permSize = permSize; + propertyChanged.execute("permSize"); + } + + public boolean isNoJVMArgs() { + return noJVMArgs; + } + + public void setNoJVMArgs(boolean noJVMArgs) { + this.noJVMArgs = noJVMArgs; + propertyChanged.execute("noJVMArgs"); + } + + public String getMinecraftArgs() { + return minecraftArgs; + } + + public void setMinecraftArgs(String minecraftArgs) { + this.minecraftArgs = minecraftArgs; + propertyChanged.execute("minecraftArgs"); + } + + public boolean isCanceledWrapper() { + return canceledWrapper; + } + + public void setCanceledWrapper(boolean canceledWrapper) { + this.canceledWrapper = canceledWrapper; + propertyChanged.execute("canceledWrapper"); + } + + public String getPrecalledCommand() { + return precalledCommand; + } + + public void setPrecalledCommand(String precalledCommand) { + this.precalledCommand = precalledCommand; + propertyChanged.execute("precalledCommand"); + } + + public String getServerIp() { + return serverIp; + } + + public void setServerIp(String serverIp) { + this.serverIp = serverIp; + propertyChanged.execute("serverIp"); + } + + public LaunchOptions createLaunchOptions(File gameDir) { + LaunchOptions x = new LaunchOptions(); + x.setCanceledWrapper(isCanceledWrapper()); + x.setDebug(isDebug()); + x.setFullscreen(isFullscreen()); + x.setGameDir(gameDir); + x.setGameDirType(getGameDirType()); + x.setHeight(getHeight()); + x.setJavaArgs(getJavaArgs()); + x.setLaunchVersion(id); + x.setMaxMemory(getMaxMemory()); + x.setMinecraftArgs(getMinecraftArgs()); + x.setName(Main.makeTitle()); + x.setNoJVMArgs(isNoJVMArgs()); + x.setPermSize(getPermSize()); + x.setPrecalledCommand(getPrecalledCommand()); + x.setProxyHost(Settings.getInstance().getProxyHost()); + x.setProxyPort(Settings.getInstance().getProxyPort()); + x.setProxyUser(Settings.getInstance().getProxyUserName()); + x.setProxyPass(Settings.getInstance().getProxyPassword()); + x.setServerIp(getServerIp()); + x.setVersionName(Main.makeTitle()); + x.setWidth(getWidth()); + + String str = getJavaDir(); + if (!getJavaDirFile().exists()) { + HMCLog.err(C.i18n("launch.wrong_javadir")); + setJava(null); + str = getJavaDir(); + } + JdkVersion jv = new JdkVersion(str); + if (Settings.getInstance().getJava().contains(jv)) + jv = Settings.getInstance().getJava().get(Settings.getInstance().getJava().indexOf(jv)); + else + try { + jv = JdkVersion.getJavaVersionFromExecutable(str); + Settings.getInstance().getJava().add(jv); + Settings.save(); + } catch (IOException ex) { + HMCLog.warn("Failed to get java version", ex); + jv = null; + } + x.setJava(jv); + x.setJavaDir(str); + return x; + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/CrashReporter.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/CrashReporter.java index 151338dfa..e17caefce 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/CrashReporter.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/CrashReporter.java @@ -106,7 +106,12 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { System.out.println(text); if (checkThrowable(e) && !System.getProperty("java.vm.name").contains("OpenJDK")) { - SwingUtilities.invokeLater(() -> LogWindow.INSTANCE.showAsCrashWindow(Settings.UPDATE_CHECKER.OUT_DATED)); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + LogWindow.INSTANCE.showAsCrashWindow(Settings.UPDATE_CHECKER.OUT_DATED); + } + }); if (!Settings.UPDATE_CHECKER.OUT_DATED) reportToServer(text, s); } @@ -127,20 +132,23 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { private static final HashSet THROWABLE_SET = new HashSet<>(); - void reportToServer(String text, String stacktrace) { + void reportToServer(final String text, String stacktrace) { if (THROWABLE_SET.contains(stacktrace)) return; THROWABLE_SET.add(stacktrace); - new Thread(() -> { - HashMap map = new HashMap<>(); - map.put("CrashReport", text); - try { - System.out.println(NetUtils.post(NetUtils.constantURL("http://huangyuhui.duapp.com/crash.php"), map)); - } catch (IOException ex) { - System.out.println("Failed to send post request to HMCL server."); - ex.printStackTrace(); + new Thread() { + @Override + public void run() { + HashMap map = new HashMap<>(); + map.put("CrashReport", text); + try { + System.out.println(NetUtils.post(NetUtils.constantURL("http://huangyuhui.duapp.com/crash.php"), map)); + } catch (IOException ex) { + System.out.println("Failed to send post request to HMCL server."); + ex.printStackTrace(); + } } - }).start(); + }.start(); } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/upgrade/AppDataUpgrader.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/upgrade/AppDataUpgrader.java index eab21d939..93b70b515 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/upgrade/AppDataUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/upgrade/AppDataUpgrader.java @@ -45,6 +45,7 @@ import org.jackhuang.hellominecraft.utils.MessageBox; import org.jackhuang.hellominecraft.utils.UpdateChecker; import org.jackhuang.hellominecraft.utils.Utils; import org.jackhuang.hellominecraft.utils.VersionNumber; +import org.jackhuang.hellominecraft.utils.functions.Consumer; import org.jackhuang.hellominecraft.utils.system.FileUtils; import org.jackhuang.hellominecraft.utils.system.IOUtils; import org.jackhuang.hellominecraft.utils.system.OS; @@ -89,34 +90,37 @@ public class AppDataUpgrader extends IUpgrader { } @Override - public boolean call(Object sender, VersionNumber number) { - ((UpdateChecker) sender).requestDownloadLink().reg(map -> { - if (map != null && map.containsKey("pack")) - try { - if (TaskWindow.getInstance().addTask(new AppDataUpgraderTask(map.get("pack"), number.version)).start()) { - new ProcessBuilder(new String[] { IOUtils.getJavaDir(), "-jar", AppDataUpgraderTask.getSelf(number.version).getAbsolutePath() }).directory(new File(".")).start(); - System.exit(0); + public boolean call(Object sender, final VersionNumber number) { + ((UpdateChecker) sender).requestDownloadLink().reg(new Consumer>() { + @Override + public void accept(Map map) { + if (map != null && map.containsKey("pack")) + try { + if (TaskWindow.getInstance().addTask(new AppDataUpgraderTask(map.get("pack"), number.version)).start()) { + new ProcessBuilder(new String[] { IOUtils.getJavaDir(), "-jar", AppDataUpgraderTask.getSelf(number.version).getAbsolutePath() }).directory(new File(".")).start(); + System.exit(0); + } + } catch (IOException ex) { + HMCLog.err("Failed to create upgrader", ex); + } + if (MessageBox.Show(C.i18n("update.newest_version") + number.firstVer + "." + number.secondVer + "." + number.thirdVer + "\n" + + C.i18n("update.should_open_link"), + MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) { + String url = C.URL_PUBLISH; + if (map != null) + if (map.containsKey(OS.os().checked_name)) + url = map.get(OS.os().checked_name); + else if (map.containsKey(OS.UNKOWN.checked_name)) + url = map.get(OS.UNKOWN.checked_name); + if (url == null) + url = C.URL_PUBLISH; + try { + java.awt.Desktop.getDesktop().browse(new URI(url)); + } catch (URISyntaxException | IOException e) { + HMCLog.warn("Failed to browse uri: " + url, e); + Utils.setClipborad(url); + MessageBox.Show(C.i18n("update.no_browser")); } - } catch (IOException ex) { - HMCLog.err("Failed to create upgrader", ex); - } - if (MessageBox.Show(C.i18n("update.newest_version") + number.firstVer + "." + number.secondVer + "." + number.thirdVer + "\n" - + C.i18n("update.should_open_link"), - MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) { - String url = C.URL_PUBLISH; - if (map != null) - if (map.containsKey(OS.os().checked_name)) - url = map.get(OS.os().checked_name); - else if (map.containsKey(OS.UNKOWN.checked_name)) - url = map.get(OS.UNKOWN.checked_name); - if (url == null) - url = C.URL_PUBLISH; - try { - java.awt.Desktop.getDesktop().browse(new URI(url)); - } catch (URISyntaxException | IOException e) { - HMCLog.warn("Failed to browse uri: " + url, e); - Utils.setClipborad(url); - MessageBox.Show(C.i18n("update.no_browser")); } } }).execute(); @@ -142,7 +146,7 @@ public class AppDataUpgrader extends IUpgrader { } @Override - public Collection getDependTasks() { + public Collection getDependTasks() { return Arrays.asList(new FileDownloadTask(downloadLink, tempFile)); } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.form index 6534ecd71..46881e26b 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.form @@ -112,7 +112,7 @@ - + @@ -300,7 +300,7 @@ - + @@ -461,7 +461,7 @@ - + diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java index 90b9a356a..778a9e6b6 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java @@ -53,6 +53,8 @@ import org.jackhuang.hellominecraft.launcher.core.installers.InstallerType; import org.jackhuang.hellominecraft.launcher.core.mod.ModpackManager; import org.jackhuang.hellominecraft.launcher.core.version.GameDirType; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion; +import org.jackhuang.hellominecraft.launcher.settings.DefaultMinecraftService; +import org.jackhuang.hellominecraft.launcher.settings.VersionSetting; import org.jackhuang.hellominecraft.launcher.views.modpack.ModpackWizard; import org.jackhuang.hellominecraft.utils.tasks.TaskWindow; import org.jackhuang.hellominecraft.utils.Event; @@ -372,7 +374,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget lblLauncherVisibility.setText(C.i18n("advancedsettings.launcher_visible")); // NOI18N - lblRunDirectory.setText(C.i18n("advancedsettings.run_directory")); // NOI18N + lblRunDirectory.setText(C.i18n("settings.run_directory")); // NOI18N cboRunDirectory.setModel(new javax.swing.DefaultComboBoxModel(new String[] { C.I18N.getString("advancedsettings.game_dir.default"), C.I18N.getString("advancedsettings.game_dir.independent") })); cboRunDirectory.addFocusListener(new java.awt.event.FocusAdapter() { @@ -446,7 +448,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget .addComponent(lblDimensionX) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(txtHeight, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 444, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 410, Short.MAX_VALUE) .addComponent(chkFullscreen)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnlSettingsLayout.createSequentialGroup() .addComponent(txtMaxMemory) @@ -508,7 +510,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget tabVersionEdit.addTab(C.i18n("settings"), pnlSettings); // NOI18N - chkDebug.setText(C.i18n("advencedsettings.debug_mode")); // NOI18N + chkDebug.setText(C.i18n("advancedsettings.debug_mode")); // NOI18N chkDebug.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { chkDebugFocusLost(evt); @@ -915,7 +917,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget Settings.getInstance().setLast((String) cboProfiles.getSelectedItem()); if (getProfile().service().version().getVersionCount() <= 0) versionChanged(null); - prepare(getProfile()); + prepareProfile(getProfile()); } }//GEN-LAST:event_cboProfilesItemStateChanged @@ -974,45 +976,45 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget }//GEN-LAST:event_btnModifyMouseClicked private void txtJavaArgsFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtJavaArgsFocusLost - getProfile().setJavaArgs(txtJavaArgs.getText()); + getProfile().getSelectedVersionSetting().setJavaArgs(txtJavaArgs.getText()); }//GEN-LAST:event_txtJavaArgsFocusLost private void txtMinecraftArgsFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtMinecraftArgsFocusLost - getProfile().setMinecraftArgs(txtMinecraftArgs.getText()); + getProfile().getSelectedVersionSetting().setMinecraftArgs(txtMinecraftArgs.getText()); }//GEN-LAST:event_txtMinecraftArgsFocusLost private void txtPermSizeFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPermSizeFocusLost - getProfile().setPermSize(txtPermSize.getText()); + getProfile().getSelectedVersionSetting().setPermSize(txtPermSize.getText()); }//GEN-LAST:event_txtPermSizeFocusLost private void chkDebugFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkDebugFocusLost - getProfile().setDebug(chkDebug.isSelected()); + getProfile().getSelectedVersionSetting().setDebug(chkDebug.isSelected()); }//GEN-LAST:event_chkDebugFocusLost private void chkNoJVMArgsFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkNoJVMArgsFocusLost - getProfile().setNoJVMArgs(chkNoJVMArgs.isSelected()); + getProfile().getSelectedVersionSetting().setNoJVMArgs(chkNoJVMArgs.isSelected()); }//GEN-LAST:event_chkNoJVMArgsFocusLost private void chkCancelWrapperFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkCancelWrapperFocusLost - getProfile().setCanceledWrapper(chkCancelWrapper.isSelected()); + getProfile().getSelectedVersionSetting().setCanceledWrapper(chkCancelWrapper.isSelected()); }//GEN-LAST:event_chkCancelWrapperFocusLost private void txtPrecalledCommandFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPrecalledCommandFocusLost - getProfile().setPrecalledCommand(txtPrecalledCommand.getText()); + getProfile().getSelectedVersionSetting().setPrecalledCommand(txtPrecalledCommand.getText()); }//GEN-LAST:event_txtPrecalledCommandFocusLost private void txtServerIPFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtServerIPFocusLost - getProfile().setServerIp(txtServerIP.getText()); + getProfile().getSelectedVersionSetting().setServerIp(txtServerIP.getText()); }//GEN-LAST:event_txtServerIPFocusLost private void cboRunDirectoryFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_cboRunDirectoryFocusLost if (cboRunDirectory.getSelectedIndex() >= 0) - getProfile().setGameDirType(GameDirType.values()[cboRunDirectory.getSelectedIndex()]); + getProfile().getSelectedVersionSetting().setGameDirType(GameDirType.values()[cboRunDirectory.getSelectedIndex()]); }//GEN-LAST:event_cboRunDirectoryFocusLost private void cboLauncherVisibilityFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_cboLauncherVisibilityFocusLost if (cboLauncherVisibility.getSelectedIndex() >= 0) - getProfile().setLauncherVisibility(LauncherVisibility.values()[cboLauncherVisibility.getSelectedIndex()]); + getProfile().getSelectedVersionSetting().setLauncherVisibility(LauncherVisibility.values()[cboLauncherVisibility.getSelectedIndex()]); }//GEN-LAST:event_cboLauncherVisibilityFocusLost private void btnDownloadAllAssetsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDownloadAllAssetsActionPerformed @@ -1021,23 +1023,23 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget }//GEN-LAST:event_btnDownloadAllAssetsActionPerformed private void txtMaxMemoryFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtMaxMemoryFocusLost - getProfile().setMaxMemory(txtMaxMemory.getText()); + getProfile().getSelectedVersionSetting().setMaxMemory(txtMaxMemory.getText()); }//GEN-LAST:event_txtMaxMemoryFocusLost private void txtJavaDirFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtJavaDirFocusLost - getProfile().setJavaDir(txtJavaDir.getText()); + getProfile().getSelectedVersionSetting().setJavaDir(txtJavaDir.getText()); }//GEN-LAST:event_txtJavaDirFocusLost private void chkFullscreenFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkFullscreenFocusLost - getProfile().setFullscreen(chkFullscreen.isSelected()); + getProfile().getSelectedVersionSetting().setFullscreen(chkFullscreen.isSelected()); }//GEN-LAST:event_chkFullscreenFocusLost private void txtHeightFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtHeightFocusLost - getProfile().setHeight(txtHeight.getText()); + getProfile().getSelectedVersionSetting().setHeight(txtHeight.getText()); }//GEN-LAST:event_txtHeightFocusLost private void txtWidthFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtWidthFocusLost - getProfile().setWidth(txtWidth.getText()); + getProfile().getSelectedVersionSetting().setWidth(txtWidth.getText()); }//GEN-LAST:event_txtWidthFocusLost private void txtGameDirFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtGameDirFocusLost @@ -1061,7 +1063,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget try { String path = fc.getSelectedFile().getCanonicalPath(); txtJavaDir.setText(path); - getProfile().setJavaDir(txtJavaDir.getText()); + getProfile().getSelectedVersionSetting().setJavaDir(txtJavaDir.getText()); } catch (IOException e) { HMCLog.warn("Failed to set java path.", e); MessageBox.Show(C.i18n("ui.label.failed_set") + e.getMessage()); @@ -1074,9 +1076,9 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget int idx = cboJava.getSelectedIndex(); if (idx != -1) { Java j = Java.JAVA.get(idx); - getProfile().setJava(j); + getProfile().getSelectedVersionSetting().setJava(j); txtJavaDir.setEnabled(idx == 1); - txtJavaDir.setText(j.getHome() == null ? getProfile().getSettingsJavaDir() : j.getJava()); + txtJavaDir.setText(j.getHome() == null ? getProfile().getSelectedVersionSetting().getSettingsJavaDir() : j.getJava()); } }//GEN-LAST:event_cboJavaItemStateChanged @@ -1171,7 +1173,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget isLoading = true; cboProfiles.setSelectedIndex(index); isLoading = false; - prepare(getProfile()); + prepareProfile(getProfile()); } } @@ -1179,15 +1181,26 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget return Settings.getProfile((String) cboProfiles.getSelectedItem()); } - void prepare(Profile profile) { + final String mcVersion() { + return getProfile().getSelectedVersion(); + } + + void prepareProfile(Profile profile) { if (profile == null) return; profile.selectedVersionChangedEvent.register(this); + txtGameDir.setText(profile.getGameDir()); + + loadVersions(); + } + + void prepareVersionSetting(VersionSetting profile) { + if (profile == null) + return; txtWidth.setText(profile.getWidth()); txtHeight.setText(profile.getHeight()); txtMaxMemory.setText(profile.getMaxMemory()); txtPermSize.setText(profile.getPermSize()); - txtGameDir.setText(profile.getGameDir()); txtJavaArgs.setText(profile.getJavaArgs()); txtMinecraftArgs.setText(profile.getMinecraftArgs()); txtJavaDir.setText(profile.getSettingsJavaDir()); @@ -1204,8 +1217,6 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget cboJava.setSelectedIndex(profile.getJavaIndexInAllJavas()); isLoading = false; cboJavaItemStateChanged(new ItemEvent(cboJava, 0, cboJava.getSelectedItem(), ItemEvent.SELECTED)); - - loadVersions(); } void loadVersions() { @@ -1224,11 +1235,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget cboVersions.setSelectedIndex(index); reloadMods(); - - loadMinecraftVersion(); - } - - void loadMinecraftVersion() { + prepareVersionSetting(((DefaultMinecraftService) getProfile().service()).getVersionSetting(getProfile().getSelectedVersion())); loadMinecraftVersion(getProfile().getSelectedVersion()); } @@ -1309,6 +1316,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget // public void versionChanged(String version) { this.mcVersion = version; + prepareVersionSetting(getProfile().getVersionSetting(version)); for (InstallerPanel p : installerPanels) p.loadVersions(); } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java index 721341840..6de3aadd6 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java @@ -319,10 +319,10 @@ public class MainPagePanel extends AnimatedPanel implements Event { }//GEN-LAST:event_cboProfilesItemStateChanged private void cboVersionsItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboVersionsItemStateChanged - if (isLoading || evt.getStateChange() != ItemEvent.SELECTED || cboVersions.getSelectedIndex() < 0 || StrUtils.isBlank((String) cboVersions.getSelectedItem()) || getCurrentProfile() == null) + if (isLoading || evt.getStateChange() != ItemEvent.SELECTED || cboVersions.getSelectedIndex() < 0 || StrUtils.isBlank((String) cboVersions.getSelectedItem()) || getProfile() == null) return; String mcv = (String) cboVersions.getSelectedItem(); - getCurrentProfile().setSelectedMinecraftVersion(mcv); + getProfile().setSelectedMinecraftVersion(mcv); }//GEN-LAST:event_cboVersionsItemStateChanged @Override @@ -379,18 +379,18 @@ public class MainPagePanel extends AnimatedPanel implements Event { // void genLaunchCode(final Consumer listener) { - if (isLaunching || getCurrentProfile() == null) + if (isLaunching || getProfile() == null) return; isLaunching = true; HMCLog.log("Start generating launching command..."); - File file = getCurrentProfile().getCanonicalGameDirFile(); + File file = getProfile().getCanonicalGameDirFile(); if (!file.exists()) { HMCLog.warn("The minecraft path is wrong, please check it yourself."); MessageBox.ShowLocalized("minecraft.wrong_path"); return; } final String name = (String) cboProfiles.getSelectedItem(); - if (StrUtils.isBlank(name) || getCurrentProfile().getSelectedVersion() == null) { + if (StrUtils.isBlank(name) || getProfile().getSelectedVersion() == null) { HMCLog.warn("There's no selected version, rechoose a version."); MessageBox.ShowLocalized("minecraft.no_selected_version"); return; @@ -408,8 +408,8 @@ public class MainPagePanel extends AnimatedPanel implements Event { @Override public void run() { Thread.currentThread().setName("Game Launcher"); - DefaultGameLauncher gl = new DefaultGameLauncher(getCurrentProfile().createLaunchOptions(), getCurrentProfile().service(), li, l); - gl.setTag(getCurrentProfile().getLauncherVisibility()); + DefaultGameLauncher gl = new DefaultGameLauncher(getProfile().getSelectedVersionSetting().createLaunchOptions(getProfile().getCanonicalGameDirFile()), getProfile().service(), li, l); + gl.setTag(getProfile().getSelectedVersionSetting().getLauncherVisibility()); gl.successEvent.register((sender, s) -> { isLaunching = false; return true; @@ -478,10 +478,10 @@ public class MainPagePanel extends AnimatedPanel implements Event { isLoading = true; cboVersions.removeAllItems(); int index = 0, i = 0; - getCurrentProfile().selectedVersionChangedEvent.register(this); - getCurrentProfile().service().version().refreshVersions(); - String selVersion = getCurrentProfile().getSelectedVersion(); - if (getCurrentProfile().service().version().getVersions().isEmpty()) { + getProfile().selectedVersionChangedEvent.register(this); + getProfile().service().version().refreshVersions(); + String selVersion = getProfile().getSelectedVersion(); + if (getProfile().service().version().getVersions().isEmpty()) { if (!showedNoVersion) SwingUtilities.invokeLater(() -> { if (MessageBox.Show(C.i18n("mainwindow.no_version"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) { @@ -491,7 +491,7 @@ public class MainPagePanel extends AnimatedPanel implements Event { showedNoVersion = true; }); } else { - for (MinecraftVersion mcVersion : getCurrentProfile().service().version().getVersions()) { + for (MinecraftVersion mcVersion : getProfile().service().version().getVersions()) { if (mcVersion.hidden) continue; cboVersions.addItem(mcVersion.id); @@ -628,7 +628,7 @@ public class MainPagePanel extends AnimatedPanel implements Event { } - public Profile getCurrentProfile() { + public Profile getProfile() { return Settings.getProfile((String) cboProfiles.getSelectedItem()); } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/OverridableSwingWorker.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/OverridableSwingWorker.java index d50075ea6..c33a6e358 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/OverridableSwingWorker.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/OverridableSwingWorker.java @@ -46,11 +46,13 @@ public abstract class OverridableSwingWorker extends SwingWorker { } public OverridableSwingWorker reg(Consumer c) { + Utils.requireNonNull(c); processListeners.add(c); return this; } public OverridableSwingWorker regDone(Runnable c) { + Utils.requireNonNull(c); doneListeners.add(c); return this; } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/UpdateChecker.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/UpdateChecker.java index 143542033..0f37183ce 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/UpdateChecker.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/UpdateChecker.java @@ -40,7 +40,7 @@ public final class UpdateChecker implements IUpdateChecker { VersionNumber value; @Override - public OverridableSwingWorker process(boolean showMessage) { + public OverridableSwingWorker process(final boolean showMessage) { return new OverridableSwingWorker() { @Override protected void work() throws Exception { diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/tasks/Task.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/tasks/Task.java index 6451b0f55..160fc7d2f 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/tasks/Task.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/tasks/Task.java @@ -87,11 +87,11 @@ public abstract class Task { public abstract String getInfo(); - public Collection getDependTasks() { + public Collection getDependTasks() { return null; } - public Collection getAfterTasks() { + public Collection getAfterTasks() { return null; } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/tasks/TaskList.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/tasks/TaskList.java index 48882ab32..5f68990e3 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/tasks/TaskList.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/tasks/TaskList.java @@ -79,15 +79,15 @@ public class TaskList extends Thread { public void run() { executeTask(task); s.remove(this); - threadPool.remove(this); + THREAD_POOL.remove(this); } } - static final Set threadPool = Collections.synchronizedSet(new HashSet()); - static final Set taskPool = Collections.synchronizedSet(new HashSet()); + static final Set THREAD_POOL = Collections.synchronizedSet(new HashSet()); + static final Set TASK_POOL = Collections.synchronizedSet(new HashSet()); - private void processTasks(Collection c) { + private void processTasks(Collection c) { if (c == null) return; this.totTask += c.size(); @@ -95,7 +95,7 @@ public class TaskList extends Thread { for (Task t2 : c) { t2.setParallelExecuting(true); InvokeThread thread = new InvokeThread(t2, runningThread); - threadPool.add(thread); + THREAD_POOL.add(thread); runningThread.add(thread); thread.start(); } @@ -147,7 +147,7 @@ public class TaskList extends Thread { public void run() { Thread.currentThread().setName("TaskList"); - threadPool.clear(); + THREAD_POOL.clear(); totTask = taskQueue.size(); while (!taskQueue.isEmpty()) executeTask(taskQueue.remove(0)); @@ -162,12 +162,12 @@ public class TaskList extends Thread { public void abort() { shouldContinue = false; - while (!threadPool.isEmpty()) - synchronized (threadPool) { - InvokeThread it = threadPool.iterator().next(); + while (!THREAD_POOL.isEmpty()) + synchronized (THREAD_POOL) { + InvokeThread it = THREAD_POOL.iterator().next(); if (!it.task.abort()) it.interrupt(); - threadPool.remove(it); + THREAD_POOL.remove(it); } this.interrupt(); } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/views/wizard/api/displayer/NavButtonManager.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/views/wizard/api/displayer/NavButtonManager.java index 349a59ae0..e4017bda1 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/views/wizard/api/displayer/NavButtonManager.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/views/wizard/api/displayer/NavButtonManager.java @@ -199,20 +199,23 @@ public class NavButtonManager implements ActionListener { final boolean enableNext = nextStep != null && canContinue && problem == null && !isDeferredResult; final boolean enablePrevious = wizard.getPreviousStep() != null && !isDeferredResult; - final Runnable runnable = () -> { - next.setEnabled(enableNext); - prev.setEnabled(enablePrevious); - finish.setEnabled(enableFinish); - JRootPane root = next.getRootPane(); - if (root != null) - if (next.isEnabled()) - root.setDefaultButton(next); - else if (finish.isEnabled()) - root.setDefaultButton(finish); - else if (prev.isEnabled()) - root.setDefaultButton(prev); - else - root.setDefaultButton(null); + final Runnable runnable = new Runnable() { + @Override + public void run() { + next.setEnabled(enableNext); + prev.setEnabled(enablePrevious); + finish.setEnabled(enableFinish); + JRootPane root = next.getRootPane(); + if (root != null) + if (next.isEnabled()) + root.setDefaultButton(next); + else if (finish.isEnabled()) + root.setDefaultButton(finish); + else if (prev.isEnabled()) + root.setDefaultButton(prev); + else + root.setDefaultButton(null); + } }; if (EventQueue.isDispatchThread()) @@ -263,18 +266,21 @@ public class NavButtonManager implements ActionListener { } void deferredResultFailed(final boolean canGoBack) { - final Runnable runnable = () -> { - if (!canGoBack) - getCancel().setText(getCloseString()); - getPrev().setEnabled(true); - getNext().setEnabled(false); - getCancel().setEnabled(true); - getFinish().setEnabled(false); + final Runnable runnable = new Runnable() { + @Override + public void run() { + if (!canGoBack) + getCancel().setText(getCloseString()); + getPrev().setEnabled(true); + getNext().setEnabled(false); + getCancel().setEnabled(true); + getFinish().setEnabled(false); - if (NAME_CLOSE.equals(deferredStatus)) { - // no action - } else - deferredStatus = DEFERRED_FAILED + deferredStatus; + if (NAME_CLOSE.equals(deferredStatus)) { + // no action + } else + deferredStatus = DEFERRED_FAILED + deferredStatus; + } }; if (EventQueue.isDispatchThread()) runnable.run(); @@ -596,22 +602,25 @@ public class NavButtonManager implements ActionListener { } public void navigabilityChanged(final Wizard wizard) { - final Runnable runnable = () -> { - if (wizard.isBusy()) { - next.setEnabled(false); - prev.setEnabled(false); - finish.setEnabled(false); - cancel.setEnabled(false); - parent.getOuterPanel().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - wasBusy = true; - return; - } else if (wasBusy) { - cancel.setEnabled(true); - parent.getOuterPanel().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - } - configureNavigationButtons(wizard, prev, next, finish); + final Runnable runnable = new Runnable() { + @Override + public void run() { + if (wizard.isBusy()) { + next.setEnabled(false); + prev.setEnabled(false); + finish.setEnabled(false); + cancel.setEnabled(false); + parent.getOuterPanel().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + wasBusy = true; + return; + } else if (wasBusy) { + cancel.setEnabled(true); + parent.getOuterPanel().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } + configureNavigationButtons(wizard, prev, next, finish); - parent.updateProblem(); + parent.updateProblem(); + } }; if (EventQueue.isDispatchThread()) runnable.run(); diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/views/wizard/modules/InstructionsPanelImpl.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/views/wizard/modules/InstructionsPanelImpl.java index 43bb3bd20..f12591bdf 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/views/wizard/modules/InstructionsPanelImpl.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/views/wizard/modules/InstructionsPanelImpl.java @@ -29,7 +29,6 @@ import java.awt.IllegalComponentStateException; import java.awt.Insets; import java.awt.image.BufferedImage; import java.io.IOException; -import java.net.URL; import java.util.Locale; import java.util.Arrays; import javax.accessibility.Accessible; @@ -119,34 +118,6 @@ public class InstructionsPanelImpl extends JComponent implements WizardObserver, } public InstructionsPanelImpl(BufferedImage img, Wizard wizard) { - if (img == null) - //In the event of classloader issues, also have a way to get - //the image from UIManager - slightly more portable for large - //apps - img = (BufferedImage) UIManager.get("wizard.sidebar.image"); - - String imgStr = System.getProperty("wizard.sidebar.image"); - //image has not been loaded and user wishes to supply their own image - if (img == null && imgStr != null) { - //get an URL, works for jars - ClassLoader cl = this.getClass().getClassLoader(); - URL url = cl.getResource(imgStr); - //successfully parsed the URL - if (url != null) - try { - img = ImageIO.read(url); - } catch (IOException ioe) { - System.err.println("Could not load wizard image " - + ioe.getMessage()); - System.setProperty("wizard.sidebar.image", null); - img = null; //error loading img, set to null to use default - } - else { //URL was not successfully parsed, set img to null to use default - System.err.println("Bad URL for wizard image " + imgStr); - System.setProperty("wizard.sidebar.image", null); - img = null; - } - } if (img == null) try { img = ImageIO.read(InstructionsPanelImpl.class.getResourceAsStream( diff --git a/HMCLAPI/src/main/java/org/tukaani/xz/CountingInputStream.java b/HMCLAPI/src/main/java/org/tukaani/xz/CountingInputStream.java old mode 100755 new mode 100644 diff --git a/HMCLAPI/src/main/java/org/tukaani/xz/CountingOutputStream.java b/HMCLAPI/src/main/java/org/tukaani/xz/CountingOutputStream.java old mode 100755 new mode 100644 diff --git a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N.properties b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N.properties index f9a5ba8f9..16902f4cb 100755 --- a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N.properties +++ b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N.properties @@ -198,9 +198,10 @@ settings.cannot_remove_default_config=\u4e0d\u80fd\u5220\u9664\u9ed8\u8ba4\u914d settings.max_memory=\u6700\u5927\u5185\u5b58/MB settings.java_dir=Java\u8def\u5f84 settings.game_directory=\u6e38\u620f\u8def\u5f84 -settings.dimension=\u5206\u8fa8\u7387 +settings.dimension=\u6e38\u620f\u7a97\u53e3\u5206\u8fa8\u7387 settings.fullscreen=\u5168\u5c4f settings.update_version=\u66f4\u65b0\u7248\u672c\u6587\u4ef6 +settings.run_directory=\u8fd0\u884c\u8def\u5f84(\u7248\u672c\u9694\u79bb) settings.physical_memory=\u7269\u7406\u5185\u5b58\u5927\u5c0f settings.choose_javapath=\u9009\u62e9Java\u8def\u5f84 settings.default=\u9ed8\u8ba4 @@ -237,8 +238,7 @@ mods.default_information=\u5b89\u88c5Mod\u524d\u4f60\u advancedsettings=\u9ad8\u7ea7\u8bbe\u7f6e advancedsettings.launcher_visible=\u542f\u52a8\u5668\u53ef\u89c1\u6027 -advancedsettings.run_directory=\u8fd0\u884c\u8def\u5f84 -advencedsettings.debug_mode=\u8c03\u8bd5\u6a21\u5f0f +advancedsettings.debug_mode=\u8c03\u8bd5\u6a21\u5f0f advancedsettings.java_permanent_generation_space=\u5185\u5b58\u6c38\u4e45\u4fdd\u5b58\u533a\u57df(\u4e0d\u5fc5\u586b\u5199,MB) advancedsettings.jvm_args=Java\u865a\u62df\u673a\u53c2\u6570(\u4e0d\u5fc5\u586b\u5199) advancedsettings.Minecraft_arguments=Minecraft\u989d\u5916\u53c2\u6570(\u4e0d\u5fc5\u586b\u5199) @@ -368,4 +368,5 @@ wizard.close=\u5173\u95ed wizard.close_mnemonic=\u5173 wizard.summary=\u6982\u8981 wizard.failed=\u5931\u8d25 -wizard.steps=\u6b65\u9aa4 \ No newline at end of file +wizard.steps=\u6b65\u9aa4 +advancedsettings.debug_mode=\u8c03\u8bd5\u6a21\u5f0f diff --git a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_en.properties b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_en.properties index 7c8747db3..2b744aeff 100755 --- a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_en.properties +++ b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_en.properties @@ -197,10 +197,11 @@ settings.manage=Manage settings.cannot_remove_default_config=Cannot remove the default configution. settings.max_memory=Max Memory/MB settings.java_dir=Java Dir -settings.game_directory=Game Dir -settings.dimension=Dimension +settings.game_directory=Game Directory +settings.dimension=Game Window Dimension settings.fullscreen=Fullscreen settings.update_version=Update version json. +settings.run_directory=Run Directory(Version Isolation) settings.physical_memory=Physical Memory Size settings.choose_javapath=Choose Java Directory. settings.default=Default @@ -237,8 +238,7 @@ mods.default_information=Please ensure that you have i advancedsettings=Advanced advancedsettings.launcher_visible=Launcher Visibility -advancedsettings.run_directory=Run Directory -advencedsettings.debug_mode=Debug Mode +advancedsettings.debug_mode=Debug Mode advancedsettings.java_permanent_generation_space=Permanent Generation Space/MB advancedsettings.jvm_args=Java VM Arguments advancedsettings.Minecraft_arguments=Minecraft Arguments diff --git a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh.properties b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh.properties index 4ac1cdcb3..f73648d51 100755 --- a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh.properties +++ b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh.properties @@ -198,9 +198,10 @@ settings.cannot_remove_default_config=\u4e0d\u80fd\u522a\u9664\u9ed8\u8a8d\u914d settings.max_memory=\u6700\u5927\u5167\u5b58\uff08MB\uff09 settings.java_dir=Java\u8def\u5f91 settings.game_directory=\u904a\u6232\u8def\u5f91 -settings.dimension=\u5206\u8fa8\u7387 +settings.dimension=\u6e38\u620f\u7a97\u53e3\u5206\u8fa8\u7387 settings.fullscreen=\u5168\u5c4f settings.update_version=\u66f4\u65b0\u7248\u672c\u8cc7\u6599 +settings.run_directory=\u904b\u884c\u8def\u5f91(\u7248\u672c\u9694\u96e2) settings.physical_memory=\u7269\u7406\u5185\u5b58\u5927\u5c0f settings.choose_javapath=\u9009\u62e9Java\u8def\u5f84 settings.default=\u9ed8\u8a8d @@ -237,8 +238,7 @@ mods.default_information=\u60a8\u53ef\u4ee5\u62d6\u52a8mod\u5230\u5217\u88 advancedsettings=\u9ad8\u7d1a\u8a2d\u5b9a advancedsettings.launcher_visible=\u555f\u52d5\u5668\u53ef\u898b\u6027 -advancedsettings.run_directory=\u904b\u884c\u8def\u5f91 -advencedsettings.debug_mode=\u8abf\u8a66\u6a21\u5f0f +advancedsettings.debug_mode=\u8abf\u8a66\u6a21\u5f0f advancedsettings.java_permanent_generation_space=\u5167\u5b58\u6c38\u4e45\u4fdd\u5b58\u5340\u57df/MB advancedsettings.jvm_args=Java\u865b\u64ec\u6a5f\u53c3\u6578(\u4e0d\u5fc5\u586b\u5beb) advancedsettings.Minecraft_arguments=Minecraft\u984d\u5916\u53c3\u6578(\u4e0d\u5fc5\u586b\u5beb) diff --git a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh_CN.properties b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh_CN.properties index 73a5df1b3..d3fade3dc 100755 --- a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh_CN.properties +++ b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh_CN.properties @@ -198,10 +198,11 @@ settings.cannot_remove_default_config=\u4e0d\u80fd\u5220\u9664\u9ed8\u8ba4\u914d settings.max_memory=\u6700\u5927\u5185\u5b58/MB settings.java_dir=Java\u8def\u5f84 settings.game_directory=\u6e38\u620f\u8def\u5f84 -settings.dimension=\u5206\u8fa8\u7387 +settings.dimension=\u6e38\u620f\u7a97\u53e3\u5206\u8fa8\u7387 settings.fullscreen=\u5168\u5c4f settings.update_version=\u66f4\u65b0\u7248\u672c\u6587\u4ef6 settings.physical_memory=\u7269\u7406\u5185\u5b58\u5927\u5c0f +settings.run_directory=\u8fd0\u884c\u8def\u5f84(\u7248\u672c\u9694\u79bb) settings.choose_javapath=\u9009\u62e9Java\u8def\u5f84 settings.default=\u9ed8\u8ba4 settings.custom=\u81ea\u5b9a\u4e49 @@ -237,8 +238,7 @@ mods.default_information=\u5b89\u88c5Mod\u524d\u4f60\u advancedsettings=\u9ad8\u7ea7\u8bbe\u7f6e advancedsettings.launcher_visible=\u542f\u52a8\u5668\u53ef\u89c1\u6027 -advancedsettings.run_directory=\u8fd0\u884c\u8def\u5f84 -advencedsettings.debug_mode=\u8c03\u8bd5\u6a21\u5f0f +advancedsettings.debug_mode=\u8c03\u8bd5\u6a21\u5f0f advancedsettings.java_permanent_generation_space=\u5185\u5b58\u6c38\u4e45\u4fdd\u5b58\u533a\u57df(\u4e0d\u5fc5\u586b\u5199,MB) advancedsettings.jvm_args=Java\u865a\u62df\u673a\u53c2\u6570(\u4e0d\u5fc5\u586b\u5199) advancedsettings.Minecraft_arguments=Minecraft\u989d\u5916\u53c2\u6570(\u4e0d\u5fc5\u586b\u5199)