From ebc0b4b2b09410e949cd400856a3cdcb08a9308e Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Sat, 2 Jun 2018 18:06:32 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E7=A7=BB=E9=99=A4AccountHelper=E6=9C=AA?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=9A=84=E5=8D=95=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java index a3e50cc26..2ed2be5e9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java @@ -40,7 +40,7 @@ import java.util.List; import java.util.Optional; public final class AccountHelper { - public static final AccountHelper INSTANCE = new AccountHelper(); + private AccountHelper() {} public static final File SKIN_DIR = new File(Launcher.HMCL_DIRECTORY, "skins"); From 3866377a28b3a5dcf527e98b24246155668969e1 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Sat, 2 Jun 2018 18:15:41 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E4=BD=BF=E7=94=A8UUID=E8=80=8C=E4=B8=8D?= =?UTF-8?q?=E6=98=AF=E8=A7=92=E8=89=B2=E5=90=8D=E6=9D=A5=E6=A0=87=E8=AF=86?= =?UTF-8?q?=E7=9A=AE=E8=82=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jackhuang/hmcl/game/AccountHelper.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java index 2ed2be5e9..ae4db1045 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java @@ -38,6 +38,7 @@ import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Optional; +import java.util.UUID; public final class AccountHelper { @@ -73,8 +74,8 @@ public final class AccountHelper { return new SkinLoadTask(account, proxy, true); } - private static File getSkinFile(String name) { - return new File(SKIN_DIR, name + ".png"); + private static File getSkinFile(UUID uuid) { + return new File(SKIN_DIR, uuid + ".png"); } public static Image getSkin(YggdrasilAccount account) { @@ -84,7 +85,7 @@ public final class AccountHelper { public static Image getSkin(YggdrasilAccount account, double scaleRatio) { if (account.getCharacter() == null) return getDefaultSkin(account, scaleRatio); - File file = getSkinFile(account.getCharacter()); + File file = getSkinFile(account.getUUID()); if (file.exists()) { Image original = new Image("file:" + file.getAbsolutePath()); return new Image("file:" + file.getAbsolutePath(), @@ -96,8 +97,7 @@ public final class AccountHelper { } public static Image getSkinImmediately(YggdrasilAccount account, GameProfile profile, double scaleRatio, Proxy proxy) throws Exception { - String name = profile.getName(); - File file = getSkinFile(name); + File file = getSkinFile(profile.getId()); downloadSkin(account, profile, true, proxy); if (!file.exists()) return getDefaultSkin(account, scaleRatio); @@ -152,7 +152,7 @@ public final class AccountHelper { Optional texture = account.getSkin(profile); if (!texture.isPresent()) return; String url = texture.get().getUrl(); - File file = getSkinFile(profile.getName()); + File file = getSkinFile(profile.getId()); if (!refresh && file.exists()) return; new FileDownloadTask(NetworkUtils.toURL(url), file, proxy).run(); @@ -165,7 +165,7 @@ public final class AccountHelper { Optional texture = account.getSkin(); if (!texture.isPresent()) return; String url = texture.get().getUrl(); - File file = getSkinFile(account.getCharacter()); + File file = getSkinFile(account.getUUID()); if (!refresh && file.exists()) return; new FileDownloadTask(NetworkUtils.toURL(url), file, proxy).run(); From bbe584bd910d62422c88493c3b8309e8c37fd171 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Sat, 2 Jun 2018 19:21:41 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E6=9C=AA=E8=AE=BE=E7=BD=AE=E7=9A=AE=E8=82=A4?= =?UTF-8?q?=E7=9A=84Yggdrasil=E8=B4=A6=E6=88=B7=E7=9A=84=E7=9A=AE=E8=82=A4?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jackhuang/hmcl/game/AccountHelper.java | 19 +++++++++---------- .../org/jackhuang/hmcl/ui/AddAccountPane.java | 1 + .../jackhuang/hmcl/ui/LeftPaneController.java | 2 +- .../hmcl/auth/yggdrasil/YggdrasilAccount.java | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java index ae4db1045..fdca46992 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java @@ -83,9 +83,11 @@ public final class AccountHelper { } public static Image getSkin(YggdrasilAccount account, double scaleRatio) { - if (account.getCharacter() == null) - return getDefaultSkin(account, scaleRatio); - File file = getSkinFile(account.getUUID()); + UUID uuid = account.getUUID(); + if (uuid == null) + return getSteveSkin(scaleRatio); + + File file = getSkinFile(uuid); if (file.exists()) { Image original = new Image("file:" + file.getAbsolutePath()); return new Image("file:" + file.getAbsolutePath(), @@ -93,14 +95,14 @@ public final class AccountHelper { original.getHeight() * scaleRatio, false, false); } - return getDefaultSkin(account, scaleRatio); + return getDefaultSkin(uuid, scaleRatio); } public static Image getSkinImmediately(YggdrasilAccount account, GameProfile profile, double scaleRatio, Proxy proxy) throws Exception { File file = getSkinFile(profile.getId()); downloadSkin(account, profile, true, proxy); if (!file.exists()) - return getDefaultSkin(account, scaleRatio); + return getDefaultSkin(profile.getId(), scaleRatio); String url = "file:" + file.getAbsolutePath(); return scale(url, scaleRatio); @@ -187,11 +189,8 @@ public final class AccountHelper { return scale("/assets/img/alex.png", 4); } - public static Image getDefaultSkin(Account account, double scaleRatio) { - if (account == null) - return getSteveSkin(scaleRatio); - - int type = account.getUUID().hashCode() & 1; + public static Image getDefaultSkin(UUID uuid, double scaleRatio) { + int type = uuid.hashCode() & 1; if (type == 1) return getAlexSkin(scaleRatio); else diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java index 782606e0f..acfe68ba2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java @@ -208,6 +208,7 @@ public class AddAccountPane extends StackPane { try { image = AccountHelper.getSkinImmediately(yggdrasilAccount, profile, 4, Settings.INSTANCE.getProxy()); } catch (Exception e) { + Logging.LOG.log(Level.WARNING, "Failed to get skin for " + profile.getName(), e); image = FXUtils.DEFAULT_ICON; } ImageView portraitView = new ImageView(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java index 51f38a3b6..3fda2d12c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java @@ -167,7 +167,7 @@ public final class LeftPaneController { Image image = AccountHelper.getSkin((YggdrasilAccount) account, 4); item.setImage(image, AccountHelper.getViewport(4)); } else - item.setImage(AccountHelper.getDefaultSkin(account, 4), AccountHelper.getViewport(4)); + item.setImage(AccountHelper.getDefaultSkin(account.getUUID(), 4), AccountHelper.getViewport(4)); if (account instanceof AuthlibInjectorAccount) Accounts.getAuthlibInjectorServerNameAsync((AuthlibInjectorAccount) account) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java index f6dcbb7ca..200449925 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java @@ -145,7 +145,7 @@ public class YggdrasilAccount extends Account { } public UUID getUUID() { - if (session == null) + if (session == null || session.getSelectedProfile() == null) return null; else return session.getSelectedProfile().getId(); From 60a140efb3e6d4617371b74eb4eaea2e24c3c154 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Sat, 2 Jun 2018 19:38:03 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E6=9C=8D=E5=8A=A1=E5=99=A8=E6=97=B6=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E5=87=BA=E7=8E=B0ConcurrentModificationException?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 初始化块执行时字段并不一定都完成了初始化,应当避免使用。 利用ConcurrentHashMap的弱一致性防止迭代中删除账户造成ConcurrentModificationException。 --- .../src/main/java/org/jackhuang/hmcl/setting/Settings.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java index 679ec8f85..937ab255b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -42,6 +42,7 @@ import java.net.InetSocketAddress; import java.net.PasswordAuthentication; import java.net.Proxy; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.stream.Collectors; @@ -62,13 +63,11 @@ public class Settings { public static final Settings INSTANCE = new Settings(); - private Settings() {} - private final Config SETTINGS = initSettings(); - private final Map accounts = new HashMap<>(); + private final Map accounts = new ConcurrentHashMap<>(); - { + private Settings() { loadProxy(); for (Iterator> iterator = SETTINGS.getAccounts().iterator(); iterator.hasNext(); ) { From 3408a8ffcf21e92fbd32a0ed84beb1c2da21a44e Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Sat, 2 Jun 2018 19:59:00 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E6=8E=AA=E8=BE=9E?= =?UTF-8?q?=EF=BC=9A=E6=B7=BB=E5=8A=A0=E8=AE=A4=E8=AF=81=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8->=E7=AE=A1=E7=90=86=E8=AE=A4=E8=AF=81=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/jackhuang/hmcl/ui/AddAccountPane.java | 10 +++++----- HMCL/src/main/resources/assets/fxml/account-add.fxml | 6 +++--- HMCL/src/main/resources/assets/lang/I18N.properties | 3 ++- .../main/resources/assets/lang/I18N_zh_CN.properties | 3 ++- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java index acfe68ba2..d384855a1 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java @@ -64,8 +64,8 @@ public class AddAccountPane extends StackPane { @FXML private JFXComboBox cboType; @FXML private JFXComboBox cboServers; @FXML private JFXProgressBar progressBar; - @FXML private Label lblAddInjectorServer; - @FXML private Hyperlink linkAddInjectorServer; + @FXML private Label lblInjectorServer; + @FXML private Hyperlink linkManageInjectorServers; @FXML private JFXDialogLayout layout; @FXML private JFXButton btnAccept; private final Consumer finalization; @@ -82,8 +82,8 @@ public class AddAccountPane extends StackPane { txtPassword.setVisible(newValue.intValue() != 0); lblPassword.setVisible(newValue.intValue() != 0); cboServers.setVisible(newValue.intValue() == 2); - linkAddInjectorServer.setVisible(newValue.intValue() == 2); - lblAddInjectorServer.setVisible(newValue.intValue() == 2); + linkManageInjectorServers.setVisible(newValue.intValue() == 2); + lblInjectorServer.setVisible(newValue.intValue() == 2); validateAcceptButton(); }); cboType.getSelectionModel().select(0); @@ -160,7 +160,7 @@ public class AddAccountPane extends StackPane { } @FXML - private void onAddInjecterServer() { + private void onManageInjecterServers() { finalization.accept(this); Controllers.navigate(Controllers.getServersPage()); } diff --git a/HMCL/src/main/resources/assets/fxml/account-add.fxml b/HMCL/src/main/resources/assets/fxml/account-add.fxml index 4361683f8..c08f1b2c8 100644 --- a/HMCL/src/main/resources/assets/fxml/account-add.fxml +++ b/HMCL/src/main/resources/assets/fxml/account-add.fxml @@ -25,13 +25,13 @@ -