Each version has its own settings

This commit is contained in:
huangyuhui
2016-01-29 22:21:13 +08:00
parent d2162f31e4
commit f8eec1b7d5
30 changed files with 710 additions and 574 deletions

View File

@@ -43,7 +43,7 @@ public class AssetsMojangLoader extends IAssetsHandler {
} }
@Override @Override
public OverridableSwingWorker<String[]> getList(MinecraftVersion mv, IMinecraftAssetService mp) { public OverridableSwingWorker<String[]> getList(final MinecraftVersion mv, final IMinecraftAssetService mp) {
return new OverridableSwingWorker<String[]>() { return new OverridableSwingWorker<String[]>() {
@Override @Override
protected void work() throws Exception { protected void work() throws Exception {

View File

@@ -41,7 +41,7 @@ public class MinecraftAssetService extends IMinecraftAssetService {
} }
@Override @Override
public Task downloadAssets(String mcVersion) { public Task downloadAssets(final String mcVersion) {
return new Task() { return new Task() {
@Override @Override

View File

@@ -29,7 +29,7 @@ import org.jackhuang.hellominecraft.utils.system.JdkVersion;
*/ */
public class LaunchOptions { public class LaunchOptions {
private String name, versionName, javaArgs, minecraftArgs, maxMemory, permSize, width, height, userProperties, serverIp; private String name, versionName, javaArgs, minecraftArgs, maxMemory, permSize, width, height, serverIp;
private String proxyHost, proxyPort, proxyUser, proxyPass, javaDir, launchVersion; private String proxyHost, proxyPort, proxyUser, proxyPass, javaDir, launchVersion;
private boolean fullscreen, debug, noJVMArgs, canceledWrapper; private boolean fullscreen, debug, noJVMArgs, canceledWrapper;
private JdkVersion java; private JdkVersion java;
@@ -114,16 +114,6 @@ public class LaunchOptions {
this.height = height; this.height = height;
} }
public String getUserProperties() {
if (userProperties == null)
return "";
return userProperties;
}
public void setUserProperties(String userProperties) {
this.userProperties = userProperties;
}
public boolean isFullscreen() { public boolean isFullscreen() {
return fullscreen; return fullscreen;
} }

View File

@@ -74,7 +74,8 @@ public class MinecraftModService extends IMinecraftModService {
} }
} }
Collections.sort(mods); Collections.sort(mods);
return modCache.put(id, mods); modCache.put(id, mods);
return mods;
} }
@Override @Override

View File

@@ -33,12 +33,12 @@ import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftProvider;
import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService;
import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion;
import org.jackhuang.hellominecraft.utils.functions.BiFunction; import org.jackhuang.hellominecraft.utils.functions.BiFunction;
import org.jackhuang.hellominecraft.utils.functions.Predicate;
import org.jackhuang.hellominecraft.utils.system.Compressor; import org.jackhuang.hellominecraft.utils.system.Compressor;
import org.jackhuang.hellominecraft.utils.system.FileUtils; import org.jackhuang.hellominecraft.utils.system.FileUtils;
import org.jackhuang.hellominecraft.utils.system.ZipEngine; import org.jackhuang.hellominecraft.utils.system.ZipEngine;
import org.jackhuang.hellominecraft.utils.tasks.Task; import org.jackhuang.hellominecraft.utils.tasks.Task;
import org.jackhuang.hellominecraft.utils.version.MinecraftVersionRequest; import org.jackhuang.hellominecraft.utils.version.MinecraftVersionRequest;
import org.jackhuang.hellominecraft.utils.views.wizard.spi.ResultProgressHandle;
/** /**
* A mod pack(*.zip) includes these things: * A mod pack(*.zip) includes these things:
@@ -60,7 +60,7 @@ import org.jackhuang.hellominecraft.utils.views.wizard.spi.ResultProgressHandle;
*/ */
public final class ModpackManager { public final class ModpackManager {
public static Task install(File input, IMinecraftService service, String id) { public static Task install(final File input, final IMinecraftService service, final String id) {
return new Task() { return new Task() {
Collection<Task> c = new ArrayList<>(); Collection<Task> c = new ArrayList<>();
@@ -87,12 +87,15 @@ public final class ModpackManager {
} }
try { try {
AtomicInteger b = new AtomicInteger(0); final AtomicInteger b = new AtomicInteger(0);
HMCLog.log("Decompressing modpack"); HMCLog.log("Decompressing modpack");
Compressor.unzip(input, versions, t -> { Compressor.unzip(input, versions, new Predicate<String>() {
@Override
public boolean apply(String t) {
if (t.equals("minecraft/pack.json")) if (t.equals("minecraft/pack.json"))
b.incrementAndGet(); b.incrementAndGet();
return true; return true;
}
}, true); }, true);
if (b.get() < 1) if (b.get() < 1)
throw new FileNotFoundException(C.i18n("modpack.incorrect_format.no_json")); throw new FileNotFoundException(C.i18n("modpack.incorrect_format.no_json"));
@@ -138,26 +141,31 @@ public final class ModpackManager {
} }
public static final List<String> MODPACK_BLACK_LIST = Arrays.asList(new String[] { "usernamecache.json", "asm", "logs", "backups", "versions", "assets", "usercache.json", "libraries", "crash-reports", "launcher_profiles.json", "NVIDIA", "TCNodeTracker", "screenshots", "natives", "native" }); public static final List<String> MODPACK_BLACK_LIST = Arrays.asList(new String[] { "usernamecache.json", "asm", "logs", "backups", "versions", "assets", "usercache.json", "libraries", "crash-reports", "launcher_profiles.json", "NVIDIA", "TCNodeTracker", "screenshots", "natives", "native", "hmclversion.cfg", "pack.json" });
public static final List<String> MODPACK_SUGGESTED_BLACK_LIST = Arrays.asList(new String[] { "saves", "servers.dat", "options.txt", "optionsshaders.txt", "mods/VoxelMods" }); public static final List<String> MODPACK_SUGGESTED_BLACK_LIST = Arrays.asList(new String[] { "saves", "servers.dat", "options.txt", "optionsshaders.txt", "mods/VoxelMods" });
/** /**
* &lt; String, Boolean, Boolean &gt;: Folder/File name, Is Directory, * &lt; String, Boolean, Boolean &gt;: Folder/File name, Is Directory,
* Return 0: non blocked, 1: non shown, 2: suggested, checked. * Return 0: non blocked, 1: non shown, 2: suggested, checked.
*/ */
public static final BiFunction<String, Boolean, Integer> MODPACK_PREDICATE = (String x, Boolean y) -> { public static final BiFunction<String, Boolean, Integer> MODPACK_PREDICATE = new BiFunction<String, Boolean, Integer>() {
@Override
public Integer apply(String x, Boolean y) {
if (ModpackManager.MODPACK_BLACK_LIST_PREDICATE.apply(x, y)) if (ModpackManager.MODPACK_BLACK_LIST_PREDICATE.apply(x, y))
return 1; return 1;
if (ModpackManager.MODPACK_SUGGESTED_BLACK_LIST_PREDICATE.apply(x, y)) if (ModpackManager.MODPACK_SUGGESTED_BLACK_LIST_PREDICATE.apply(x, y))
return 2; return 2;
return 0; return 0;
}
}; };
public static final BiFunction<String, Boolean, Boolean> MODPACK_BLACK_LIST_PREDICATE = modpackPredicateMaker(MODPACK_BLACK_LIST); public static final BiFunction<String, Boolean, Boolean> MODPACK_BLACK_LIST_PREDICATE = modpackPredicateMaker(MODPACK_BLACK_LIST);
public static final BiFunction<String, Boolean, Boolean> MODPACK_SUGGESTED_BLACK_LIST_PREDICATE = modpackPredicateMaker(MODPACK_SUGGESTED_BLACK_LIST); public static final BiFunction<String, Boolean, Boolean> MODPACK_SUGGESTED_BLACK_LIST_PREDICATE = modpackPredicateMaker(MODPACK_SUGGESTED_BLACK_LIST);
private static BiFunction<String, Boolean, Boolean> modpackPredicateMaker(List<String> l) { private static BiFunction<String, Boolean, Boolean> modpackPredicateMaker(final List<String> l) {
return (String x, Boolean y) -> { return new BiFunction<String, Boolean, Boolean>() {
@Override
public Boolean apply(String x, Boolean y) {
for (String s : l) for (String s : l)
if (y) { if (y) {
if (x.startsWith(s + "/")) if (x.startsWith(s + "/"))
@@ -165,6 +173,7 @@ public final class ModpackManager {
} else if (x.equals(s)) } else if (x.equals(s))
return true; return true;
return false; return false;
}
}; };
} }
@@ -179,14 +188,18 @@ public final class ModpackManager {
* @throws IOException if create tmp directory failed * @throws IOException if create tmp directory failed
*/ */
public static void export(File output, IMinecraftProvider provider, String version, List<String> blacklist) throws IOException, GameException { public static void export(File output, IMinecraftProvider provider, String version, List<String> blacklist) throws IOException, GameException {
ArrayList<String> b = new ArrayList<>(MODPACK_BLACK_LIST); final ArrayList<String> b = new ArrayList<>(MODPACK_BLACK_LIST);
if (blacklist != null) if (blacklist != null)
b.addAll(blacklist); b.addAll(blacklist);
b.add(version + ".jar");
b.add(version + ".json");
HMCLog.log("Compressing game files without some files in blacklist, including files or directories: usernamecache.json, asm, logs, backups, versions, assets, usercache.json, libraries, crash-reports, launcher_profiles.json, NVIDIA, TCNodeTracker"); HMCLog.log("Compressing game files without some files in blacklist, including files or directories: usernamecache.json, asm, logs, backups, versions, assets, usercache.json, libraries, crash-reports, launcher_profiles.json, NVIDIA, TCNodeTracker");
ZipEngine zip = null; ZipEngine zip = null;
try { try {
zip = new ZipEngine(output); zip = new ZipEngine(output);
zip.putDirectory(provider.getRunDirectory(version), (String x, Boolean y) -> { zip.putDirectory(provider.getRunDirectory(version), new BiFunction<String, Boolean, String>() {
@Override
public String apply(String x, Boolean y) {
for (String s : b) for (String s : b)
if (y) { if (y) {
if (x.startsWith(s + "/")) if (x.startsWith(s + "/"))
@@ -194,14 +207,15 @@ public final class ModpackManager {
} else if (x.equals(s)) } else if (x.equals(s))
return null; return null;
return "minecraft/" + x; return "minecraft/" + x;
}
}); });
MinecraftVersion mv = provider.getVersionById(version).resolve(provider); MinecraftVersion mv = provider.getVersionById(version).resolve(provider);
mv.runDir = "version";
MinecraftVersionRequest r = MinecraftVersionRequest.minecraftVersion(provider.getMinecraftJar(version)); MinecraftVersionRequest r = MinecraftVersionRequest.minecraftVersion(provider.getMinecraftJar(version));
if (r.type != MinecraftVersionRequest.OK) if (r.type != MinecraftVersionRequest.OK)
throw new FileSystemException(C.i18n("modpack.cannot_read_version") + ": " + MinecraftVersionRequest.getResponse(r)); throw new FileSystemException(C.i18n("modpack.cannot_read_version") + ": " + MinecraftVersionRequest.getResponse(r));
mv.jar = r.version; mv.jar = r.version;
mv.runDir = "version";
zip.putTextFile(C.gsonPrettyPrinting.toJson(mv), "minecraft/pack.json"); zip.putTextFile(C.gsonPrettyPrinting.toJson(mv), "minecraft/pack.json");
} finally { } finally {
if (zip != null) if (zip != null)

View File

@@ -21,8 +21,8 @@ import java.io.File;
import java.util.Collection; import java.util.Collection;
import org.jackhuang.hellominecraft.launcher.core.GameException; import org.jackhuang.hellominecraft.launcher.core.GameException;
import org.jackhuang.hellominecraft.launcher.core.version.DecompressLibraryJob; import org.jackhuang.hellominecraft.launcher.core.version.DecompressLibraryJob;
import org.jackhuang.hellominecraft.launcher.core.version.GameDirType;
import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion;
import org.jackhuang.hellominecraft.utils.EventHandler;
import org.jackhuang.hellominecraft.utils.functions.Consumer; import org.jackhuang.hellominecraft.utils.functions.Consumer;
/** /**
@@ -54,6 +54,8 @@ public abstract class IMinecraftProvider {
*/ */
public abstract File getRunDirectory(String id); public abstract File getRunDirectory(String id);
public abstract File versionRoot(String id);
public File getRunDirectory(String id, String subFolder) { public File getRunDirectory(String id, String subFolder) {
return new File(getRunDirectory(id), subFolder); return new File(getRunDirectory(id), subFolder);
} }
@@ -91,12 +93,6 @@ public abstract class IMinecraftProvider {
*/ */
public abstract File getMinecraftJar(String id); public abstract File getMinecraftJar(String id);
protected GameDirType gameDirType = GameDirType.ROOT_FOLDER;
public void setGameDirType(GameDirType gameDirType) {
this.gameDirType = gameDirType;
}
/** /**
* Rename version * Rename version
* *
@@ -148,9 +144,15 @@ public abstract class IMinecraftProvider {
/** /**
* Refind the versions in this profile. * Refind the versions in this profile.
* Must call onRefreshingVersions, onRefreshedVersions, onLoadedVersion
* Events.
*/ */
public abstract void refreshVersions(); public abstract void refreshVersions();
public final EventHandler<Void> onRefreshingVersions = new EventHandler<>(this),
onRefreshedVersions = new EventHandler<>(this);
public final EventHandler<String> onLoadedVersion = new EventHandler<>(this);
/** /**
* Clean redundant files. * Clean redundant files.
*/ */
@@ -163,4 +165,8 @@ public abstract class IMinecraftProvider {
*/ */
public abstract boolean onLaunch(); public abstract boolean onLaunch();
public File baseDirectory() {
return service.baseDirectory();
}
} }

View File

@@ -68,6 +68,8 @@ public class MinecraftVersionManager extends IMinecraftProvider {
@Override @Override
public void refreshVersions() { public void refreshVersions() {
onRefreshingVersions.execute(null);
try { try {
MCUtils.tryWriteProfile(service.baseDirectory()); MCUtils.tryWriteProfile(service.baseDirectory());
} catch (IOException ex) { } catch (IOException ex) {
@@ -140,15 +142,22 @@ public class MinecraftVersionManager extends IMinecraftProvider {
for (MinecraftLibrary ml : mcVersion.libraries) for (MinecraftLibrary ml : mcVersion.libraries)
ml.init(); ml.init();
versions.put(id, mcVersion); versions.put(id, mcVersion);
onLoadedVersion.execute(id);
} catch (Exception e) { } catch (Exception e) {
HMCLog.warn("Ignoring: " + dir + ", the json of this Minecraft is malformed.", e); HMCLog.warn("Ignoring: " + dir + ", the json of this Minecraft is malformed.", e);
} }
} }
onRefreshedVersions.execute(null);
}
@Override
public File versionRoot(String id) {
return new File(service.baseDirectory(), "versions/" + id);
} }
@Override @Override
public boolean removeVersionFromDisk(String name) { public boolean removeVersionFromDisk(String name) {
File version = new File(service.baseDirectory(), "versions/" + name); File version = versionRoot(name);
if (!version.exists()) if (!version.exists())
return true; return true;
@@ -159,12 +168,12 @@ public class MinecraftVersionManager extends IMinecraftProvider {
@Override @Override
public boolean renameVersion(String from, String to) { public boolean renameVersion(String from, String to) {
try { try {
File fromJson = new File(service.baseDirectory(), "versions/" + from + "/" + from + ".json"); File fromJson = new File(versionRoot(from), from + ".json");
MinecraftVersion mcVersion = C.gson.fromJson(FileUtils.readFileToString(fromJson), MinecraftVersion.class); MinecraftVersion mcVersion = C.gson.fromJson(FileUtils.readFileToString(fromJson), MinecraftVersion.class);
mcVersion.id = to; mcVersion.id = to;
FileUtils.writeQuietly(fromJson, C.gsonPrettyPrinting.toJson(mcVersion)); FileUtils.writeQuietly(fromJson, C.gsonPrettyPrinting.toJson(mcVersion));
File toDir = new File(service.baseDirectory(), "versions/" + to); File toDir = versionRoot(to);
new File(service.baseDirectory(), "versions/" + from).renameTo(toDir); versionRoot(from).renameTo(toDir);
File toJson = new File(toDir, to + ".json"); File toJson = new File(toDir, to + ".json");
File toJar = new File(toDir, to + ".jar"); File toJar = new File(toDir, to + ".jar");
new File(toDir, from + ".json").renameTo(toJson); new File(toDir, from + ".json").renameTo(toJson);
@@ -180,14 +189,9 @@ public class MinecraftVersionManager extends IMinecraftProvider {
@Override @Override
public File getRunDirectory(String id) { public File getRunDirectory(String id) {
if ("version".equals(versions.get(id).runDir)) if ("version".equals(getVersionById(id).runDir))
return new File(service.baseDirectory(), "versions/" + id + "/"); return versionRoot(id);
switch (gameDirType) { return baseDirectory();
case VERSION_FOLDER:
return new File(service.baseDirectory(), "versions/" + id + "/");
default:
return service.baseDirectory();
}
} }
@Override @Override
@@ -195,7 +199,7 @@ public class MinecraftVersionManager extends IMinecraftProvider {
MinecraftVersion v = service.download().downloadMinecraft(id); MinecraftVersion v = service.download().downloadMinecraft(id);
if (callback != null) { if (callback != null) {
callback.accept(v); callback.accept(v);
File mvt = new File(service.baseDirectory(), "versions/" + id + "/" + id + ".json"); File mvt = new File(versionRoot(id), id + ".json");
FileUtils.writeQuietly(mvt, C.gsonPrettyPrinting.toJson(v)); FileUtils.writeQuietly(mvt, C.gsonPrettyPrinting.toJson(v));
} }
if (v != null) { if (v != null) {
@@ -265,9 +269,9 @@ public class MinecraftVersionManager extends IMinecraftProvider {
@Override @Override
public void cleanFolder() { public void cleanFolder() {
for (MinecraftVersion s : getVersions()) { for (MinecraftVersion s : getVersions()) {
FileUtils.deleteDirectoryQuietly(new File(service.baseDirectory(), "versions" + File.separator + s.id + File.separator + s.id + "-natives")); FileUtils.deleteDirectoryQuietly(new File(versionRoot(s.id), s.id + "-natives"));
File f = getRunDirectory(s.id); File f = getRunDirectory(s.id);
String[] dir = { "logs", "asm", "NVIDIA", "crash-reports", "server-resource-packs", "natives", "native" }; String[] dir = { "asm", "NVIDIA", "server-resource-packs", "natives", "native" };
for (String str : dir) for (String str : dir)
FileUtils.deleteDirectoryQuietly(new File(f, str)); FileUtils.deleteDirectoryQuietly(new File(f, str));
String[] files = { "output-client.log", "usercache.json", "usernamecache.json", "hmclmc.log" }; String[] files = { "output-client.log", "usercache.json", "usernamecache.json", "hmclmc.log" };

View File

@@ -15,11 +15,12 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see {http://www.gnu.org/licenses/}. * along with this program. If not, see {http://www.gnu.org/licenses/}.
*/ */
package org.jackhuang.hellominecraft.launcher.utils; package org.jackhuang.hellominecraft.launcher.settings;
import java.io.File; import java.io.File;
import java.util.HashMap;
import java.util.Map;
import org.jackhuang.hellominecraft.launcher.core.GameException; import org.jackhuang.hellominecraft.launcher.core.GameException;
import org.jackhuang.hellominecraft.launcher.settings.Profile;
import org.jackhuang.hellominecraft.launcher.core.installers.MinecraftInstallerService; import org.jackhuang.hellominecraft.launcher.core.installers.MinecraftInstallerService;
import org.jackhuang.hellominecraft.launcher.core.assets.MinecraftAssetService; import org.jackhuang.hellominecraft.launcher.core.assets.MinecraftAssetService;
import org.jackhuang.hellominecraft.launcher.core.auth.UserProfileProvider; import org.jackhuang.hellominecraft.launcher.core.auth.UserProfileProvider;
@@ -34,7 +35,8 @@ import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftModService;
import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftProvider; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftProvider;
import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService;
import org.jackhuang.hellominecraft.launcher.core.mod.MinecraftModService; import org.jackhuang.hellominecraft.launcher.core.mod.MinecraftModService;
import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersionManager; import org.jackhuang.hellominecraft.utils.C;
import org.jackhuang.hellominecraft.utils.system.FileUtils;
/** /**
* *
@@ -44,15 +46,51 @@ public class DefaultMinecraftService extends IMinecraftService {
File base; File base;
Profile p; Profile p;
final Map<String, VersionSetting> versionSettings = new HashMap<>();
public DefaultMinecraftService(Profile p) { public DefaultMinecraftService(Profile p) {
this.p = p; this.p = p;
this.provider = new MinecraftVersionManager(this); this.provider = new HMCLGameProvider(this);
provider.initializeMiencraft(); provider.initializeMiencraft();
provider.onRefreshingVersions.register((sender, x) -> {
versionSettings.clear();
return true;
});
provider.onLoadedVersion.register((sender, id) -> {
VersionSetting vs = new VersionSetting();
File f = new File(provider.versionRoot(id), "hmclversion.cfg");
if (f.exists()) {
String s = FileUtils.readFileToStringQuietly(f);
if (s != null)
vs = C.gson.fromJson(s, VersionSetting.class);
}
vs.id = id;
versionSettings.put(id, vs);
return true;
});
this.mms = new MinecraftModService(this); this.mms = new MinecraftModService(this);
this.mds = new MinecraftDownloadService(this); this.mds = new MinecraftDownloadService(this);
this.mas = new MinecraftAssetService(this); this.mas = new MinecraftAssetService(this);
this.mis = new MinecraftInstallerService(this); this.mis = new MinecraftInstallerService(this);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
for (String key : versionSettings.keySet())
saveVersionSetting(key);
}
});
}
public VersionSetting getVersionSetting(String id) {
return versionSettings.get(id);
}
public void saveVersionSetting(String id) {
if (!versionSettings.containsKey(id))
return;
File f = new File(provider.versionRoot(id), "hmclversion.cfg");
FileUtils.writeQuietly(f, C.gson.toJson(versionSettings.get(id)));
} }
@Override @Override

View File

@@ -17,10 +17,8 @@
*/ */
package org.jackhuang.hellominecraft.launcher.settings; package org.jackhuang.hellominecraft.launcher.settings;
import org.jackhuang.hellominecraft.launcher.utils.DefaultMinecraftService;
import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService;
import org.jackhuang.hellominecraft.launcher.api.IPlugin; import org.jackhuang.hellominecraft.launcher.api.IPlugin;
import org.jackhuang.hellominecraft.launcher.settings.Settings;
import org.jackhuang.hellominecraft.launcher.core.auth.IAuthenticator; import org.jackhuang.hellominecraft.launcher.core.auth.IAuthenticator;
import org.jackhuang.hellominecraft.launcher.core.auth.OfflineAuthenticator; import org.jackhuang.hellominecraft.launcher.core.auth.OfflineAuthenticator;
import org.jackhuang.hellominecraft.launcher.core.auth.SkinmeAuthenticator; import org.jackhuang.hellominecraft.launcher.core.auth.SkinmeAuthenticator;
@@ -54,11 +52,14 @@ public class DefaultPlugin implements IPlugin {
SKINME_LOGIN = new SkinmeAuthenticator(clientToken); SKINME_LOGIN = new SkinmeAuthenticator(clientToken);
SKINME_LOGIN.onLoadSettings(Settings.getInstance().getAuthenticatorConfig(SKINME_LOGIN.id())); SKINME_LOGIN.onLoadSettings(Settings.getInstance().getAuthenticatorConfig(SKINME_LOGIN.id()));
Runtime.getRuntime().addShutdownHook(new Thread(() -> { Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
Settings.getInstance().setAuthenticatorConfig(OFFLINE_LOGIN.id(), OFFLINE_LOGIN.onSaveSettings()); Settings.getInstance().setAuthenticatorConfig(OFFLINE_LOGIN.id(), OFFLINE_LOGIN.onSaveSettings());
Settings.getInstance().setAuthenticatorConfig(YGGDRASIL_LOGIN.id(), YGGDRASIL_LOGIN.onSaveSettings()); Settings.getInstance().setAuthenticatorConfig(YGGDRASIL_LOGIN.id(), YGGDRASIL_LOGIN.onSaveSettings());
Settings.getInstance().setAuthenticatorConfig(SKINME_LOGIN.id(), SKINME_LOGIN.onSaveSettings()); Settings.getInstance().setAuthenticatorConfig(SKINME_LOGIN.id(), SKINME_LOGIN.onSaveSettings());
})); }
});
apply.accept(OFFLINE_LOGIN); apply.accept(OFFLINE_LOGIN);
apply.accept(YGGDRASIL_LOGIN); apply.accept(YGGDRASIL_LOGIN);
apply.accept(SKINME_LOGIN); apply.accept(SKINME_LOGIN);

View File

@@ -0,0 +1,40 @@
/*
* 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.settings;
import java.io.File;
import org.jackhuang.hellominecraft.launcher.core.version.GameDirType;
import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersionManager;
/**
*
* @author huangyuhui
*/
public class HMCLGameProvider extends MinecraftVersionManager {
public HMCLGameProvider(DefaultMinecraftService p) {
super(p);
}
@Override
public File getRunDirectory(String id) {
return ((DefaultMinecraftService) service).getVersionSetting(id).getGameDirType() == GameDirType.VERSION_FOLDER
? service.version().versionRoot(id)
: super.getRunDirectory(id);
}
}

View File

@@ -18,22 +18,12 @@
package org.jackhuang.hellominecraft.launcher.settings; package org.jackhuang.hellominecraft.launcher.settings;
import java.io.File; import java.io.File;
import java.io.IOException;
import org.jackhuang.hellominecraft.utils.C;
import org.jackhuang.hellominecraft.utils.logging.HMCLog;
import org.jackhuang.hellominecraft.launcher.Main;
import org.jackhuang.hellominecraft.launcher.api.PluginManager; import org.jackhuang.hellominecraft.launcher.api.PluginManager;
import org.jackhuang.hellominecraft.launcher.core.LauncherVisibility;
import org.jackhuang.hellominecraft.launcher.core.MCUtils; import org.jackhuang.hellominecraft.launcher.core.MCUtils;
import org.jackhuang.hellominecraft.launcher.core.launch.LaunchOptions;
import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService;
import org.jackhuang.hellominecraft.utils.system.IOUtils; import org.jackhuang.hellominecraft.utils.system.IOUtils;
import org.jackhuang.hellominecraft.launcher.core.version.GameDirType;
import org.jackhuang.hellominecraft.utils.StrUtils; import org.jackhuang.hellominecraft.utils.StrUtils;
import org.jackhuang.hellominecraft.utils.Utils;
import org.jackhuang.hellominecraft.utils.EventHandler; import org.jackhuang.hellominecraft.utils.EventHandler;
import org.jackhuang.hellominecraft.utils.system.Java;
import org.jackhuang.hellominecraft.utils.system.JdkVersion;
import org.jackhuang.hellominecraft.utils.system.OS; import org.jackhuang.hellominecraft.utils.system.OS;
/** /**
@@ -42,22 +32,7 @@ import org.jackhuang.hellominecraft.utils.system.OS;
*/ */
public final class Profile { public final class Profile {
private String name, selectedMinecraftVersion = "", javaArgs, minecraftArgs, maxMemory, permSize, width, height, userProperties; private String name, selectedMinecraftVersion = "", gameDir;
private String gameDir, javaDir, precalledCommand, serverIp, java;
private boolean fullscreen, debug, noJVMArgs, canceledWrapper;
/**
* 0 - Close the launcher when the game starts.<br/>
* 1 - Hide the launcher when the game starts.<br/>
* 2 - Keep the launcher open.<br/>
*/
private int launcherVisibility;
/**
* 0 - .minecraft<br/>
* 1 - .minecraft/versions/&lt;version&gt;/<br/>
*/
private int gameDirType;
protected transient IMinecraftService service; protected transient IMinecraftService service;
public transient final EventHandler<String> propertyChanged = new EventHandler<>(this); public transient final EventHandler<String> propertyChanged = new EventHandler<>(this);
@@ -69,14 +44,7 @@ public final class Profile {
public Profile(String name) { public Profile(String name) {
this.name = name; this.name = name;
gameDir = MCUtils.getInitGameDir().getPath(); gameDir = MCUtils.getInitGameDir().getPath();
debug = fullscreen = canceledWrapper = false;
launcherVisibility = gameDirType = 0;
PluginManager.NOW_PLUGIN.onInitializingProfile(this); PluginManager.NOW_PLUGIN.onInitializingProfile(this);
javaDir = java = minecraftArgs = serverIp = precalledCommand = "";
}
public void initialize(int gameDirType) {
this.gameDirType = gameDirType;
} }
public Profile(Profile v) { public Profile(Profile v) {
@@ -85,22 +53,6 @@ public final class Profile {
return; return;
name = v.name; name = v.name;
gameDir = v.gameDir; gameDir = v.gameDir;
maxMemory = v.maxMemory;
width = v.width;
height = v.height;
java = v.java;
fullscreen = v.fullscreen;
javaArgs = v.javaArgs;
javaDir = v.javaDir;
debug = v.debug;
minecraftArgs = v.minecraftArgs;
permSize = v.permSize;
gameDirType = v.gameDirType;
canceledWrapper = v.canceledWrapper;
noJVMArgs = v.noJVMArgs;
launcherVisibility = v.launcherVisibility;
precalledCommand = v.precalledCommand;
serverIp = v.serverIp;
} }
public IMinecraftService service() { public IMinecraftService service() {
@@ -109,6 +61,14 @@ public final class Profile {
return service; return service;
} }
public VersionSetting getSelectedVersionSetting() {
return getVersionSetting(getSelectedVersion());
}
public VersionSetting getVersionSetting(String id) {
return ((DefaultMinecraftService) service()).getVersionSetting(id);
}
public String getSettingsSelectedMinecraftVersion() { public String getSettingsSelectedMinecraftVersion() {
return selectedMinecraftVersion; return selectedMinecraftVersion;
} }
@@ -157,60 +117,6 @@ public final class Profile {
return this; return this;
} }
public String getJavaDir() {
Java j = getJava();
if (j.getHome() == null)
return javaDir;
else
return j.getJava();
}
public String getSettingsJavaDir() {
return javaDir;
}
public File getJavaDirFile() {
return new File(getJavaDir());
}
public void setJavaDir(String javaDir) {
this.javaDir = javaDir;
propertyChanged.execute("javaDir");
}
public Java getJava() {
return Java.JAVA.get(getJavaIndexInAllJavas());
}
public int getJavaIndexInAllJavas() {
if (StrUtils.isBlank(java) && StrUtils.isNotBlank(javaDir))
java = "Custom";
int idx = Java.JAVA.indexOf(new Java(java, null));
if (idx == -1) {
java = "Default";
idx = 0;
}
return idx;
}
public void setJava(Java java) {
if (java == null)
this.java = Java.JAVA.get(0).getName();
else {
int idx = Java.JAVA.indexOf(java);
if (idx == -1)
return;
this.java = java.getName();
}
propertyChanged.execute("java");
}
public File getFolder(String folder) {
if (getSelectedVersion() == null)
return new File(getCanonicalGameDirFile(), folder);
return service().version().getRunDirectory(getSelectedVersion(), folder);
}
public String getName() { public String getName() {
return name; return name;
} }
@@ -220,207 +126,7 @@ public final class Profile {
propertyChanged.execute("name"); propertyChanged.execute("name");
} }
public String getJavaArgs() {
if (StrUtils.isBlank(javaArgs))
return "";
return javaArgs;
}
public void setJavaArgs(String javaArgs) {
this.javaArgs = javaArgs;
propertyChanged.execute("javaArgs");
}
public boolean hasJavaArgs() {
return StrUtils.isNotBlank(getJavaArgs().trim());
}
public String getMaxMemory() {
if (StrUtils.isBlank(maxMemory))
return String.valueOf(Utils.getSuggestedMemorySize());
return maxMemory;
}
public void setMaxMemory(String maxMemory) {
this.maxMemory = maxMemory;
propertyChanged.execute("maxMemory");
}
public String getWidth() {
if (StrUtils.isBlank(width))
return "854";
return width;
}
public void setWidth(String width) {
this.width = width;
propertyChanged.execute("width");
}
public String getHeight() {
if (StrUtils.isBlank(height))
return "480";
return height;
}
public void setHeight(String height) {
this.height = height;
propertyChanged.execute("height");
}
public String getUserProperties() {
if (userProperties == null)
return "";
return userProperties;
}
public void setUserProperties(String userProperties) {
this.userProperties = userProperties;
propertyChanged.execute("userProperties");
}
public boolean isFullscreen() {
return fullscreen;
}
public void setFullscreen(boolean fullscreen) {
this.fullscreen = fullscreen;
propertyChanged.execute("fullscreen");
}
public boolean isDebug() {
return debug;
}
public void setDebug(boolean debug) {
this.debug = debug;
propertyChanged.execute("debug");
}
public LauncherVisibility getLauncherVisibility() {
return LauncherVisibility.values()[launcherVisibility];
}
public void setLauncherVisibility(LauncherVisibility launcherVisibility) {
this.launcherVisibility = launcherVisibility.ordinal();
propertyChanged.execute("launcherVisibility");
}
public GameDirType getGameDirType() {
if (gameDirType < 0 || gameDirType > 1)
setGameDirType(GameDirType.ROOT_FOLDER);
return GameDirType.values()[gameDirType];
}
public void setGameDirType(GameDirType gameDirType) {
this.gameDirType = gameDirType.ordinal();
service().version().setGameDirType(getGameDirType());
propertyChanged.execute("gameDirType");
}
public String getPermSize() {
return permSize;
}
public void setPermSize(String permSize) {
this.permSize = permSize;
propertyChanged.execute("permSize");
}
public boolean isNoJVMArgs() {
return noJVMArgs;
}
public void setNoJVMArgs(boolean noJVMArgs) {
this.noJVMArgs = noJVMArgs;
propertyChanged.execute("noJVMArgs");
}
public String getMinecraftArgs() {
return minecraftArgs;
}
public void setMinecraftArgs(String minecraftArgs) {
this.minecraftArgs = minecraftArgs;
propertyChanged.execute("minecraftArgs");
}
public boolean isCanceledWrapper() {
return canceledWrapper;
}
public void setCanceledWrapper(boolean canceledWrapper) {
this.canceledWrapper = canceledWrapper;
propertyChanged.execute("canceledWrapper");
}
public String getPrecalledCommand() {
return precalledCommand;
}
public void setPrecalledCommand(String precalledCommand) {
this.precalledCommand = precalledCommand;
propertyChanged.execute("precalledCommand");
}
public String getServerIp() {
return serverIp;
}
public void setServerIp(String serverIp) {
this.serverIp = serverIp;
propertyChanged.execute("serverIp");
}
public void checkFormat() { public void checkFormat() {
gameDir = gameDir.replace('/', OS.os().fileSeparator).replace('\\', OS.os().fileSeparator); gameDir = gameDir.replace('/', OS.os().fileSeparator).replace('\\', OS.os().fileSeparator);
} }
public LaunchOptions createLaunchOptions() {
LaunchOptions x = new LaunchOptions();
x.setCanceledWrapper(isCanceledWrapper());
x.setDebug(isDebug());
x.setFullscreen(isFullscreen());
x.setGameDir(getCanonicalGameDirFile());
x.setGameDirType(getGameDirType());
x.setHeight(getHeight());
x.setJavaArgs(getJavaArgs());
x.setLaunchVersion(getSelectedVersion());
x.setMaxMemory(getMaxMemory());
x.setMinecraftArgs(getMinecraftArgs());
x.setName(getName());
x.setNoJVMArgs(isNoJVMArgs());
x.setPermSize(getPermSize());
x.setPrecalledCommand(getPrecalledCommand());
x.setProxyHost(Settings.getInstance().getProxyHost());
x.setProxyPort(Settings.getInstance().getProxyPort());
x.setProxyUser(Settings.getInstance().getProxyUserName());
x.setProxyPass(Settings.getInstance().getProxyPassword());
x.setServerIp(getServerIp());
x.setUserProperties(getUserProperties());
x.setVersionName(Main.makeTitle());
x.setWidth(getWidth());
String str = getJavaDir();
if (!getJavaDirFile().exists()) {
HMCLog.err(C.i18n("launch.wrong_javadir"));
setJava(null);
str = getJavaDir();
}
JdkVersion jv = new JdkVersion(str);
if (Settings.getInstance().getJava().contains(jv))
jv = Settings.getInstance().getJava().get(Settings.getInstance().getJava().indexOf(jv));
else
try {
jv = JdkVersion.getJavaVersionFromExecutable(str);
Settings.getInstance().getJava().add(jv);
Settings.save();
} catch (IOException ex) {
HMCLog.warn("Failed to get java version", ex);
jv = null;
}
x.setJava(jv);
x.setJavaDir(str);
return x;
}
} }

View File

@@ -20,21 +20,20 @@ package org.jackhuang.hellominecraft.launcher.settings;
import com.google.gson.JsonSyntaxException; import com.google.gson.JsonSyntaxException;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map; import java.util.Map;
import org.jackhuang.hellominecraft.utils.C; import org.jackhuang.hellominecraft.utils.C;
import org.jackhuang.hellominecraft.utils.logging.HMCLog; import org.jackhuang.hellominecraft.utils.logging.HMCLog;
import org.jackhuang.hellominecraft.launcher.Main; import org.jackhuang.hellominecraft.launcher.Main;
import org.jackhuang.hellominecraft.launcher.core.download.DownloadType; import org.jackhuang.hellominecraft.launcher.core.download.DownloadType;
import org.jackhuang.hellominecraft.utils.CollectionUtils; import org.jackhuang.hellominecraft.utils.CollectionUtils;
import org.jackhuang.hellominecraft.utils.Event;
import org.jackhuang.hellominecraft.utils.system.FileUtils; import org.jackhuang.hellominecraft.utils.system.FileUtils;
import org.jackhuang.hellominecraft.utils.system.IOUtils; import org.jackhuang.hellominecraft.utils.system.IOUtils;
import org.jackhuang.hellominecraft.utils.MessageBox; import org.jackhuang.hellominecraft.utils.MessageBox;
import org.jackhuang.hellominecraft.utils.UpdateChecker; import org.jackhuang.hellominecraft.utils.UpdateChecker;
import org.jackhuang.hellominecraft.utils.VersionNumber; import org.jackhuang.hellominecraft.utils.VersionNumber;
import org.jackhuang.hellominecraft.utils.functions.Predicate;
/** /**
* *
@@ -56,9 +55,12 @@ public final class Settings {
static { static {
SETTINGS = initSettings(); SETTINGS = initSettings();
SETTINGS.downloadTypeChangedEvent.register((s, t) -> { SETTINGS.downloadTypeChangedEvent.register(new Event<DownloadType>() {
@Override
public boolean call(Object sender, DownloadType t) {
DownloadType.setSuggestedDownloadType(t); DownloadType.setSuggestedDownloadType(t);
return true; return true;
}
}); });
DownloadType.setSuggestedDownloadType(SETTINGS.getDownloadSource()); DownloadType.setSuggestedDownloadType(SETTINGS.getDownloadSource());
if (!getProfiles().containsKey(DEFAULT_PROFILE)) if (!getProfiles().containsKey(DEFAULT_PROFILE))
@@ -66,9 +68,12 @@ public final class Settings {
for (Profile e : getProfiles().values()) { for (Profile e : getProfiles().values()) {
e.checkFormat(); e.checkFormat();
e.propertyChanged.register((sender, t) -> { e.propertyChanged.register(new Event<String>() {
@Override
public boolean call(Object sender, String t) {
save(); save();
return true; return true;
}
}); });
} }
} }
@@ -121,7 +126,12 @@ public final class Settings {
} }
public static Collection<Profile> getProfilesFiltered() { public static Collection<Profile> getProfilesFiltered() {
return CollectionUtils.map(getProfiles().values(), (t) -> t != null && t.getName() != null); return CollectionUtils.map(getProfiles().values(), new Predicate<Profile>() {
@Override
public boolean apply(Profile t) {
return t != null && t.getName() != null;
}
});
} }
public static Profile getOneProfile() { public static Profile getOneProfile() {

View File

@@ -0,0 +1,323 @@
/*
* 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.settings;
import java.io.File;
import java.io.IOException;
import org.jackhuang.hellominecraft.launcher.Main;
import org.jackhuang.hellominecraft.launcher.core.LauncherVisibility;
import org.jackhuang.hellominecraft.launcher.core.launch.LaunchOptions;
import org.jackhuang.hellominecraft.launcher.core.version.GameDirType;
import org.jackhuang.hellominecraft.utils.C;
import org.jackhuang.hellominecraft.utils.EventHandler;
import org.jackhuang.hellominecraft.utils.StrUtils;
import org.jackhuang.hellominecraft.utils.Utils;
import org.jackhuang.hellominecraft.utils.logging.HMCLog;
import org.jackhuang.hellominecraft.utils.system.Java;
import org.jackhuang.hellominecraft.utils.system.JdkVersion;
/**
*
* @author huangyuhui
*/
public class VersionSetting {
public transient String id;
private String javaArgs, minecraftArgs, maxMemory, permSize, width, height;
private String javaDir, precalledCommand, serverIp, java;
private boolean fullscreen, debug, noJVMArgs, canceledWrapper;
/**
* 0 - Close the launcher when the game starts.<br/>
* 1 - Hide the launcher when the game starts.<br/>
* 2 - Keep the launcher open.<br/>
*/
private int launcherVisibility;
/**
* 0 - .minecraft<br/>
* 1 - .minecraft/versions/&lt;version&gt;/<br/>
*/
private int gameDirType;
public transient final EventHandler<String> propertyChanged = new EventHandler<>(this);
public VersionSetting() {
debug = fullscreen = canceledWrapper = false;
launcherVisibility = gameDirType = 0;
javaDir = java = minecraftArgs = serverIp = precalledCommand = "";
}
public VersionSetting(VersionSetting v) {
this();
if (v == null)
return;
maxMemory = v.maxMemory;
width = v.width;
height = v.height;
java = v.java;
fullscreen = v.fullscreen;
javaArgs = v.javaArgs;
javaDir = v.javaDir;
debug = v.debug;
minecraftArgs = v.minecraftArgs;
permSize = v.permSize;
gameDirType = v.gameDirType;
canceledWrapper = v.canceledWrapper;
noJVMArgs = v.noJVMArgs;
launcherVisibility = v.launcherVisibility;
precalledCommand = v.precalledCommand;
serverIp = v.serverIp;
}
public String getJavaDir() {
Java j = getJava();
if (j.getHome() == null)
return javaDir;
else
return j.getJava();
}
public String getSettingsJavaDir() {
return javaDir;
}
public File getJavaDirFile() {
return new File(getJavaDir());
}
public void setJavaDir(String javaDir) {
this.javaDir = javaDir;
propertyChanged.execute("javaDir");
}
public Java getJava() {
return Java.JAVA.get(getJavaIndexInAllJavas());
}
public int getJavaIndexInAllJavas() {
if (StrUtils.isBlank(java) && StrUtils.isNotBlank(javaDir))
java = "Custom";
int idx = Java.JAVA.indexOf(new Java(java, null));
if (idx == -1) {
java = "Default";
idx = 0;
}
return idx;
}
public void setJava(Java java) {
if (java == null)
this.java = Java.JAVA.get(0).getName();
else {
int idx = Java.JAVA.indexOf(java);
if (idx == -1)
return;
this.java = java.getName();
}
propertyChanged.execute("java");
}
public String getJavaArgs() {
if (StrUtils.isBlank(javaArgs))
return "";
return javaArgs;
}
public void setJavaArgs(String javaArgs) {
this.javaArgs = javaArgs;
propertyChanged.execute("javaArgs");
}
public boolean hasJavaArgs() {
return StrUtils.isNotBlank(getJavaArgs().trim());
}
public String getMaxMemory() {
if (StrUtils.isBlank(maxMemory))
return String.valueOf(Utils.getSuggestedMemorySize());
return maxMemory;
}
public void setMaxMemory(String maxMemory) {
this.maxMemory = maxMemory;
propertyChanged.execute("maxMemory");
}
public String getWidth() {
if (StrUtils.isBlank(width))
return "854";
return width;
}
public void setWidth(String width) {
this.width = width;
propertyChanged.execute("width");
}
public String getHeight() {
if (StrUtils.isBlank(height))
return "480";
return height;
}
public void setHeight(String height) {
this.height = height;
propertyChanged.execute("height");
}
public boolean isFullscreen() {
return fullscreen;
}
public void setFullscreen(boolean fullscreen) {
this.fullscreen = fullscreen;
propertyChanged.execute("fullscreen");
}
public boolean isDebug() {
return debug;
}
public void setDebug(boolean debug) {
this.debug = debug;
propertyChanged.execute("debug");
}
public LauncherVisibility getLauncherVisibility() {
return LauncherVisibility.values()[launcherVisibility];
}
public void setLauncherVisibility(LauncherVisibility launcherVisibility) {
this.launcherVisibility = launcherVisibility.ordinal();
propertyChanged.execute("launcherVisibility");
}
public GameDirType getGameDirType() {
if (gameDirType < 0 || gameDirType > 1)
setGameDirType(GameDirType.ROOT_FOLDER);
return GameDirType.values()[gameDirType];
}
public void setGameDirType(GameDirType gameDirType) {
this.gameDirType = gameDirType.ordinal();
propertyChanged.execute("gameDirType");
}
public String getPermSize() {
return permSize;
}
public void setPermSize(String permSize) {
this.permSize = permSize;
propertyChanged.execute("permSize");
}
public boolean isNoJVMArgs() {
return noJVMArgs;
}
public void setNoJVMArgs(boolean noJVMArgs) {
this.noJVMArgs = noJVMArgs;
propertyChanged.execute("noJVMArgs");
}
public String getMinecraftArgs() {
return minecraftArgs;
}
public void setMinecraftArgs(String minecraftArgs) {
this.minecraftArgs = minecraftArgs;
propertyChanged.execute("minecraftArgs");
}
public boolean isCanceledWrapper() {
return canceledWrapper;
}
public void setCanceledWrapper(boolean canceledWrapper) {
this.canceledWrapper = canceledWrapper;
propertyChanged.execute("canceledWrapper");
}
public String getPrecalledCommand() {
return precalledCommand;
}
public void setPrecalledCommand(String precalledCommand) {
this.precalledCommand = precalledCommand;
propertyChanged.execute("precalledCommand");
}
public String getServerIp() {
return serverIp;
}
public void setServerIp(String serverIp) {
this.serverIp = serverIp;
propertyChanged.execute("serverIp");
}
public LaunchOptions createLaunchOptions(File gameDir) {
LaunchOptions x = new LaunchOptions();
x.setCanceledWrapper(isCanceledWrapper());
x.setDebug(isDebug());
x.setFullscreen(isFullscreen());
x.setGameDir(gameDir);
x.setGameDirType(getGameDirType());
x.setHeight(getHeight());
x.setJavaArgs(getJavaArgs());
x.setLaunchVersion(id);
x.setMaxMemory(getMaxMemory());
x.setMinecraftArgs(getMinecraftArgs());
x.setName(Main.makeTitle());
x.setNoJVMArgs(isNoJVMArgs());
x.setPermSize(getPermSize());
x.setPrecalledCommand(getPrecalledCommand());
x.setProxyHost(Settings.getInstance().getProxyHost());
x.setProxyPort(Settings.getInstance().getProxyPort());
x.setProxyUser(Settings.getInstance().getProxyUserName());
x.setProxyPass(Settings.getInstance().getProxyPassword());
x.setServerIp(getServerIp());
x.setVersionName(Main.makeTitle());
x.setWidth(getWidth());
String str = getJavaDir();
if (!getJavaDirFile().exists()) {
HMCLog.err(C.i18n("launch.wrong_javadir"));
setJava(null);
str = getJavaDir();
}
JdkVersion jv = new JdkVersion(str);
if (Settings.getInstance().getJava().contains(jv))
jv = Settings.getInstance().getJava().get(Settings.getInstance().getJava().indexOf(jv));
else
try {
jv = JdkVersion.getJavaVersionFromExecutable(str);
Settings.getInstance().getJava().add(jv);
Settings.save();
} catch (IOException ex) {
HMCLog.warn("Failed to get java version", ex);
jv = null;
}
x.setJava(jv);
x.setJavaDir(str);
return x;
}
}

View File

@@ -106,7 +106,12 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler {
System.out.println(text); System.out.println(text);
if (checkThrowable(e) && !System.getProperty("java.vm.name").contains("OpenJDK")) { if (checkThrowable(e) && !System.getProperty("java.vm.name").contains("OpenJDK")) {
SwingUtilities.invokeLater(() -> LogWindow.INSTANCE.showAsCrashWindow(Settings.UPDATE_CHECKER.OUT_DATED)); SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
LogWindow.INSTANCE.showAsCrashWindow(Settings.UPDATE_CHECKER.OUT_DATED);
}
});
if (!Settings.UPDATE_CHECKER.OUT_DATED) if (!Settings.UPDATE_CHECKER.OUT_DATED)
reportToServer(text, s); reportToServer(text, s);
} }
@@ -127,11 +132,13 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler {
private static final HashSet<String> THROWABLE_SET = new HashSet<>(); private static final HashSet<String> THROWABLE_SET = new HashSet<>();
void reportToServer(String text, String stacktrace) { void reportToServer(final String text, String stacktrace) {
if (THROWABLE_SET.contains(stacktrace)) if (THROWABLE_SET.contains(stacktrace))
return; return;
THROWABLE_SET.add(stacktrace); THROWABLE_SET.add(stacktrace);
new Thread(() -> { new Thread() {
@Override
public void run() {
HashMap<String, String> map = new HashMap<>(); HashMap<String, String> map = new HashMap<>();
map.put("CrashReport", text); map.put("CrashReport", text);
try { try {
@@ -140,7 +147,8 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler {
System.out.println("Failed to send post request to HMCL server."); System.out.println("Failed to send post request to HMCL server.");
ex.printStackTrace(); ex.printStackTrace();
} }
}).start(); }
}.start();
} }
} }

View File

@@ -45,6 +45,7 @@ import org.jackhuang.hellominecraft.utils.MessageBox;
import org.jackhuang.hellominecraft.utils.UpdateChecker; import org.jackhuang.hellominecraft.utils.UpdateChecker;
import org.jackhuang.hellominecraft.utils.Utils; import org.jackhuang.hellominecraft.utils.Utils;
import org.jackhuang.hellominecraft.utils.VersionNumber; import org.jackhuang.hellominecraft.utils.VersionNumber;
import org.jackhuang.hellominecraft.utils.functions.Consumer;
import org.jackhuang.hellominecraft.utils.system.FileUtils; import org.jackhuang.hellominecraft.utils.system.FileUtils;
import org.jackhuang.hellominecraft.utils.system.IOUtils; import org.jackhuang.hellominecraft.utils.system.IOUtils;
import org.jackhuang.hellominecraft.utils.system.OS; import org.jackhuang.hellominecraft.utils.system.OS;
@@ -89,8 +90,10 @@ public class AppDataUpgrader extends IUpgrader {
} }
@Override @Override
public boolean call(Object sender, VersionNumber number) { public boolean call(Object sender, final VersionNumber number) {
((UpdateChecker) sender).requestDownloadLink().reg(map -> { ((UpdateChecker) sender).requestDownloadLink().reg(new Consumer<Map<String, String>>() {
@Override
public void accept(Map<String, String> map) {
if (map != null && map.containsKey("pack")) if (map != null && map.containsKey("pack"))
try { try {
if (TaskWindow.getInstance().addTask(new AppDataUpgraderTask(map.get("pack"), number.version)).start()) { if (TaskWindow.getInstance().addTask(new AppDataUpgraderTask(map.get("pack"), number.version)).start()) {
@@ -119,6 +122,7 @@ public class AppDataUpgrader extends IUpgrader {
MessageBox.Show(C.i18n("update.no_browser")); MessageBox.Show(C.i18n("update.no_browser"));
} }
} }
}
}).execute(); }).execute();
return true; return true;
} }
@@ -142,7 +146,7 @@ public class AppDataUpgrader extends IUpgrader {
} }
@Override @Override
public Collection<Task> getDependTasks() { public Collection<? extends Task> getDependTasks() {
return Arrays.asList(new FileDownloadTask(downloadLink, tempFile)); return Arrays.asList(new FileDownloadTask(downloadLink, tempFile));
} }

View File

@@ -112,7 +112,7 @@
<Component id="lblDimensionX" min="-2" max="-2" attributes="0"/> <Component id="lblDimensionX" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="txtHeight" min="-2" pref="100" max="-2" attributes="0"/> <Component id="txtHeight" min="-2" pref="100" max="-2" attributes="0"/>
<EmptySpace pref="444" max="32767" attributes="0"/> <EmptySpace pref="410" max="32767" attributes="0"/>
<Component id="chkFullscreen" min="-2" max="-2" attributes="0"/> <Component id="chkFullscreen" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<Group type="102" alignment="1" attributes="0"> <Group type="102" alignment="1" attributes="0">
@@ -300,7 +300,7 @@
<Component class="javax.swing.JLabel" name="lblRunDirectory"> <Component class="javax.swing.JLabel" name="lblRunDirectory">
<Properties> <Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/jackhuang/hellominecraft/launcher/I18N.properties" key="advancedsettings.run_directory" replaceFormat="C.i18n(&quot;{key}&quot;)"/> <ResourceString bundle="org/jackhuang/hellominecraft/launcher/I18N.properties" key="settings.run_directory" replaceFormat="C.i18n(&quot;{key}&quot;)"/>
</Property> </Property>
</Properties> </Properties>
</Component> </Component>
@@ -461,7 +461,7 @@
<Component class="javax.swing.JCheckBox" name="chkDebug"> <Component class="javax.swing.JCheckBox" name="chkDebug">
<Properties> <Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/jackhuang/hellominecraft/launcher/I18N.properties" key="advencedsettings.debug_mode" replaceFormat="C.i18n(&quot;{key}&quot;)"/> <ResourceString bundle="org/jackhuang/hellominecraft/launcher/I18N.properties" key="advancedsettings.debug_mode" replaceFormat="C.i18n(&quot;{key}&quot;)"/>
</Property> </Property>
</Properties> </Properties>
<Events> <Events>

View File

@@ -53,6 +53,8 @@ import org.jackhuang.hellominecraft.launcher.core.installers.InstallerType;
import org.jackhuang.hellominecraft.launcher.core.mod.ModpackManager; import org.jackhuang.hellominecraft.launcher.core.mod.ModpackManager;
import org.jackhuang.hellominecraft.launcher.core.version.GameDirType; import org.jackhuang.hellominecraft.launcher.core.version.GameDirType;
import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion;
import org.jackhuang.hellominecraft.launcher.settings.DefaultMinecraftService;
import org.jackhuang.hellominecraft.launcher.settings.VersionSetting;
import org.jackhuang.hellominecraft.launcher.views.modpack.ModpackWizard; import org.jackhuang.hellominecraft.launcher.views.modpack.ModpackWizard;
import org.jackhuang.hellominecraft.utils.tasks.TaskWindow; import org.jackhuang.hellominecraft.utils.tasks.TaskWindow;
import org.jackhuang.hellominecraft.utils.Event; import org.jackhuang.hellominecraft.utils.Event;
@@ -372,7 +374,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget
lblLauncherVisibility.setText(C.i18n("advancedsettings.launcher_visible")); // NOI18N lblLauncherVisibility.setText(C.i18n("advancedsettings.launcher_visible")); // NOI18N
lblRunDirectory.setText(C.i18n("advancedsettings.run_directory")); // NOI18N lblRunDirectory.setText(C.i18n("settings.run_directory")); // NOI18N
cboRunDirectory.setModel(new javax.swing.DefaultComboBoxModel(new String[] { C.I18N.getString("advancedsettings.game_dir.default"), C.I18N.getString("advancedsettings.game_dir.independent") })); cboRunDirectory.setModel(new javax.swing.DefaultComboBoxModel(new String[] { C.I18N.getString("advancedsettings.game_dir.default"), C.I18N.getString("advancedsettings.game_dir.independent") }));
cboRunDirectory.addFocusListener(new java.awt.event.FocusAdapter() { cboRunDirectory.addFocusListener(new java.awt.event.FocusAdapter() {
@@ -446,7 +448,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget
.addComponent(lblDimensionX) .addComponent(lblDimensionX)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(txtHeight, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtHeight, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 444, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 410, Short.MAX_VALUE)
.addComponent(chkFullscreen)) .addComponent(chkFullscreen))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnlSettingsLayout.createSequentialGroup() .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnlSettingsLayout.createSequentialGroup()
.addComponent(txtMaxMemory) .addComponent(txtMaxMemory)
@@ -508,7 +510,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget
tabVersionEdit.addTab(C.i18n("settings"), pnlSettings); // NOI18N tabVersionEdit.addTab(C.i18n("settings"), pnlSettings); // NOI18N
chkDebug.setText(C.i18n("advencedsettings.debug_mode")); // NOI18N chkDebug.setText(C.i18n("advancedsettings.debug_mode")); // NOI18N
chkDebug.addFocusListener(new java.awt.event.FocusAdapter() { chkDebug.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusLost(java.awt.event.FocusEvent evt) { public void focusLost(java.awt.event.FocusEvent evt) {
chkDebugFocusLost(evt); chkDebugFocusLost(evt);
@@ -915,7 +917,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget
Settings.getInstance().setLast((String) cboProfiles.getSelectedItem()); Settings.getInstance().setLast((String) cboProfiles.getSelectedItem());
if (getProfile().service().version().getVersionCount() <= 0) if (getProfile().service().version().getVersionCount() <= 0)
versionChanged(null); versionChanged(null);
prepare(getProfile()); prepareProfile(getProfile());
} }
}//GEN-LAST:event_cboProfilesItemStateChanged }//GEN-LAST:event_cboProfilesItemStateChanged
@@ -974,45 +976,45 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget
}//GEN-LAST:event_btnModifyMouseClicked }//GEN-LAST:event_btnModifyMouseClicked
private void txtJavaArgsFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtJavaArgsFocusLost private void txtJavaArgsFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtJavaArgsFocusLost
getProfile().setJavaArgs(txtJavaArgs.getText()); getProfile().getSelectedVersionSetting().setJavaArgs(txtJavaArgs.getText());
}//GEN-LAST:event_txtJavaArgsFocusLost }//GEN-LAST:event_txtJavaArgsFocusLost
private void txtMinecraftArgsFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtMinecraftArgsFocusLost private void txtMinecraftArgsFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtMinecraftArgsFocusLost
getProfile().setMinecraftArgs(txtMinecraftArgs.getText()); getProfile().getSelectedVersionSetting().setMinecraftArgs(txtMinecraftArgs.getText());
}//GEN-LAST:event_txtMinecraftArgsFocusLost }//GEN-LAST:event_txtMinecraftArgsFocusLost
private void txtPermSizeFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPermSizeFocusLost private void txtPermSizeFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPermSizeFocusLost
getProfile().setPermSize(txtPermSize.getText()); getProfile().getSelectedVersionSetting().setPermSize(txtPermSize.getText());
}//GEN-LAST:event_txtPermSizeFocusLost }//GEN-LAST:event_txtPermSizeFocusLost
private void chkDebugFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkDebugFocusLost private void chkDebugFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkDebugFocusLost
getProfile().setDebug(chkDebug.isSelected()); getProfile().getSelectedVersionSetting().setDebug(chkDebug.isSelected());
}//GEN-LAST:event_chkDebugFocusLost }//GEN-LAST:event_chkDebugFocusLost
private void chkNoJVMArgsFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkNoJVMArgsFocusLost private void chkNoJVMArgsFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkNoJVMArgsFocusLost
getProfile().setNoJVMArgs(chkNoJVMArgs.isSelected()); getProfile().getSelectedVersionSetting().setNoJVMArgs(chkNoJVMArgs.isSelected());
}//GEN-LAST:event_chkNoJVMArgsFocusLost }//GEN-LAST:event_chkNoJVMArgsFocusLost
private void chkCancelWrapperFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkCancelWrapperFocusLost private void chkCancelWrapperFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkCancelWrapperFocusLost
getProfile().setCanceledWrapper(chkCancelWrapper.isSelected()); getProfile().getSelectedVersionSetting().setCanceledWrapper(chkCancelWrapper.isSelected());
}//GEN-LAST:event_chkCancelWrapperFocusLost }//GEN-LAST:event_chkCancelWrapperFocusLost
private void txtPrecalledCommandFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPrecalledCommandFocusLost private void txtPrecalledCommandFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPrecalledCommandFocusLost
getProfile().setPrecalledCommand(txtPrecalledCommand.getText()); getProfile().getSelectedVersionSetting().setPrecalledCommand(txtPrecalledCommand.getText());
}//GEN-LAST:event_txtPrecalledCommandFocusLost }//GEN-LAST:event_txtPrecalledCommandFocusLost
private void txtServerIPFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtServerIPFocusLost private void txtServerIPFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtServerIPFocusLost
getProfile().setServerIp(txtServerIP.getText()); getProfile().getSelectedVersionSetting().setServerIp(txtServerIP.getText());
}//GEN-LAST:event_txtServerIPFocusLost }//GEN-LAST:event_txtServerIPFocusLost
private void cboRunDirectoryFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_cboRunDirectoryFocusLost private void cboRunDirectoryFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_cboRunDirectoryFocusLost
if (cboRunDirectory.getSelectedIndex() >= 0) if (cboRunDirectory.getSelectedIndex() >= 0)
getProfile().setGameDirType(GameDirType.values()[cboRunDirectory.getSelectedIndex()]); getProfile().getSelectedVersionSetting().setGameDirType(GameDirType.values()[cboRunDirectory.getSelectedIndex()]);
}//GEN-LAST:event_cboRunDirectoryFocusLost }//GEN-LAST:event_cboRunDirectoryFocusLost
private void cboLauncherVisibilityFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_cboLauncherVisibilityFocusLost private void cboLauncherVisibilityFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_cboLauncherVisibilityFocusLost
if (cboLauncherVisibility.getSelectedIndex() >= 0) if (cboLauncherVisibility.getSelectedIndex() >= 0)
getProfile().setLauncherVisibility(LauncherVisibility.values()[cboLauncherVisibility.getSelectedIndex()]); getProfile().getSelectedVersionSetting().setLauncherVisibility(LauncherVisibility.values()[cboLauncherVisibility.getSelectedIndex()]);
}//GEN-LAST:event_cboLauncherVisibilityFocusLost }//GEN-LAST:event_cboLauncherVisibilityFocusLost
private void btnDownloadAllAssetsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDownloadAllAssetsActionPerformed private void btnDownloadAllAssetsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDownloadAllAssetsActionPerformed
@@ -1021,23 +1023,23 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget
}//GEN-LAST:event_btnDownloadAllAssetsActionPerformed }//GEN-LAST:event_btnDownloadAllAssetsActionPerformed
private void txtMaxMemoryFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtMaxMemoryFocusLost private void txtMaxMemoryFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtMaxMemoryFocusLost
getProfile().setMaxMemory(txtMaxMemory.getText()); getProfile().getSelectedVersionSetting().setMaxMemory(txtMaxMemory.getText());
}//GEN-LAST:event_txtMaxMemoryFocusLost }//GEN-LAST:event_txtMaxMemoryFocusLost
private void txtJavaDirFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtJavaDirFocusLost private void txtJavaDirFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtJavaDirFocusLost
getProfile().setJavaDir(txtJavaDir.getText()); getProfile().getSelectedVersionSetting().setJavaDir(txtJavaDir.getText());
}//GEN-LAST:event_txtJavaDirFocusLost }//GEN-LAST:event_txtJavaDirFocusLost
private void chkFullscreenFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkFullscreenFocusLost private void chkFullscreenFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkFullscreenFocusLost
getProfile().setFullscreen(chkFullscreen.isSelected()); getProfile().getSelectedVersionSetting().setFullscreen(chkFullscreen.isSelected());
}//GEN-LAST:event_chkFullscreenFocusLost }//GEN-LAST:event_chkFullscreenFocusLost
private void txtHeightFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtHeightFocusLost private void txtHeightFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtHeightFocusLost
getProfile().setHeight(txtHeight.getText()); getProfile().getSelectedVersionSetting().setHeight(txtHeight.getText());
}//GEN-LAST:event_txtHeightFocusLost }//GEN-LAST:event_txtHeightFocusLost
private void txtWidthFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtWidthFocusLost private void txtWidthFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtWidthFocusLost
getProfile().setWidth(txtWidth.getText()); getProfile().getSelectedVersionSetting().setWidth(txtWidth.getText());
}//GEN-LAST:event_txtWidthFocusLost }//GEN-LAST:event_txtWidthFocusLost
private void txtGameDirFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtGameDirFocusLost private void txtGameDirFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtGameDirFocusLost
@@ -1061,7 +1063,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget
try { try {
String path = fc.getSelectedFile().getCanonicalPath(); String path = fc.getSelectedFile().getCanonicalPath();
txtJavaDir.setText(path); txtJavaDir.setText(path);
getProfile().setJavaDir(txtJavaDir.getText()); getProfile().getSelectedVersionSetting().setJavaDir(txtJavaDir.getText());
} catch (IOException e) { } catch (IOException e) {
HMCLog.warn("Failed to set java path.", e); HMCLog.warn("Failed to set java path.", e);
MessageBox.Show(C.i18n("ui.label.failed_set") + e.getMessage()); MessageBox.Show(C.i18n("ui.label.failed_set") + e.getMessage());
@@ -1074,9 +1076,9 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget
int idx = cboJava.getSelectedIndex(); int idx = cboJava.getSelectedIndex();
if (idx != -1) { if (idx != -1) {
Java j = Java.JAVA.get(idx); Java j = Java.JAVA.get(idx);
getProfile().setJava(j); getProfile().getSelectedVersionSetting().setJava(j);
txtJavaDir.setEnabled(idx == 1); txtJavaDir.setEnabled(idx == 1);
txtJavaDir.setText(j.getHome() == null ? getProfile().getSettingsJavaDir() : j.getJava()); txtJavaDir.setText(j.getHome() == null ? getProfile().getSelectedVersionSetting().getSettingsJavaDir() : j.getJava());
} }
}//GEN-LAST:event_cboJavaItemStateChanged }//GEN-LAST:event_cboJavaItemStateChanged
@@ -1171,7 +1173,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget
isLoading = true; isLoading = true;
cboProfiles.setSelectedIndex(index); cboProfiles.setSelectedIndex(index);
isLoading = false; isLoading = false;
prepare(getProfile()); prepareProfile(getProfile());
} }
} }
@@ -1179,15 +1181,26 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget
return Settings.getProfile((String) cboProfiles.getSelectedItem()); return Settings.getProfile((String) cboProfiles.getSelectedItem());
} }
void prepare(Profile profile) { final String mcVersion() {
return getProfile().getSelectedVersion();
}
void prepareProfile(Profile profile) {
if (profile == null) if (profile == null)
return; return;
profile.selectedVersionChangedEvent.register(this); profile.selectedVersionChangedEvent.register(this);
txtGameDir.setText(profile.getGameDir());
loadVersions();
}
void prepareVersionSetting(VersionSetting profile) {
if (profile == null)
return;
txtWidth.setText(profile.getWidth()); txtWidth.setText(profile.getWidth());
txtHeight.setText(profile.getHeight()); txtHeight.setText(profile.getHeight());
txtMaxMemory.setText(profile.getMaxMemory()); txtMaxMemory.setText(profile.getMaxMemory());
txtPermSize.setText(profile.getPermSize()); txtPermSize.setText(profile.getPermSize());
txtGameDir.setText(profile.getGameDir());
txtJavaArgs.setText(profile.getJavaArgs()); txtJavaArgs.setText(profile.getJavaArgs());
txtMinecraftArgs.setText(profile.getMinecraftArgs()); txtMinecraftArgs.setText(profile.getMinecraftArgs());
txtJavaDir.setText(profile.getSettingsJavaDir()); txtJavaDir.setText(profile.getSettingsJavaDir());
@@ -1204,8 +1217,6 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget
cboJava.setSelectedIndex(profile.getJavaIndexInAllJavas()); cboJava.setSelectedIndex(profile.getJavaIndexInAllJavas());
isLoading = false; isLoading = false;
cboJavaItemStateChanged(new ItemEvent(cboJava, 0, cboJava.getSelectedItem(), ItemEvent.SELECTED)); cboJavaItemStateChanged(new ItemEvent(cboJava, 0, cboJava.getSelectedItem(), ItemEvent.SELECTED));
loadVersions();
} }
void loadVersions() { void loadVersions() {
@@ -1224,11 +1235,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget
cboVersions.setSelectedIndex(index); cboVersions.setSelectedIndex(index);
reloadMods(); reloadMods();
prepareVersionSetting(((DefaultMinecraftService) getProfile().service()).getVersionSetting(getProfile().getSelectedVersion()));
loadMinecraftVersion();
}
void loadMinecraftVersion() {
loadMinecraftVersion(getProfile().getSelectedVersion()); loadMinecraftVersion(getProfile().getSelectedVersion());
} }
@@ -1309,6 +1316,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget
// </editor-fold> // </editor-fold>
public void versionChanged(String version) { public void versionChanged(String version) {
this.mcVersion = version; this.mcVersion = version;
prepareVersionSetting(getProfile().getVersionSetting(version));
for (InstallerPanel p : installerPanels) for (InstallerPanel p : installerPanels)
p.loadVersions(); p.loadVersions();
} }

View File

@@ -319,10 +319,10 @@ public class MainPagePanel extends AnimatedPanel implements Event<String> {
}//GEN-LAST:event_cboProfilesItemStateChanged }//GEN-LAST:event_cboProfilesItemStateChanged
private void cboVersionsItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboVersionsItemStateChanged private void cboVersionsItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboVersionsItemStateChanged
if (isLoading || evt.getStateChange() != ItemEvent.SELECTED || cboVersions.getSelectedIndex() < 0 || StrUtils.isBlank((String) cboVersions.getSelectedItem()) || getCurrentProfile() == null) if (isLoading || evt.getStateChange() != ItemEvent.SELECTED || cboVersions.getSelectedIndex() < 0 || StrUtils.isBlank((String) cboVersions.getSelectedItem()) || getProfile() == null)
return; return;
String mcv = (String) cboVersions.getSelectedItem(); String mcv = (String) cboVersions.getSelectedItem();
getCurrentProfile().setSelectedMinecraftVersion(mcv); getProfile().setSelectedMinecraftVersion(mcv);
}//GEN-LAST:event_cboVersionsItemStateChanged }//GEN-LAST:event_cboVersionsItemStateChanged
@Override @Override
@@ -379,18 +379,18 @@ public class MainPagePanel extends AnimatedPanel implements Event<String> {
// <editor-fold defaultstate="collapsed" desc="Game Launch"> // <editor-fold defaultstate="collapsed" desc="Game Launch">
void genLaunchCode(final Consumer<GameLauncher> listener) { void genLaunchCode(final Consumer<GameLauncher> listener) {
if (isLaunching || getCurrentProfile() == null) if (isLaunching || getProfile() == null)
return; return;
isLaunching = true; isLaunching = true;
HMCLog.log("Start generating launching command..."); HMCLog.log("Start generating launching command...");
File file = getCurrentProfile().getCanonicalGameDirFile(); File file = getProfile().getCanonicalGameDirFile();
if (!file.exists()) { if (!file.exists()) {
HMCLog.warn("The minecraft path is wrong, please check it yourself."); HMCLog.warn("The minecraft path is wrong, please check it yourself.");
MessageBox.ShowLocalized("minecraft.wrong_path"); MessageBox.ShowLocalized("minecraft.wrong_path");
return; return;
} }
final String name = (String) cboProfiles.getSelectedItem(); final String name = (String) cboProfiles.getSelectedItem();
if (StrUtils.isBlank(name) || getCurrentProfile().getSelectedVersion() == null) { if (StrUtils.isBlank(name) || getProfile().getSelectedVersion() == null) {
HMCLog.warn("There's no selected version, rechoose a version."); HMCLog.warn("There's no selected version, rechoose a version.");
MessageBox.ShowLocalized("minecraft.no_selected_version"); MessageBox.ShowLocalized("minecraft.no_selected_version");
return; return;
@@ -408,8 +408,8 @@ public class MainPagePanel extends AnimatedPanel implements Event<String> {
@Override @Override
public void run() { public void run() {
Thread.currentThread().setName("Game Launcher"); Thread.currentThread().setName("Game Launcher");
DefaultGameLauncher gl = new DefaultGameLauncher(getCurrentProfile().createLaunchOptions(), getCurrentProfile().service(), li, l); DefaultGameLauncher gl = new DefaultGameLauncher(getProfile().getSelectedVersionSetting().createLaunchOptions(getProfile().getCanonicalGameDirFile()), getProfile().service(), li, l);
gl.setTag(getCurrentProfile().getLauncherVisibility()); gl.setTag(getProfile().getSelectedVersionSetting().getLauncherVisibility());
gl.successEvent.register((sender, s) -> { gl.successEvent.register((sender, s) -> {
isLaunching = false; isLaunching = false;
return true; return true;
@@ -478,10 +478,10 @@ public class MainPagePanel extends AnimatedPanel implements Event<String> {
isLoading = true; isLoading = true;
cboVersions.removeAllItems(); cboVersions.removeAllItems();
int index = 0, i = 0; int index = 0, i = 0;
getCurrentProfile().selectedVersionChangedEvent.register(this); getProfile().selectedVersionChangedEvent.register(this);
getCurrentProfile().service().version().refreshVersions(); getProfile().service().version().refreshVersions();
String selVersion = getCurrentProfile().getSelectedVersion(); String selVersion = getProfile().getSelectedVersion();
if (getCurrentProfile().service().version().getVersions().isEmpty()) { if (getProfile().service().version().getVersions().isEmpty()) {
if (!showedNoVersion) if (!showedNoVersion)
SwingUtilities.invokeLater(() -> { SwingUtilities.invokeLater(() -> {
if (MessageBox.Show(C.i18n("mainwindow.no_version"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) { if (MessageBox.Show(C.i18n("mainwindow.no_version"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) {
@@ -491,7 +491,7 @@ public class MainPagePanel extends AnimatedPanel implements Event<String> {
showedNoVersion = true; showedNoVersion = true;
}); });
} else { } else {
for (MinecraftVersion mcVersion : getCurrentProfile().service().version().getVersions()) { for (MinecraftVersion mcVersion : getProfile().service().version().getVersions()) {
if (mcVersion.hidden) if (mcVersion.hidden)
continue; continue;
cboVersions.addItem(mcVersion.id); cboVersions.addItem(mcVersion.id);
@@ -628,7 +628,7 @@ public class MainPagePanel extends AnimatedPanel implements Event<String> {
} }
public Profile getCurrentProfile() { public Profile getProfile() {
return Settings.getProfile((String) cboProfiles.getSelectedItem()); return Settings.getProfile((String) cboProfiles.getSelectedItem());
} }

View File

@@ -46,11 +46,13 @@ public abstract class OverridableSwingWorker<T> extends SwingWorker<Void, T> {
} }
public OverridableSwingWorker reg(Consumer<T> c) { public OverridableSwingWorker reg(Consumer<T> c) {
Utils.requireNonNull(c);
processListeners.add(c); processListeners.add(c);
return this; return this;
} }
public OverridableSwingWorker regDone(Runnable c) { public OverridableSwingWorker regDone(Runnable c) {
Utils.requireNonNull(c);
doneListeners.add(c); doneListeners.add(c);
return this; return this;
} }

View File

@@ -40,7 +40,7 @@ public final class UpdateChecker implements IUpdateChecker {
VersionNumber value; VersionNumber value;
@Override @Override
public OverridableSwingWorker<VersionNumber> process(boolean showMessage) { public OverridableSwingWorker<VersionNumber> process(final boolean showMessage) {
return new OverridableSwingWorker() { return new OverridableSwingWorker() {
@Override @Override
protected void work() throws Exception { protected void work() throws Exception {

View File

@@ -87,11 +87,11 @@ public abstract class Task {
public abstract String getInfo(); public abstract String getInfo();
public Collection<Task> getDependTasks() { public Collection<? extends Task> getDependTasks() {
return null; return null;
} }
public Collection<Task> getAfterTasks() { public Collection<? extends Task> getAfterTasks() {
return null; return null;
} }

View File

@@ -79,15 +79,15 @@ public class TaskList extends Thread {
public void run() { public void run() {
executeTask(task); executeTask(task);
s.remove(this); s.remove(this);
threadPool.remove(this); THREAD_POOL.remove(this);
} }
} }
static final Set<InvokeThread> threadPool = Collections.synchronizedSet(new HashSet<InvokeThread>()); static final Set<InvokeThread> THREAD_POOL = Collections.synchronizedSet(new HashSet<InvokeThread>());
static final Set<Task> taskPool = Collections.synchronizedSet(new HashSet<Task>()); static final Set<Task> TASK_POOL = Collections.synchronizedSet(new HashSet<Task>());
private void processTasks(Collection<Task> c) { private void processTasks(Collection<? extends Task> c) {
if (c == null) if (c == null)
return; return;
this.totTask += c.size(); this.totTask += c.size();
@@ -95,7 +95,7 @@ public class TaskList extends Thread {
for (Task t2 : c) { for (Task t2 : c) {
t2.setParallelExecuting(true); t2.setParallelExecuting(true);
InvokeThread thread = new InvokeThread(t2, runningThread); InvokeThread thread = new InvokeThread(t2, runningThread);
threadPool.add(thread); THREAD_POOL.add(thread);
runningThread.add(thread); runningThread.add(thread);
thread.start(); thread.start();
} }
@@ -147,7 +147,7 @@ public class TaskList extends Thread {
public void run() { public void run() {
Thread.currentThread().setName("TaskList"); Thread.currentThread().setName("TaskList");
threadPool.clear(); THREAD_POOL.clear();
totTask = taskQueue.size(); totTask = taskQueue.size();
while (!taskQueue.isEmpty()) while (!taskQueue.isEmpty())
executeTask(taskQueue.remove(0)); executeTask(taskQueue.remove(0));
@@ -162,12 +162,12 @@ public class TaskList extends Thread {
public void abort() { public void abort() {
shouldContinue = false; shouldContinue = false;
while (!threadPool.isEmpty()) while (!THREAD_POOL.isEmpty())
synchronized (threadPool) { synchronized (THREAD_POOL) {
InvokeThread it = threadPool.iterator().next(); InvokeThread it = THREAD_POOL.iterator().next();
if (!it.task.abort()) if (!it.task.abort())
it.interrupt(); it.interrupt();
threadPool.remove(it); THREAD_POOL.remove(it);
} }
this.interrupt(); this.interrupt();
} }

View File

@@ -199,7 +199,9 @@ public class NavButtonManager implements ActionListener {
final boolean enableNext = nextStep != null && canContinue && problem == null && !isDeferredResult; final boolean enableNext = nextStep != null && canContinue && problem == null && !isDeferredResult;
final boolean enablePrevious = wizard.getPreviousStep() != null && !isDeferredResult; final boolean enablePrevious = wizard.getPreviousStep() != null && !isDeferredResult;
final Runnable runnable = () -> { final Runnable runnable = new Runnable() {
@Override
public void run() {
next.setEnabled(enableNext); next.setEnabled(enableNext);
prev.setEnabled(enablePrevious); prev.setEnabled(enablePrevious);
finish.setEnabled(enableFinish); finish.setEnabled(enableFinish);
@@ -213,6 +215,7 @@ public class NavButtonManager implements ActionListener {
root.setDefaultButton(prev); root.setDefaultButton(prev);
else else
root.setDefaultButton(null); root.setDefaultButton(null);
}
}; };
if (EventQueue.isDispatchThread()) if (EventQueue.isDispatchThread())
@@ -263,7 +266,9 @@ public class NavButtonManager implements ActionListener {
} }
void deferredResultFailed(final boolean canGoBack) { void deferredResultFailed(final boolean canGoBack) {
final Runnable runnable = () -> { final Runnable runnable = new Runnable() {
@Override
public void run() {
if (!canGoBack) if (!canGoBack)
getCancel().setText(getCloseString()); getCancel().setText(getCloseString());
getPrev().setEnabled(true); getPrev().setEnabled(true);
@@ -275,6 +280,7 @@ public class NavButtonManager implements ActionListener {
// no action // no action
} else } else
deferredStatus = DEFERRED_FAILED + deferredStatus; deferredStatus = DEFERRED_FAILED + deferredStatus;
}
}; };
if (EventQueue.isDispatchThread()) if (EventQueue.isDispatchThread())
runnable.run(); runnable.run();
@@ -596,7 +602,9 @@ public class NavButtonManager implements ActionListener {
} }
public void navigabilityChanged(final Wizard wizard) { public void navigabilityChanged(final Wizard wizard) {
final Runnable runnable = () -> { final Runnable runnable = new Runnable() {
@Override
public void run() {
if (wizard.isBusy()) { if (wizard.isBusy()) {
next.setEnabled(false); next.setEnabled(false);
prev.setEnabled(false); prev.setEnabled(false);
@@ -612,6 +620,7 @@ public class NavButtonManager implements ActionListener {
configureNavigationButtons(wizard, prev, next, finish); configureNavigationButtons(wizard, prev, next, finish);
parent.updateProblem(); parent.updateProblem();
}
}; };
if (EventQueue.isDispatchThread()) if (EventQueue.isDispatchThread())
runnable.run(); runnable.run();

View File

@@ -29,7 +29,6 @@ import java.awt.IllegalComponentStateException;
import java.awt.Insets; import java.awt.Insets;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.IOException; import java.io.IOException;
import java.net.URL;
import java.util.Locale; import java.util.Locale;
import java.util.Arrays; import java.util.Arrays;
import javax.accessibility.Accessible; import javax.accessibility.Accessible;
@@ -119,34 +118,6 @@ public class InstructionsPanelImpl extends JComponent implements WizardObserver,
} }
public InstructionsPanelImpl(BufferedImage img, Wizard wizard) { public InstructionsPanelImpl(BufferedImage img, Wizard wizard) {
if (img == null)
//In the event of classloader issues, also have a way to get
//the image from UIManager - slightly more portable for large
//apps
img = (BufferedImage) UIManager.get("wizard.sidebar.image");
String imgStr = System.getProperty("wizard.sidebar.image");
//image has not been loaded and user wishes to supply their own image
if (img == null && imgStr != null) {
//get an URL, works for jars
ClassLoader cl = this.getClass().getClassLoader();
URL url = cl.getResource(imgStr);
//successfully parsed the URL
if (url != null)
try {
img = ImageIO.read(url);
} catch (IOException ioe) {
System.err.println("Could not load wizard image "
+ ioe.getMessage());
System.setProperty("wizard.sidebar.image", null);
img = null; //error loading img, set to null to use default
}
else { //URL was not successfully parsed, set img to null to use default
System.err.println("Bad URL for wizard image " + imgStr);
System.setProperty("wizard.sidebar.image", null);
img = null;
}
}
if (img == null) if (img == null)
try { try {
img = ImageIO.read(InstructionsPanelImpl.class.getResourceAsStream( img = ImageIO.read(InstructionsPanelImpl.class.getResourceAsStream(

View File

View File

View File

@@ -198,9 +198,10 @@ settings.cannot_remove_default_config=\u4e0d\u80fd\u5220\u9664\u9ed8\u8ba4\u914d
settings.max_memory=\u6700\u5927\u5185\u5b58/MB settings.max_memory=\u6700\u5927\u5185\u5b58/MB
settings.java_dir=Java\u8def\u5f84 settings.java_dir=Java\u8def\u5f84
settings.game_directory=\u6e38\u620f\u8def\u5f84 settings.game_directory=\u6e38\u620f\u8def\u5f84
settings.dimension=\u5206\u8fa8\u7387 settings.dimension=\u6e38\u620f\u7a97\u53e3\u5206\u8fa8\u7387
settings.fullscreen=\u5168\u5c4f settings.fullscreen=\u5168\u5c4f
settings.update_version=\u66f4\u65b0\u7248\u672c\u6587\u4ef6 settings.update_version=\u66f4\u65b0\u7248\u672c\u6587\u4ef6
settings.run_directory=\u8fd0\u884c\u8def\u5f84(\u7248\u672c\u9694\u79bb)
settings.physical_memory=\u7269\u7406\u5185\u5b58\u5927\u5c0f settings.physical_memory=\u7269\u7406\u5185\u5b58\u5927\u5c0f
settings.choose_javapath=\u9009\u62e9Java\u8def\u5f84 settings.choose_javapath=\u9009\u62e9Java\u8def\u5f84
settings.default=\u9ed8\u8ba4 settings.default=\u9ed8\u8ba4
@@ -237,8 +238,7 @@ mods.default_information=<html><font color=#c0392b>\u5b89\u88c5Mod\u524d\u4f60\u
advancedsettings=\u9ad8\u7ea7\u8bbe\u7f6e advancedsettings=\u9ad8\u7ea7\u8bbe\u7f6e
advancedsettings.launcher_visible=\u542f\u52a8\u5668\u53ef\u89c1\u6027 advancedsettings.launcher_visible=\u542f\u52a8\u5668\u53ef\u89c1\u6027
advancedsettings.run_directory=\u8fd0\u884c\u8def\u5f84 advancedsettings.debug_mode=\u8c03\u8bd5\u6a21\u5f0f
advencedsettings.debug_mode=\u8c03\u8bd5\u6a21\u5f0f
advancedsettings.java_permanent_generation_space=\u5185\u5b58\u6c38\u4e45\u4fdd\u5b58\u533a\u57df(\u4e0d\u5fc5\u586b\u5199,MB) advancedsettings.java_permanent_generation_space=\u5185\u5b58\u6c38\u4e45\u4fdd\u5b58\u533a\u57df(\u4e0d\u5fc5\u586b\u5199,MB)
advancedsettings.jvm_args=Java\u865a\u62df\u673a\u53c2\u6570(\u4e0d\u5fc5\u586b\u5199) advancedsettings.jvm_args=Java\u865a\u62df\u673a\u53c2\u6570(\u4e0d\u5fc5\u586b\u5199)
advancedsettings.Minecraft_arguments=Minecraft\u989d\u5916\u53c2\u6570(\u4e0d\u5fc5\u586b\u5199) advancedsettings.Minecraft_arguments=Minecraft\u989d\u5916\u53c2\u6570(\u4e0d\u5fc5\u586b\u5199)
@@ -369,3 +369,4 @@ wizard.close_mnemonic=\u5173
wizard.summary=\u6982\u8981 wizard.summary=\u6982\u8981
wizard.failed=\u5931\u8d25 wizard.failed=\u5931\u8d25
wizard.steps=\u6b65\u9aa4 wizard.steps=\u6b65\u9aa4
advancedsettings.debug_mode=\u8c03\u8bd5\u6a21\u5f0f

View File

@@ -197,10 +197,11 @@ settings.manage=Manage
settings.cannot_remove_default_config=Cannot remove the default configution. settings.cannot_remove_default_config=Cannot remove the default configution.
settings.max_memory=Max Memory/MB settings.max_memory=Max Memory/MB
settings.java_dir=Java Dir settings.java_dir=Java Dir
settings.game_directory=Game Dir settings.game_directory=Game Directory
settings.dimension=Dimension settings.dimension=Game Window Dimension
settings.fullscreen=Fullscreen settings.fullscreen=Fullscreen
settings.update_version=Update version json. settings.update_version=Update version json.
settings.run_directory=Run Directory(Version Isolation)
settings.physical_memory=Physical Memory Size settings.physical_memory=Physical Memory Size
settings.choose_javapath=Choose Java Directory. settings.choose_javapath=Choose Java Directory.
settings.default=Default settings.default=Default
@@ -237,8 +238,7 @@ mods.default_information=<html><font color=#c0392b>Please ensure that you have i
advancedsettings=Advanced advancedsettings=Advanced
advancedsettings.launcher_visible=Launcher Visibility advancedsettings.launcher_visible=Launcher Visibility
advancedsettings.run_directory=Run Directory advancedsettings.debug_mode=Debug Mode
advencedsettings.debug_mode=Debug Mode
advancedsettings.java_permanent_generation_space=Permanent Generation Space/MB advancedsettings.java_permanent_generation_space=Permanent Generation Space/MB
advancedsettings.jvm_args=Java VM Arguments advancedsettings.jvm_args=Java VM Arguments
advancedsettings.Minecraft_arguments=Minecraft Arguments advancedsettings.Minecraft_arguments=Minecraft Arguments

View File

@@ -198,9 +198,10 @@ settings.cannot_remove_default_config=\u4e0d\u80fd\u522a\u9664\u9ed8\u8a8d\u914d
settings.max_memory=\u6700\u5927\u5167\u5b58\uff08MB\uff09 settings.max_memory=\u6700\u5927\u5167\u5b58\uff08MB\uff09
settings.java_dir=Java\u8def\u5f91 settings.java_dir=Java\u8def\u5f91
settings.game_directory=\u904a\u6232\u8def\u5f91 settings.game_directory=\u904a\u6232\u8def\u5f91
settings.dimension=\u5206\u8fa8\u7387 settings.dimension=\u6e38\u620f\u7a97\u53e3\u5206\u8fa8\u7387
settings.fullscreen=\u5168\u5c4f settings.fullscreen=\u5168\u5c4f
settings.update_version=\u66f4\u65b0\u7248\u672c\u8cc7\u6599 settings.update_version=\u66f4\u65b0\u7248\u672c\u8cc7\u6599
settings.run_directory=\u904b\u884c\u8def\u5f91(\u7248\u672c\u9694\u96e2)
settings.physical_memory=\u7269\u7406\u5185\u5b58\u5927\u5c0f settings.physical_memory=\u7269\u7406\u5185\u5b58\u5927\u5c0f
settings.choose_javapath=\u9009\u62e9Java\u8def\u5f84 settings.choose_javapath=\u9009\u62e9Java\u8def\u5f84
settings.default=\u9ed8\u8a8d settings.default=\u9ed8\u8a8d
@@ -237,8 +238,7 @@ mods.default_information=<html>\u60a8\u53ef\u4ee5\u62d6\u52a8mod\u5230\u5217\u88
advancedsettings=\u9ad8\u7d1a\u8a2d\u5b9a advancedsettings=\u9ad8\u7d1a\u8a2d\u5b9a
advancedsettings.launcher_visible=\u555f\u52d5\u5668\u53ef\u898b\u6027 advancedsettings.launcher_visible=\u555f\u52d5\u5668\u53ef\u898b\u6027
advancedsettings.run_directory=\u904b\u884c\u8def\u5f91 advancedsettings.debug_mode=\u8abf\u8a66\u6a21\u5f0f
advencedsettings.debug_mode=\u8abf\u8a66\u6a21\u5f0f
advancedsettings.java_permanent_generation_space=\u5167\u5b58\u6c38\u4e45\u4fdd\u5b58\u5340\u57df/MB advancedsettings.java_permanent_generation_space=\u5167\u5b58\u6c38\u4e45\u4fdd\u5b58\u5340\u57df/MB
advancedsettings.jvm_args=Java\u865b\u64ec\u6a5f\u53c3\u6578(\u4e0d\u5fc5\u586b\u5beb) advancedsettings.jvm_args=Java\u865b\u64ec\u6a5f\u53c3\u6578(\u4e0d\u5fc5\u586b\u5beb)
advancedsettings.Minecraft_arguments=Minecraft\u984d\u5916\u53c3\u6578(\u4e0d\u5fc5\u586b\u5beb) advancedsettings.Minecraft_arguments=Minecraft\u984d\u5916\u53c3\u6578(\u4e0d\u5fc5\u586b\u5beb)

View File

@@ -198,10 +198,11 @@ settings.cannot_remove_default_config=\u4e0d\u80fd\u5220\u9664\u9ed8\u8ba4\u914d
settings.max_memory=\u6700\u5927\u5185\u5b58/MB settings.max_memory=\u6700\u5927\u5185\u5b58/MB
settings.java_dir=Java\u8def\u5f84 settings.java_dir=Java\u8def\u5f84
settings.game_directory=\u6e38\u620f\u8def\u5f84 settings.game_directory=\u6e38\u620f\u8def\u5f84
settings.dimension=\u5206\u8fa8\u7387 settings.dimension=\u6e38\u620f\u7a97\u53e3\u5206\u8fa8\u7387
settings.fullscreen=\u5168\u5c4f settings.fullscreen=\u5168\u5c4f
settings.update_version=\u66f4\u65b0\u7248\u672c\u6587\u4ef6 settings.update_version=\u66f4\u65b0\u7248\u672c\u6587\u4ef6
settings.physical_memory=\u7269\u7406\u5185\u5b58\u5927\u5c0f settings.physical_memory=\u7269\u7406\u5185\u5b58\u5927\u5c0f
settings.run_directory=\u8fd0\u884c\u8def\u5f84(\u7248\u672c\u9694\u79bb)
settings.choose_javapath=\u9009\u62e9Java\u8def\u5f84 settings.choose_javapath=\u9009\u62e9Java\u8def\u5f84
settings.default=\u9ed8\u8ba4 settings.default=\u9ed8\u8ba4
settings.custom=\u81ea\u5b9a\u4e49 settings.custom=\u81ea\u5b9a\u4e49
@@ -237,8 +238,7 @@ mods.default_information=<html><font color=#c0392b>\u5b89\u88c5Mod\u524d\u4f60\u
advancedsettings=\u9ad8\u7ea7\u8bbe\u7f6e advancedsettings=\u9ad8\u7ea7\u8bbe\u7f6e
advancedsettings.launcher_visible=\u542f\u52a8\u5668\u53ef\u89c1\u6027 advancedsettings.launcher_visible=\u542f\u52a8\u5668\u53ef\u89c1\u6027
advancedsettings.run_directory=\u8fd0\u884c\u8def\u5f84 advancedsettings.debug_mode=\u8c03\u8bd5\u6a21\u5f0f
advencedsettings.debug_mode=\u8c03\u8bd5\u6a21\u5f0f
advancedsettings.java_permanent_generation_space=\u5185\u5b58\u6c38\u4e45\u4fdd\u5b58\u533a\u57df(\u4e0d\u5fc5\u586b\u5199,MB) advancedsettings.java_permanent_generation_space=\u5185\u5b58\u6c38\u4e45\u4fdd\u5b58\u533a\u57df(\u4e0d\u5fc5\u586b\u5199,MB)
advancedsettings.jvm_args=Java\u865a\u62df\u673a\u53c2\u6570(\u4e0d\u5fc5\u586b\u5199) advancedsettings.jvm_args=Java\u865a\u62df\u673a\u53c2\u6570(\u4e0d\u5fc5\u586b\u5199)
advancedsettings.Minecraft_arguments=Minecraft\u989d\u5916\u53c2\u6570(\u4e0d\u5fc5\u586b\u5199) advancedsettings.Minecraft_arguments=Minecraft\u989d\u5916\u53c2\u6570(\u4e0d\u5fc5\u586b\u5199)