Reconstructed too many codes

This commit is contained in:
huanghongxun 2015-12-09 21:03:56 +08:00
parent 8e2fa57868
commit a436e10d93
38 changed files with 606 additions and 822 deletions

View File

@ -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;
}

View File

@ -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);

View File

@ -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();

View File

@ -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<List<String>> successEvent = new EventHandler(this);
public final EventHandler<JavaProcess> launchEvent = new EventHandler(this);
public final EventHandler<DecompressLibraryJob> 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;
}

View File

@ -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<ModInfo> getMods();
public IMinecraftModService(Profile profile) {
super(profile);
}
List<ModInfo> recacheMods();
public abstract List<ModInfo> getMods();
boolean addMod(File f);
public abstract List<ModInfo> recacheMods();
void removeMod(int[] index);
public abstract boolean addMod(File f);
public abstract void removeMod(int[] index);
}

View File

@ -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<GameLauncher.DownloadLibraryJob> 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.
*/

View File

@ -34,18 +34,18 @@ public class LaunchFinisher implements Event<List<String>> {
public boolean call(Object sender, List<String> 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;
});

View File

@ -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) {

View File

@ -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();
}
}

View File

@ -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> 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<String, Profile> 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) {

View File

@ -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);
}

View File

@ -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 {

View File

@ -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();
}

View File

