diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameLauncher.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameLauncher.java index 4da995ccf..2584c32a7 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameLauncher.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameLauncher.java @@ -73,8 +73,10 @@ public class GameLauncher { public IMinecraftLoader makeLaunchCommand() { IMinecraftLoader loader; try { - if (info != null) result = login.login(info); - else result = login.loginBySettings(); + if (info != null) + result = login.login(info); + else + result = login.loginBySettings(); } catch (Exception e) { HMCLog.err("An exception has thrown when logging in.", e); result = new UserProfileProvider(); @@ -102,7 +104,8 @@ public class GameLauncher { } File file = provider.getDecompressNativesToLocation(); - if (file != null) FileUtils.cleanDirectoryQuietly(file); + if (file != null) + FileUtils.cleanDirectoryQuietly(file); if (!downloadLibrariesEvent.execute(provider.getDownloadLibraries(downloadType))) { failEvent.execute(C.i18n("launch.failed")); @@ -135,8 +138,10 @@ public class GameLauncher { } HMCLog.log("Starting process"); ProcessBuilder builder = new ProcessBuilder(str); + if (get == null || get.getSelectedMinecraftVersion() == null || StrUtils.isBlank(get.getCanonicalGameDir())) + throw new NullPointerException("Fucking bug!"); builder.directory(provider.getRunDirectory(get.getSelectedMinecraftVersion().id)) - .environment().put("APPDATA", get.getCanonicalGameDirFile().getPath()); + .environment().put("APPDATA", get.getCanonicalGameDir()); JavaProcess jp = new JavaProcess(str, builder.start(), PROCESS_MANAGER); launchEvent.execute(jp); } catch (IOException e) { @@ -157,7 +162,8 @@ public class GameLauncher { provider.onLaunch(); boolean isWin = OS.os() == OS.WINDOWS; File f = new File(launcherName + (isWin ? ".bat" : ".sh")); - if (!f.exists()) f.createNewFile(); + if (!f.exists()) + f.createNewFile(); BufferedWriter writer; try { writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), System.getProperty("sun.jnu.encoding", "UTF-8"))); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Config.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Config.java index 9114db143..8f4abd704 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Config.java @@ -155,7 +155,10 @@ public final class Config { } public DownloadType getDownloadSource() { - if (downloadtype >= DownloadType.values().length || downloadtype < 0) return null; + if (downloadtype >= DownloadType.values().length || downloadtype < 0) { + downloadtype = 0; + Settings.save(); + } return DownloadType.values()[downloadtype]; } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/CrashReporter.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/CrashReporter.java index 0b6cc2aee..7dcaff74d 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/CrashReporter.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/CrashReporter.java @@ -57,9 +57,10 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { try { MessageBox.Show(C.i18n("crash.headless")); } catch (Throwable t) { + t.printStackTrace(); } return false; - } else if(s.contains("java.lang.NoClassDefFoundError")) { + } else if(s.contains("java.lang.NoClassDefFoundError") || s.contains("java.lang.IncompatibleClassChangeError") || s.contains("java.lang.ClassFormatError")) { System.out.println(C.i18n("crash.NoClassDefFound")); try { MessageBox.Show(C.i18n("crash.NoClassDefFound")); @@ -67,6 +68,9 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { t.printStackTrace(); } return false; + } else if(s.contains("java.lang.OutOfMemoryError")) { + System.out.println("FUCKING MEMORY LIMIT!"); + return false; } return true; } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/MCUtils.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/MCUtils.java index f338d3e44..b642c5dbe 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/MCUtils.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/MCUtils.java @@ -22,6 +22,7 @@ import java.io.File; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; +import org.jackhuang.hellominecraft.C; import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.launcher.utils.assets.AssetsIndex; import org.jackhuang.hellominecraft.launcher.utils.assets.AssetsObject; @@ -242,7 +243,13 @@ public final class MCUtils { .addTask(new FileDownloadTask(vurl + id + ".json", IOUtils.tryGetCanonicalFile(mvt)).setTag(id + ".json")) .addTask(new FileDownloadTask(vurl + id + ".jar", IOUtils.tryGetCanonicalFile(mvj)).setTag(id + ".jar")) .start()) { - MinecraftVersion mv = new Gson().fromJson(FileUtils.readFileToStringQuietly(mvt), MinecraftVersion.class); + MinecraftVersion mv; + try { + mv = C.gson.fromJson(FileUtils.readFileToStringQuietly(mvt), MinecraftVersion.class); + } catch(JsonSyntaxException ex) { + HMCLog.err("Failed to parse minecraft version json.", ex); + mv = null; + } return mv; } return null; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/YggdrasilAuthenticator.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/YggdrasilAuthenticator.java index 6a7fcfd11..978bd9d13 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/YggdrasilAuthenticator.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/YggdrasilAuthenticator.java @@ -25,7 +25,7 @@ import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.utils.ArrayUtils; import org.jackhuang.hellominecraft.views.Selector; import org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.GameProfile; -import org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.properties.PropertyMap; +import org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.PropertyMap; import org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.YggdrasilAuthentication; import org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.UUIDTypeAdapter; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/request/AuthenticationRequest.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/AuthenticationRequest.java similarity index 84% rename from HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/request/AuthenticationRequest.java rename to HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/AuthenticationRequest.java index 92071e0de..f5f662dff 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/request/AuthenticationRequest.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/AuthenticationRequest.java @@ -1,13 +1,11 @@ -package org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.request; +package org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil; import java.util.HashMap; public class AuthenticationRequest { public HashMap agent; - public String username; - public String password; - public String clientToken; + public String username, password, clientToken; public boolean requestUser = true; public AuthenticationRequest(String username, String password, String clientToken) { diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/GameProfile.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/GameProfile.java index 15f313a02..d6012d52f 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/GameProfile.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/GameProfile.java @@ -8,7 +8,6 @@ import com.google.gson.JsonParseException; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import java.lang.reflect.Type; -import org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.properties.PropertyMap; import java.util.UUID; import org.jackhuang.hellominecraft.utils.StrUtils; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/Property.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/Property.java new file mode 100644 index 000000000..41b3f628c --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/Property.java @@ -0,0 +1,11 @@ +package org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil; + +public class Property { + + public final String name, value; + + public Property(String name, String value) { + this.name = name; + this.value = value; + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/properties/PropertyMap.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/PropertyMap.java similarity index 84% rename from HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/properties/PropertyMap.java rename to HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/PropertyMap.java index e4d449f67..9fb073747 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/properties/PropertyMap.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/PropertyMap.java @@ -1,4 +1,4 @@ -package org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.properties; +package org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil; import com.google.gson.JsonArray; import com.google.gson.JsonDeserializationContext; @@ -24,7 +24,6 @@ public class PropertyMap extends HashMap { Map property = new HashMap<>(); property.put("name", profileProperty.name); property.put("value", profileProperty.value); - property.put("signature", profileProperty.signature); properties.add(property); } return properties; @@ -35,9 +34,6 @@ public class PropertyMap extends HashMap { for (Map propertyMap : list) { String name = propertyMap.get("name"); String value = propertyMap.get("value"); - String signature = propertyMap.get("signature"); - - put(name, new Property(name, value, signature)); } } catch (Throwable t) { HMCLog.warn("Failed to deserialize properties", t); @@ -53,7 +49,7 @@ public class PropertyMap extends HashMap { JsonObject object = (JsonObject) json; for (Map.Entry entry : object.entrySet()) - if ((entry.getValue() instanceof JsonArray)) + if (entry.getValue() instanceof JsonArray) for (JsonElement element : (JsonArray) entry.getValue()) result.put(entry.getKey(), new Property((String) entry.getKey(), element.getAsString())); @@ -63,11 +59,6 @@ public class PropertyMap extends HashMap { JsonObject object = (JsonObject) element; String name = object.getAsJsonPrimitive("name").getAsString(); String value = object.getAsJsonPrimitive("value").getAsString(); - - if (object.has("signature")) - result.put(name, new Property(name, value, object.getAsJsonPrimitive("signature").getAsString())); - else - result.put(name, new Property(name, value)); } return result; @@ -76,16 +67,10 @@ public class PropertyMap extends HashMap { @Override public JsonElement serialize(PropertyMap src, Type typeOfSrc, JsonSerializationContext context) { JsonArray result = new JsonArray(); - for (Property property : src.values()) { JsonObject object = new JsonObject(); - object.addProperty("name", property.name); object.addProperty("value", property.value); - - if (property.signature != null) - object.addProperty("signature", property.signature); - result.add(object); } @@ -99,15 +84,11 @@ public class PropertyMap extends HashMap { @Override public JsonElement serialize(PropertyMap src, Type typeOfSrc, JsonSerializationContext context) { JsonObject result = new JsonObject(); - for (String key : src.keySet()) { JsonArray values = new JsonArray(); - values.add(new JsonPrimitive(src.get(key).value)); - result.add(key, values); } - return result; } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/RefreshRequest.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/RefreshRequest.java new file mode 100644 index 000000000..a819557ac --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/RefreshRequest.java @@ -0,0 +1,13 @@ +package org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil; + +public class RefreshRequest { + + public String clientToken; + public String accessToken; + public boolean requestUser = true; + + public RefreshRequest(String accessToken, String clientToken) { + this.clientToken = clientToken; + this.accessToken = accessToken; + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/response/Response.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/Response.java similarity index 82% rename from HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/response/Response.java rename to HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/Response.java index 2e10796e5..a8afe899f 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/response/Response.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/Response.java @@ -1,11 +1,10 @@ -package org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.response; +package org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil; import org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.GameProfile; public class Response { - public String accessToken; - public String clientToken; + public String accessToken, clientToken; public GameProfile selectedProfile; public GameProfile[] availableProfiles; public User user; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/UUIDTypeAdapter.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/UUIDTypeAdapter.java index 877978685..e038d92da 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/UUIDTypeAdapter.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/UUIDTypeAdapter.java @@ -9,8 +9,7 @@ import java.util.UUID; public class UUIDTypeAdapter extends TypeAdapter { @Override - public void write(JsonWriter out, UUID value) - throws IOException { + public void write(JsonWriter out, UUID value) throws IOException { out.value(fromUUID(value)); } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/response/User.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/User.java similarity index 58% rename from HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/response/User.java rename to HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/User.java index 24c077702..f98022133 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/response/User.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/User.java @@ -1,6 +1,4 @@ -package org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.response; - -import org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.properties.PropertyMap; +package org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil; public class User { diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/YggdrasilAuthentication.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/YggdrasilAuthentication.java index 4f377b2c9..3d3805e2c 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/YggdrasilAuthentication.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/YggdrasilAuthentication.java @@ -11,14 +11,8 @@ import java.util.List; import java.util.Map; import java.util.UUID; import org.jackhuang.hellominecraft.C; -import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.utils.NetUtils; import org.jackhuang.hellominecraft.utils.StrUtils; -import org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.properties.PropertyMap; -import org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.request.AuthenticationRequest; -import org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.request.RefreshRequest; -import org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.response.Response; -import org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.response.User; public class YggdrasilAuthentication { @@ -30,8 +24,8 @@ public class YggdrasilAuthentication { protected static final String BASE_URL = "https://authserver.mojang.com/"; protected static final URL ROUTE_AUTHENTICATE = NetUtils.constantURL(BASE_URL + "authenticate"); protected static final URL ROUTE_REFRESH = NetUtils.constantURL(BASE_URL + "refresh"); + protected static final String STORAGE_KEY_ACCESS_TOKEN = "accessToken"; - protected static final String STORAGE_KEY_PROFILE_NAME = "displayName"; protected static final String STORAGE_KEY_PROFILE_ID = "uuid"; protected static final String STORAGE_KEY_PROFILE_PROPERTIES = "profileProperties"; @@ -41,15 +35,11 @@ public class YggdrasilAuthentication { private final Proxy proxy; private final String clientToken; - private final PropertyMap userProperties = new PropertyMap(); - private String userid; - private String username; - private String password; + + private String userid, username, password, accessToken; private GameProfile selectedProfile; - private GameProfile[] profiles; - private String accessToken; private boolean isOnline; public YggdrasilAuthentication(Proxy proxy, String clientToken) { @@ -57,16 +47,18 @@ public class YggdrasilAuthentication { this.clientToken = clientToken; } + // + public void setUsername(String username) { if ((isLoggedIn()) && (canPlayOnline())) - throw new IllegalStateException("Cannot change username whilst logged in & online"); + throw new IllegalStateException("Cannot change username while logged in & online"); this.username = username; } public void setPassword(String password) { if ((isLoggedIn()) && (canPlayOnline()) && (StrUtils.isNotBlank(password))) - throw new IllegalStateException("Cannot set password whilst logged in & online"); + throw new IllegalStateException("Cannot set password while logged in & online"); this.password = password; } @@ -104,37 +96,52 @@ public class YggdrasilAuthentication { return this.userProperties; } - protected void setUserid(String userid) { + protected void updateUserProperties(User user) { + if (user != null && user.properties != null) + getModifiableUserProperties().putAll(user.properties); + } + + protected void setUserId(String userid) { this.userid = userid; } public Proxy getProxy() { return this.proxy; } - - protected Response makeRequest(URL url, Object input) throws AuthenticationException { - try { - String jsonResult = input == null ? NetUtils.doGet(url) : NetUtils.post(url, GSON.toJson(input), "application/json", proxy); - Response result = (Response) GSON.fromJson(jsonResult, Response.class); - - if (result == null) - return null; - - if (StrUtils.isNotBlank(result.error)) - throw new AuthenticationException("InvalidCredentials " + result.errorMessage); - - return result; - } catch (IOException | IllegalStateException | JsonParseException e) { - throw new AuthenticationException(C.i18n("login.failed.connect_authentication_server"), e); - } - } public String getClientToken() { return this.clientToken; } + public GameProfile[] getAvailableProfiles() { + return this.profiles; + } + + @Deprecated + public String getSessionToken() { + if (isLoggedIn() && getSelectedProfile() != null && canPlayOnline()) + return String.format("token:%s:%s", new Object[]{getAuthenticatedToken(), getSelectedProfile().id}); + return null; + } + + public String getAuthenticatedToken() { + return this.accessToken; + } + + // + + // + + public boolean canPlayOnline() { + return isLoggedIn() && getSelectedProfile() != null && this.isOnline; + } + public boolean canLogIn() { - return (!canPlayOnline()) && (StrUtils.isNotBlank(getUsername())) && ((StrUtils.isNotBlank(getPassword())) || (StrUtils.isNotBlank(getAuthenticatedToken()))); + return !canPlayOnline() && StrUtils.isNotBlank(getUsername()) && (StrUtils.isNotBlank(getPassword()) || StrUtils.isNotBlank(getAuthenticatedToken())); + } + + public boolean isLoggedIn() { + return StrUtils.isNotBlank(this.accessToken); } public void logIn() throws AuthenticationException { @@ -149,23 +156,13 @@ public class YggdrasilAuthentication { throw new AuthenticationException(C.i18n("login.invalid_password")); } - protected void logInWithPassword() throws AuthenticationException { - if (StrUtils.isBlank(getUsername())) - throw new AuthenticationException(C.i18n("login.invalid_username")); - if (StrUtils.isBlank(getPassword())) - throw new AuthenticationException(C.i18n("login.invalid_password")); - - HMCLog.log("Logging in with username & password"); - - AuthenticationRequest request = new AuthenticationRequest(clientToken, getUsername(), getPassword()); - Response response = makeRequest(ROUTE_AUTHENTICATE, request); - + private void logInWithPassword() throws AuthenticationException { + Response response = request(ROUTE_AUTHENTICATE, new AuthenticationRequest(getUsername(), getPassword(), clientToken)); if (!response.clientToken.equals(clientToken)) throw new AuthenticationException(C.i18n("login.changed_client_token")); User user = response.user; - - setUserid(user != null && user.id != null ? user.id : getUsername()); + setUserId(user != null && user.id != null ? user.id : getUsername()); this.isOnline = true; this.accessToken = response.accessToken; @@ -177,32 +174,18 @@ public class YggdrasilAuthentication { updateUserProperties(user); } - protected void updateUserProperties(User user) { - if (user == null) - return; - - if (user.properties != null) - getModifiableUserProperties().putAll(user.properties); - } - protected void logInWithToken() throws AuthenticationException { if (StrUtils.isBlank(getUserID())) if (StrUtils.isBlank(getUsername())) - setUserid(getUsername()); + setUserId(getUsername()); else throw new AuthenticationException(C.i18n("login.invalid_uuid_and_username")); - if (StrUtils.isBlank(getAuthenticatedToken())) - throw new AuthenticationException(C.i18n("login.invalid_access_token")); - HMCLog.log("Logging in with access token"); - - RefreshRequest request = new RefreshRequest(this); - Response response = makeRequest(ROUTE_REFRESH, request); - - if (!response.clientToken.equals(clientToken)) + Response response = request(ROUTE_REFRESH, new RefreshRequest(getAuthenticatedToken(), getClientToken())); + if (!clientToken.equals(response.clientToken)) throw new AuthenticationException(C.i18n("login.changed_client_token")); - setUserid(response.user != null && response.user.id != null ? response.user.id : getUsername()); + setUserId(response.user != null && response.user.id != null ? response.user.id : getUsername()); this.isOnline = true; this.accessToken = response.accessToken; @@ -223,19 +206,10 @@ public class YggdrasilAuthentication { this.profiles = null; this.isOnline = false; } + // - public GameProfile[] getAvailableProfiles() { - return this.profiles; - } - - public boolean isLoggedIn() { - return StrUtils.isNotBlank(this.accessToken); - } - - public boolean canPlayOnline() { - return isLoggedIn() && getSelectedProfile() != null && this.isOnline; - } - + // + public void loadFromStorage(Map credentials) { logOut(); @@ -283,15 +257,23 @@ public class YggdrasilAuthentication { return result; } + + // + + protected Response request(URL url, Object input) throws AuthenticationException { + try { + String jsonResult = input == null ? NetUtils.doGet(url) : NetUtils.post(url, GSON.toJson(input), "application/json", proxy); + Response result = (Response) GSON.fromJson(jsonResult, Response.class); - @Deprecated - public String getSessionToken() { - if (isLoggedIn() && getSelectedProfile() != null && canPlayOnline()) - return String.format("token:%s:%s", new Object[]{getAuthenticatedToken(), getSelectedProfile().id}); - return null; - } + if (result == null) + return null; - public String getAuthenticatedToken() { - return this.accessToken; + if (StrUtils.isNotBlank(result.error)) + throw new AuthenticationException("InvalidCredentials " + result.errorMessage); + + return result; + } catch (IOException | IllegalStateException | JsonParseException e) { + throw new AuthenticationException(C.i18n("login.failed.connect_authentication_server"), e); + } } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/properties/Property.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/properties/Property.java deleted file mode 100644 index 856f44c92..000000000 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/properties/Property.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.properties; - -public class Property { - - public final String name; - public final String value; - public final String signature; - - public Property(String value, String name) { - this(value, name, null); - } - - public Property(String name, String value, String signature) { - this.name = name; - this.value = value; - this.signature = signature; - } -} diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/request/RefreshRequest.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/request/RefreshRequest.java deleted file mode 100644 index 16eda3018..000000000 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/request/RefreshRequest.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.request; - -import org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.GameProfile; -import org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.YggdrasilAuthentication; - -public class RefreshRequest { - - public String clientToken; - public String accessToken; - public GameProfile selectedProfile; - public boolean requestUser = true; - - public RefreshRequest(YggdrasilAuthentication userAuth) { - this(userAuth, null); - } - - public RefreshRequest(YggdrasilAuthentication userAuth, GameProfile profile) { - this.clientToken = userAuth.getClientToken(); - this.accessToken = userAuth.getAuthenticatedToken(); - this.selectedProfile = profile; - } -} diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersionManager.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersionManager.java index a9371de61..2284069af 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersionManager.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersionManager.java @@ -245,6 +245,7 @@ public final class MinecraftVersionManager extends IMinecraftProvider { @Override public List getDownloadLibraries(DownloadType downloadType) { ArrayList downloadLibraries = new ArrayList<>(); + if(profile.getSelectedMinecraftVersion() == null) return downloadLibraries; MinecraftVersion v = profile.getSelectedMinecraftVersion().resolve(this, Settings.getInstance().getDownloadSource()); if (v.libraries != null) for (IMinecraftLibrary l : v.libraries) { @@ -296,7 +297,7 @@ public final class MinecraftVersionManager extends IMinecraftProvider { @Override public File getDecompressNativesToLocation() { MinecraftVersion v = profile.getSelectedMinecraftVersion(); - return v.getNatives(profile.getCanonicalGameDirFile()); + return v == null ? null : v.getNatives(profile.getCanonicalGameDirFile()); } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.form index 84d0966db..03924c0a9 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.form @@ -488,7 +488,9 @@ - + + + @@ -577,7 +579,7 @@ - + @@ -635,7 +637,7 @@ - + @@ -1248,7 +1250,9 @@ - + + + diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java index 1267786f2..111ac8188 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java @@ -569,7 +569,7 @@ public class GameSettingsPanel extends javax.swing.JPanel implements DropTargetL } }); - chkCancelWrapper.setText("取消包裹启动器(出现奇怪问题时可尝试使用,与调试模式冲突)"); + chkCancelWrapper.setText(bundle.getString("advancedsettings.cancel_wrapper_launcher")); // NOI18N chkCancelWrapper.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { chkCancelWrapperFocusLost(evt); @@ -716,7 +716,7 @@ public class GameSettingsPanel extends javax.swing.JPanel implements DropTargetL .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnRemoveMod) .addGap(0, 0, Short.MAX_VALUE)) - .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 279, Short.MAX_VALUE)) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 264, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lblModInfo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) @@ -1079,7 +1079,7 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { } }); - btnCleanGame.setText("清理游戏文件"); + btnCleanGame.setText(bundle.getString("setupwindow.clean")); // NOI18N btnCleanGame.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnCleanGameActionPerformed(evt); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java index b6feeb715..76719e3f3 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java @@ -349,7 +349,7 @@ public class MainPagePanel extends javax.swing.JPanel { // void genLaunchCode(final Consumer listener) { - if (isLaunching) return; + if (isLaunching || getCurrentProfile() == null) return; isLaunching = true; HMCLog.log("Start generating launching command..."); File file = getCurrentProfile().getCanonicalGameDirFile(); diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/C.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/C.java index ad1f0ff26..77a26f9e3 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/C.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/C.java @@ -29,7 +29,19 @@ public final class C { public static final Gson gsonPrettyPrinting = new GsonBuilder().setPrettyPrinting().create(); public static final Gson gson = new Gson(); - public static final ResourceBundle I18N = ResourceBundle.getBundle("org/jackhuang/hellominecraft/launcher/I18N"); + public static final ResourceBundle I18N; + + static { + ResourceBundle rb = null; + try { + rb = ResourceBundle.getBundle("org/jackhuang/hellominecraft/launcher/I18N"); + } catch(Throwable t) { + rb = null; + System.out.println("Did you delete I18N.properties?"); + t.printStackTrace(); + } + I18N = rb; + } //http://repo1.maven.org/maven2 public static final String URL_PUBLISH = "http://www.mcbbs.net/thread-142335-1-1.html"; diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskWindow.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskWindow.java index af575cb98..9ba8e7af5 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskWindow.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskWindow.java @@ -71,16 +71,15 @@ public class TaskWindow extends javax.swing.JDialog return this; } - public void clean() { + public synchronized void clean() { if (isVisible()) return; - taskList = null; taskList = new TaskList(); taskList.addTaskListener(this); taskList.addAllDoneListener(this); } public boolean start() { - if (isVisible() || taskList.isAlive()) return false; + if (isVisible() || taskList == null || taskList.isAlive()) return false; pgsTotal.setValue(0); suc = false; SwingUtils.clearDefaultTable(lstDownload); @@ -179,7 +178,8 @@ public class TaskWindow extends javax.swing.JDialog } if (!suc) { - SwingUtilities.invokeLater(taskList::abort); + if (taskList != null) + SwingUtilities.invokeLater(taskList::abort); HMCLog.log("Tasks have been canceled by user."); } taskList = null; @@ -205,7 +205,7 @@ public class TaskWindow extends javax.swing.JDialog int idx = tasks.indexOf(task); if (idx == -1) return; int pgs = progress * 100 / max; - if (progresses.get(idx) != pgs) { + if (progresses.contains(idx) && progresses.get(idx) != pgs && lstDownload.getRowCount() > idx) { SwingUtils.setValueAt(lstDownload, pgs + "%", idx, 1); progresses.set(idx, pgs); } @@ -281,8 +281,6 @@ public class TaskWindow extends javax.swing.JDialog } public static class TaskWindowFactory { - public static final Object obj = new Object(); - LinkedList ll = new LinkedList<>(); public TaskWindowFactory addTask(Task t) { @@ -291,7 +289,8 @@ public class TaskWindow extends javax.swing.JDialog } public boolean start() { - synchronized(obj) { + synchronized(instance) { + if (instance.isVisible()) return false; TaskWindow tw = inst(); for(Task t : ll) tw.addTask(t); return tw.start(); diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/Utils.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/Utils.java index 54181b9cc..7ee95e46f 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/Utils.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/Utils.java @@ -30,7 +30,6 @@ import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URI; -import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; import java.net.URLDecoder; @@ -93,7 +92,7 @@ public final class Utils { try { Desktop.getDesktop().browse(new URI(url)); return true; - } catch (URISyntaxException | IOException ex) { + } catch (Exception ex) { HMCLog.warn("Failed to open link:" + url, ex); return false; } @@ -166,7 +165,8 @@ public final class Utils { } /** - * In order to fight against the permission manager. + * In order to fight against the permission manager by Minecraft Forge. + * @param status exit code */ public static void shutdownForcely(int status) { try { diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/FileUtils.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/FileUtils.java index da853e591..1ea793fb6 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/FileUtils.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/FileUtils.java @@ -435,6 +435,7 @@ public class FileUtils { public static File[] searchSuffix(File dir, String suffix) { ArrayList al = new ArrayList(); File[] files = dir.listFiles(); + if (files == null) return new File[0]; for (File f : files) if (f.getName().endsWith(suffix)) al.add(f); return al.toArray(new File[0]); diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/JdkVersion.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/JdkVersion.java index 32823516c..2a3d9dc50 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/JdkVersion.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/JdkVersion.java @@ -57,12 +57,14 @@ public final class JdkVersion { public boolean equals(Object obj) { if (!(obj instanceof JdkVersion)) return false; JdkVersion b = (JdkVersion) obj; + if(b.location == null || location == null) + return b.location == location; return new File(b.location).equals(new File(location)); } @Override public int hashCode() { - return new File(location).hashCode(); + return location == null ? 0 : new File(location).hashCode(); } public JdkVersion(String location) { diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/MessageBox.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/MessageBox.java index 610598333..cfff7e410 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/MessageBox.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/MessageBox.java @@ -24,7 +24,7 @@ import org.jackhuang.hellominecraft.C; */ public class MessageBox { - private static String Title = C.i18n("message.info"); + private static final String TITLE = C.i18n("message.info"); /** * Buttons: OK */ @@ -110,7 +110,7 @@ public class MessageBox { * @return User Operation */ public static int Show(String Msg, int Option) { - return Show(Msg, Title, Option); + return Show(Msg, TITLE, Option); } /** @@ -120,6 +120,6 @@ public class MessageBox { * @return User Operation */ public static int Show(String Msg) { - return Show(Msg, Title, INFORMATION_MESSAGE); + return Show(Msg, TITLE, INFORMATION_MESSAGE); } } diff --git a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N.properties b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N.properties index ca70e5bfd..8ecf629f0 100644 --- a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N.properties +++ b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N.properties @@ -209,7 +209,7 @@ settings.failed_load=\u8bbe\u7f6e\u6587\u4ef6\u52a0\u8f7d\u5931\u8d25\uff0c\u53e mods=Mod\u7ba1\u7406 mods.choose_mod=\u9009\u62e9\u6a21\u7ec4 mods.failed=\u6dfb\u52a0\u5931\u8d25 -mods.default_information=\u60a8\u53ef\u4ee5\u4ece\u8d44\u6e90\u7ba1\u7406\u5668\u62d6\u52a8mod\u6587\u4ef6\u5230\u5217\u8868\u4e2d\u6765\u6dfb\u52a0mod\uff0c\u540c\u65f6\u4f7f\u7528\u5220\u9664\u952e\u53ef\u5feb\u901f\u5220\u9664\u9009\u4e2dmod
\u70b9\u6389mod\u524d\u9762\u7684\u52fe\u53ef\u7981\u7528mod\uff0c\u4e0d\u4f1a\u52a0\u8f7d\uff1b\u9009\u62e9mod\u53ef\u4ee5\u83b7\u53d6mod\u4fe1\u606f
+mods.default_information=\u5b89\u88c5Mod\u524d\u4f60\u9700\u8981\u786e\u4fdd\u5df2\u5b89\u88c5Forge\u6216LiteLoader!
\u60a8\u53ef\u4ee5\u4ece\u8d44\u6e90\u7ba1\u7406\u5668\u62d6\u52a8mod\u6587\u4ef6\u5230\u5217\u8868\u4e2d\u6765\u6dfb\u52a0mod\uff0c\u540c\u65f6\u4f7f\u7528\u5220\u9664\u952e\u53ef\u5feb\u901f\u5220\u9664\u9009\u4e2dmod
\u70b9\u6389mod\u524d\u9762\u7684\u52fe\u53ef\u7981\u7528mod\uff0c\u4e0d\u4f1a\u52a0\u8f7d\uff1b\u9009\u62e9mod\u53ef\u4ee5\u83b7\u53d6mod\u4fe1\u606f
advancedsettings=\u9ad8\u7ea7\u8bbe\u7f6e advancedsettings.launcher_visible=\u542f\u52a8\u5668\u53ef\u89c1\u6027 @@ -227,6 +227,7 @@ advancedsettings.no_jvm_args=\u4e0d\u6dfb\u52a0JVM\u53c2\u6570(\u4f7f\u7528Java9 advancedsettings.java_args_default=\u542f\u52a8\u5668\u9ed8\u8ba4\u6dfb\u52a0\u7684\u53c2\u6570\uff08\u8bf7\u4e0d\u8981\u91cd\u590d\u6dfb\u52a0\uff09\uff1a-XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:-UseAdaptiveSizePolicy -XX:MaxPermSize=???m -Xmx???m -Dfml.ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true advancedsettings.wrapper_launcher=\u542f\u52a8\u524d\u6267\u884c\u547d\u4ee4(\u4e0d\u5fc5\u586b\u5199\uff0c\u5c06\u5728\u6e38\u620f\u542f\u52a8\u524d\u8c03\u7528) advancedsettings.server_ip=\u76f4\u5165\u670d\u52a1\u5668ip\u5730\u5740(\u4e0d\u5fc5\u586b\u5199\uff0c\u542f\u52a8\u6e38\u620f\u540e\u76f4\u63a5\u8fdb\u5165\u5bf9\u5e94\u670d\u52a1\u5668) +advancedsettings.cancel_wrapper_launcher=\u53d6\u6d88\u5305\u88f9\u542f\u52a8\u5668\uff08\u51fa\u73b0\u5947\u602a\u95ee\u9898\u65f6\u53ef\u5c1d\u8bd5\u4f7f\u7528,\u4e0e\u8c03\u8bd5\u6a21\u5f0f\u51b2\u7a81\uff09 mainwindow.show_log=\u67e5\u770b\u65e5\u5fd7 mainwindow.make_launch_script=\u751f\u6210\u542f\u52a8\u811a\u672c @@ -293,6 +294,7 @@ setupwindow.find_in_configurations=\u5bfc\u5165\u5b8c\u6210\uff0c\u5feb\u5230\u9 setupwindow.give_a_name=\u7ed9\u65b0\u6e38\u620f\u8def\u5f84\u8d77\u4e2a\u540d\u5b57\u5427 setupwindow.new=\u65b0\u5efa setupwindow.no_empty_name=\u540d\u5b57\u4e0d\u53ef\u4e3a\u7a7a +setupwindow.clean=\u6e05\u7406\u6e38\u620f\u6587\u4ef6 update.no_browser=\u65e0\u6cd5\u6253\u5f00\u6d4f\u89c8\u5668\uff0c\u7f51\u5740\u5df2\u7ecf\u590d\u5236\u5230\u526a\u8d34\u677f\u4e86\uff0c\u60a8\u53ef\u4ee5\u624b\u52a8\u7c98\u8d34\u7f51\u5740\u6253\u5f00\u9875\u9762 update.should_open_link=\u662f\u5426\u524d\u5f80\u53d1\u5e03\u9875\u9762\u66f4\u65b0\uff1f diff --git a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_en_US.properties b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_en_US.properties index aa6a81c02..dbbbd2cc0 100644 --- a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_en_US.properties +++ b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_en_US.properties @@ -134,7 +134,7 @@ ui.button.run=Play ui.button.settings=Settings ui.button.about=About ui.button.others=Others -ui.button.logout=LogOut +ui.button.logout=Log Out ui.button.download=Download ui.button.retry=Retry ui.button.delete=Delete @@ -209,6 +209,7 @@ settings.failed_load=Failed to load settings file. Remove it? mods=Mods mods.choose_mod=Choose your mods mods.failed=Failed to add mods +mods.default_information=Please ensure that you have installed Forge or LiteLoader before installing mods!
You can drop your mod files from explorer/finder, and delete mods by the delete button.
Disable a mod by leaving the check box unchecked; Choose an item to get the information.
advancedsettings=Advanced advancedsettings.launcher_visible=Launcher Visibility @@ -226,6 +227,7 @@ advancedsettings.no_jvm_args=No JVM Args advancedsettings.java_args_default=Default java args: -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:-UseAdaptiveSizePolicy -XX:MaxPermSize=???m -Xmx???m -Dfml.ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true advancedsettings.wrapper_launcher=Wrapper Launcher(like optirun...) advancedsettings.server_ip=Server Host +advancedsettings.cancel_wrapper_launcher=Cancel Wrapper Launcher mainwindow.show_log=Show Logs mainwindow.make_launch_script=Make Launching Script. @@ -240,11 +242,13 @@ launcher.background_location=Background Location launcher.exit_failed=Failed to shutdown. launcher.versions_json_not_matched=The version %s is malformed! There are a json:%s in this version. Do you want to fix this problem? launcher.versions_json_not_matched_cannot_auto_completion=The version %s lost version information file, delete it? +launcher.versions_json_not_formatted=The version information of %s is malformed! Redownload it? launcher.choose_bgpath=Choose background path. launcher.background_tooltip=\n\nThis app uses the default background at first.
\nIf there is background.png in the directory, it will be used.
\nIf there is "bg" subdirectory, this app will chooses one picture in "bgskin" randomly.
\nIf you set the background setting, this app will use it.\n\n launcher.update_launcher=Check for update launcher.enable_shadow=Enable Window Shadow launcher.theme=Theme +launcher.proxy=Proxy launcher.title.game=Games launcher.title.main=Home @@ -269,6 +273,7 @@ assets.not_refreshed=The assets list is not refreshed, please refresh it once. assets.failed=Failed to get the list, try again. assets.list.1_7_3_after=1.7.3 And Higher assets.list.1_6=1.6(BMCLAPI) +assets.unkown_type_select_one=Unknown game version: %s, please choose an asset type. assets.type=Asset Type assets.download=Download Assets assets.no_assets=Assets are not complete, complete them? @@ -289,6 +294,7 @@ setupwindow.find_in_configurations=Finished importing. You can find it in the co setupwindow.give_a_name=Give a name to the new game. setupwindow.new=New setupwindow.no_empty_name=Version name cannot be empty. +setupwindow.clean=Clean game files update.no_browser=Cannot open any browser. The link has been copied to the clipboard. You can paste it to the address bar. update.should_open_link=Are you willing to open the update link? diff --git a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh_CN.properties b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh_CN.properties index d73e893ec..312d48f0d 100644 --- a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh_CN.properties +++ b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh_CN.properties @@ -209,7 +209,7 @@ settings.failed_load=\u8bbe\u7f6e\u6587\u4ef6\u52a0\u8f7d\u5931\u8d25\uff0c\u53e mods=Mod\u7ba1\u7406 mods.choose_mod=\u9009\u62e9\u6a21\u7ec4 mods.failed=\u6dfb\u52a0\u5931\u8d25 -mods.default_information=\u60a8\u53ef\u4ee5\u4ece\u8d44\u6e90\u7ba1\u7406\u5668\u62d6\u52a8mod\u6587\u4ef6\u5230\u5217\u8868\u4e2d\u6765\u6dfb\u52a0mod\uff0c\u540c\u65f6\u4f7f\u7528\u5220\u9664\u952e\u53ef\u5feb\u901f\u5220\u9664\u9009\u4e2dmod
\u70b9\u6389mod\u524d\u9762\u7684\u52fe\u53ef\u7981\u7528mod\uff0c\u4e0d\u4f1a\u52a0\u8f7d\uff1b\u9009\u62e9mod\u53ef\u4ee5\u83b7\u53d6mod\u4fe1\u606f
+mods.default_information=\u5b89\u88c5Mod\u524d\u4f60\u9700\u8981\u786e\u4fdd\u5df2\u5b89\u88c5Forge\u6216LiteLoader!
\u60a8\u53ef\u4ee5\u4ece\u8d44\u6e90\u7ba1\u7406\u5668\u62d6\u52a8mod\u6587\u4ef6\u5230\u5217\u8868\u4e2d\u6765\u6dfb\u52a0mod\uff0c\u540c\u65f6\u4f7f\u7528\u5220\u9664\u952e\u53ef\u5feb\u901f\u5220\u9664\u9009\u4e2dmod
\u70b9\u6389mod\u524d\u9762\u7684\u52fe\u53ef\u7981\u7528mod\uff0c\u4e0d\u4f1a\u52a0\u8f7d\uff1b\u9009\u62e9mod\u53ef\u4ee5\u83b7\u53d6mod\u4fe1\u606f
advancedsettings=\u9ad8\u7ea7\u8bbe\u7f6e advancedsettings.launcher_visible=\u542f\u52a8\u5668\u53ef\u89c1\u6027 @@ -293,6 +293,7 @@ setupwindow.find_in_configurations=\u5bfc\u5165\u5b8c\u6210\uff0c\u5feb\u5230\u9 setupwindow.give_a_name=\u7ed9\u65b0\u6e38\u620f\u8def\u5f84\u8d77\u4e2a\u540d\u5b57\u5427 setupwindow.new=\u65b0\u5efa setupwindow.no_empty_name=\u540d\u5b57\u4e0d\u53ef\u4e3a\u7a7a +setupwindow.clean=\u6e05\u7406\u6e38\u620f\u6587\u4ef6 update.no_browser=\u65e0\u6cd5\u6253\u5f00\u6d4f\u89c8\u5668\uff0c\u7f51\u5740\u5df2\u7ecf\u590d\u5236\u5230\u526a\u8d34\u677f\u4e86\uff0c\u60a8\u53ef\u4ee5\u624b\u52a8\u7c98\u8d34\u7f51\u5740\u6253\u5f00\u9875\u9762 update.should_open_link=\u662f\u5426\u524d\u5f80\u53d1\u5e03\u9875\u9762\u66f4\u65b0\uff1f diff --git a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh_TW.properties b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh_TW.properties index 239084156..43f2a000f 100644 --- a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh_TW.properties +++ b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh_TW.properties @@ -227,6 +227,7 @@ advancedsettings.no_jvm_args=\u4e0d\u6dfb\u52a0JVM\u53c3\u6578(\u4f7f\u7528Java9 advancedsettings.java_args_default=\u555f\u52d5\u5668\u9ed8\u8a8d\u6dfb\u52a0\u7684\u53c3\u6578\uff08\u8acb\u4e0d\u8981\u91cd\u8907\u6dfb\u52a0\uff09\uff1a-XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:-UseAdaptiveSizePolicy -XX:MaxPermSize=???m -Xmx???m -Dfml. ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true advancedsettings.wrapper_launcher=\u524d\u7f6e\u555f\u52d5\u6307\u4ee4(\u4e0d\u5fc5\u586b\u5beb\uff0c\u5167\u5bb9\u5c07\u52a0\u5728\u555f\u52d5\u8173\u672c\u6700\u524d\uff0c\u5982optirun...) advancedsettings.server_ip=\u76f4\u5165\u670d\u52d9\u5668ip\u5730\u5740(\u4e0d\u5fc5\u586b\u5beb\uff0c\u555f\u52d5\u904a\u6232\u5f8c\u76f4\u63a5\u9032\u5165\u5c0d\u61c9\u670d\u52d9\u5668) +advancedsettings.cancel_wrapper_launcher=\u53d6\u6d88\u5305\u88f9\u555f\u52d5\u5668(\u51fa\u73fe\u5947\u602a\u554f\u984c\u6642\u53ef\u5617\u8a66\u4f7f\u7528,\u8207\u8abf\u8a66\u6a21\u5f0f\u885d\u7a81) mainwindow.show_log=\u67e5\u770b\u65e5\u8a8c mainwindow.make_launch_script=\u751f\u6210\u555f\u52d5\u8173\u672c @@ -272,6 +273,7 @@ assets.not_refreshed=\u8cc7\u6e90\u5217\u8868\u672a\u5237\u65b0\uff0c\u8acb\u523 assets.failed=\u7372\u53d6\u5217\u8868\u5931\u6557\uff0c\u8acb\u5237\u65b0\u91cd\u8a66\u3002 assets.list.1_7_3_after=1.7.3\u53ca\u4ee5\u5f8c assets.list.1_6=1.6(BMCLAPI) +assets.unkown_type_select_one=\u7121\u6cd5\u89e3\u6790\u904a\u6232\u7248\u672c\uff1a%s\uff0c\u8acb\u9078\u64c7\u4e00\u7a2e\u8cc7\u6e90\u985e\u578b\u4e0b\u8f09\u3002 assets.type=\u8cc7\u6e90\u985e\u578b assets.download=\u4e0b\u8f09\u8cc7\u6e90 assets.no_assets=\u8cc7\u6e90\u6587\u4ef6\u4e0d\u5b8c\u6574\uff0c\u662f\u5426\u88dc\u5168\uff1f @@ -292,6 +294,7 @@ setupwindow.find_in_configurations=\u5c0e\u5165\u5b8c\u6210\uff0c\u5feb\u5230\u9 setupwindow.give_a_name=\u7d66\u65b0\u904a\u6232\u8def\u5f91\u8d77\u500b\u540d\u5b57\u5427 setupwindow.new=\u65b0\u5efa setupwindow.no_empty_name=\u540d\u5b57\u4e0d\u53ef\u70ba\u7a7a +setupwindow.clean=\u6e05\u7406\u904a\u6232\u6587\u4ef6 update.no_browser=\u7121\u6cd5\u6253\u958b\u700f\u89bd\u5668\uff0c\u7db2\u5740\u5df2\u7d93\u5fa9\u88fd\u5230\u526a\u8cbc\u677f\u4e86\uff0c\u60a8\u53ef\u4ee5\u624b\u52d5\u7c98\u8cbc\u7db2\u5740\u6253\u958b\u9801\u9762 update.should_open_link=\u662f\u5426\u524d\u5f80\u767c\u5e03\u9801\u9762\u66f4\u65b0\uff1f