diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Launcher.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Launcher.java index d6412fc61..6355731b7 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Launcher.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Launcher.java @@ -66,7 +66,7 @@ public final class Launcher { int len = tokenized.length; if (showInfo) { - LogWindow.instance.setTerminateGame(() -> Utils.shutdownForcely(1)); + LogWindow.INSTANCE.setTerminateGame(() -> Utils.shutdownForcely(1)); try { File logFile = new File("hmclmc.log"); if (!logFile.exists()) @@ -84,9 +84,7 @@ public final class Launcher { println("Arguments: {\n" + StrUtils.parseParams(" ", args, "\n") + "\n}"); println("Main Class: " + mainClass); println("Class Path: {\n" + StrUtils.parseParams(" ", tokenized, "\n") + "\n}"); - SwingUtilities.invokeLater(() -> { - LogWindow.instance.setVisible(true); - }); + SwingUtilities.invokeLater(() -> LogWindow.INSTANCE.setVisible(true)); } URL[] urls = new URL[len]; @@ -126,8 +124,8 @@ public final class Launcher { System.err.println(C.i18n("crash.minecraft")); System.err.println(advice); System.err.println(trace); - LogWindow.instance.setExit(() -> true); - LogWindow.instance.setVisible(true); + LogWindow.INSTANCE.setExit(() -> true); + LogWindow.INSTANCE.setVisible(true); flag = 1; } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java index f1f19ffb9..f59660cf2 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java @@ -24,9 +24,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.Authenticator; -import java.net.InetSocketAddress; import java.net.PasswordAuthentication; -import java.net.Proxy; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; @@ -108,7 +106,7 @@ public final class Main implements Runnable { public static String launcherName = "Hello Minecraft! Launcher"; public static byte firstVer = 2, secondVer = 3, thirdVer = 5, forthVer = 5; public static int minimumLauncherVersion = 16; - public static Proxy PROXY; + //public static Proxy PROXY; /** * Make the version of HMCL. @@ -178,8 +176,8 @@ public final class Main implements Runnable { HMCLog.log("*** " + Main.makeTitle() + " ***"); - LogWindow.instance.clean(); - LogWindow.instance.setTerminateGame(GameLauncher.PROCESS_MANAGER::stopAllProcesses); + LogWindow.INSTANCE.clean(); + LogWindow.INSTANCE.setTerminateGame(GameLauncher.PROCESS_MANAGER::stopAllProcesses); try { UIManager.setLookAndFeel(new HelloMinecraftLookAndFeel()); @@ -200,13 +198,13 @@ public final class Main implements Runnable { return new PasswordAuthentication(Settings.getInstance().getProxyUserName(), Settings.getInstance().getProxyPassword().toCharArray()); } }); - PROXY = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(Settings.getInstance().getProxyHost(), Integer.parseInt(Settings.getInstance().getProxyPort()))); + //PROXY = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(Settings.getInstance().getProxyHost(), Integer.parseInt(Settings.getInstance().getProxyPort()))); } else { - PROXY = Proxy.NO_PROXY; + //PROXY = Proxy.NO_PROXY; } try { - MainFrame.showMainFrame(Settings.isFirstLoad()); + MainFrame.showMainFrame(Settings.isFirstLoading()); } catch (Throwable t) { new CrashReporter(false).uncaughtException(Thread.currentThread(), t); System.exit(1); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/DefaultGameLauncher.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/DefaultGameLauncher.java index 394c1efac..b7ad56ab2 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/DefaultGameLauncher.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/DefaultGameLauncher.java @@ -23,7 +23,6 @@ import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.launcher.launch.GameLauncher.DownloadLibraryJob; import org.jackhuang.hellominecraft.launcher.utils.auth.IAuthenticator; import org.jackhuang.hellominecraft.launcher.utils.auth.LoginInfo; -import org.jackhuang.hellominecraft.launcher.utils.download.DownloadType; import org.jackhuang.hellominecraft.launcher.settings.Profile; import org.jackhuang.hellominecraft.tasks.ParallelTask; import org.jackhuang.hellominecraft.tasks.TaskWindow; @@ -37,11 +36,6 @@ public class DefaultGameLauncher extends GameLauncher { register(); } - public DefaultGameLauncher(Profile version, LoginInfo info, IAuthenticator lg, DownloadType downloadType) { - super(version, info, lg, downloadType); - register(); - } - private void register() { downloadLibrariesEvent.register((sender, t) -> { final TaskWindow.TaskWindowFactory dw = TaskWindow.getInstance(); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameLauncher.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameLauncher.java index 0eb9db9a7..d82193678 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameLauncher.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameLauncher.java @@ -29,7 +29,6 @@ import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.launcher.utils.auth.IAuthenticator; import org.jackhuang.hellominecraft.launcher.utils.auth.LoginInfo; import org.jackhuang.hellominecraft.launcher.utils.auth.UserProfileProvider; -import org.jackhuang.hellominecraft.launcher.utils.download.DownloadType; import org.jackhuang.hellominecraft.launcher.settings.Profile; import org.jackhuang.hellominecraft.launcher.utils.auth.AuthenticationException; import org.jackhuang.hellominecraft.utils.system.FileUtils; @@ -54,18 +53,12 @@ public class GameLauncher { public final EventHandler> successEvent = new EventHandler(this); public final EventHandler launchEvent = new EventHandler(this); public final EventHandler decompressNativesEvent = new EventHandler(this); - DownloadType downloadType; public GameLauncher(Profile version, LoginInfo info, IAuthenticator lg) { - this(version, info, lg, DownloadType.Mojang); - } - - public GameLauncher(Profile version, LoginInfo info, IAuthenticator lg, DownloadType downloadType) { this.get = version; this.provider = get.getMinecraftProvider(); this.info = info; this.login = lg; - this.downloadType = downloadType; } public Profile getProfile() { @@ -89,7 +82,7 @@ public class GameLauncher { } try { - loader = provider.provideMinecraftLoader(result, downloadType); + loader = provider.provideMinecraftLoader(result); } catch (IllegalStateException e) { HMCLog.err("Failed to get minecraft loader", e); failEvent.execute(C.i18n("launch.circular_dependency_versions")); @@ -101,7 +94,7 @@ public class GameLauncher { FileUtils.cleanDirectoryQuietly(file); HMCLog.log("Detecting libraries..."); - if (!downloadLibrariesEvent.execute(provider.getDownloadLibraries(downloadType))) { + if (!downloadLibrariesEvent.execute(provider.getDownloadService().getDownloadLibraries())) { failEvent.execute(C.i18n("launch.failed")); return null; } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/IMinecraftModService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/IMinecraftModService.java index 139cef227..3b9a5983e 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/IMinecraftModService.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/IMinecraftModService.java @@ -19,19 +19,24 @@ package org.jackhuang.hellominecraft.launcher.launch; import java.io.File; import java.util.List; +import org.jackhuang.hellominecraft.launcher.settings.Profile; import org.jackhuang.hellominecraft.launcher.utils.ModInfo; /** * * @author huangyuhui */ -public interface IMinecraftModService { +public abstract class IMinecraftModService extends IMinecraftService { - List getMods(); + public IMinecraftModService(Profile profile) { + super(profile); + } - List recacheMods(); + public abstract List getMods(); - boolean addMod(File f); + public abstract List recacheMods(); - void removeMod(int[] index); + public abstract boolean addMod(File f); + + public abstract void removeMod(int[] index); } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/IMinecraftProvider.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/IMinecraftProvider.java index 9c052fcb7..04a235887 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/IMinecraftProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/IMinecraftProvider.java @@ -19,9 +19,7 @@ package org.jackhuang.hellominecraft.launcher.launch; import java.io.File; import java.util.Collection; -import java.util.List; import org.jackhuang.hellominecraft.launcher.utils.auth.UserProfileProvider; -import org.jackhuang.hellominecraft.launcher.utils.download.DownloadType; import org.jackhuang.hellominecraft.launcher.settings.Profile; import org.jackhuang.hellominecraft.launcher.version.MinecraftVersion; import org.jackhuang.hellominecraft.utils.StrUtils; @@ -34,7 +32,7 @@ import org.jackhuang.hellominecraft.utils.StrUtils; */ public abstract class IMinecraftProvider { - Profile profile; + protected Profile profile; public IMinecraftProvider(Profile profile) { this.profile = profile; @@ -53,20 +51,13 @@ public abstract class IMinecraftProvider { return new File(getRunDirectory(getSelectedMinecraftVersion().id), subFolder); } - /** - * Get the libraries that need to download. - * - * @param type where to download - * - * @return the library collection - */ - public abstract List getDownloadLibraries(DownloadType type); - public abstract void open(String version, String folder); - - public abstract File getAssets(); public abstract IMinecraftModService getModService(); + + public abstract IMinecraftDownloadService getDownloadService(); + + public abstract IMinecraftAssetService getAssetService(); /** * Returns the thing like ".minecraft/resourcepacks". @@ -100,7 +91,7 @@ public abstract class IMinecraftProvider { * * @throws IllegalStateException circular denpendency versions */ - public abstract IMinecraftLoader provideMinecraftLoader(UserProfileProvider p, DownloadType type) throws IllegalStateException; + public abstract IMinecraftLoader provideMinecraftLoader(UserProfileProvider p) throws IllegalStateException; /** * Rename version @@ -124,20 +115,13 @@ public abstract class IMinecraftProvider { /** * Redownload the Minecraft json of the given version. * - * @param a the given version name + * @param id the given version name * * @return Is the action successful? */ - public abstract boolean refreshJson(String a); - - /** - * Redownload the Asset index json of the given version. - * - * @param a the given version name - * - * @return Is the action successful? - */ - public abstract boolean refreshAssetsIndex(String a); + public boolean refreshJson(String id) { + return getDownloadService().downloadMinecraftVersionJson(id); + } /** * Choose a version randomly. @@ -199,16 +183,6 @@ public abstract class IMinecraftProvider { */ public abstract void cleanFolder(); - /** - * Install a new version to this profile. - * - * @param version the new version name - * @param type where to download - * - * @return Is the action successful? - */ - public abstract boolean install(String version, DownloadType type); - /** * When GameLauncher launches the game, this function will be called. */ diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/LaunchFinisher.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/LaunchFinisher.java index 45fab9678..908851167 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/LaunchFinisher.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/LaunchFinisher.java @@ -34,18 +34,18 @@ public class LaunchFinisher implements Event> { public boolean call(Object sender, List str) { final GameLauncher obj = (GameLauncher) sender; obj.launchEvent.register((sender1, p) -> { - if (obj.getProfile().getLauncherVisibility() == LauncherVisibility.CLOSE && !LogWindow.instance.isVisible()) + if (obj.getProfile().getLauncherVisibility() == LauncherVisibility.CLOSE && !LogWindow.INSTANCE.isVisible()) System.exit(0); else if (obj.getProfile().getLauncherVisibility() == LauncherVisibility.KEEP) MainFrame.INSTANCE.closeMessage(); else { - if (LogWindow.instance.isVisible()) - LogWindow.instance.setExit(() -> true); + if (LogWindow.INSTANCE.isVisible()) + LogWindow.INSTANCE.setExit(() -> true); MainFrame.INSTANCE.dispose(); } JavaProcessMonitor jpm = new JavaProcessMonitor(p); jpm.stoppedEvent.register((sender3, t) -> { - if (obj.getProfile().getLauncherVisibility() != LauncherVisibility.KEEP && !LogWindow.instance.isVisible()) + if (obj.getProfile().getLauncherVisibility() != LauncherVisibility.KEEP && !LogWindow.INSTANCE.isVisible()) System.exit(0); return true; }); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/MinecraftLoader.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/MinecraftLoader.java index a51dd99e7..066d7ca68 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/MinecraftLoader.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/MinecraftLoader.java @@ -27,7 +27,6 @@ import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.launcher.utils.auth.UserProfileProvider; import org.jackhuang.hellominecraft.launcher.settings.Profile; import org.jackhuang.hellominecraft.utils.system.IOUtils; -import org.jackhuang.hellominecraft.launcher.utils.MCUtils; import org.jackhuang.hellominecraft.launcher.utils.assets.AssetsIndex; import org.jackhuang.hellominecraft.launcher.utils.assets.AssetsObject; import org.jackhuang.hellominecraft.launcher.utils.assets.IAssetsHandler; @@ -46,17 +45,13 @@ import rx.concurrency.Schedulers; */ public class MinecraftLoader extends AbstractMinecraftLoader { - private MinecraftVersion version; + private final MinecraftVersion version; DownloadType dt; String text; public MinecraftLoader(Profile ver, IMinecraftProvider provider, UserProfileProvider lr) throws IllegalStateException { - this(ver, provider, lr, DownloadType.Mojang); - } - - public MinecraftLoader(Profile ver, IMinecraftProvider provider, UserProfileProvider lr, DownloadType downloadtype) throws IllegalStateException { super(ver, provider, lr); - version = ver.getSelectedMinecraftVersion().resolve(provider, dt = downloadtype); + version = ver.getSelectedMinecraftVersion().resolve(provider); } @Override @@ -95,7 +90,7 @@ public class MinecraftLoader extends AbstractMinecraftLoader { t = t.replace("${profile_name}", provider.profile.getName()); t = t.replace("${game_directory}", provider.getRunDirectory(version.id).getAbsolutePath()); t = t.replace("${game_assets}", game_assets); - t = t.replace("${assets_root}", provider.getAssets().getAbsolutePath()); + t = t.replace("${assets_root}", provider.getAssetService().getAssets().getAbsolutePath()); t = t.replace("${auth_access_token}", lr.getAccessToken()); t = t.replace("${user_type}", lr.getUserType()); t = t.replace("${assets_index_name}", version.getAssets()); @@ -115,7 +110,7 @@ public class MinecraftLoader extends AbstractMinecraftLoader { try { if (OS.os() == OS.OSX) { - list.add("-Xdock:icon=" + MCUtils.getAssetObject(C.gson, v.getCanonicalGameDir(), version.assets, "icons/minecraft.icns").getAbsolutePath()); + list.add("-Xdock:icon=" + provider.getAssetService().getAssetObject(version.assets, "icons/minecraft.icns").getAbsolutePath()); list.add("-Xdock:name=Minecraft"); } } catch (IOException e) { 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 7862aebd5..fd0974e2b 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Profile.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Profile.java @@ -21,9 +21,9 @@ import java.io.File; import org.jackhuang.hellominecraft.launcher.launch.IMinecraftProvider; import org.jackhuang.hellominecraft.utils.system.IOUtils; import org.jackhuang.hellominecraft.launcher.utils.MCUtils; +import org.jackhuang.hellominecraft.launcher.utils.download.DownloadType; import org.jackhuang.hellominecraft.launcher.utils.installers.InstallerService; import org.jackhuang.hellominecraft.launcher.version.GameDirType; -import org.jackhuang.hellominecraft.launcher.version.MinecraftService; import org.jackhuang.hellominecraft.utils.StrUtils; import org.jackhuang.hellominecraft.utils.Utils; import org.jackhuang.hellominecraft.launcher.version.MinecraftVersion; @@ -365,8 +365,7 @@ public final class Profile { return is; } - transient final MinecraftService ms = new MinecraftService(this); - public MinecraftService getMinecraftService() { - return ms; + public DownloadType getDownloadType() { + return Settings.getInstance().getDownloadSource(); } } 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 f854d4e7e..e14d8c8e2 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Settings.java @@ -46,23 +46,23 @@ public final class Settings { public static final String DEFAULT_PROFILE = "Default"; - public static final File settingsFile = new File(IOUtils.currentDir(), "hmcl.json"); + public static final File SETTINGS_FILE = new File(IOUtils.currentDir(), "hmcl.json"); - private static boolean isFirstLoad; - private static final Config settings; + private static boolean isFirstLoading; + private static final Config SETTINGS; public static final UpdateChecker UPDATE_CHECKER; public static final List JAVA; public static Config getInstance() { - return settings; + return SETTINGS; } - public static boolean isFirstLoad() { - return isFirstLoad; + public static boolean isFirstLoading() { + return isFirstLoading; } static { - settings = initSettings(); + SETTINGS = initSettings(); if (!getProfiles().containsKey(DEFAULT_PROFILE)) getProfiles().put(DEFAULT_PROFILE, new Profile()); @@ -84,9 +84,9 @@ public final class Settings { private static Config initSettings() { Config c = new Config(); - if (settingsFile.exists()) { + if (SETTINGS_FILE.exists()) { try { - String str = FileUtils.readFileToString(settingsFile); + String str = FileUtils.readFileToString(SETTINGS_FILE); if (str == null || str.trim().equals("")) HMCLog.log("Settings file is empty, use the default settings."); else { @@ -102,17 +102,17 @@ public final class Settings { System.exit(1); } } - isFirstLoad = StrUtils.isBlank(c.getUsername()); + isFirstLoading = StrUtils.isBlank(c.getUsername()); } else { HMCLog.log("No settings file here, may be first loading."); - isFirstLoad = true; + isFirstLoading = true; } return c; } public static void save() { try { - FileUtils.write(settingsFile, C.gsonPrettyPrinting.toJson(settings)); + FileUtils.write(SETTINGS_FILE, C.gsonPrettyPrinting.toJson(SETTINGS)); } catch (IOException ex) { HMCLog.err("Failed to save config", ex); } @@ -123,7 +123,7 @@ public final class Settings { } public static Map getProfiles() { - return settings.getConfigurations(); + return SETTINGS.getConfigurations(); } public static void setProfile(Profile ver) { @@ -135,7 +135,7 @@ public final class Settings { } public static Profile getOneProfile() { - return settings.getConfigurations().firstEntry().getValue(); + return SETTINGS.getConfigurations().firstEntry().getValue(); } public static boolean trySetProfile(Profile ver) { 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 fb982c7b3..3af8b38c0 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/CrashReporter.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/CrashReporter.java @@ -99,7 +99,7 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { System.out.println(text); if (checkThrowable(e)) { - SwingUtilities.invokeLater(() -> LogWindow.instance.showAsCrashWindow(UpdateChecker.OUT_DATED)); + SwingUtilities.invokeLater(() -> LogWindow.INSTANCE.showAsCrashWindow(UpdateChecker.OUT_DATED)); if (!UpdateChecker.OUT_DATED) reportToServer(text, s); } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/MCUtils.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/MCUtils.java index 3953357c6..654920b7d 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/MCUtils.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/MCUtils.java @@ -17,25 +17,10 @@ */ package org.jackhuang.hellominecraft.launcher.utils; -import com.google.gson.Gson; -import com.google.gson.JsonSyntaxException; import java.io.File; import java.io.IOException; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; -import org.jackhuang.hellominecraft.C; -import org.jackhuang.hellominecraft.HMCLog; -import org.jackhuang.hellominecraft.launcher.utils.assets.AssetsIndex; -import org.jackhuang.hellominecraft.launcher.utils.assets.AssetsObject; -import org.jackhuang.hellominecraft.launcher.utils.download.DownloadType; -import org.jackhuang.hellominecraft.launcher.version.MinecraftVersion; -import org.jackhuang.hellominecraft.tasks.TaskWindow; -import org.jackhuang.hellominecraft.tasks.download.FileDownloadTask; -import org.jackhuang.hellominecraft.utils.ArrayUtils; import org.jackhuang.hellominecraft.utils.system.FileUtils; import org.jackhuang.hellominecraft.utils.system.IOUtils; -import org.jackhuang.hellominecraft.version.MinecraftVersionRequest; -import org.jackhuang.hellominecraft.utils.NetUtils; import org.jackhuang.hellominecraft.utils.system.OS; /** @@ -44,144 +29,6 @@ import org.jackhuang.hellominecraft.utils.system.OS; */ public final class MCUtils { - public static File getAssetObject(Gson gson, String dir, String assetVersion, String name) throws IOException { - File assetsDir = new File(dir, "assets"); - File indexDir = new File(assetsDir, "indexes"); - File objectsDir = new File(assetsDir, "objects"); - File indexFile = new File(indexDir, assetVersion + ".json"); - try { - AssetsIndex index = (AssetsIndex) gson.fromJson(FileUtils.readFileToString(indexFile, "UTF-8"), AssetsIndex.class); - - String hash = ((AssetsObject) index.getFileMap().get(name)).getHash(); - return new File(objectsDir, hash.substring(0, 2) + "/" + hash); - } catch (JsonSyntaxException e) { - throw new IOException("Assets file format malformed.", e); - } - } - - private static int lessThan32(byte[] b, int x) { - for (; x < b.length; x++) - if (b[x] < 32) - return x; - return -1; - } - - private static MinecraftVersionRequest getVersionOfOldMinecraft(ZipFile file, ZipEntry entry) throws IOException { - MinecraftVersionRequest r = new MinecraftVersionRequest(); - byte[] tmp = NetUtils.getBytesFromStream(file.getInputStream(entry)); - - byte[] bytes = "Minecraft Minecraft ".getBytes("ASCII"); - int j; - if ((j = ArrayUtils.matchArray(tmp, bytes)) < 0) { - r.type = MinecraftVersionRequest.UNKOWN; - return r; - } - int i = j + bytes.length; - - if ((j = lessThan32(tmp, i)) < 0) { - r.type = MinecraftVersionRequest.UNKOWN; - return r; - } - String ver = new String(tmp, i, j - i, "ASCII"); - r.version = ver; - - r.type = file.getEntry("META-INF/MANIFEST.MF") == null - ? MinecraftVersionRequest.MODIFIED : MinecraftVersionRequest.OK; - return r; - } - - private static MinecraftVersionRequest getVersionOfNewMinecraft(ZipFile file, ZipEntry entry) throws IOException { - MinecraftVersionRequest r = new MinecraftVersionRequest(); - byte[] tmp = NetUtils.getBytesFromStream(file.getInputStream(entry)); - - byte[] str = "-server.txt".getBytes("ASCII"); - int j = ArrayUtils.matchArray(tmp, str); - if (j < 0) { - r.type = MinecraftVersionRequest.UNKOWN; - return r; - } - int i = j + str.length; - i += 11; - j = lessThan32(tmp, i); - if (j < 0) { - r.type = MinecraftVersionRequest.UNKOWN; - return r; - } - r.version = new String(tmp, i, j - i, "ASCII"); - - char ch = r.version.charAt(0); - // 1.8.1+ - if (ch < '0' || ch > '9') { - str = "Can't keep up! Did the system time change, or is the server overloaded?".getBytes("ASCII"); - j = ArrayUtils.matchArray(tmp, str); - if (j < 0) { - r.type = MinecraftVersionRequest.UNKOWN; - return r; - } - i = -1; - while (j > 0) { - if (tmp[j] >= 48 && tmp[j] <= 57) { - i = j; - break; - } - j--; - } - if (i == -1) { - r.type = MinecraftVersionRequest.UNKOWN; - return r; - } - int k = i; - while (tmp[k] >= 48 && tmp[k] <= 57 || tmp[k] == 46) - k--; - k++; - r.version = new String(tmp, k, i - k + 1); - } - r.type = file.getEntry("META-INF/MANIFEST.MF") == null - ? MinecraftVersionRequest.MODIFIED : MinecraftVersionRequest.OK; - return r; - } - - public static MinecraftVersionRequest minecraftVersion(File file) { - MinecraftVersionRequest r = new MinecraftVersionRequest(); - if (!file.exists()) { - r.type = MinecraftVersionRequest.NOT_FOUND; - return r; - } - if (!file.isFile()) { - r.type = MinecraftVersionRequest.NOT_FILE; - return r; - } - if (!file.canRead()) { - r.type = MinecraftVersionRequest.UNREADABLE; - return r; - } - ZipFile localZipFile = null; - try { - localZipFile = new ZipFile(file); - ZipEntry minecraft = localZipFile - .getEntry("net/minecraft/client/Minecraft.class"); - if (minecraft != null) - return getVersionOfOldMinecraft(localZipFile, minecraft); - ZipEntry main = localZipFile.getEntry("net/minecraft/client/main/Main.class"); - ZipEntry minecraftserver = localZipFile.getEntry("net/minecraft/server/MinecraftServer.class"); - if ((main != null) && (minecraftserver != null)) - return getVersionOfNewMinecraft(localZipFile, minecraftserver); - r.type = MinecraftVersionRequest.INVALID; - return r; - } catch (IOException localException) { - HMCLog.warn("Zip file is invalid", localException); - r.type = MinecraftVersionRequest.INVALID_JAR; - return r; - } finally { - if (localZipFile != null) - try { - localZipFile.close(); - } catch (IOException ex) { - HMCLog.warn("Failed to close zip file", ex); - } - } - } - public static File getWorkingDirectory(String baseName) { String userhome = System.getProperty("user.home", "."); File file; @@ -233,98 +80,6 @@ public final class MCUtils { return gameDir; } - public static MinecraftVersion downloadMinecraft(File gameDir, String id, DownloadType sourceType) { - String vurl = sourceType.getProvider().getVersionsDownloadURL() + id + "/"; - File vpath = new File(gameDir, "versions/" + id); - File mvt = new File(vpath, id + ".json"); - File mvj = new File(vpath, id + ".jar"); - vpath.mkdirs(); - mvt.delete(); - mvj.delete(); - - if (TaskWindow.getInstance() - .addTask(new FileDownloadTask(vurl + id + ".json", IOUtils.tryGetCanonicalFile(mvt)).setTag(id + ".json")) - .addTask(new FileDownloadTask(vurl + id + ".jar", IOUtils.tryGetCanonicalFile(mvj)).setTag(id + ".jar")) - .start()) { - try { - return C.gson.fromJson(FileUtils.readFileToStringQuietly(mvt), MinecraftVersion.class); - } catch (JsonSyntaxException ex) { - HMCLog.err("Failed to parse minecraft version json.", ex); - } - } - return null; - } - - public static boolean downloadMinecraftJar(File gameDir, String id, DownloadType sourceType) { - String vurl = sourceType.getProvider().getVersionsDownloadURL() + id + "/"; - File vpath = new File(gameDir, "versions/" + id); - File mvv = new File(vpath, id + ".jar"), moved = null; - if (mvv.exists()) { - moved = new File(vpath, id + "-renamed.jar"); - mvv.renameTo(moved); - } - File mvt = new File(vpath, id + ".jar"); - vpath.mkdirs(); - if (TaskWindow.getInstance() - .addTask(new FileDownloadTask(vurl + id + ".jar", IOUtils.tryGetCanonicalFile(mvt)).setTag(id + ".jar")) - .start()) { - if (moved != null) - moved.delete(); - return true; - } else { - mvt.delete(); - if (moved != null) - moved.renameTo(mvt); - return false; - } - } - - public static boolean downloadMinecraftVersionJson(File gameDir, String id, DownloadType sourceType) { - String vurl = sourceType.getProvider().getVersionsDownloadURL() + id + "/"; - File vpath = new File(gameDir, "versions/" + id); - File mvv = new File(vpath, id + ".json"), moved = null; - if (mvv.exists()) { - moved = new File(vpath, id + "-renamed.json"); - mvv.renameTo(moved); - } - File mvt = new File(vpath, id + ".json"); - vpath.mkdirs(); - if (TaskWindow.getInstance() - .addTask(new FileDownloadTask(vurl + id + ".json", IOUtils.tryGetCanonicalFile(mvt)).setTag(id + ".json")) - .start()) { - if (moved != null) - moved.delete(); - return true; - } else { - mvt.delete(); - if (moved != null) - moved.renameTo(mvt); - return false; - } - } - - public static boolean downloadMinecraftAssetsIndex(File assetsLocation, String assetsId, DownloadType sourceType) { - String aurl = sourceType.getProvider().getIndexesDownloadURL(); - - assetsLocation.mkdirs(); - File assetsIndex = new File(assetsLocation, "indexes/" + assetsId + ".json"); - File renamed = null; - if (assetsIndex.exists()) { - renamed = new File(assetsLocation, "indexes/" + assetsId + "-renamed.json"); - assetsIndex.renameTo(renamed); - } - if (TaskWindow.getInstance() - .addTask(new FileDownloadTask(aurl + assetsId + ".json", IOUtils.tryGetCanonicalFile(assetsIndex)).setTag(assetsId + ".json")) - .start()) { - if (renamed != null) - renamed.delete(); - return true; - } - if (renamed != null) - renamed.renameTo(assetsIndex); - return false; - } - public static String profile = "{\"selectedProfile\": \"(Default)\",\"profiles\": {\"(Default)\": {\"name\": \"(Default)\"}},\"clientToken\": \"88888888-8888-8888-8888-888888888888\"}"; public static void tryWriteProfile(File gameDir) throws IOException { diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/AssetsMojangLoader.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/AssetsMojangLoader.java index 954ad0a23..f39315717 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/AssetsMojangLoader.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/AssetsMojangLoader.java @@ -24,12 +24,10 @@ import java.util.Map; import org.jackhuang.hellominecraft.C; import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.launcher.launch.IMinecraftProvider; -import org.jackhuang.hellominecraft.launcher.settings.Settings; import org.jackhuang.hellominecraft.tasks.Task; import org.jackhuang.hellominecraft.utils.system.FileUtils; import org.jackhuang.hellominecraft.utils.system.IOUtils; import org.jackhuang.hellominecraft.utils.StrUtils; -import org.jackhuang.hellominecraft.launcher.utils.MCUtils; import org.jackhuang.hellominecraft.launcher.utils.download.IDownloadProvider; import org.jackhuang.hellominecraft.launcher.version.MinecraftVersion; import org.jackhuang.hellominecraft.utils.VersionNumber; @@ -55,10 +53,10 @@ public class AssetsMojangLoader extends IAssetsHandler { return Subscriptions.empty(); } String assetsId = mv.assets == null ? "legacy" : mv.assets; - File assets = mp.getAssets(); + File assets = mp.getAssetService().getAssets(); HMCLog.log("Get index: " + assetsId); File f = IOUtils.tryGetCanonicalFile(new File(assets, "indexes/" + assetsId + ".json")); - if (!f.exists() && !MCUtils.downloadMinecraftAssetsIndex(assets, assetsId, Settings.getInstance().getDownloadSource())) { + if (!f.exists() && !mp.getAssetService().downloadMinecraftAssetsIndex(assetsId)) { t1.onError(null); return Subscriptions.empty(); } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/AssetsObject.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/AssetsObject.java index e62bb72e9..154714d1b 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/AssetsObject.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/AssetsObject.java @@ -17,6 +17,7 @@ */ package org.jackhuang.hellominecraft.launcher.utils.assets; + /** * * @author huangyuhui diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/YggdrasilAuthenticator.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/YggdrasilAuthenticator.java index d33b2b01f..47dafd4f9 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/YggdrasilAuthenticator.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/YggdrasilAuthenticator.java @@ -18,10 +18,10 @@ package org.jackhuang.hellominecraft.launcher.utils.auth; import com.google.gson.GsonBuilder; +import java.net.Proxy; import java.util.Map; import javax.swing.JOptionPane; import org.jackhuang.hellominecraft.C; -import org.jackhuang.hellominecraft.launcher.Main; import org.jackhuang.hellominecraft.utils.ArrayUtils; import org.jackhuang.hellominecraft.views.Selector; import org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.GameProfile; @@ -39,7 +39,7 @@ public final class YggdrasilAuthenticator extends IAuthenticator { public YggdrasilAuthenticator(String clientToken) { super(clientToken); - ua = new YggdrasilAuthentication(Main.PROXY, clientToken); + ua = new YggdrasilAuthentication(Proxy.NO_PROXY, clientToken); } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/InstallerService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/InstallerService.java index 5120a925d..472ec9f24 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/InstallerService.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/InstallerService.java @@ -43,9 +43,22 @@ public final class InstallerService { public InstallerService(Profile p) { this.p = p; } + + public Task download(InstallerVersion v, String type) { + switch(type) { + case "forge": + return downloadForge(v); + case "optifine": + return downloadOptifine(v); + case "liteloader": + return downloadLiteLoader(v); + default: + return null; + } + } public Task downloadForge(InstallerVersion v) { - return new TaskInfo("OptiFine Downloader") { + return new TaskInfo("Forge Downloader") { @Override public void executeTask() { File filepath = IOUtils.tryGetCanonicalFile(IOUtils.currentDirWithSeparator() + "forge-installer.jar"); @@ -75,7 +88,7 @@ public final class InstallerService { } public Task downloadLiteLoader(InstallerVersion v) { - return new TaskInfo("OptiFine Downloader") { + return new TaskInfo("LiteLoader Downloader") { @Override public void executeTask() { File filepath = IOUtils.tryGetCanonicalFile(IOUtils.currentDirWithSeparator() + "liteloader-universal.jar"); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/ForgeInstaller.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/ForgeInstaller.java index 993765c10..f79f4b471 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/ForgeInstaller.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/ForgeInstaller.java @@ -18,18 +18,15 @@ package org.jackhuang.hellominecraft.launcher.utils.installers.forge; import org.jackhuang.hellominecraft.launcher.utils.installers.InstallProfile; -import com.google.gson.JsonSyntaxException; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; -import java.io.IOException; import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.jackhuang.hellominecraft.C; import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.launcher.launch.IMinecraftProvider; -import org.jackhuang.hellominecraft.launcher.settings.Settings; import org.jackhuang.hellominecraft.launcher.utils.installers.InstallerVersionList.InstallerVersion; import org.jackhuang.hellominecraft.tasks.Task; import org.jackhuang.hellominecraft.utils.system.FileUtils; @@ -67,7 +64,7 @@ public class ForgeInstaller extends Task { File from = new File(gameDir, "versions" + File.separator + profile.install.minecraft); if (!from.exists()) if (MessageBox.Show(C.i18n("install.no_version_if_intall")) == MessageBox.YES_OPTION) { - if (!mp.install(profile.install.minecraft, Settings.getInstance().getDownloadSource())) + if (!mp.getDownloadService().install(profile.install.minecraft)) throw new IllegalStateException(C.i18n("install.no_version")); } else throw new IllegalStateException(C.i18n("install.no_version")); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftAssetService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftAssetService.java new file mode 100644 index 000000000..ddaf2154c --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftAssetService.java @@ -0,0 +1,122 @@ +/* + * 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.version; + +import com.google.gson.JsonSyntaxException; +import java.io.File; +import java.io.IOException; +import org.jackhuang.hellominecraft.C; +import org.jackhuang.hellominecraft.launcher.launch.IMinecraftAssetService; +import org.jackhuang.hellominecraft.launcher.settings.Profile; +import org.jackhuang.hellominecraft.launcher.utils.assets.AssetsIndex; +import org.jackhuang.hellominecraft.launcher.utils.assets.AssetsObject; +import org.jackhuang.hellominecraft.launcher.utils.assets.IAssetsHandler; +import org.jackhuang.hellominecraft.tasks.Task; +import org.jackhuang.hellominecraft.tasks.TaskWindow; +import org.jackhuang.hellominecraft.tasks.download.FileDownloadTask; +import org.jackhuang.hellominecraft.utils.system.FileUtils; +import org.jackhuang.hellominecraft.utils.system.IOUtils; +import rx.concurrency.Schedulers; + +/** + * + * @author huangyuhui + */ +public class MinecraftAssetService extends IMinecraftAssetService { + + MinecraftVersionManager mgr; + + public MinecraftAssetService(Profile profile, MinecraftVersionManager mvm) { + super(profile); + + mgr = mvm; + } + + @Override + public Task downloadAssets(String mcVersion) { + return new Task() { + + @Override + public void executeTask() throws Throwable { + IAssetsHandler type = IAssetsHandler.ASSETS_HANDLER; + type.getList(profile.getMinecraftProvider().getVersionById(mcVersion), profile.getMinecraftProvider()) + .subscribeOn(Schedulers.newThread()) + .observeOn(Schedulers.eventQueue()) + .subscribe((value) -> TaskWindow.getInstance().addTask(type.getDownloadTask(profile.getDownloadType().getProvider())).start()); + } + + @Override + public String getInfo() { + return "Download Assets"; + } + }; + } + + @Override + public boolean refreshAssetsIndex(String id) { + MinecraftVersion mv = mgr.getVersionById(id); + if (mv == null) + return false; + return downloadMinecraftAssetsIndex(mv.assets); + } + + @Override + public boolean downloadMinecraftAssetsIndex(String assetsId) { + String aurl = profile.getDownloadType().getProvider().getIndexesDownloadURL(); + + File assetsLocation = getAssets(); + assetsLocation.mkdirs(); + File assetsIndex = new File(assetsLocation, "indexes/" + assetsId + ".json"); + File renamed = null; + if (assetsIndex.exists()) { + renamed = new File(assetsLocation, "indexes/" + assetsId + "-renamed.json"); + assetsIndex.renameTo(renamed); + } + if (TaskWindow.getInstance() + .addTask(new FileDownloadTask(aurl + assetsId + ".json", IOUtils.tryGetCanonicalFile(assetsIndex)).setTag(assetsId + ".json")) + .start()) { + if (renamed != null) + renamed.delete(); + return true; + } + if (renamed != null) + renamed.renameTo(assetsIndex); + return false; + } + + @Override + public File getAssets() { + return new File(profile.getCanonicalGameDirFile(), "assets"); + } + + @Override + public File getAssetObject(String assetVersion, String name) throws IOException { + File assetsDir = getAssets(); + File indexDir = new File(assetsDir, "indexes"); + File objectsDir = new File(assetsDir, "objects"); + File indexFile = new File(indexDir, assetVersion + ".json"); + try { + AssetsIndex index = (AssetsIndex) C.gson.fromJson(FileUtils.readFileToString(indexFile, "UTF-8"), AssetsIndex.class); + + String hash = ((AssetsObject) index.getFileMap().get(name)).getHash(); + return new File(objectsDir, hash.substring(0, 2) + "/" + hash); + } catch (JsonSyntaxException e) { + throw new IOException("Assets file format malformed.", e); + } + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftClassicVersion.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftClassicVersion.java index 979521059..60c3c4c58 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftClassicVersion.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftClassicVersion.java @@ -21,7 +21,6 @@ import java.io.File; import java.util.ArrayList; import java.util.Set; import org.jackhuang.hellominecraft.launcher.launch.IMinecraftProvider; -import org.jackhuang.hellominecraft.launcher.utils.download.DownloadType; /** * @@ -49,7 +48,7 @@ public class MinecraftClassicVersion extends MinecraftVersion { } @Override - public MinecraftVersion resolve(IMinecraftProvider manager, Set resolvedSoFar, DownloadType sourceType) { + public MinecraftVersion resolve(IMinecraftProvider manager, Set resolvedSoFar) { return this; } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftModService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftModService.java index 866cacc69..39ef55c06 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftModService.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftModService.java @@ -25,6 +25,7 @@ import java.util.Collections; import java.util.List; import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.launcher.launch.IMinecraftModService; +import org.jackhuang.hellominecraft.launcher.settings.Profile; import org.jackhuang.hellominecraft.launcher.utils.ModInfo; import org.jackhuang.hellominecraft.utils.system.FileUtils; @@ -32,10 +33,11 @@ import org.jackhuang.hellominecraft.utils.system.FileUtils; * * @author huangyuhui */ -public class MinecraftModService implements IMinecraftModService { +public class MinecraftModService extends IMinecraftModService { MinecraftVersionManager mgr; - public MinecraftModService(MinecraftVersionManager mgr) { + public MinecraftModService(Profile p, MinecraftVersionManager mgr) { + super(p); this.mgr = mgr; } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftService.java deleted file mode 100644 index 742797c83..000000000 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftService.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * 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.version; - -import org.jackhuang.hellominecraft.launcher.settings.Profile; -import org.jackhuang.hellominecraft.launcher.settings.Settings; -import org.jackhuang.hellominecraft.launcher.utils.assets.IAssetsHandler; -import org.jackhuang.hellominecraft.tasks.Task; -import org.jackhuang.hellominecraft.tasks.TaskWindow; -import rx.concurrency.Schedulers; - -/** - * - * @author huangyuhui - */ -public class MinecraftService { - - Profile profile; - - public MinecraftService(Profile profile) { - this.profile = profile; - } - - public Task downloadAssets(String mcVersion) { - return new Task() { - - @Override - public void executeTask() throws Throwable { - IAssetsHandler type = IAssetsHandler.ASSETS_HANDLER; - type.getList(profile.getMinecraftProvider().getVersionById(mcVersion), profile.getMinecraftProvider()) - .subscribeOn(Schedulers.newThread()) - .observeOn(Schedulers.eventQueue()) - .subscribe((value) -> TaskWindow.getInstance().addTask(type.getDownloadTask(Settings.getInstance().getDownloadSource().getProvider())).start()); - } - - @Override - public String getInfo() { - return "Download Assets"; - } - }; - } -} diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersion.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersion.java index b0226f7e4..98d9eabb5 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersion.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersion.java @@ -24,7 +24,6 @@ import java.util.List; import java.util.Set; import org.jackhuang.hellominecraft.launcher.launch.IMinecraftProvider; import org.jackhuang.hellominecraft.launcher.utils.assets.AssetsIndex; -import org.jackhuang.hellominecraft.launcher.utils.download.DownloadType; import org.jackhuang.hellominecraft.utils.ArrayUtils; /** @@ -71,11 +70,11 @@ public class MinecraftVersion implements Cloneable, Comparable return new MinecraftVersion(minecraftArguments, mainClass, time, id, type, processArguments, releaseTime, assets, jar, inheritsFrom, minimumLauncherVersion, libraries, hidden); } - public MinecraftVersion resolve(IMinecraftProvider manager, DownloadType sourceType) { - return resolve(manager, new HashSet<>(), sourceType); + public MinecraftVersion resolve(IMinecraftProvider manager) { + return resolve(manager, new HashSet<>()); } - protected MinecraftVersion resolve(IMinecraftProvider manager, Set resolvedSoFar, DownloadType sourceType) { + protected MinecraftVersion resolve(IMinecraftProvider manager, Set resolvedSoFar) { if (inheritsFrom == null) return this; if (!resolvedSoFar.add(id)) @@ -83,11 +82,11 @@ public class MinecraftVersion implements Cloneable, Comparable MinecraftVersion parent = manager.getVersionById(inheritsFrom); if (parent == null) { - if (!manager.install(inheritsFrom, sourceType)) + if (!manager.getDownloadService().install(inheritsFrom)) return this; parent = manager.getVersionById(inheritsFrom); } - parent = parent.resolve(manager, resolvedSoFar, sourceType); + parent = parent.resolve(manager, resolvedSoFar); MinecraftVersion result = new MinecraftVersion( this.minecraftArguments != null ? this.minecraftArguments : parent.minecraftArguments, this.mainClass != null ? this.mainClass : parent.mainClass, diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersionManager.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersionManager.java index bb421c088..62b56257d 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersionManager.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersionManager.java @@ -22,13 +22,13 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; -import java.util.List; import java.util.Map; import java.util.TreeMap; import org.jackhuang.hellominecraft.C; import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.launcher.launch.GameLauncher; -import org.jackhuang.hellominecraft.launcher.launch.GameLauncher.DownloadLibraryJob; +import org.jackhuang.hellominecraft.launcher.launch.IMinecraftAssetService; +import org.jackhuang.hellominecraft.launcher.launch.IMinecraftDownloadService; import org.jackhuang.hellominecraft.launcher.launch.IMinecraftLoader; import org.jackhuang.hellominecraft.launcher.launch.IMinecraftModService; import org.jackhuang.hellominecraft.launcher.launch.IMinecraftProvider; @@ -36,9 +36,7 @@ import org.jackhuang.hellominecraft.launcher.launch.MinecraftLoader; import org.jackhuang.hellominecraft.utils.system.FileUtils; import org.jackhuang.hellominecraft.launcher.utils.MCUtils; import org.jackhuang.hellominecraft.launcher.utils.auth.UserProfileProvider; -import org.jackhuang.hellominecraft.launcher.utils.download.DownloadType; import org.jackhuang.hellominecraft.launcher.settings.Profile; -import org.jackhuang.hellominecraft.launcher.settings.Settings; import org.jackhuang.hellominecraft.utils.system.IOUtils; import org.jackhuang.hellominecraft.utils.MessageBox; import org.jackhuang.hellominecraft.utils.Utils; @@ -49,9 +47,8 @@ import org.jackhuang.hellominecraft.utils.Utils; */ public final class MinecraftVersionManager extends IMinecraftProvider { - private File baseFolder; - private final Profile profile; - private final Map versions = new TreeMap(); + File baseFolder; + final Map versions = new TreeMap(); /** * @@ -59,7 +56,9 @@ public final class MinecraftVersionManager extends IMinecraftProvider { */ public MinecraftVersionManager(Profile p) { super(p); - this.profile = p; + mms = new MinecraftModService(p, this); + mds = new MinecraftDownloadService(p, this); + mas = new MinecraftAssetService(p, this); refreshVersions(); } @@ -191,77 +190,24 @@ public final class MinecraftVersionManager extends IMinecraftProvider { } } - @Override - public boolean refreshJson(String id) { - return MCUtils.downloadMinecraftVersionJson(baseFolder, id, Settings.getInstance().getDownloadSource()); - } - - @Override - public boolean refreshAssetsIndex(String id) { - MinecraftVersion mv = getVersionById(id); - if (mv == null) - return false; - return MCUtils.downloadMinecraftAssetsIndex(new File(baseFolder, "assets"), mv.assets, Settings.getInstance().getDownloadSource()); - } - - @Override - public boolean install(String id, DownloadType sourceType) { - MinecraftVersion v = MCUtils.downloadMinecraft(baseFolder, id, sourceType); - if (v != null) { - versions.put(v.id, v); - return true; - } - return false; - } - @Override public File getRunDirectory(String id) { switch (profile.getGameDirType()) { - case VERSION_FOLDER: - return new File(baseFolder, "versions/" + id + "/"); - default: - return baseFolder; + case VERSION_FOLDER: + return new File(baseFolder, "versions/" + id + "/"); + default: + return baseFolder; } } - @Override - public List getDownloadLibraries(DownloadType downloadType) { - ArrayList downloadLibraries = new ArrayList<>(); - if (profile.getSelectedMinecraftVersion() == null) - return downloadLibraries; - MinecraftVersion v = profile.getSelectedMinecraftVersion().resolve(this, Settings.getInstance().getDownloadSource()); - if (v.libraries != null) - for (IMinecraftLibrary l : v.libraries) { - l.init(); - if (l.allow()) { - File ff = l.getFilePath(baseFolder); - if (!ff.exists()) { - String libURL = downloadType.getProvider().getLibraryDownloadURL() + "/"; - libURL = downloadType.getProvider().getParsedLibraryDownloadURL(l.getDownloadURL(libURL, downloadType)); - if (libURL != null) - downloadLibraries.add(new DownloadLibraryJob(l.name, libURL, ff)); - } - } - } - return downloadLibraries; - } - @Override public void open(String mv, String name) { - if (name == null) - Utils.openFolder(getRunDirectory(mv)); - else - Utils.openFolder(new File(getRunDirectory(mv), name)); - } - - @Override - public File getAssets() { - return new File(profile.getCanonicalGameDirFile(), "assets"); + Utils.openFolder((name == null) ? getRunDirectory(mv) : new File(getRunDirectory(mv), name)); } @Override public GameLauncher.DecompressLibraryJob getDecompressLibraries() { - MinecraftVersion v = profile.getSelectedMinecraftVersion().resolve(this, Settings.getInstance().getDownloadSource()); + MinecraftVersion v = profile.getSelectedMinecraftVersion().resolve(this); if (v.libraries == null) return null; ArrayList unzippings = new ArrayList<>(); @@ -288,9 +234,9 @@ public final class MinecraftVersionManager extends IMinecraftProvider { } @Override - public IMinecraftLoader provideMinecraftLoader(UserProfileProvider p, DownloadType type) - throws IllegalStateException { - return new MinecraftLoader(profile, this, p, type); + public IMinecraftLoader provideMinecraftLoader(UserProfileProvider p) + throws IllegalStateException { + return new MinecraftLoader(profile, this, p); } @Override @@ -334,10 +280,24 @@ public final class MinecraftVersionManager extends IMinecraftProvider { } } - final MinecraftModService mms = new MinecraftModService(this); + final MinecraftModService mms; @Override public IMinecraftModService getModService() { return mms; } + + final MinecraftDownloadService mds; + + @Override + public IMinecraftDownloadService getDownloadService() { + return mds; + } + + final MinecraftAssetService mas; + + @Override + public IMinecraftAssetService getAssetService() { + return mas; + } } 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 72b8a22a9..611b9b7da 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.form @@ -1068,7 +1068,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 2d25e7dcb..dd06ca4ca 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java @@ -32,8 +32,6 @@ import java.awt.event.ItemEvent; import java.awt.event.KeyEvent; import java.io.File; import java.io.IOException; -import java.util.Arrays; -import java.util.Collection; import java.util.List; import javax.swing.JFileChooser; import javax.swing.JMenuItem; @@ -48,7 +46,6 @@ import javax.swing.table.DefaultTableModel; import org.jackhuang.hellominecraft.C; import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.launcher.settings.LauncherVisibility; -import org.jackhuang.hellominecraft.launcher.utils.MCUtils; import org.jackhuang.hellominecraft.launcher.utils.installers.InstallerVersionList; import org.jackhuang.hellominecraft.launcher.utils.installers.InstallerVersionList.InstallerVersion; import org.jackhuang.hellominecraft.launcher.utils.download.DownloadType; @@ -58,12 +55,10 @@ import org.jackhuang.hellominecraft.launcher.utils.FileNameFilter; import org.jackhuang.hellominecraft.launcher.utils.ModInfo; import org.jackhuang.hellominecraft.launcher.version.GameDirType; import org.jackhuang.hellominecraft.launcher.version.MinecraftVersion; -import org.jackhuang.hellominecraft.tasks.Task; import org.jackhuang.hellominecraft.tasks.TaskRunnable; import org.jackhuang.hellominecraft.tasks.TaskRunnableArg1; import org.jackhuang.hellominecraft.tasks.TaskWindow; import org.jackhuang.hellominecraft.tasks.communication.DefaultPreviousResult; -import org.jackhuang.hellominecraft.tasks.download.HTTPGetTask; import org.jackhuang.hellominecraft.utils.system.IOUtils; import org.jackhuang.hellominecraft.utils.MessageBox; import org.jackhuang.hellominecraft.version.MinecraftVersionRequest; @@ -71,15 +66,14 @@ import org.jackhuang.hellominecraft.utils.system.OS; import org.jackhuang.hellominecraft.utils.StrUtils; import org.jackhuang.hellominecraft.utils.SwingUtils; import org.jackhuang.hellominecraft.utils.system.Java; -import org.jackhuang.hellominecraft.version.MinecraftRemoteVersion; -import org.jackhuang.hellominecraft.version.MinecraftRemoteVersions; import org.jackhuang.hellominecraft.views.LogWindow; +import rx.concurrency.Schedulers; /** * * @author huangyuhui */ -public class GameSettingsPanel extends javax.swing.JPanel implements DropTargetListener { +public final class GameSettingsPanel extends javax.swing.JPanel implements DropTargetListener { /** * Creates new form GameSettingsPanel @@ -92,7 +86,18 @@ public class GameSettingsPanel extends javax.swing.JPanel implements DropTargetL forge = new InstallerHelper(lstForge, "forge"); liteloader = new InstallerHelper(lstLiteLoader, "liteloader"); optifine = new InstallerHelper(lstOptifine, "optifine"); - // + initExplorationMenu(); + initManagementMenu(); + initExternalModsTable(); + initTabs(); + + for (Java j : Settings.JAVA) + cboJava.addItem(j.getLocalizedName()); + + dropTarget = new DropTarget(lstExternalMods, DnDConstants.ACTION_COPY_OR_MOVE, this); + } + + void initExplorationMenu() { ppmExplore = new JPopupMenu(); class ImplementedActionListener implements ActionListener { @@ -127,10 +132,11 @@ public class GameSettingsPanel extends javax.swing.JPanel implements DropTargetL itm = new JMenuItem(C.i18n("folder.screenshots")); itm.addActionListener(new ImplementedActionListener("screenshots")); ppmExplore.add(itm); - // - // + } + + void initManagementMenu() { ppmManage = new JPopupMenu(); - itm = new JMenuItem(C.i18n("versions.manage.rename")); + JMenuItem itm = new JMenuItem(C.i18n("versions.manage.rename")); itm.addActionListener((e) -> { Profile v = getProfile(); if (v != null && mcVersion != null) { @@ -160,11 +166,12 @@ public class GameSettingsPanel extends javax.swing.JPanel implements DropTargetL itm.addActionListener((e) -> { Profile v = getProfile(); if (v != null && mcVersion != null) - v.getMinecraftProvider().refreshAssetsIndex(mcVersion); + v.getMinecraftProvider().getAssetService().refreshAssetsIndex(mcVersion); }); ppmManage.add(itm); - // - + } + + void initExternalModsTable() { if (lstExternalMods.getColumnModel().getColumnCount() > 0) { lstExternalMods.getColumnModel().getColumn(0).setMinWidth(17); lstExternalMods.getColumnModel().getColumn(0).setPreferredWidth(17); @@ -191,6 +198,9 @@ public class GameSettingsPanel extends javax.swing.JPanel implements DropTargetL mods.get(row).reverseModState(); } }); + } + + void initTabs() { tabVersionEdit.addChangeListener(new ChangeListener() { boolean a = false, b = false; @@ -218,17 +228,6 @@ public class GameSettingsPanel extends javax.swing.JPanel implements DropTargetL } } }); - - for (Java j : Settings.JAVA) { - String name = j.getName(); - if (name.equals("Default")) - name = C.i18n("settings.default"); - if (name.equals("Custom")) - name = C.i18n("settings.custom"); - cboJava.addItem(name); - } - - dropTarget = new DropTarget(lstExternalMods, DnDConstants.ACTION_COPY_OR_MOVE, this); } /** @@ -1250,7 +1249,7 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { private void btnDownloadAllAssetsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDownloadAllAssetsActionPerformed if (mcVersion != null && profile != null) - profile.getMinecraftService().downloadAssets(mcVersion).run(); + profile.getMinecraftProvider().getAssetService().downloadAssets(mcVersion).run(); }//GEN-LAST:event_btnDownloadAllAssetsActionPerformed private void txtMaxMemoryFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtMaxMemoryFocusLost @@ -1369,7 +1368,7 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { }//GEN-LAST:event_btnMakeLaunchScriptActionPerformed private void btnShowLogActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnShowLogActionPerformed - LogWindow.instance.setVisible(true); + LogWindow.INSTANCE.setVisible(true); }//GEN-LAST:event_btnShowLogActionPerformed private void btnCleanGameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCleanGameActionPerformed @@ -1482,46 +1481,24 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { txtMinecraftVersion.setText(""); if (v == null) return; - File minecraftJar = v.getJar(profile.getGameDirFile()); - minecraftVersion = MCUtils.minecraftVersion(minecraftJar); + minecraftVersion = MinecraftVersionRequest.minecraftVersion(v.getJar(profile.getGameDirFile())); txtMinecraftVersion.setText(MinecraftVersionRequest.getResponse(minecraftVersion)); } - // - // - public int assetsType; - // + // // public void refreshDownloads(final DownloadType provider) { - TaskWindow.getInstance().addTask(new Task() { - HTTPGetTask tsk = new HTTPGetTask(provider.getProvider().getVersionsListDownloadURL()); - - @Override - public void executeTask() { - final MinecraftRemoteVersions v = C.gson.fromJson(tsk.getResult(), MinecraftRemoteVersions.class); - if (v == null || v.versions == null) - return; - SwingUtilities.invokeLater(() -> { - DefaultTableModel model = (DefaultTableModel) lstDownloads.getModel(); - while (model.getRowCount() > 0) - model.removeRow(0); - for (MinecraftRemoteVersion ver : v.versions) - model.addRow(new Object[] {ver.id, ver.time, - StrUtils.equalsOne(ver.type, "old_beta", "old_alpha", "release", "snapshot") ? C.i18n("versions." + ver.type) : ver.type}); - lstDownloads.updateUI(); - }); - } - - @Override - public String getInfo() { - return "Format list."; - } - - @Override - public Collection getDependTasks() { - return Arrays.asList((Task) tsk); - } - }).start(); + DefaultTableModel model = (DefaultTableModel) lstDownloads.getModel(); + while (model.getRowCount() > 0) + model.removeRow(0); + profile.getMinecraftProvider().getDownloadService().getRemoteVersions() + .observeOn(Schedulers.eventQueue()).subscribeOn(Schedulers.newThread()) + .subscribe((ver) -> model.addRow(new Object[] {ver.id, ver.time, + StrUtils.equalsOne(ver.type, "old_beta", "old_alpha", "release", "snapshot") ? C.i18n("versions." + ver.type) : ver.type}), + (e) -> { + MessageBox.Show("Failed to refresh download: " + e.getLocalizedMessage()); + HMCLog.err("Failed to refresh download.", e); + }, lstDownloads::updateUI); } void downloadMinecraft(DownloadType index) { @@ -1534,7 +1511,7 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { return; } String id = (String) lstDownloads.getModel().getValueAt(lstDownloads.getSelectedRow(), 0); - MCUtils.downloadMinecraft(profile.getGameDirFile(), id, index); + profile.getMinecraftProvider().getDownloadService().downloadMinecraft(id); } // @@ -1607,7 +1584,7 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { MessageBox.Show(C.i18n("install.not_refreshed")); return; } - profile.getInstallerService().downloadOptifine(getVersion(idx)).after(new TaskRunnable(this::refreshVersions)).run(); + profile.getInstallerService().download(getVersion(idx), id).after(new TaskRunnable(this::refreshVersions)).run(); } private List loadVersions(InstallerVersionList list, JTable table) { 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 cab3198c8..be9a8ef06 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java @@ -390,7 +390,7 @@ public class MainPagePanel extends javax.swing.JPanel { @Override public void run() { Thread.currentThread().setName("Game Launcher"); - DefaultGameLauncher gl = new DefaultGameLauncher(getCurrentProfile(), li, l, Settings.getInstance().getDownloadSource()); + DefaultGameLauncher gl = new DefaultGameLauncher(getCurrentProfile(), li, l); gl.failEvent.register((sender, s) -> { if (s != null) MessageBox.Show(s); diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/ContentGetAndShowTask.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/ContentGetAndShowTask.java index 26e5ffdf6..2a79e685d 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/ContentGetAndShowTask.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/ContentGetAndShowTask.java @@ -46,9 +46,9 @@ public class ContentGetAndShowTask extends HTTPGetTask implements Event @Override public boolean call(Object sender, String value) { - LogWindow.instance.clean(); - LogWindow.instance.log(value); - LogWindow.instance.setVisible(true); + LogWindow.INSTANCE.clean(); + LogWindow.INSTANCE.log(value); + LogWindow.INSTANCE.setVisible(true); return true; } } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/CollectionUtils.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/CollectionUtils.java index b2dc1d33b..9d5847075 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/CollectionUtils.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/CollectionUtils.java @@ -17,11 +17,11 @@ */ package org.jackhuang.hellominecraft.utils; -import org.jackhuang.hellominecraft.utils.functions.Consumer; import org.jackhuang.hellominecraft.utils.functions.Predicate; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; +import rx.Observable; /** * @@ -29,17 +29,9 @@ import java.util.Iterator; */ public final class CollectionUtils { - public static void forEach(Collection coll, Consumer p) { - for (T t : coll) - p.accept(t); - } - public static ArrayList map(Collection coll, Predicate p) { ArrayList newColl = new ArrayList<>(); - forEach(coll, t -> { - if (p.apply(t)) - newColl.add(t); - }); + Observable.from(coll).filter(p).subscribe(newColl::add); return newColl; } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/NetUtils.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/NetUtils.java index 99ef7df79..c1ffbf3f3 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/NetUtils.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/NetUtils.java @@ -29,6 +29,8 @@ import java.net.URL; import java.util.Map; import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.utils.system.IOUtils; +import rx.Observable; +import rx.subscriptions.Subscriptions; /** * @@ -156,4 +158,15 @@ public final class NetUtils { throw new IllegalArgumentException("Could not concatenate given URL with GET arguments!", ex); } } + + public static Observable getRx(String url) { + return Observable.create(t1 -> { + try { + t1.onNext(get(url)); + } catch(Exception e) { + t1.onError(e); + } + return Subscriptions.empty(); + }); + } } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/Java.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/Java.java index f38aab164..e80166c09 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/Java.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/Java.java @@ -21,6 +21,7 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import org.jackhuang.hellominecraft.C; import org.jackhuang.hellominecraft.HMCLog; /** @@ -40,6 +41,14 @@ public class Java { return name; } + public String getLocalizedName() { + if (name.equals("Default")) + return C.i18n("settings.default"); + if (name.equals("Custom")) + return C.i18n("settings.custom"); + return name; + } + public String getHome() { return home; } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/version/MinecraftVersionRequest.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/version/MinecraftVersionRequest.java index 755f9c94a..f98b6bc65 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/version/MinecraftVersionRequest.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/version/MinecraftVersionRequest.java @@ -17,7 +17,14 @@ */ package org.jackhuang.hellominecraft.version; +import java.io.File; +import java.io.IOException; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; import org.jackhuang.hellominecraft.C; +import org.jackhuang.hellominecraft.HMCLog; +import org.jackhuang.hellominecraft.utils.ArrayUtils; +import org.jackhuang.hellominecraft.utils.NetUtils; /** * @author huangyuhui @@ -59,4 +66,127 @@ public class MinecraftVersionRequest { } return text; } + + private static int lessThan32(byte[] b, int x) { + for (; x < b.length; x++) + if (b[x] < 32) + return x; + return -1; + } + + private static MinecraftVersionRequest getVersionOfOldMinecraft(ZipFile file, ZipEntry entry) throws IOException { + MinecraftVersionRequest r = new MinecraftVersionRequest(); + byte[] tmp = NetUtils.getBytesFromStream(file.getInputStream(entry)); + + byte[] bytes = "Minecraft Minecraft ".getBytes("ASCII"); + int j; + if ((j = ArrayUtils.matchArray(tmp, bytes)) < 0) { + r.type = MinecraftVersionRequest.UNKOWN; + return r; + } + int i = j + bytes.length; + + if ((j = lessThan32(tmp, i)) < 0) { + r.type = MinecraftVersionRequest.UNKOWN; + return r; + } + String ver = new String(tmp, i, j - i, "ASCII"); + r.version = ver; + + r.type = file.getEntry("META-INF/MANIFEST.MF") == null + ? MinecraftVersionRequest.MODIFIED : MinecraftVersionRequest.OK; + return r; + } + + private static MinecraftVersionRequest getVersionOfNewMinecraft(ZipFile file, ZipEntry entry) throws IOException { + MinecraftVersionRequest r = new MinecraftVersionRequest(); + byte[] tmp = NetUtils.getBytesFromStream(file.getInputStream(entry)); + + byte[] str = "-server.txt".getBytes("ASCII"); + int j = ArrayUtils.matchArray(tmp, str); + if (j < 0) { + r.type = MinecraftVersionRequest.UNKOWN; + return r; + } + int i = j + str.length; + i += 11; + j = lessThan32(tmp, i); + if (j < 0) { + r.type = MinecraftVersionRequest.UNKOWN; + return r; + } + r.version = new String(tmp, i, j - i, "ASCII"); + + char ch = r.version.charAt(0); + // 1.8.1+ + if (ch < '0' || ch > '9') { + str = "Can't keep up! Did the system time change, or is the server overloaded?".getBytes("ASCII"); + j = ArrayUtils.matchArray(tmp, str); + if (j < 0) { + r.type = MinecraftVersionRequest.UNKOWN; + return r; + } + i = -1; + while (j > 0) { + if (tmp[j] >= 48 && tmp[j] <= 57) { + i = j; + break; + } + j--; + } + if (i == -1) { + r.type = MinecraftVersionRequest.UNKOWN; + return r; + } + int k = i; + while (tmp[k] >= 48 && tmp[k] <= 57 || tmp[k] == 46) + k--; + k++; + r.version = new String(tmp, k, i - k + 1); + } + r.type = file.getEntry("META-INF/MANIFEST.MF") == null + ? MinecraftVersionRequest.MODIFIED : MinecraftVersionRequest.OK; + return r; + } + + public static MinecraftVersionRequest minecraftVersion(File file) { + MinecraftVersionRequest r = new MinecraftVersionRequest(); + if (!file.exists()) { + r.type = MinecraftVersionRequest.NOT_FOUND; + return r; + } + if (!file.isFile()) { + r.type = MinecraftVersionRequest.NOT_FILE; + return r; + } + if (!file.canRead()) { + r.type = MinecraftVersionRequest.UNREADABLE; + return r; + } + ZipFile localZipFile = null; + try { + localZipFile = new ZipFile(file); + ZipEntry minecraft = localZipFile + .getEntry("net/minecraft/client/Minecraft.class"); + if (minecraft != null) + return getVersionOfOldMinecraft(localZipFile, minecraft); + ZipEntry main = localZipFile.getEntry("net/minecraft/client/main/Main.class"); + ZipEntry minecraftserver = localZipFile.getEntry("net/minecraft/server/MinecraftServer.class"); + if ((main != null) && (minecraftserver != null)) + return getVersionOfNewMinecraft(localZipFile, minecraftserver); + r.type = MinecraftVersionRequest.INVALID; + return r; + } catch (IOException localException) { + HMCLog.warn("Zip file is invalid", localException); + r.type = MinecraftVersionRequest.INVALID_JAR; + return r; + } finally { + if (localZipFile != null) + try { + localZipFile.close(); + } catch (IOException ex) { + HMCLog.warn("Failed to close zip file", ex); + } + } + } } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.java index ef2b2077f..6213fc780 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.java @@ -57,7 +57,7 @@ public class LogWindow extends javax.swing.JFrame { System.setErr(new LauncherPrintStream(err)); } - public static LogWindow instance = new LogWindow(); + public static final LogWindow INSTANCE = new LogWindow(); /** * This method is called from within the constructor to initialize the form. diff --git a/HMCLAPI/src/main/java/rx/Observable.java b/HMCLAPI/src/main/java/rx/Observable.java index a460f1ab7..427c3969d 100644 --- a/HMCLAPI/src/main/java/rx/Observable.java +++ b/HMCLAPI/src/main/java/rx/Observable.java @@ -2478,6 +2478,10 @@ public class Observable { public Observable where(Func1 predicate) { return where(this, predicate); } + + public final Observable flatMap(Func1> func) { + return merge(map(func)); + } /** * Returns the last element of an observable sequence with a specified source. diff --git a/HMCLAPI/src/main/java/rx/concurrency/EventQueueScheduler.java b/HMCLAPI/src/main/java/rx/concurrency/EventQueueScheduler.java index ed1db4370..88b68e0cf 100644 --- a/HMCLAPI/src/main/java/rx/concurrency/EventQueueScheduler.java +++ b/HMCLAPI/src/main/java/rx/concurrency/EventQueueScheduler.java @@ -1,7 +1,19 @@ /* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. + * 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 rx.concurrency; diff --git a/HMCLAPI/src/main/java/rx/operators/OperationSubscribeOn.java b/HMCLAPI/src/main/java/rx/operators/OperationSubscribeOn.java index 68e9fa4b7..022030a01 100644 --- a/HMCLAPI/src/main/java/rx/operators/OperationSubscribeOn.java +++ b/HMCLAPI/src/main/java/rx/operators/OperationSubscribeOn.java @@ -55,12 +55,7 @@ public class OperationSubscribeOn { @Override public void unsubscribe() { - scheduler.schedule(new Action0() { - @Override - public void call() { - underlying.unsubscribe(); - } - }); + scheduler.schedule(underlying::unsubscribe); } } diff --git a/HMCLAPI/src/main/java/rx/util/functions/Functions.java b/HMCLAPI/src/main/java/rx/util/functions/Functions.java index d93270089..0e59503f2 100644 --- a/HMCLAPI/src/main/java/rx/util/functions/Functions.java +++ b/HMCLAPI/src/main/java/rx/util/functions/Functions.java @@ -1,12 +1,12 @@ /** * Copyright 2013 Netflix, Inc. - * + *

* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + *

* http://www.apache.org/licenses/LICENSE-2.0 - * + *

* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -22,24 +22,18 @@ import org.jackhuang.hellominecraft.logging.logger.Logger; /** * Allows execution of functions from multiple different languages. *

- * Language support is provided via implementations of {@link FunctionLanguageAdaptor}. + * Language support is provided via implementations of + * {@link FunctionLanguageAdaptor}. *

- * This class will dynamically look for known language adaptors on the classpath at startup or new ones can be registered using {@link #registerLanguageAdaptor(Class[], FunctionLanguageAdaptor)}. + * This class will dynamically look for known language adaptors on the classpath + * at startup or new ones can be registered using + * {@link #registerLanguageAdaptor(Class[], FunctionLanguageAdaptor)}. */ public class Functions { private static final Logger logger = new Logger("Functions"); - private final static ConcurrentHashMap, FunctionLanguageAdaptor> languageAdaptors = new ConcurrentHashMap, FunctionLanguageAdaptor>(); - - static { - /* optimistically look for supported languages if they are in the classpath */ - loadLanguageAdaptor("Groovy"); - loadLanguageAdaptor("JRuby"); - loadLanguageAdaptor("Clojure"); - loadLanguageAdaptor("Scala"); - // as new languages arise we can add them here but this does not prevent someone from using 'registerLanguageAdaptor' directly - } + private final static ConcurrentHashMap, FunctionLanguageAdaptor> languageAdaptors = new ConcurrentHashMap<>(); private static boolean loadLanguageAdaptor(String name) { String className = "rx.lang." + name.toLowerCase() + "." + name + "Adaptor"; @@ -60,9 +54,8 @@ public class Functions { public static void registerLanguageAdaptor(Class[] functionClasses, FunctionLanguageAdaptor adaptor) { for (Class functionClass : functionClasses) { - if (functionClass.getPackage().getName().startsWith("java.")) { + if (functionClass.getPackage().getName().startsWith("java.")) throw new IllegalArgumentException("FunctionLanguageAdaptor implementations can not specify java.lang.* classes."); - } languageAdaptors.put(functionClass, adaptor); } } @@ -76,24 +69,24 @@ public class Functions { } /** - * Utility method for determining the type of closure/function and executing it. - * + * Utility method for determining the type of closure/function and executing + * it. + * * @param function */ - @SuppressWarnings({ "rawtypes" }) + @SuppressWarnings({"rawtypes"}) public static FuncN from(final Object function) { - if (function == null) { + if (function == null) throw new RuntimeException("function is null. Can't send arguments to null function."); - } /* check for typed Rx Function implementation first */ - if (function instanceof Function) { + if (function instanceof Function) return fromFunction((Function) function); - } else { + else /* not an Rx Function so try language adaptors */ // check for language adaptor - for (final Class c : languageAdaptors.keySet()) { + for (final Class c : languageAdaptors.keySet()) if (c.isInstance(function)) { final FunctionLanguageAdaptor la = languageAdaptors.get(c); // found the language adaptor so wrap in FuncN and return @@ -105,10 +98,7 @@ public class Functions { } }; - } - } - // no language adaptor found - } + } // no language adaptor found // no support found throw new RuntimeException("Unsupported closure type: " + function.getClass().getSimpleName()); @@ -213,338 +203,254 @@ public class Functions { // // throw new RuntimeException("Unknown implementation of Function: " + function.getClass().getSimpleName()); // } - - @SuppressWarnings({ "unchecked", "rawtypes" }) + @SuppressWarnings({"unchecked", "rawtypes"}) private static FuncN fromFunction(Function function) { // check Func* classes - if (function instanceof Func0) { + if (function instanceof Func0) return fromFunc((Func0) function); - } else if (function instanceof Func1) { + else if (function instanceof Func1) return fromFunc((Func1) function); - } else if (function instanceof Func2) { + else if (function instanceof Func2) return fromFunc((Func2) function); - } else if (function instanceof Func3) { + else if (function instanceof Func3) return fromFunc((Func3) function); - } else if (function instanceof Func4) { + else if (function instanceof Func4) return fromFunc((Func4) function); - } else if (function instanceof Func5) { + else if (function instanceof Func5) return fromFunc((Func5) function); - } else if (function instanceof Func6) { + else if (function instanceof Func6) return fromFunc((Func6) function); - } else if (function instanceof Func7) { + else if (function instanceof Func7) return fromFunc((Func7) function); - } else if (function instanceof Func8) { + else if (function instanceof Func8) return fromFunc((Func8) function); - } else if (function instanceof Func9) { + else if (function instanceof Func9) return fromFunc((Func9) function); - } else if (function instanceof FuncN) { + else if (function instanceof FuncN) return (FuncN) function; - } else if (function instanceof Action0) { + else if (function instanceof Action0) return fromAction((Action0) function); - } else if (function instanceof Action1) { + else if (function instanceof Action1) return fromAction((Action1) function); - } else if (function instanceof Action2) { + else if (function instanceof Action2) return fromAction((Action2) function); - } else if (function instanceof Action3) { + else if (function instanceof Action3) return fromAction((Action3) function); - } throw new RuntimeException("Unknown implementation of Function: " + function.getClass().getSimpleName()); } /** - * Convert a function to FuncN to allow heterogeneous handling of functions with different arities. - * + * Convert a function to FuncN to allow heterogeneous handling of functions + * with different arities. + * * @param f * @return {@link FuncN} */ public static FuncN fromFunc(final Func0 f) { - return new FuncN() { - - @Override - public R call(Object... args) { - if (args.length != 0) { - throw new RuntimeException("Func0 expecting 0 arguments."); - } - return f.call(); - } - + return (Object... args) -> { + if (args.length != 0) + throw new RuntimeException("Func0 expecting 0 arguments."); + return f.call(); }; } /** - * Convert a function to FuncN to allow heterogeneous handling of functions with different arities. - * + * Convert a function to FuncN to allow heterogeneous handling of functions + * with different arities. + * * @param f * @return {@link FuncN} */ public static FuncN fromFunc(final Func1 f) { - return new FuncN() { - - @SuppressWarnings("unchecked") - @Override - public R call(Object... args) { - if (args.length != 1) { - throw new RuntimeException("Func1 expecting 1 argument."); - } - return f.call((T0) args[0]); - } - + return (Object... args) -> { + if (args.length != 1) + throw new RuntimeException("Func1 expecting 1 argument."); + return f.call((T0) args[0]); }; } /** - * Convert a function to FuncN to allow heterogeneous handling of functions with different arities. - * + * Convert a function to FuncN to allow heterogeneous handling of functions + * with different arities. + * * @param f * @return {@link FuncN} */ public static FuncN fromFunc(final Func2 f) { - return new FuncN() { - - @SuppressWarnings("unchecked") - @Override - public R call(Object... args) { - if (args.length != 2) { - throw new RuntimeException("Func2 expecting 2 arguments."); - } - return f.call((T0) args[0], (T1) args[1]); - } - + return (Object... args) -> { + if (args.length != 2) + throw new RuntimeException("Func2 expecting 2 arguments."); + return f.call((T0) args[0], (T1) args[1]); }; } /** - * Convert a function to FuncN to allow heterogeneous handling of functions with different arities. - * + * Convert a function to FuncN to allow heterogeneous handling of functions + * with different arities. + * * @param f * @return {@link FuncN} */ public static FuncN fromFunc(final Func3 f) { - return new FuncN() { - - @SuppressWarnings("unchecked") - @Override - public R call(Object... args) { - if (args.length != 3) { - throw new RuntimeException("Func3 expecting 3 arguments."); - } - return f.call((T0) args[0], (T1) args[1], (T2) args[2]); - } - + return (Object... args) -> { + if (args.length != 3) + throw new RuntimeException("Func3 expecting 3 arguments."); + return f.call((T0) args[0], (T1) args[1], (T2) args[2]); }; } /** - * Convert a function to FuncN to allow heterogeneous handling of functions with different arities. - * + * Convert a function to FuncN to allow heterogeneous handling of functions + * with different arities. + * * @param f * @return {@link FuncN} */ public static FuncN fromFunc(final Func4 f) { - return new FuncN() { - - @SuppressWarnings("unchecked") - @Override - public R call(Object... args) { - if (args.length != 4) { - throw new RuntimeException("Func4 expecting 4 arguments."); - } - return f.call((T0) args[0], (T1) args[1], (T2) args[2], (T3) args[3]); - } - + return (Object... args) -> { + if (args.length != 4) + throw new RuntimeException("Func4 expecting 4 arguments."); + return f.call((T0) args[0], (T1) args[1], (T2) args[2], (T3) args[3]); }; } /** - * Convert a function to FuncN to allow heterogeneous handling of functions with different arities. - * + * Convert a function to FuncN to allow heterogeneous handling of functions + * with different arities. + * * @param f * @return {@link FuncN} */ public static FuncN fromFunc(final Func5 f) { - return new FuncN() { - - @SuppressWarnings("unchecked") - @Override - public R call(Object... args) { - if (args.length != 5) { - throw new RuntimeException("Func5 expecting 5 arguments."); - } - return f.call((T0) args[0], (T1) args[1], (T2) args[2], (T3) args[3], (T4) args[4]); - } - + return (Object... args) -> { + if (args.length != 5) + throw new RuntimeException("Func5 expecting 5 arguments."); + return f.call((T0) args[0], (T1) args[1], (T2) args[2], (T3) args[3], (T4) args[4]); }; } /** - * Convert a function to FuncN to allow heterogeneous handling of functions with different arities. - * + * Convert a function to FuncN to allow heterogeneous handling of functions + * with different arities. + * * @param f * @return {@link FuncN} */ public static FuncN fromFunc(final Func6 f) { - return new FuncN() { - - @SuppressWarnings("unchecked") - @Override - public R call(Object... args) { - if (args.length != 6) { - throw new RuntimeException("Func6 expecting 6 arguments."); - } - return f.call((T0) args[0], (T1) args[1], (T2) args[2], (T3) args[3], (T4) args[4], (T5) args[5]); - } - + return (Object... args) -> { + if (args.length != 6) + throw new RuntimeException("Func6 expecting 6 arguments."); + return f.call((T0) args[0], (T1) args[1], (T2) args[2], (T3) args[3], (T4) args[4], (T5) args[5]); }; } /** - * Convert a function to FuncN to allow heterogeneous handling of functions with different arities. - * + * Convert a function to FuncN to allow heterogeneous handling of functions + * with different arities. + * * @param f * @return {@link FuncN} */ public static FuncN fromFunc(final Func7 f) { - return new FuncN() { - - @SuppressWarnings("unchecked") - @Override - public R call(Object... args) { - if (args.length != 7) { - throw new RuntimeException("Func7 expecting 7 arguments."); - } - return f.call((T0) args[0], (T1) args[1], (T2) args[2], (T3) args[3], (T4) args[4], (T5) args[5], (T6) args[6]); - } - + return (Object... args) -> { + if (args.length != 7) + throw new RuntimeException("Func7 expecting 7 arguments."); + return f.call((T0) args[0], (T1) args[1], (T2) args[2], (T3) args[3], (T4) args[4], (T5) args[5], (T6) args[6]); }; } /** - * Convert a function to FuncN to allow heterogeneous handling of functions with different arities. - * + * Convert a function to FuncN to allow heterogeneous handling of functions + * with different arities. + * * @param f * @return {@link FuncN} */ public static FuncN fromFunc(final Func8 f) { - return new FuncN() { - - @SuppressWarnings("unchecked") - @Override - public R call(Object... args) { - if (args.length != 8) { - throw new RuntimeException("Func8 expecting 8 arguments."); - } - return f.call((T0) args[0], (T1) args[1], (T2) args[2], (T3) args[3], (T4) args[4], (T5) args[5], (T6) args[6], (T7) args[7]); - } - + return (Object... args) -> { + if (args.length != 8) + throw new RuntimeException("Func8 expecting 8 arguments."); + return f.call((T0) args[0], (T1) args[1], (T2) args[2], (T3) args[3], (T4) args[4], (T5) args[5], (T6) args[6], (T7) args[7]); }; } /** - * Convert a function to FuncN to allow heterogeneous handling of functions with different arities. - * + * Convert a function to FuncN to allow heterogeneous handling of functions + * with different arities. + * * @param f * @return {@link FuncN} */ public static FuncN fromFunc(final Func9 f) { - return new FuncN() { - - @SuppressWarnings("unchecked") - @Override - public R call(Object... args) { - if (args.length != 9) { - throw new RuntimeException("Func9 expecting 9 arguments."); - } - return f.call((T0) args[0], (T1) args[1], (T2) args[2], (T3) args[3], (T4) args[4], (T5) args[5], (T6) args[6], (T7) args[7], (T8) args[8]); - } - + return (Object... args) -> { + if (args.length != 9) + throw new RuntimeException("Func9 expecting 9 arguments."); + return f.call((T0) args[0], (T1) args[1], (T2) args[2], (T3) args[3], (T4) args[4], (T5) args[5], (T6) args[6], (T7) args[7], (T8) args[8]); }; } /** - * Convert a function to FuncN to allow heterogeneous handling of functions with different arities. - * + * Convert a function to FuncN to allow heterogeneous handling of functions + * with different arities. + * * @param f * @return {@link FuncN} */ public static FuncN fromAction(final Action0 f) { - return new FuncN() { - - @Override - public Void call(Object... args) { - if (args.length != 0) { - throw new RuntimeException("Action0 expecting 0 arguments."); - } - f.call(); - return null; - } - + return (Object... args) -> { + if (args.length != 0) + throw new RuntimeException("Action0 expecting 0 arguments."); + f.call(); + return null; }; } /** - * Convert a function to FuncN to allow heterogeneous handling of functions with different arities. - * + * Convert a function to FuncN to allow heterogeneous handling of functions + * with different arities. + * * @param f * @return {@link FuncN} */ public static FuncN fromAction(final Action1 f) { - return new FuncN() { - - @SuppressWarnings("unchecked") - @Override - public Void call(Object... args) { - if (args.length != 1) { - throw new RuntimeException("Action1 expecting 1 argument."); - } - f.call((T0) args[0]); - return null; - } - + return (Object... args) -> { + if (args.length != 1) + throw new RuntimeException("Action1 expecting 1 argument."); + f.call((T0) args[0]); + return null; }; } /** - * Convert a function to FuncN to allow heterogeneous handling of functions with different arities. - * + * Convert a function to FuncN to allow heterogeneous handling of functions + * with different arities. + * * @param f * @return {@link FuncN} */ public static FuncN fromAction(final Action2 f) { - return new FuncN() { - - @SuppressWarnings("unchecked") - @Override - public Void call(Object... args) { - if (args.length != 2) { - throw new RuntimeException("Action3 expecting 2 arguments."); - } - f.call((T0) args[0], (T1) args[1]); - return null; - } - + return (Object... args) -> { + if (args.length != 2) + throw new RuntimeException("Action3 expecting 2 arguments."); + f.call((T0) args[0], (T1) args[1]); + return null; }; } /** - * Convert a function to FuncN to allow heterogeneous handling of functions with different arities. - * + * Convert a function to FuncN to allow heterogeneous handling of functions + * with different arities. + * * @param f * @return {@link FuncN} */ public static FuncN fromAction(final Action3 f) { - return new FuncN() { - - @SuppressWarnings("unchecked") - @Override - public Void call(Object... args) { - if (args.length != 3) { - throw new RuntimeException("Action3 expecting 3 arguments."); - } - f.call((T0) args[0], (T1) args[1], (T2) args[2]); - return null; - } - + return (Object... args) -> { + if (args.length != 3) + throw new RuntimeException("Action3 expecting 3 arguments."); + f.call((T0) args[0], (T1) args[1], (T2) args[2]); + return null; }; } diff --git a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/Main.java b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/Main.java index 50ce86670..724341b44 100644 --- a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/Main.java +++ b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/Main.java @@ -63,12 +63,12 @@ public class Main { } catch (Throwable t) { HMCLog.err("There's something wrong when running server holder.", t); - LogWindow.instance.clean(); - LogWindow.instance.warning("开服器崩溃了QAQ"); + LogWindow.INSTANCE.clean(); + LogWindow.INSTANCE.warning("开服器崩溃了QAQ"); StringWriter trace = new StringWriter(); t.printStackTrace(new PrintWriter(trace)); - LogWindow.instance.warning(trace.toString()); - LogWindow.instance.setVisible(true); + LogWindow.INSTANCE.warning(trace.toString()); + LogWindow.INSTANCE.setVisible(true); System.exit(-1); } diff --git a/README.md b/README.md index e656fc0f1..b8b93fd1d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Hello Minecraft! Launcher Hello Minecraft! Launcher is a Minecraft launcher. +License is GPL v3, see http://www.gnu.org/licenses/. ### Joining If you really want to join the development, here's some requests.