diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java index be21803cf..c1d937f98 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java @@ -26,8 +26,14 @@ import java.net.Authenticator; import java.net.PasswordAuthentication; import java.net.URI; import java.net.URISyntaxException; +import java.security.GeneralSecurityException; +import java.security.cert.X509Certificate; import java.text.ParseException; import java.util.Map; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.X509TrustManager; import javax.swing.ImageIcon; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; @@ -52,6 +58,37 @@ import org.jackhuang.hellominecraft.utils.system.OS; * @author huangyuhui */ public final class Main implements NonConsumer { + + private static final X509TrustManager xtm = new X509TrustManager() { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return null; + } + }; + private static final HostnameVerifier hnv = (hostname, session) -> true; + + static { + SSLContext sslContext = null; + + try { + sslContext = SSLContext.getInstance("TLS"); + X509TrustManager[] xtmArray = new X509TrustManager[]{xtm}; + sslContext.init(null, xtmArray, new java.security.SecureRandom()); + } catch (GeneralSecurityException gse) { + } + if (sslContext != null) + HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); + + HttpsURLConnection.setDefaultHostnameVerifier(hnv); + } public static String launcherName = "Hello Minecraft! Launcher"; public static byte firstVer = 2, secondVer = 3, thirdVer = 4, forthVer = 10; 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 e1313ef38..11a0966dd 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 @@ -41,30 +41,38 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { public CrashReporter(boolean enableLogger) { this.enableLogger = enableLogger; } - + public boolean checkThrowable(Throwable e) { String s = StrUtils.getStackTrace(e); - if(s.contains("sun.awt.shell.Win32ShellFolder2") || s.contains("UnsatisfiedLinkError")) { + if (s.contains("sun.awt.shell.Win32ShellFolder2") || s.contains("UnsatisfiedLinkError")) { System.out.println(C.i18n("crash.user_fault")); try { MessageBox.Show(C.i18n("crash.user_fault")); - } catch(Throwable t) { + } catch (Throwable t) { t.printStackTrace(); } return false; - } else if(s.contains("java.awt.HeadlessException")) { + } else if (s.contains("java.awt.HeadlessException")) { System.out.println(C.i18n("crash.headless")); try { MessageBox.Show(C.i18n("crash.headless")); - } catch(Throwable t) { + } catch (Throwable t) { } + return false; + } else if(s.contains("java.lang.NoClassDefFoundError")) { + System.out.println(C.i18n("crash.NoClassDefFound")); + try { + MessageBox.Show(C.i18n("crash.NoClassDefFound")); + } catch (Throwable t) { + t.printStackTrace(); + } + return false; } return true; } @Override public void uncaughtException(Thread t, Throwable e) { - if (!checkThrowable(e)) return; String s = StrUtils.getStackTrace(e); if (!s.contains("org.jackhuang.hellominecraft")) return; try { @@ -80,9 +88,12 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { text += " Java VM Version: " + System.getProperty("java.vm.name") + " (" + System.getProperty("java.vm.info") + "), " + System.getProperty("java.vm.vendor") + "\n"; if (enableLogger) HMCLog.err(text); else System.out.println(text); - SwingUtilities.invokeLater(() -> LogWindow.instance.showAsCrashWindow(UpdateChecker.OUT_DATED)); - if (!UpdateChecker.OUT_DATED) - reportToServer(text, s); + + if (!checkThrowable(e)) { + SwingUtilities.invokeLater(() -> LogWindow.instance.showAsCrashWindow(UpdateChecker.OUT_DATED)); + if (!UpdateChecker.OUT_DATED) + reportToServer(text, s); + } } catch (Throwable ex) { try { MessageBox.Show(e.getMessage() + "\n" + ex.getMessage(), "ERROR", MessageBox.ERROR_MESSAGE); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/AssetsMojangLoader.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/AssetsMojangLoader.java index fc97bb59c..466f79caa 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/AssetsMojangLoader.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/AssetsMojangLoader.java @@ -20,7 +20,6 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Map; -import java.util.concurrent.ThreadPoolExecutor; import org.jackhuang.hellominecraft.C; import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.launcher.settings.Settings; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/IAssetsHandler.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/IAssetsHandler.java index 6fbb39261..6a4eb4802 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/IAssetsHandler.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/IAssetsHandler.java @@ -109,7 +109,6 @@ public abstract class IAssetsHandler { ArrayList al; String u; - int progress, max; public AssetsTask(String url) { this.u = url; @@ -121,8 +120,7 @@ public abstract class IAssetsHandler { setFailReason(new RuntimeException(C.i18n("assets.not_refreshed"))); return false; } - progress = 0; - max = assetsDownloadURLs.size(); + int max = assetsDownloadURLs.size(); al = new ArrayList<>(); int hasDownloaded = 0; for (int i = 0; i < max; i++) { 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 c8e27c05e..4e018aca9 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 @@ -1187,7 +1187,7 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { TaskWindow.getInstance() .addTask(task).addTask(new LiteLoaderInstaller(profile, (LiteLoaderInstallerVersion) v).registerPreviousResult(task)) .start(); - refreshVersions(); + refreshVersions(); }//GEN-LAST:event_btnInstallLiteLoaderActionPerformed private void btnRefreshLiteLoaderActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRefreshLiteLoaderActionPerformed @@ -1371,7 +1371,7 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { try { if (!ModInfo.isFileMod(f) || mods == null) return false; File newf = profile.getFolder("mods"); - if(newf == null) return false; + if (newf == null) return false; newf.mkdirs(); newf = new File(newf, f.getName()); FileUtils.copyFile(f, newf); @@ -1724,6 +1724,7 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { reloadMods(); + if (profile == null || version == null) return; MinecraftVersion v = profile.getMinecraftProvider().getVersionById(version); if (v != null) for (IAssetsHandler ph : IAssetsHandler.getAssetsHandlers()) diff --git a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/YggdrasilAuthenticationService.java b/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/YggdrasilAuthenticationService.java index 83d6214b2..1447d97b2 100644 --- a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/YggdrasilAuthenticationService.java +++ b/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/YggdrasilAuthenticationService.java @@ -80,11 +80,7 @@ public class YggdrasilAuthenticationService extends HttpAuthenticationService { } return (T) result; - } catch (IOException e) { - throw new AuthenticationUnavailableException(C.i18n("login.failed.connect_authentication_server"), e); - } catch (IllegalStateException e) { - throw new AuthenticationUnavailableException(C.i18n("login.failed.connect_authentication_server"), e); - } catch (JsonParseException e) { + } catch (IOException | IllegalStateException | JsonParseException e) { throw new AuthenticationUnavailableException(C.i18n("login.failed.connect_authentication_server"), e); } } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskList.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskList.java index 5ae92a49a..739e14859 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskList.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskList.java @@ -117,7 +117,13 @@ public class TaskList extends Thread { for (DoingDoneListener d : t.getTaskListeners()) d.onDoing(t); - if (t.executeTask()) { + boolean returns = false; + try { + returns = t.executeTask(); + } catch(Throwable e) { + t.setFailReason(e); + } + if (returns) { HMCLog.log((t.isAborted() ? "Task aborted: " : "Task finished: ") + t.getInfo()); for (DoingDoneListener d : taskListener) d.onDone(t); 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 6d0313ea1..f95f05d63 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskWindow.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskWindow.java @@ -51,7 +51,7 @@ public class TaskWindow extends javax.swing.JDialog initComponents(); setLocationRelativeTo(null); - + if (lstDownload.getColumnModel().getColumnCount() > 1) { int i = 35; lstDownload.getColumnModel().getColumn(1).setMinWidth(i); @@ -68,6 +68,8 @@ public class TaskWindow extends javax.swing.JDialog } public void clean() { + if (isVisible()) + throw new RuntimeException("This error should not appear, please contact the author."); taskList = null; taskList = new TaskList(); taskList.addTaskListener(this); @@ -170,7 +172,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."); } }//GEN-LAST:event_formWindowClosed diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/FileDownloadTask.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/FileDownloadTask.java index 4769bc464..7e54765a3 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/FileDownloadTask.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/FileDownloadTask.java @@ -22,13 +22,7 @@ import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; -import java.security.GeneralSecurityException; -import java.security.cert.X509Certificate; import java.util.ArrayList; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.X509TrustManager; import org.jackhuang.hellominecraft.C; import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.tasks.Task; @@ -43,37 +37,6 @@ import org.jackhuang.hellominecraft.utils.system.IOUtils; // This class downloads a file from a URL. public class FileDownloadTask extends Task implements PreviousResult, PreviousResultRegistrar { - private static final X509TrustManager xtm = new X509TrustManager() { - @Override - public void checkClientTrusted(X509Certificate[] chain, String authType) { - } - - @Override - public void checkServerTrusted(X509Certificate[] chain, String authType) { - } - - @Override - public X509Certificate[] getAcceptedIssuers() { - return null; - } - }; - private static final HostnameVerifier hnv = (hostname, session) -> true; - - static { - SSLContext sslContext = null; - - try { - sslContext = SSLContext.getInstance("TLS"); - X509TrustManager[] xtmArray = new X509TrustManager[]{xtm}; - sslContext.init(null, xtmArray, new java.security.SecureRandom()); - } catch (GeneralSecurityException gse) { - } - if (sslContext != null) - HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); - - HttpsURLConnection.setDefaultHostnameVerifier(hnv); - } - // Max size of download buffer. private static final int MAX_BUFFER_SIZE = 2048; diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/SwingUtils.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/SwingUtils.java index 5a6e3b65f..56f9ec618 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/SwingUtils.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/SwingUtils.java @@ -19,7 +19,6 @@ package org.jackhuang.hellominecraft.utils; import java.awt.FontMetrics; import java.net.URI; import javax.swing.DefaultListModel; -import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JScrollBar; @@ -153,11 +152,12 @@ public class SwingUtils { } public static String getParsedJPanelText(JLabel jLabel1, String longString) { - if(StrUtils.isBlank(longString)) return longString; + if (StrUtils.isBlank(longString)) return longString; StringBuilder builder = new StringBuilder(); char[] chars = longString.toCharArray(); FontMetrics fontMetrics = jLabel1.getFontMetrics(jLabel1.getFont()); for (int beginIndex = 0, limit = 1;; limit++) { + if (beginIndex + limit >= chars.length) break; if (fontMetrics.charsWidth(chars, beginIndex, limit) < jLabel1.getWidth()) { if (beginIndex + limit < chars.length) continue; diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.form b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.form index e72974771..1567b985d 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.form +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.form @@ -4,7 +4,7 @@ - + @@ -99,7 +99,7 @@ - + @@ -109,7 +109,7 @@ - + @@ -119,7 +119,7 @@ - + @@ -144,7 +144,7 @@ - + @@ -162,7 +162,7 @@ - + diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.java index 9c7704215..52ea57aa7 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.java @@ -76,8 +76,7 @@ public class LogWindow extends javax.swing.JFrame { btnGitHub = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("org/jackhuang/hellominecraft/launcher/I18N"); // NOI18N - setTitle(bundle.getString("logwindow.title")); // NOI18N + setTitle(C.I18N.getString("logwindow.title")); // NOI18N addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosed(java.awt.event.WindowEvent evt) { formWindowClosed(evt); @@ -89,21 +88,21 @@ public class LogWindow extends javax.swing.JFrame { txtLog.setRows(5); jScrollPane1.setViewportView(txtLog); - btnClear.setText(bundle.getString("ui.button.clear")); // NOI18N + btnClear.setText(C.I18N.getString("ui.button.clear")); // NOI18N btnClear.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnClearActionPerformed(evt); } }); - btnClose.setText(bundle.getString("ui.button.close")); // NOI18N + btnClose.setText(C.I18N.getString("ui.button.close")); // NOI18N btnClose.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnCloseActionPerformed(evt); } }); - btnCopy.setText(bundle.getString("ui.button.copy")); // NOI18N + btnCopy.setText(C.I18N.getString("ui.button.copy")); // NOI18N btnCopy.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnCopyActionPerformed(evt); @@ -119,7 +118,7 @@ public class LogWindow extends javax.swing.JFrame { } }); - btnTieBa.setText(bundle.getString("logwindow.tieba")); // NOI18N + btnTieBa.setText(C.I18N.getString("logwindow.tieba")); // NOI18N btnTieBa.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnTieBaActionPerformed(evt); @@ -133,7 +132,7 @@ public class LogWindow extends javax.swing.JFrame { } }); - btnTerminateGame.setText(bundle.getString("logwindow.terminate_game")); // NOI18N + btnTerminateGame.setText(C.I18N.getString("logwindow.terminate_game")); // NOI18N btnTerminateGame.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnTerminateGameActionPerformed(evt); 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 a1067a4f4..c23d7b560 100644 --- a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N.properties +++ b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N.properties @@ -116,6 +116,7 @@ crash.advice.no=\u65e0\u5efa\u8bae\u3002 crash.user_fault=\u60a8\u7684\u7cfb\u7edf\u6216Java\u73af\u5883\u53ef\u80fd\u5b89\u88c5\u4e0d\u5f53\u5bfc\u81f4\u672c\u8f6f\u4ef6\u5d29\u6e83\uff0c\u8bf7\u68c0\u67e5\u60a8\u7684Java\u73af\u5883\u6216\u60a8\u7684\u7535\u8111\uff01\u53ef\u4ee5\u5c1d\u8bd5\u91cd\u65b0\u5b89\u88c5Java\u3002 crash.headless=\u5982\u679c\u60a8\u7684\u64cd\u4f5c\u7cfb\u7edf\u662fLinux\uff0c\u8bf7\u6ce8\u610f\u4e0d\u8981\u4f7f\u7528OpenJDK\uff0c\u52a1\u5fc5\u4f7f\u7528Oracle JDK\uff0c\u6216\u5c1d\u8bd5\u6dfb\u52a0-Djava.awt.headless=false\u53c2\u6570\uff0c\u6216\u68c0\u67e5\u60a8\u7684Xserver\u662f\u5426\u6b63\u5e38 +crash.NoClassDefFound=\u8bf7\u786e\u8ba4HMCL\u672c\u4f53\u662f\u5426\u5b8c\u6574 crash.error=\u60a8\u7684Minecraft\u5d29\u6e83\u4e86\u3002 crash.main_class_not_found=\u627e\u4e0d\u5230\u4e3b\u7c7b\uff0c\u53ef\u80fd\u662f\u60a8\u7684JSON\u6587\u4ef6\u586b\u5199\u9519\u8bef\u3002\u65e0\u6cd5\u542f\u52a8\u6e38\u620f\u3002\u53ef\u4ee5\u901a\u8fc7\u4e0b\u8f7d\u6574\u5408\u5305\u89e3\u51b3\u95ee\u9898\u3002 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 7e7d181ed..c39b5ec08 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 @@ -116,6 +116,7 @@ crash.advice.no=No advice. crash.user_fault=Your OS or Java environment may not be properly installed resulting in crashing of this software, please check your Java Environment or your computer! crash.headless=If your OS is Linux, please use Oracle JDK instead of OpenJDK, or add "-Djava.awt.headless=false" JVM argument, or check if your Xserver works normally. +crash.NoClassDefFound=Please check "HMCL" software is complete. crash.error=Minecraft has crashed. crash.main_class_not_found=Main Class is not found, may be your mc has been broken. 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 a1067a4f4..c23d7b560 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 @@ -116,6 +116,7 @@ crash.advice.no=\u65e0\u5efa\u8bae\u3002 crash.user_fault=\u60a8\u7684\u7cfb\u7edf\u6216Java\u73af\u5883\u53ef\u80fd\u5b89\u88c5\u4e0d\u5f53\u5bfc\u81f4\u672c\u8f6f\u4ef6\u5d29\u6e83\uff0c\u8bf7\u68c0\u67e5\u60a8\u7684Java\u73af\u5883\u6216\u60a8\u7684\u7535\u8111\uff01\u53ef\u4ee5\u5c1d\u8bd5\u91cd\u65b0\u5b89\u88c5Java\u3002 crash.headless=\u5982\u679c\u60a8\u7684\u64cd\u4f5c\u7cfb\u7edf\u662fLinux\uff0c\u8bf7\u6ce8\u610f\u4e0d\u8981\u4f7f\u7528OpenJDK\uff0c\u52a1\u5fc5\u4f7f\u7528Oracle JDK\uff0c\u6216\u5c1d\u8bd5\u6dfb\u52a0-Djava.awt.headless=false\u53c2\u6570\uff0c\u6216\u68c0\u67e5\u60a8\u7684Xserver\u662f\u5426\u6b63\u5e38 +crash.NoClassDefFound=\u8bf7\u786e\u8ba4HMCL\u672c\u4f53\u662f\u5426\u5b8c\u6574 crash.error=\u60a8\u7684Minecraft\u5d29\u6e83\u4e86\u3002 crash.main_class_not_found=\u627e\u4e0d\u5230\u4e3b\u7c7b\uff0c\u53ef\u80fd\u662f\u60a8\u7684JSON\u6587\u4ef6\u586b\u5199\u9519\u8bef\u3002\u65e0\u6cd5\u542f\u52a8\u6e38\u620f\u3002\u53ef\u4ee5\u901a\u8fc7\u4e0b\u8f7d\u6574\u5408\u5305\u89e3\u51b3\u95ee\u9898\u3002 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 b388c8dfd..77af0af46 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 @@ -116,6 +116,7 @@ crash.advice.no=\u7121\u5efa\u8b70\u3002 crash.user_fault=\u60a8\u7684\u7cfb\u7d71\u6216Java\u74b0\u5883\u53ef\u80fd\u5b89\u88dd\u4e0d\u7576\u5c0e\u81f4\u672c\u8edf\u4ef6\u5d29\u6f70\uff0c\u8acb\u6aa2\u67e5\u60a8\u7684Java\u74b0\u5883\u6216\u60a8\u7684\u96fb\u8166\uff01\u53ef\u4ee5\u5617\u8a66\u91cd\u65b0\u5b89\u88ddJava\u3002 crash.headless=\u5982\u679c\u60a8\u7684\u64cd\u4f5c\u7cfb\u7d71\u662fLinux\uff0c\u8acb\u6ce8\u610f\u4e0d\u8981\u4f7f\u7528OpenJDK\uff0c\u52d9\u5fc5\u4f7f\u7528Oracle JDK\uff0c\u6216\u5617\u8a66\u6dfb\u52a0-Djava.awt.headless=false\u53c3\u6578\uff0c\u6216\u6aa2\u67e5\u60a8\u7684Xserver\u662f\u5426\u6b63\u5e38 +crash.NoClassDefFound=\u8acb\u78ba\u8a8dHMCL\u672c\u9ad4\u662f\u5426\u5b8c\u6574 crash.error=\u60a8\u7684Minecraft\u5d29\u6f70\u4e86\u3002 crash.main_class_not_found=\u627e\u4e0d\u5230\u4e3b\u985e\uff0c\u53ef\u80fd\u662f\u60a8\u7684JSON\u6587\u4ef6\u586b\u5beb\u932f\u8aa4\u3002\u7121\u6cd5\u555f\u52d5\u904a\u6232\u3002\u53ef\u4ee5\u901a\u904e\u4e0b\u8f09\u6574\u5408\u5305\u89e3\u6c7a\u554f\u984c\u3002