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
public OverridableSwingWorker<String[]> getList(MinecraftVersion mv, IMinecraftAssetService mp) {
public OverridableSwingWorker<String[]> getList(final MinecraftVersion mv, final IMinecraftAssetService mp) {
return new OverridableSwingWorker<String[]>() {
@Override
protected void work() throws Exception {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

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);
if (checkThrowable(e) && !System.getProperty("java.vm.name").contains("OpenJDK")) {
SwingUtilities.invokeLater(() -> LogWindow.INSTANCE.showAsCrashWindow(Settings.UPDATE_CHECKER.OUT_DATED));
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
LogWindow.INSTANCE.showAsCrashWindow(Settings.UPDATE_CHECKER.OUT_DATED);
}
});
if (!Settings.UPDATE_CHECKER.OUT_DATED)
reportToServer(text, s);
}
@ -127,20 +132,23 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler {
private static final HashSet<String> THROWABLE_SET = new HashSet<>();
void reportToServer(String text, String stacktrace) {
void reportToServer(final String text, String stacktrace) {
if (THROWABLE_SET.contains(stacktrace))
return;
THROWABLE_SET.add(stacktrace);
new Thread(() -> {
HashMap<String, String> map = new HashMap<>();
map.put("CrashReport", text);
try {
System.out.println(NetUtils.post(NetUtils.constantURL("http://huangyuhui.duapp.com/crash.php"), map));
} catch (IOException ex) {
System.out.println("Failed to send post request to HMCL server.");
ex.printStackTrace();
new Thread() {
@Override
public void run() {
HashMap<String, String> map = new HashMap<>();
map.put("CrashReport", text);
try {
System.out.println(NetUtils.post(NetUtils.constantURL("http://huangyuhui.duapp.com/crash.php"), map));
} catch (IOException ex) {
System.out.println("Failed to send post request to HMCL server.");
ex.printStackTrace();
}
}
}).start();
}.start();
}
}

View File

@ -45,6 +45,7 @@ import org.jackhuang.hellominecraft.utils.MessageBox;
import org.jackhuang.hellominecraft.utils.UpdateChecker;
import org.jackhuang.hellominecraft.utils.Utils;
import org.jackhuang.hellominecraft.utils.VersionNumber;
import org.jackhuang.hellominecraft.utils.functions.Consumer;
import org.jackhuang.hellominecraft.utils.system.FileUtils;
import org.jackhuang.hellominecraft.utils.system.IOUtils;
import org.jackhuang.hellominecraft.utils.system.OS;
@ -89,34 +90,37 @@ public class AppDataUpgrader extends IUpgrader {
}
@Override
public boolean call(Object sender, VersionNumber number) {
((UpdateChecker) sender).requestDownloadLink().reg(map -> {
if (map != null && map.containsKey("pack"))
try {
if (TaskWindow.getInstance().addTask(new AppDataUpgraderTask(map.get("pack"), number.version)).start()) {
new ProcessBuilder(new String[] { IOUtils.getJavaDir(), "-jar", AppDataUpgraderTask.getSelf(number.version).getAbsolutePath() }).directory(new File(".")).start();
System.exit(0);
public boolean call(Object sender, final VersionNumber number) {
((UpdateChecker) sender).requestDownloadLink().reg(new Consumer<Map<String, String>>() {
@Override
public void accept(Map<String, String> map) {
if (map != null && map.containsKey("pack"))
try {
if (TaskWindow.getInstance().addTask(new AppDataUpgraderTask(map.get("pack"), number.version)).start()) {
new ProcessBuilder(new String[] { IOUtils.getJavaDir(), "-jar", AppDataUpgraderTask.getSelf(number.version).getAbsolutePath() }).directory(new File(".")).start();
System.exit(0);
}
} catch (IOException ex) {
HMCLog.err("Failed to create upgrader", ex);
}
if (MessageBox.Show(C.i18n("update.newest_version") + number.firstVer + "." + number.secondVer + "." + number.thirdVer + "\n"
+ C.i18n("update.should_open_link"),
MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) {
String url = C.URL_PUBLISH;
if (map != null)
if (map.containsKey(OS.os().checked_name))
url = map.get(OS.os().checked_name);
else if (map.containsKey(OS.UNKOWN.checked_name))
url = map.get(OS.UNKOWN.checked_name);
if (url == null)
url = C.URL_PUBLISH;
try {
java.awt.Desktop.getDesktop().browse(new URI(url));
} catch (URISyntaxException | IOException e) {
HMCLog.warn("Failed to browse uri: " + url, e);
Utils.setClipborad(url);
MessageBox.Show(C.i18n("update.no_browser"));
}
} catch (IOException ex) {
HMCLog.err("Failed to create upgrader", ex);
}
if (MessageBox.Show(C.i18n("update.newest_version") + number.firstVer + "." + number.secondVer + "." + number.thirdVer + "\n"
+ C.i18n("update.should_open_link"),
MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) {
String url = C.URL_PUBLISH;
if (map != null)
if (map.containsKey(OS.os().checked_name))
url = map.get(OS.os().checked_name);
else if (map.containsKey(OS.UNKOWN.checked_name))
url = map.get(OS.UNKOWN.checked_name);
if (url == null)
url = C.URL_PUBLISH;
try {
java.awt.Desktop.getDesktop().browse(new URI(url));
} catch (URISyntaxException | IOException e) {
HMCLog.warn("Failed to browse uri: " + url, e);
Utils.setClipborad(url);
MessageBox.Show(C.i18n("update.no_browser"));
}
}
}).execute();
@ -142,7 +146,7 @@ public class AppDataUpgrader extends IUpgrader {
}
@Override
public Collection<Task> getDependTasks() {
public Collection<? extends Task> getDependTasks() {
return Arrays.asList(new FileDownloadTask(downloadLink, tempFile));
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -199,20 +199,23 @@ public class NavButtonManager implements ActionListener {
final boolean enableNext = nextStep != null && canContinue && problem == null && !isDeferredResult;
final boolean enablePrevious = wizard.getPreviousStep() != null && !isDeferredResult;
final Runnable runnable = () -> {
next.setEnabled(enableNext);
prev.setEnabled(enablePrevious);
finish.setEnabled(enableFinish);
JRootPane root = next.getRootPane();
if (root != null)
if (next.isEnabled())
root.setDefaultButton(next);
else if (finish.isEnabled())
root.setDefaultButton(finish);
else if (prev.isEnabled())
root.setDefaultButton(prev);
else
root.setDefaultButton(null);
final Runnable runnable = new Runnable() {
@Override
public void run() {
next.setEnabled(enableNext);
prev.setEnabled(enablePrevious);
finish.setEnabled(enableFinish);
JRootPane root = next.getRootPane();
if (root != null)
if (next.isEnabled())
root.setDefaultButton(next);
else if (finish.isEnabled())
root.setDefaultButton(finish);
else if (prev.isEnabled())
root.setDefaultButton(prev);
else
root.setDefaultButton(null);
}
};
if (EventQueue.isDispatchThread())
@ -263,18 +266,21 @@ public class NavButtonManager implements ActionListener {
}
void deferredResultFailed(final boolean canGoBack) {
final Runnable runnable = () -> {
if (!canGoBack)
getCancel().setText(getCloseString());
getPrev().setEnabled(true);
getNext().setEnabled(false);
getCancel().setEnabled(true);
getFinish().setEnabled(false);
final Runnable runnable = new Runnable() {
@Override
public void run() {
if (!canGoBack)
getCancel().setText(getCloseString());
getPrev().setEnabled(true);
getNext().setEnabled(false);
getCancel().setEnabled(true);
getFinish().setEnabled(false);
if (NAME_CLOSE.equals(deferredStatus)) {
// no action
} else
deferredStatus = DEFERRED_FAILED + deferredStatus;
if (NAME_CLOSE.equals(deferredStatus)) {
// no action
} else
deferredStatus = DEFERRED_FAILED + deferredStatus;
}
};
if (EventQueue.isDispatchThread())
runnable.run();
@ -596,22 +602,25 @@ public class NavButtonManager implements ActionListener {
}
public void navigabilityChanged(final Wizard wizard) {
final Runnable runnable = () -> {
if (wizard.isBusy()) {
next.setEnabled(false);
prev.setEnabled(false);
finish.setEnabled(false);
cancel.setEnabled(false);
parent.getOuterPanel().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
wasBusy = true;
return;
} else if (wasBusy) {
cancel.setEnabled(true);
parent.getOuterPanel().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
configureNavigationButtons(wizard, prev, next, finish);
final Runnable runnable = new Runnable() {
@Override
public void run() {
if (wizard.isBusy()) {
next.setEnabled(false);
prev.setEnabled(false);
finish.setEnabled(false);
cancel.setEnabled(false);
parent.getOuterPanel().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
wasBusy = true;
return;
} else if (wasBusy) {
cancel.setEnabled(true);
parent.getOuterPanel().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
configureNavigationButtons(wizard, prev, next, finish);
parent.updateProblem();
parent.updateProblem();
}
};
if (EventQueue.isDispatchThread())
runnable.run();

View File

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

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.java_dir=Java\u8def\u5f84
settings.game_directory=\u6e38\u620f\u8def\u5f84
settings.dimension=\u5206\u8fa8\u7387
settings.dimension=\u6e38\u620f\u7a97\u53e3\u5206\u8fa8\u7387
settings.fullscreen=\u5168\u5c4f
settings.update_version=\u66f4\u65b0\u7248\u672c\u6587\u4ef6
settings.run_directory=\u8fd0\u884c\u8def\u5f84(\u7248\u672c\u9694\u79bb)
settings.physical_memory=\u7269\u7406\u5185\u5b58\u5927\u5c0f
settings.choose_javapath=\u9009\u62e9Java\u8def\u5f84
settings.default=\u9ed8\u8ba4
@ -237,8 +238,7 @@ mods.default_information=<html><font color=#c0392b>\u5b89\u88c5Mod\u524d\u4f60\u
advancedsettings=\u9ad8\u7ea7\u8bbe\u7f6e
advancedsettings.launcher_visible=\u542f\u52a8\u5668\u53ef\u89c1\u6027
advancedsettings.run_directory=\u8fd0\u884c\u8def\u5f84
advencedsettings.debug_mode=\u8c03\u8bd5\u6a21\u5f0f
advancedsettings.debug_mode=\u8c03\u8bd5\u6a21\u5f0f
advancedsettings.java_permanent_generation_space=\u5185\u5b58\u6c38\u4e45\u4fdd\u5b58\u533a\u57df(\u4e0d\u5fc5\u586b\u5199,MB)
advancedsettings.jvm_args=Java\u865a\u62df\u673a\u53c2\u6570(\u4e0d\u5fc5\u586b\u5199)
advancedsettings.Minecraft_arguments=Minecraft\u989d\u5916\u53c2\u6570(\u4e0d\u5fc5\u586b\u5199)
@ -368,4 +368,5 @@ wizard.close=\u5173\u95ed
wizard.close_mnemonic=\u5173
wizard.summary=\u6982\u8981
wizard.failed=\u5931\u8d25
wizard.steps=\u6b65\u9aa4
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.max_memory=Max Memory/MB
settings.java_dir=Java Dir
settings.game_directory=Game Dir
settings.dimension=Dimension
settings.game_directory=Game Directory
settings.dimension=Game Window Dimension
settings.fullscreen=Fullscreen
settings.update_version=Update version json.
settings.run_directory=Run Directory(Version Isolation)
settings.physical_memory=Physical Memory Size
settings.choose_javapath=Choose Java Directory.
settings.default=Default
@ -237,8 +238,7 @@ mods.default_information=<html><font color=#c0392b>Please ensure that you have i
advancedsettings=Advanced
advancedsettings.launcher_visible=Launcher Visibility
advancedsettings.run_directory=Run Directory
advencedsettings.debug_mode=Debug Mode
advancedsettings.debug_mode=Debug Mode
advancedsettings.java_permanent_generation_space=Permanent Generation Space/MB
advancedsettings.jvm_args=Java VM Arguments
advancedsettings.Minecraft_arguments=Minecraft Arguments

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

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