@ -17,6 +17,7 @@
*/
package org.jackhuang.hellominecraft.launcher.utils.assets;
/**
*
* @author huangyuhui

View File

@ -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

View File

@ -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");

View File

@ -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"));

View File

@ -0,0 +1,122 @@
/*
* Hello Minecraft! Launcher.
* Copyright (C) 2013 huangyuhui <huanghongxun2008@126.com>
*
* 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);
}
}
}

View File

@ -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<String> resolvedSoFar, DownloadType sourceType) {
public MinecraftVersion resolve(IMinecraftProvider manager, Set<String> resolvedSoFar) {
return this;
}

View File

@ -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;
}

View File

@ -1,57 +0,0 @@
/*
* Hello Minecraft! Launcher.
* Copyright (C) 2013 huangyuhui <huanghongxun2008@126.com>
*
* 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";
}
};
}
}

View File

@ -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<MinecraftVersion>
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<String> resolvedSoFar, DownloadType sourceType) {
protected MinecraftVersion resolve(IMinecraftProvider manager, Set<String> resolvedSoFar) {
if (inheritsFrom == null)
return this;
if (!resolvedSoFar.add(id))
@ -83,11 +82,11 @@ public class MinecraftVersion implements Cloneable, Comparable<MinecraftVersion>
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,

View File

@ -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<String, MinecraftVersion> versions = new TreeMap();
File baseFolder;
final Map<String, MinecraftVersion> 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<GameLauncher.DownloadLibraryJob> getDownloadLibraries(DownloadType downloadType) {
ArrayList<DownloadLibraryJob> 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<File> 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;
}
}

View File

@ -1068,7 +1068,7 @@
<Component id="cboVersions" alignment="3" min="-2" pref="26" max="-2" attributes="0"/>
<Component id="jLabel2" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace pref="11" max="32767" attributes="0"/>
<EmptySpace max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>

View File

@ -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");
//<editor-fold defaultstate="collapsed" desc="Explore Menu">
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);
//</editor-fold>
//<editor-fold defaultstate="collapsed" desc="Manage Menu">
}
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);
//</editor-fold>
}
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));
}
//</editor-fold>
// <editor-fold defaultstate="collapsed" desc="Assets">
public int assetsType;
// </editor-fold>
//</editor-fold>
// <editor-fold defaultstate="collapsed" desc="Game Download">
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<Task> 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);
}
// </editor-fold>
@ -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<InstallerVersionList.InstallerVersion> loadVersions(InstallerVersionList list, JTable table) {

View File

@ -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);

View File

@ -46,9 +46,9 @@ public class ContentGetAndShowTask extends HTTPGetTask implements Event<String>
@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;
}
}

View File

@ -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 <T> void forEach(Collection<T> coll, Consumer<T> p) {
for (T t : coll)
p.accept(t);
}
public static <T> ArrayList<T> map(Collection<T> coll, Predicate<T> p) {
ArrayList<T> newColl = new ArrayList<>();
forEach(coll, t -> {
if (p.apply(t))
newColl.add(t);
});
Observable.from(coll).filter(p).subscribe(newColl::add);
return newColl;
}

View File

@ -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<String> getRx(String url) {
return Observable.create(t1 -> {
try {
t1.onNext(get(url));
} catch(Exception e) {
t1.onError(e);
}
return Subscriptions.empty();
});
}
}

View File

@ -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;
}

View File

@ -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);
}
}
}
}

View File

@ -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.

View File

@ -2478,6 +2478,10 @@ public class Observable<T> {
public Observable<T> where(Func1<T, Boolean> predicate) {
return where(this, predicate);
}
public final <R> Observable<R> flatMap(Func1<? super T, ? extends Observable<? extends R>> func) {
return merge(map(func));
}
/**
* Returns the last element of an observable sequence with a specified source.

View File

@ -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 <huanghongxun2008@126.com>
*
* 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;

View File

@ -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);
}
}

View File

@ -1,12 +1,12 @@
/**
* Copyright 2013 Netflix, Inc.
*
* <p>
* 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
*
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
*
* <p>
* 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.
* <p>
* Language support is provided via implementations of {@link FunctionLanguageAdaptor}.
* Language support is provided via implementations of
* {@link FunctionLanguageAdaptor}.
* <p>
* 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<Class<?>, FunctionLanguageAdaptor> languageAdaptors = new ConcurrentHashMap<Class<?>, 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<Class<?>, 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 <R> FuncN<R> fromFunc(final Func0<R> f) {
return new FuncN<R>() {
@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 <T0, R> FuncN<R> fromFunc(final Func1<T0, R> f) {
return new FuncN<R>() {
@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 <T0, T1, R> FuncN<R> fromFunc(final Func2<T0, T1, R> f) {
return new FuncN<R>() {
@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 <T0, T1, T2, R> FuncN<R> fromFunc(final Func3<T0, T1, T2, R> f) {
return new FuncN<R>() {
@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 <T0, T1, T2, T3, R> FuncN<R> fromFunc(final Func4<T0, T1, T2, T3, R> f) {
return new FuncN<R>() {
@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 <T0, T1, T2, T3, T4, R> FuncN<R> fromFunc(final Func5<T0, T1, T2, T3, T4, R> f) {
return new FuncN<R>() {
@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 <T0, T1, T2, T3, T4, T5, R> FuncN<R> fromFunc(final Func6<T0, T1, T2, T3, T4, T5, R> f) {
return new FuncN<R>() {
@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 <T0, T1, T2, T3, T4, T5, T6, R> FuncN<R> fromFunc(final Func7<T0, T1, T2, T3, T4, T5, T6, R> f) {
return new FuncN<R>() {
@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 <T0, T1, T2, T3, T4, T5, T6, T7, R> FuncN<R> fromFunc(final Func8<T0, T1, T2, T3, T4, T5, T6, T7, R> f) {
return new FuncN<R>() {
@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 <T0, T1, T2, T3, T4, T5, T6, T7, T8, R> FuncN<R> fromFunc(final Func9<T0, T1, T2, T3, T4, T5, T6, T7, T8, R> f) {
return new FuncN<R>() {
@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<Void> fromAction(final Action0 f) {
return new FuncN<Void>() {
@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 <T0> FuncN<Void> fromAction(final Action1<T0> f) {
return new FuncN<Void>() {
@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 <T0, T1> FuncN<Void> fromAction(final Action2<T0, T1> f) {
return new FuncN<Void>() {
@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 <T0, T1, T2> FuncN<Void> fromAction(final Action3<T0, T1, T2> f) {
return new FuncN<Void>() {
@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;
};
}

View File

@ -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);
}

View File

@ -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.