From 13c105472e9742904f9598232d75ee05a18ae8ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Mon, 27 Jun 2016 10:23:39 +0800 Subject: [PATCH 01/46] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index d636c0f41..8140b02f4 100755 --- a/README.md +++ b/README.md @@ -4,7 +4,6 @@ ## 介绍 HMCL是一个Minecraft启动器,支持Mod管理,游戏定制,自动安装,整合包制作,界面主题定制等功能。 -并且一天的使用次数在工作日时有40万左右、节假日有150万左右的使用次数,也就是说日活跃用户在10万以上。 但是本项目的代码不够完善,希望有更多的人能加入HMCL的开发。 ## 贡献 From 9ae010a39158f6c5933d9cd849b15a9ef56e75fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Mon, 27 Jun 2016 17:43:34 +0800 Subject: [PATCH 02/46] =?UTF-8?q?=E6=94=B9=E8=BF=9B=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=95=B0=E6=8D=AE=E6=8E=92=E5=BA=8F=20?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E4=B8=8B=E8=BD=BD=E8=A1=A8=E6=A0=BC=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=E8=A1=A8=E5=A4=B4=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/install/InstallerVersionList.java | 165 ++++++++++-------- .../forge/MinecraftForgeVersionList.java | 7 +- .../launcher/ui/InstallerPanel.java | 150 +++++++++------- .../launcher/ui/LauncherSettingsPanel.form | 2 +- .../launcher/ui/LauncherSettingsPanel.java | 2 +- .../hellominecraft/launcher/ui/MainFrame.java | 2 +- .../jackhuang/hellominecraft/lang/I18N.lang | 2 +- .../hellominecraft/lang/I18N.properties | 2 +- .../hellominecraft/lang/I18N_zh_TW.lang | 2 +- 9 files changed, 190 insertions(+), 144 deletions(-) diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/InstallerVersionList.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/InstallerVersionList.java index 2aefcea2c..c7eb180d4 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/InstallerVersionList.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/InstallerVersionList.java @@ -30,91 +30,110 @@ import org.jackhuang.hellominecraft.util.tasks.Task; */ public abstract class InstallerVersionList { - /** - * Refresh installer versions list from the downloaded content. - * - * @param versions Minecraft versions you need to refresh - * - * @throws java.lang.Exception including network exceptions, IO exceptions. - */ - public abstract Task refresh(String[] versions); + /** + * Refresh installer versions list from the downloaded content. + * + * @param versions Minecraft versions you need to refresh + * + * @throws java.lang.Exception including network exceptions, IO exceptions. + */ + public abstract Task refresh(String[] versions); - /** - * Installer name. - * - * @return installer name. - */ - public abstract String getName(); + /** + * Installer name. + * + * @return installer name. + */ + public abstract String getName(); - /** - * Get installers you want. - * - * @param mcVersion the installers to this Minecraft version. - * - * @return cached result. - */ - protected abstract List getVersionsImpl(String mcVersion); + /** + * Get installers you want. + * + * @param mcVersion the installers to this Minecraft version. + * + * @return cached result. + */ + protected abstract List getVersionsImpl(String mcVersion); - /** - * Get installers you want, please cache this method's result to save time. - * - * @param mcVersion the installers to this Minecraft version. - * - * @return a copy of the cached data to prevent - * ConcurrentModificationException. - */ - public List getVersions(String mcVersion) { - List a = getVersionsImpl(mcVersion); - if (a == null) - return null; - else - return new ArrayList<>(a); - } + /** + * Get installers you want, please cache this method's result to save time. + * + * @param mcVersion the installers to this Minecraft version. + * + * @return a copy of the cached data to prevent + * ConcurrentModificationException. + */ + public List getVersions(String mcVersion) { + List a = getVersionsImpl(mcVersion); + if (a == null) { + return null; + } else { + return new ArrayList<>(a); + } + } - public static class InstallerVersion implements Comparable { + public static int compareVersion(String verOne, String verTwo) { + String[] verInfoOne = verOne.split("\\."); + String[] verInfoTwo = verTwo.split("\\."); + int idx = 0; + int minLength = Math.min(verInfoOne.length, verInfoTwo.length); + int diff = 0; + while (idx < minLength + && (diff = verInfoOne[idx].length() - verInfoTwo[idx].length()) == 0 + && (diff = verInfoOne[idx].compareTo(verInfoTwo[idx])) == 0) { + ++idx; + } + diff = (diff != 0) ? diff : verInfoOne.length - verInfoTwo.length; + return (diff == 0) ? 0 : (diff < 0 ? -1 : 1); + } - public String selfVersion, mcVersion; - public String installer, universal; - public String changelog; + public static class InstallerVersion implements Comparable { - public InstallerVersion(String selfVersion, String mcVersion) { - this.selfVersion = selfVersion; - this.mcVersion = mcVersion; - } + public String selfVersion, mcVersion; + public String installer, universal; + public String changelog; - @Override - public int compareTo(InstallerVersion o) { - return selfVersion.compareTo(o.selfVersion); - } + public InstallerVersion(String selfVersion, String mcVersion) { + this.selfVersion = selfVersion; + this.mcVersion = mcVersion; + } - @Override - public int hashCode() { - return selfVersion.hashCode(); - } + @Override + public int compareTo(InstallerVersion o) { + return compareVersion(selfVersion, o.selfVersion); + } - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - final InstallerVersion other = (InstallerVersion) obj; - return Objects.equals(this.selfVersion, other.selfVersion); - } + @Override + public int hashCode() { + return selfVersion.hashCode(); + } - } + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final InstallerVersion other = (InstallerVersion) obj; + return Objects.equals(this.selfVersion, other.selfVersion); + } - public static class InstallerVersionComparator implements Comparator, Serializable { + } - private static final long serialVersionUID = 3276198781795213723L; + public static class InstallerVersionComparator implements Comparator, Serializable { - public static final InstallerVersionComparator INSTANCE = new InstallerVersionComparator(); + private static final long serialVersionUID = 3276198781795213723L; - @Override - public int compare(InstallerVersion o1, InstallerVersion o2) { - return o2.compareTo(o1); - } - } + public static final InstallerVersionComparator INSTANCE = new InstallerVersionComparator(); + + @Override + public int compare(InstallerVersion o1, InstallerVersion o2) { + return o2.compareTo(o1); + } + } } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/forge/MinecraftForgeVersionList.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/forge/MinecraftForgeVersionList.java index 984425ca1..725b73328 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/forge/MinecraftForgeVersionList.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/forge/MinecraftForgeVersionList.java @@ -76,10 +76,13 @@ public class MinecraftForgeVersionList extends InstallerVersionList { for (Map.Entry arr : root.mcversion.entrySet()) { String mcver = StrUtils.formatVersion(arr.getKey()); + if (mcver == null) { + mcver = arr.getKey(); + } ArrayList al = new ArrayList<>(); for (int num : arr.getValue()) { MinecraftForgeVersion v = root.number.get(num); - InstallerVersion iv = new InstallerVersion(v.version, StrUtils.formatVersion(v.mcversion)); + InstallerVersion iv = new InstallerVersion(v.version, v.mcversion); for (String[] f : v.files) { String ver = v.mcversion + "-" + v.version; @@ -108,7 +111,7 @@ public class MinecraftForgeVersionList extends InstallerVersionList { versions.add(iv); } - versionMap.put(StrUtils.formatVersion(mcver), al); + versionMap.put(mcver, al); } Collections.sort(versions, new InstallerVersionComparator()); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java index 26ebaad1b..32e2e2240 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java @@ -17,9 +17,13 @@ */ package org.jackhuang.hellominecraft.launcher.ui; +import java.util.Comparator; import java.util.List; +import javax.swing.RowSorter; import javax.swing.SwingUtilities; import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableModel; +import javax.swing.table.TableRowSorter; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.launcher.core.install.InstallerType; @@ -36,29 +40,45 @@ import org.jackhuang.hellominecraft.util.ui.SwingUtils; */ public class InstallerPanel extends AnimatedPanel { - GameSettingsPanel gsp; + GameSettingsPanel gsp; - /** - * Creates new form InstallerPanel - * - * @param gsp To get the minecraft version - * @param installerType load which installer - */ - public InstallerPanel(GameSettingsPanel gsp, InstallerType installerType) { - initComponents(); + private static class VerComparator implements Comparator { - setOpaque(false); - this.gsp = gsp; - id = installerType; - list = Settings.getInstance().getDownloadSource().getProvider().getInstallerByType(id); - } + @Override + public int compare(String o1, String o2) { + return InstallerVersionList.compareVersion(o1, o2); + } + }; - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") + /** + * Creates new form InstallerPanel + * + * @param gsp To get the minecraft version + * @param installerType load which installer + */ + public InstallerPanel(GameSettingsPanel gsp, InstallerType installerType) { + initComponents(); + + //表格排序 + TableRowSorter sorter = new TableRowSorter(lstInstallers.getModel()); + VerComparator verComparator = new VerComparator(); + for (int i = 0; i < lstInstallers.getColumnCount(); i++) { + sorter.setComparator(i, verComparator); + } + lstInstallers.setRowSorter(sorter); + + setOpaque(false); + this.gsp = gsp; + id = installerType; + list = Settings.getInstance().getDownloadSource().getProvider().getInstallerByType(id); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents private void initComponents() { @@ -109,60 +129,64 @@ public class InstallerPanel extends AnimatedPanel { }// //GEN-END:initComponents private void btnInstallActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnInstallActionPerformed - downloadSelectedRow(); + downloadSelectedRow(); }//GEN-LAST:event_btnInstallActionPerformed private void btnRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRefreshActionPerformed - refreshVersions(); + refreshVersions(); }//GEN-LAST:event_btnRefreshActionPerformed - transient List versions; - transient InstallerVersionList list; - InstallerType id; + transient List versions; + transient InstallerVersionList list; + InstallerType id; - void refreshVersions() { - if (TaskWindow.execute(list.refresh(new String[] { gsp.getMinecraftVersionFormatted() }))) - loadVersions(); - } + void refreshVersions() { + if (TaskWindow.execute(list.refresh(new String[]{gsp.getMinecraftVersionFormatted()}))) { + loadVersions(); + } + } - public synchronized InstallerVersionList.InstallerVersion getVersion(int idx) { - return versions.get(idx); - } + public synchronized InstallerVersionList.InstallerVersion getVersion(int idx) { + return versions.get(idx); + } - synchronized void downloadSelectedRow() { - int idx = lstInstallers.getSelectedRow(); - if (versions == null || idx < 0 || idx >= versions.size()) { - MessageBox.Show(C.i18n("install.not_refreshed")); - return; - } - TaskWindow.execute(Settings.getLastProfile().service().install().download(Settings.getLastProfile().getSelectedVersion(), getVersion(idx), id), - new TaskRunnable(this::refreshVersions)); - } + synchronized void downloadSelectedRow() { + int idx = lstInstallers.getSelectedRow(); + if (versions == null || idx < 0 || idx >= versions.size()) { + MessageBox.Show(C.i18n("install.not_refreshed")); + return; + } + TaskWindow.execute(Settings.getLastProfile().service().install().download(Settings.getLastProfile().getSelectedVersion(), getVersion(idx), id), + new TaskRunnable(this::refreshVersions)); + } - public void loadVersions() { - SwingUtilities.invokeLater(() -> { - synchronized (InstallerPanel.this) { - DefaultTableModel model = (DefaultTableModel) lstInstallers.getModel(); - String mcver = StrUtils.formatVersion(gsp.getMinecraftVersionFormatted()); - versions = list.getVersions(mcver); - SwingUtils.clearDefaultTable(lstInstallers); - if (versions != null) - for (InstallerVersionList.InstallerVersion v : versions) - if (v != null) - model.addRow(new Object[] { v.selfVersion == null ? "null" : v.selfVersion, v.mcVersion == null ? "null" : v.mcVersion }); - } - }); - } + public void loadVersions() { + SwingUtilities.invokeLater(() -> { + synchronized (InstallerPanel.this) { + DefaultTableModel model = (DefaultTableModel) lstInstallers.getModel(); + String mcver = StrUtils.formatVersion(gsp.getMinecraftVersionFormatted()); + versions = list.getVersions(mcver); + SwingUtils.clearDefaultTable(lstInstallers); + if (versions != null) { + for (InstallerVersionList.InstallerVersion v : versions) { + if (v != null) { + model.addRow(new Object[]{v.selfVersion == null ? "null" : v.selfVersion, v.mcVersion == null ? "null" : v.mcVersion}); + } + } + } + } + }); + } - boolean refreshed = false; + boolean refreshed = false; - @Override - public void onSelect() { - if (!refreshed) { - refreshVersions(); - refreshed = true; - } - } + @Override + public void onSelect() { + if (!refreshed) { + refreshVersions(); + refreshed = true; + } + } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnInstall; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form index 9eabf0b12..553e2e43d 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form @@ -131,7 +131,7 @@ - + diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java index 29203424f..554ca9b66 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java @@ -349,7 +349,7 @@ public class LauncherSettingsPanel extends AnimatedPanel { .addComponent(btnMCBBS)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lblRestart) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 65, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 80, Short.MAX_VALUE) .addComponent(lblModpack, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lblAbout, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java index 8457cba22..aae86082a 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java @@ -89,7 +89,7 @@ public final class MainFrame extends DraggableFrame { setContentSize(834, 542); else setContentSize(802, 511); - setDefaultCloseOperation(3); + setDefaultCloseOperation(EXIT_ON_CLOSE); setTitle(Main.makeTitle()); initComponents(); loadBackground(); diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang index c57982610..cdbeb9c31 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang @@ -298,7 +298,7 @@ mainwindow.enter_script_name=输入要生成脚本的文件名 mainwindow.make_launch_succeed=启动脚本已生成完毕: mainwindow.no_version=未找到任何版本,是否进入游戏下载? -launcher.about=默认背景图感谢gamerteam提供。
如果您希望本软件继续发展,请赞助
关于作者:
百度ID:huanghongxun20
mcbbs:huanghongxun
邮箱:huanghongxun2008@126.com
Minecraft Forum ID: klkl6523
欢迎提交Bug哦
Copyright (c) 2013-2016 huangyuhui.
免责声明:Minecraft软件版权归Mojang AB所有,使用本软件产生的版权问题本软件制作方概不负责。
本启动器在GPLv3协议下开源:https://github.com/huanghongxun/HMCL/ ,感谢issues和pull requests贡献者
本软件使用了基于Apache License 2.0的Gson项目,感谢贡献者。 +launcher.about=默认背景图感谢gamerteam提供。
关于作者:
百度ID:huanghongxun20
mcbbs:huanghongxun
邮箱:huanghongxun2008@126.com
Minecraft Forum ID: klkl6523
欢迎提交Bug哦
Copyright (c) 2013-2016 huangyuhui.
免责声明:Minecraft软件版权归Mojang AB所有,使用本软件产生的版权问题本软件制作方概不负责。
本启动器在GPLv3协议下开源:https://github.com/huanghongxun/HMCL/ ,感谢issues和pull requests贡献者
本软件使用了基于Apache License 2.0的Gson项目,感谢贡献者。 launcher.download_source=下载源 launcher.background_location=背景地址 launcher.exit_failed=强制退出失败,可能是Forge 1.7.10及更高版本导致的,无法解决。 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties index 642388d74..2ea8f0ed0 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties @@ -298,7 +298,7 @@ mainwindow.enter_script_name=\u8f93\u5165\u8981\u751f\u6210\u811a\u672c\u7684\u6 mainwindow.make_launch_succeed=\u542f\u52a8\u811a\u672c\u5df2\u751f\u6210\u5b8c\u6bd5: mainwindow.no_version=\u672a\u627e\u5230\u4efb\u4f55\u7248\u672c\uff0c\u662f\u5426\u8fdb\u5165\u6e38\u620f\u4e0b\u8f7d\uff1f -launcher.about=\u9ed8\u8ba4\u80cc\u666f\u56fe\u611f\u8c22gamerteam\u63d0\u4f9b\u3002
\u5982\u679c\u60a8\u5e0c\u671b\u672c\u8f6f\u4ef6\u7ee7\u7eed\u53d1\u5c55\uff0c\u8bf7\u8d5e\u52a9
\u5173\u4e8e\u4f5c\u8005\uff1a
\u767e\u5ea6ID\uff1ahuanghongxun20
mcbbs\uff1ahuanghongxun
\u90ae\u7bb1\uff1ahuanghongxun2008@126.com
Minecraft Forum ID: klkl6523
\u6b22\u8fce\u63d0\u4ea4Bug\u54e6
Copyright (c) 2013-2016 huangyuhui.
\u514d\u8d23\u58f0\u660e\uff1aMinecraft\u8f6f\u4ef6\u7248\u6743\u5f52Mojang AB\u6240\u6709\uff0c\u4f7f\u7528\u672c\u8f6f\u4ef6\u4ea7\u751f\u7684\u7248\u6743\u95ee\u9898\u672c\u8f6f\u4ef6\u5236\u4f5c\u65b9\u6982\u4e0d\u8d1f\u8d23\u3002
\u672c\u542f\u52a8\u5668\u5728GPLv3\u534f\u8bae\u4e0b\u5f00\u6e90:https://github.com/huanghongxun/HMCL/ ,\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
\u672c\u8f6f\u4ef6\u4f7f\u7528\u4e86\u57fa\u4e8eApache License 2.0\u7684Gson\u9879\u76ee\uff0c\u611f\u8c22\u8d21\u732e\u8005\u3002 +launcher.about=\u9ed8\u8ba4\u80cc\u666f\u56fe\u611f\u8c22gamerteam\u63d0\u4f9b\u3002
\u5173\u4e8e\u4f5c\u8005\uff1a
\u767e\u5ea6ID\uff1ahuanghongxun20
mcbbs\uff1ahuanghongxun
\u90ae\u7bb1\uff1ahuanghongxun2008@126.com
Minecraft Forum ID: klkl6523
\u6b22\u8fce\u63d0\u4ea4Bug\u54e6
Copyright (c) 2013-2016 huangyuhui.
\u514d\u8d23\u58f0\u660e\uff1aMinecraft\u8f6f\u4ef6\u7248\u6743\u5f52Mojang AB\u6240\u6709\uff0c\u4f7f\u7528\u672c\u8f6f\u4ef6\u4ea7\u751f\u7684\u7248\u6743\u95ee\u9898\u672c\u8f6f\u4ef6\u5236\u4f5c\u65b9\u6982\u4e0d\u8d1f\u8d23\u3002
\u672c\u542f\u52a8\u5668\u5728GPLv3\u534f\u8bae\u4e0b\u5f00\u6e90:https://github.com/huanghongxun/HMCL/ ,\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
\u672c\u8f6f\u4ef6\u4f7f\u7528\u4e86\u57fa\u4e8eApache License 2.0\u7684Gson\u9879\u76ee\uff0c\u611f\u8c22\u8d21\u732e\u8005\u3002 launcher.download_source=\u4e0b\u8f7d\u6e90 launcher.background_location=\u80cc\u666f\u5730\u5740 launcher.exit_failed=\u5f3a\u5236\u9000\u51fa\u5931\u8d25\uff0c\u53ef\u80fd\u662fForge 1.7.10\u53ca\u66f4\u9ad8\u7248\u672c\u5bfc\u81f4\u7684\uff0c\u65e0\u6cd5\u89e3\u51b3\u3002 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang index feaaa638c..bc0e5c092 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang @@ -298,7 +298,7 @@ mainwindow.enter_script_name=輸入要生成腳本的資料名 mainwindow.make_launch_succeed=啟動腳本已生成完畢: mainwindow.no_version=未找到任何版本,是否進入遊戲下載? -launcher.about=默認背景圖感謝gamerteam提供。
如果您希望本軟件繼續發展,請贊助
關於作者:
百度ID:huanghongxun20
mcbbs:huanghongxun
郵箱:huanghongxun2008@126.com
Minecraft Forum ID: klkl6523
歡迎提交Bug哦
Copyright (c) 2013-2016 huangyuhui.
免責聲明:Minecraft軟體版權歸Mojang AB所有,遊戲由於誤操作本啟動器而丟失數據的概不負責。
本啟動器在GPLv3協議下開源:http://github.com/huanghongxun/HMCL/ ,感谢issues和pull requests贡献者
本軟體使用了基於Apache License 2.0的Gson項目,感謝貢獻者。 +launcher.about=默認背景圖感謝gamerteam提供。
關於作者:
百度ID:huanghongxun20
mcbbs:huanghongxun
郵箱:huanghongxun2008@126.com
Minecraft Forum ID: klkl6523
歡迎提交Bug哦
Copyright (c) 2013-2016 huangyuhui.
免責聲明:Minecraft軟體版權歸Mojang AB所有,遊戲由於誤操作本啟動器而丟失數據的概不負責。
本啟動器在GPLv3協議下開源:http://github.com/huanghongxun/HMCL/ ,感谢issues和pull requests贡献者
本軟體使用了基於Apache License 2.0的Gson項目,感謝貢獻者。 launcher.download_source=下載源 launcher.background_location=背景地址 launcher.exit_failed=強制退出失敗,可能是Forge 1.7.10及更高版本導致的,無法解決。 From 94b6cda86e294fa0bac94c8d5094d9748943a843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Tue, 28 Jun 2016 20:48:27 +0800 Subject: [PATCH 03/46] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E5=9C=A8=E7=BA=BF=E6=8E=A7=E5=88=B6=E7=9A=84=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/asset/AssetsMojangLoader.java | 2 +- .../launcher/core/asset/IAssetsHandler.java | 49 +++- .../core/asset/MinecraftAssetService.java | 3 +- .../core/download/DownloadLibraryJob.java | 4 +- .../launcher/core/download/DownloadType.java | 5 +- .../download/DynamicDownloadProvider.java | 149 +++++++++++ .../core/download/IDownloadProvider.java | 10 +- .../download/MinecraftDownloadService.java | 25 +- .../core/download/MojangDownloadProvider.java | 13 +- .../core/launch/LibraryDownloadTask.java | 14 +- .../core/version/LibraryDownloadInfo.java | 37 ++- .../core/version/MinecraftLibrary.java | 58 +++-- .../hellominecraft/launcher/Main.java | 235 +++++++++--------- .../launcher/setting/Config.java | 5 +- .../launcher/setting/Settings.java | 2 + .../hellominecraft/launcher/ui/MainFrame.java | 33 +-- .../util/tasks/download/FileDownloadTask.java | 8 +- 17 files changed, 454 insertions(+), 198 deletions(-) create mode 100644 HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/AssetsMojangLoader.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/AssetsMojangLoader.java index ad24a5015..126788fd4 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/AssetsMojangLoader.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/AssetsMojangLoader.java @@ -98,7 +98,7 @@ public class AssetsMojangLoader extends IAssetsHandler { @Override public Task getDownloadTask(IDownloadProvider sourceType) { - return new AssetsTask(sourceType.getAssetsDownloadURL()); + return new AssetsTask(sourceType.getAssetsDownloadURL(), sourceType.getRetryAssetsDownloadURL()); } @Override diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/IAssetsHandler.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/IAssetsHandler.java index 7302fba16..96b772a56 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/IAssetsHandler.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/IAssetsHandler.java @@ -34,6 +34,8 @@ import org.jackhuang.hellominecraft.util.code.DigestUtils; import org.jackhuang.hellominecraft.util.system.IOUtils; import org.jackhuang.hellominecraft.util.NetUtils; import org.jackhuang.hellominecraft.util.OverridableSwingWorker; +import org.jackhuang.hellominecraft.util.StrUtils; +import org.jackhuang.hellominecraft.util.func.Function; import org.jackhuang.hellominecraft.util.tasks.TaskInfo; /** @@ -89,30 +91,37 @@ public abstract class IAssetsHandler { protected class AssetsTask extends TaskInfo { - ArrayList al; - String u; + ArrayList tasks; + String baseUrl; + String retryBaseUrl; - public AssetsTask(String url) { + public AssetsTask(String url, String retryUrl) { super(C.i18n("assets.download")); - this.u = url; + this.baseUrl = url; + this.retryBaseUrl = retryUrl; } @Override public void executeTask() { if (assetsDownloadURLs == null || assetsLocalNames == null || contents == null) throw new IllegalStateException(C.i18n("assets.not_refreshed")); + + tasks = new ArrayList<>(); int max = assetsDownloadURLs.size(); - al = new ArrayList<>(); int hasDownloaded = 0; for (int i = 0; i < max; i++) { String mark = assetsDownloadURLs.get(i); - String url = u + mark; + String downloadUrl = baseUrl + mark; + String downloadRetryUrl = StrUtils.isNotBlank(retryBaseUrl) ? retryBaseUrl + mark : ""; File location = assetsLocalNames.get(i); + if (!location.getParentFile().exists() && !location.getParentFile().mkdirs()) HMCLog.warn("Failed to make directories: " + location.getParent()); + if (location.isDirectory()) continue; - boolean need = true; + + boolean needDownload = true; try { if (location.exists()) { FileInputStream fis = new FileInputStream(location); @@ -121,23 +130,39 @@ public abstract class IAssetsHandler { if (contents.get(i).geteTag().equals(sha)) { ++hasDownloaded; HMCLog.log("File " + assetsLocalNames.get(i) + " has been downloaded successfully, skipped downloading."); - if (ppl != null) + if (ppl != null) { ppl.setProgress(this, hasDownloaded, max); + } continue; } } } catch (IOException e) { HMCLog.warn("Failed to get hash: " + location, e); - need = !location.exists(); + needDownload = !location.exists(); } - if (need) - al.add(new FileDownloadTask(url, location).setTag(mark)); + + if (needDownload) { + FileDownloadTask fileDownloadTask = new FileDownloadTask(downloadUrl, location); + fileDownloadTask.setTag(mark); + + // retry + if (StrUtils.isNotBlank(downloadRetryUrl)) { + fileDownloadTask.setFailedCallbackReturnsNewURL(new Function() { + @Override + public String apply(Integer t) { + return downloadRetryUrl; + } + }); + } + + tasks.add(fileDownloadTask); + } } } @Override public Collection getAfterTasks() { - return al; + return tasks; } } } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java index 626dbe7cf..6070e8117 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java @@ -56,7 +56,8 @@ public class MinecraftAssetService extends IMinecraftAssetService { public Task downloadAssets(final MinecraftVersion mv) { if (mv == null) return null; - return IAssetsHandler.ASSETS_HANDLER.getList(mv, service.asset()).after(IAssetsHandler.ASSETS_HANDLER.getDownloadTask(service.getDownloadType().getProvider())); + return IAssetsHandler.ASSETS_HANDLER.getList(mv, service.asset()) + .after(IAssetsHandler.ASSETS_HANDLER.getDownloadTask(service.getDownloadType().getProvider())); } @Override diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadLibraryJob.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadLibraryJob.java index 7c5e28592..a3735004d 100644 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadLibraryJob.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadLibraryJob.java @@ -29,10 +29,12 @@ public class DownloadLibraryJob { public IMinecraftLibrary lib; public String url; + public String retryUrl; public File path; - public DownloadLibraryJob(IMinecraftLibrary n, String u, File p) { + public DownloadLibraryJob(IMinecraftLibrary n, String u, String retry, File p) { url = u; + retryUrl = retry; lib = n; path = IOUtils.tryGetCanonicalFile(p); } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java index 1a7644ef7..14e1711e6 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java @@ -29,7 +29,8 @@ public enum DownloadType { Mojang("download.mojang", new MojangDownloadProvider()), BMCL("download.BMCL", new BMCLAPIDownloadProvider()), //RapidData("download.rapid_data", new RapidDataDownloadProvider()), - Curse("Curse CDN", new CurseDownloadProvider()); + Curse("Curse CDN", new CurseDownloadProvider()), + Dynamic(DynamicDownloadProvider.getInstance().getName(), DynamicDownloadProvider.getInstance()); private final String name; private final IDownloadProvider provider; @@ -47,7 +48,7 @@ public enum DownloadType { return C.i18n(name); } - private static DownloadType suggestedDownloadType = Mojang; + private static DownloadType suggestedDownloadType = Dynamic; public static DownloadType getSuggestedDownloadType() { return suggestedDownloadType; diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java new file mode 100644 index 000000000..29523ab00 --- /dev/null +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java @@ -0,0 +1,149 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2013 huangyuhui + * + * 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.core.download; + +import com.google.gson.reflect.TypeToken; +import java.io.IOException; +import java.util.Map; +import org.jackhuang.hellominecraft.util.C; +import org.jackhuang.hellominecraft.util.NetUtils; +import org.jackhuang.hellominecraft.util.StrUtils; + +/** + * + * @author evilwk + */ +public class DynamicDownloadProvider extends MojangDownloadProvider { + + private static final String PROVIDER_ADDR = "http://localhost/provider.php"; + + private volatile static DynamicDownloadProvider instance; + + private String librariesAddr = null; + private String assetsAddr = null; + private String name = "MCHost"; + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public String getLibrariesAddr() { + return librariesAddr; + } + + public void setLibrariesAddr(String librariesAddr) { + this.librariesAddr = librariesAddr; + } + + public String getAssetsAddr() { + return assetsAddr; + } + + public void setAssetsAddr(String assetsAddr) { + this.assetsAddr = assetsAddr; + } + + + private DynamicDownloadProvider() { + + } + + public static DynamicDownloadProvider getInstance() { + if (instance == null) { + synchronized (DynamicDownloadProvider.class) { + if (instance == null) { + instance = new DynamicDownloadProvider(); + } + } + } + return instance; + } + + @Override + public String getRetryAssetsDownloadURL() { + return super.getAssetsDownloadURL(); + } + + @Override + public String getRetryLibraryDownloadURL() { + return super.getLibraryDownloadURL(); + } + + @Override + public String getAssetsDownloadURL() { + if (StrUtils.isNotBlank(assetsAddr)) { + return assetsAddr; + } + return super.getAssetsDownloadURL(); + } + + @Override + public String getLibraryDownloadURL() { + if (StrUtils.isNotBlank(librariesAddr)) { + return librariesAddr; + } + return super.getLibraryDownloadURL(); + } + + @Override + public String getParsedDownloadURL(String str) { + if (StrUtils.isNotBlank(librariesAddr)) { + str = str.replace("https://libraries.minecraft.net", librariesAddr); + } + return super.getParsedDownloadURL(str); + } + + public void init() { + new Thread() { + @Override + public void run() { + try { + String providerInfo = NetUtils.get(PROVIDER_ADDR); + Map addrInfo = null; + addrInfo = C.GSON.fromJson(providerInfo, new TypeToken>(){}.getType()); + if (addrInfo != null) { + if (addrInfo.containsKey("libraries")) { + String librariesAddr = addrInfo.get("libraries"); + if (StrUtils.isNotBlank(librariesAddr)) { + DynamicDownloadProvider.this.setLibrariesAddr(librariesAddr); + } + } + if (addrInfo.containsKey("assets")) { + String assetsAddr = addrInfo.get("assets"); + if (StrUtils.isNotBlank(assetsAddr)) { + DynamicDownloadProvider.this.setAssetsAddr(assetsAddr); + } + } + if (addrInfo.containsKey("name")) { + String name = addrInfo.get("name"); + if (StrUtils.isNotBlank(name)) { + DynamicDownloadProvider.this.setName(name); + } + } + } + } catch (IOException ex) { + + } + } + }.start(); + } +} diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/IDownloadProvider.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/IDownloadProvider.java index b6142969d..2d01c09b9 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/IDownloadProvider.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/IDownloadProvider.java @@ -38,7 +38,7 @@ public abstract class IDownloadProvider { return null; } } - + public abstract InstallerVersionList getForgeInstaller(); public abstract InstallerVersionList getLiteLoaderInstaller(); @@ -46,6 +46,10 @@ public abstract class IDownloadProvider { public abstract InstallerVersionList getOptiFineInstaller(); public abstract String getLibraryDownloadURL(); + + public String getRetryLibraryDownloadURL() { + return ""; + } public abstract String getVersionsDownloadURL(); @@ -55,6 +59,10 @@ public abstract class IDownloadProvider { public abstract String getAssetsDownloadURL(); + public String getRetryAssetsDownloadURL() { + return ""; + } + /** * For example, minecraft.json/assetIndex/url or * minecraft.json/downloads/client/url diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java index 478ce10f5..e8c5feb51 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java @@ -31,6 +31,7 @@ import org.jackhuang.hellominecraft.launcher.core.GameException; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.launcher.core.version.GameDownloadInfo; import org.jackhuang.hellominecraft.launcher.core.version.IMinecraftLibrary; +import org.jackhuang.hellominecraft.launcher.core.version.LibraryDownloadInfo; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion; import org.jackhuang.hellominecraft.util.tasks.download.FileDownloadTask; import org.jackhuang.hellominecraft.util.func.Function; @@ -53,14 +54,17 @@ public class MinecraftDownloadService extends IMinecraftDownloadService { ArrayList downloadLibraries = new ArrayList<>(); if (mv == null) return downloadLibraries; + MinecraftVersion v = mv.resolve(service.version()); - for (IMinecraftLibrary l : v.getLibraries()) - if (l != null && l.allow() && l.getDownloadInfo() != null) { - File ff = l.getFilePath(service.baseDirectory()); + for (IMinecraftLibrary libraryInfo : v.getLibraries()) + if (libraryInfo != null && libraryInfo.allow() && libraryInfo.getDownloadInfo() != null) { + File ff = libraryInfo.getFilePath(service.baseDirectory()); if (!ff.exists()) { - String libURL = l.getDownloadInfo().getUrl(service.getDownloadType()); - if (libURL != null) - downloadLibraries.add(new DownloadLibraryJob(l, libURL, ff)); + LibraryDownloadInfo downloadInfo = libraryInfo.getDownloadInfo(); + String downloadUrl = downloadInfo.getUrl(service.getDownloadType()); + String retryDownloadUrl = downloadInfo.getRetryUrl(service.getDownloadType()); + if (downloadUrl != null) + downloadLibraries.add(new DownloadLibraryJob(libraryInfo, downloadUrl, retryDownloadUrl, ff)); } } return downloadLibraries; @@ -114,10 +118,13 @@ public class MinecraftDownloadService extends IMinecraftDownloadService { } @Override - public String apply(Integer t) { - return DownloadType.values()[t / 2].getProvider().getVersionsDownloadURL() + suffix; + public String apply(Integer repeat) { + int index = repeat / 2; + if (index > DownloadType.values().length) { + index = 0; + } + return DownloadType.values()[index].getProvider().getVersionsDownloadURL() + suffix; } - } @Override diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MojangDownloadProvider.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MojangDownloadProvider.java index 6882922dd..aa015fe75 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MojangDownloadProvider.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MojangDownloadProvider.java @@ -41,27 +41,32 @@ public class MojangDownloadProvider extends IDownloadProvider { public InstallerVersionList getOptiFineInstaller() { return org.jackhuang.hellominecraft.launcher.core.install.optifine.vanilla.OptiFineVersionList.getInstance(); } - + + // jars @Override public String getLibraryDownloadURL() { return "https://libraries.minecraft.net"; } + // jars @Override public String getVersionsDownloadURL() { return "http://s3.amazonaws.com/Minecraft.Download/versions/"; } - + + // resource @Override public String getIndexesDownloadURL() { return "http://s3.amazonaws.com/Minecraft.Download/indexes/"; } - + + // game versions json @Override public String getVersionsListDownloadURL() { return "https://launchermeta.mojang.com/mc/game/version_manifest.json"; } - + + // resource @Override public String getAssetsDownloadURL() { return "https://resources.download.minecraft.net/"; diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/LibraryDownloadTask.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/LibraryDownloadTask.java index 3cd1cfbb9..c088f74ed 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/LibraryDownloadTask.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/LibraryDownloadTask.java @@ -21,6 +21,8 @@ import java.io.File; import java.net.URL; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.launcher.core.download.DownloadLibraryJob; +import org.jackhuang.hellominecraft.util.StrUtils; +import org.jackhuang.hellominecraft.util.func.Function; import org.jackhuang.hellominecraft.util.tasks.download.FileDownloadTask; /** @@ -49,12 +51,20 @@ public class LibraryDownloadTask extends FileDownloadTask { if (s.length == 3 && s[2].length() > 3) job.url = "http://dl.liteloader.com/versions/com/mumfrey/liteloader/" + s[2].substring(0, s[2].length() - 3) + "/liteloader-" + s[2] + ".jar"; } - download(new URL(job.url), job.path); + download(new URL(job.url), job.retryUrl, job.path); } - void download(URL url, File filePath) throws Throwable { + void download(URL url, String retryUrl, File filePath) throws Throwable { this.url = url; this.filePath = filePath; + if (StrUtils.isNotBlank(retryUrl)) { + this.failedCallbackReturnsNewURL = new Function() { + @Override + public String apply(Integer t) { + return retryUrl; + } + }; + } super.executeTask(); } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java index f2cb07a3e..7ae1f8960 100644 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java @@ -19,6 +19,7 @@ package org.jackhuang.hellominecraft.launcher.core.version; import com.google.gson.annotations.SerializedName; import org.jackhuang.hellominecraft.launcher.core.download.DownloadType; +import org.jackhuang.hellominecraft.launcher.core.download.IDownloadProvider; import org.jackhuang.hellominecraft.util.StrUtils; import org.jackhuang.hellominecraft.util.system.IOUtils; @@ -35,14 +36,36 @@ public class LibraryDownloadInfo extends GameDownloadInfo { @Override public String getUrl(DownloadType dt, boolean allowSelf) { - String myURL = (forgeURL == null ? dt.getProvider().getLibraryDownloadURL() : forgeURL); - if (StrUtils.isNotBlank(url) && allowSelf) - myURL = url; - if (!myURL.endsWith(".jar")) + IDownloadProvider provider = dt.getProvider(); + String downloadUrl = (forgeURL == null ? provider.getLibraryDownloadURL() : forgeURL); + if (StrUtils.isNotBlank(url) && allowSelf) { + downloadUrl = provider.getParsedDownloadURL(url); + } + return getUrlWithBaseUrl(downloadUrl); + } + + public String getUrlWithBaseUrl(String baseUrl) { + if (!baseUrl.endsWith(".jar")) { if (path == null) return null; else - myURL = IOUtils.addURLSeparator(myURL) + path.replace('\\', '/'); - return myURL; - } + baseUrl = IOUtils.addURLSeparator(baseUrl) + path.replace('\\', '/'); + } + return baseUrl; + } + + public String getRetryUrl(DownloadType dt) { + IDownloadProvider provider = dt.getProvider(); + String retryBaseUrl = provider.getRetryLibraryDownloadURL(); + if (StrUtils.isBlank(retryBaseUrl)) { + return null; + } + + String downloadUrl = (forgeURL == null ? retryBaseUrl : forgeURL); + if (StrUtils.isNotBlank(url) && provider.isAllowedToUseSelfURL()) { + downloadUrl = url; + } + + return getUrlWithBaseUrl(downloadUrl); + } } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftLibrary.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftLibrary.java index 5c6baede3..b4266a53c 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftLibrary.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftLibrary.java @@ -48,29 +48,25 @@ public class MinecraftLibrary extends IMinecraftLibrary { public MinecraftLibrary(ArrayList rules, String url, Natives natives, String name, Extract extract, LibraryDownloadInfo downloads) { super(name); - this.rules = rules == null ? null : (ArrayList) rules.clone(); + this.rules = (rules == null) ? null : (ArrayList) rules.clone(); this.url = url; - this.natives = natives == null ? null : (Natives) natives.clone(); - this.extract = extract == null ? null : (Extract) extract.clone(); + this.natives = (natives == null) ? null : (Natives) natives.clone(); + this.extract = (extract == null) ? null : (Extract) extract.clone(); } - /** - * is the library allowed to load. - * - * @return - */ @Override public boolean allow() { if (rules != null) { boolean flag = false; - for (Rules r : rules) + for (Rules r : rules) { if ("disallow".equals(r.action())) return false; else if ("allow".equals(r.action())) flag = true; + } return flag; - } else - return true; + } + return true; } private String formatArch(String nati) { @@ -95,19 +91,24 @@ public class MinecraftLibrary extends IMinecraftLibrary { public String formatName() { String[] s = name.split(":"); - if (s.length < 3) + if (s.length < 3) { return null; + } + StringBuilder sb = new StringBuilder(s[0].replace('.', '/')).append('/').append(s[1]).append('/').append(s[2]).append('/').append(s[1]).append('-').append(s[2]); - if (natives != null) + if (natives != null) { sb.append('-').append(getNative()); + } + return sb.append(".jar").toString(); } @Override public File getFilePath(File gameDir) { LibraryDownloadInfo info = getDownloadInfo(); - if (info == null) + if (info == null) { return null; + } return new File(gameDir, "libraries/" + info.path); } @@ -117,25 +118,34 @@ public class MinecraftLibrary extends IMinecraftLibrary { } public LibraryDownloadInfo getDownloadInfo() { - if (downloads == null) + if (downloads == null) { downloads = new LibrariesDownloadInfo(); - LibraryDownloadInfo info; + } + + LibraryDownloadInfo info = null; if (natives != null) { - if (downloads.classifiers == null) + if (downloads.classifiers == null) { downloads.classifiers = new HashMap<>(); - if (!downloads.classifiers.containsKey(getNative())) - downloads.classifiers.put(getNative(), info = new LibraryDownloadInfo()); - else - info = downloads.classifiers.get(getNative()); - } else if (downloads.artifact == null) + } else { + if (!downloads.classifiers.containsKey(getNative())) { + downloads.classifiers.put(getNative(), info = new LibraryDownloadInfo()); + } else { + info = downloads.classifiers.get(getNative()); + } + } + } else if (downloads.artifact == null) { downloads.artifact = info = new LibraryDownloadInfo(); - else + } else { info = downloads.artifact; + } + if (StrUtils.isBlank(info.path)) { info.path = formatName(); - if (info.path == null) + if (info.path == null) { return null; + } } + info.forgeURL = this.url; return info; } 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 a4e8d2689..fbe1709cd 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java @@ -59,144 +59,147 @@ import org.jackhuang.hellominecraft.util.VersionNumber; */ public final class Main implements Runnable { - private static final X509TrustManager XTM = new X509TrustManager() { - @Override - public void checkClientTrusted(X509Certificate[] chain, String authType) { - } + 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 void checkServerTrusted(X509Certificate[] chain, String authType) { + } - @Override - public X509Certificate[] getAcceptedIssuers() { - return new X509Certificate[0]; - } - }; - private static final HostnameVerifier HNV = (hostname, session) -> true; + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + }; + private static final HostnameVerifier HNV = (hostname, session) -> true; - static { - SSLContext sslContext = null; + 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()); + 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); - } + HttpsURLConnection.setDefaultHostnameVerifier(HNV); + } - public static final String LAUNCHER_NAME = "Hello Minecraft! Launcher"; - public static final String LAUNCHER_VERSION = "@HELLO_MINECRAFT_LAUNCHER_VERSION_FOR_GRADLE_REPLACING@"; - public static final int MINIMUM_LAUNCHER_VERSION = 16; + public static final String LAUNCHER_NAME = "Hello Minecraft! Launcher"; + public static final String LAUNCHER_VERSION = "@HELLO_MINECRAFT_LAUNCHER_VERSION_FOR_GRADLE_REPLACING@"; + public static final int MINIMUM_LAUNCHER_VERSION = 16; - public static VersionNumber getVersionNumber() { - return VersionNumber.check(LAUNCHER_VERSION); - } + public static VersionNumber getVersionNumber() { + return VersionNumber.check(LAUNCHER_VERSION); + } - /** - * Make the main window title. - * - * @return the MainWindow title. - */ - public static String makeTitle() { - return LAUNCHER_NAME + ' ' + LAUNCHER_VERSION; - } + /** + * Make the main window title. + * + * @return the MainWindow title. + */ + public static String makeTitle() { + return LAUNCHER_NAME + ' ' + LAUNCHER_VERSION; + } - public static String shortTitle() { - return "HMCL" + ' ' + LAUNCHER_VERSION; - } + public static String shortTitle() { + return "HMCL" + ' ' + LAUNCHER_VERSION; + } - public static final Main INSTANCE = new Main(); - private static HelloMinecraftLookAndFeel LOOK_AND_FEEL; + public static final Main INSTANCE = new Main(); + private static HelloMinecraftLookAndFeel LOOK_AND_FEEL; - private static final Logger LOGGER = Logger.getLogger(Main.class.getName()); + private static final Logger LOGGER = Logger.getLogger(Main.class.getName()); - @SuppressWarnings({ "CallToPrintStackTrace", "UseSpecificCatch" }) - public static void main(String[] args) throws IOException { - { - PluginManager.getPlugin(DefaultPlugin.class); - if (IUpgrader.NOW_UPGRADER.parseArguments(getVersionNumber(), args)) - return; + @SuppressWarnings({"CallToPrintStackTrace", "UseSpecificCatch"}) + public static void main(String[] args) throws IOException { + PluginManager.getPlugin(DefaultPlugin.class); + if (IUpgrader.NOW_UPGRADER.parseArguments(getVersionNumber(), args)) { + return; + } - System.setProperty("awt.useSystemAAFontSettings", "on"); - System.setProperty("swing.aatext", "true"); - System.setProperty("sun.java2d.noddraw", "true"); - System.setProperty("sun.java2d.dpiaware", "false"); - Thread.setDefaultUncaughtExceptionHandler(new CrashReporter(true)); + System.setProperty("awt.useSystemAAFontSettings", "on"); + System.setProperty("swing.aatext", "true"); + System.setProperty("sun.java2d.noddraw", "true"); + System.setProperty("sun.java2d.dpiaware", "false"); + Thread.setDefaultUncaughtExceptionHandler(new CrashReporter(true)); - try { - File file = new File("hmcl.log"); - if (!file.exists() && !file.createNewFile()) - HMCLog.warn("Failed to create log file " + file); - Configuration.DEFAULT.appenders.add(new ConsoleAppender("File", new DefaultLayout(), true, new FileOutputStream(file), true)); - } catch (IOException ex) { - LOGGER.log(Level.SEVERE, "Failed to add log appender File because an error occurred while creating or opening hmcl.log", ex); - } + try { + File file = new File("hmcl.log"); + if (!file.exists() && !file.createNewFile()) { + HMCLog.warn("Failed to create log file " + file); + } + Configuration.DEFAULT.appenders.add(new ConsoleAppender("File", new DefaultLayout(), true, new FileOutputStream(file), true)); + } catch (IOException ex) { + LOGGER.log(Level.SEVERE, "Failed to add log appender File because an error occurred while creating or opening hmcl.log", ex); + } - HMCLog.log("*** " + Main.makeTitle() + " ***"); + HMCLog.log("*** " + Main.makeTitle() + " ***"); - String s = Settings.getInstance().getLocalization(); - for (SupportedLocales sl : SupportedLocales.values()) - if (sl.name().equals(s)) { - SupportedLocales.NOW_LOCALE = sl; - Locale.setDefault(sl.self); - } + String s = Settings.getInstance().getLocalization(); + for (SupportedLocales sl : SupportedLocales.values()) { + if (sl.name().equals(s)) { + SupportedLocales.NOW_LOCALE = sl; + Locale.setDefault(sl.self); + } + } - LogWindow.INSTANCE.clean(); - LogWindow.INSTANCE.setTerminateGame(GameLauncher.PROCESS_MANAGER::stopAllProcesses); + LogWindow.INSTANCE.clean(); + LogWindow.INSTANCE.setTerminateGame(GameLauncher.PROCESS_MANAGER::stopAllProcesses); - try { - LOOK_AND_FEEL = new HelloMinecraftLookAndFeel(Settings.getInstance().getTheme().settings); - UIManager.setLookAndFeel(LOOK_AND_FEEL); - } catch (ParseException | UnsupportedLookAndFeelException ex) { - HMCLog.warn("Failed to set look and feel...", ex); - } + try { + LOOK_AND_FEEL = new HelloMinecraftLookAndFeel(Settings.getInstance().getTheme().settings); + UIManager.setLookAndFeel(LOOK_AND_FEEL); + } catch (ParseException | UnsupportedLookAndFeelException ex) { + HMCLog.warn("Failed to set look and feel...", ex); + } - Settings.UPDATE_CHECKER.outdated.register(IUpgrader.NOW_UPGRADER); - Settings.UPDATE_CHECKER.process(false).reg(t -> Main.invokeUpdate()).execute(); + Settings.UPDATE_CHECKER.outdated.register(IUpgrader.NOW_UPGRADER); + Settings.UPDATE_CHECKER.process(false).reg(t -> Main.invokeUpdate()).execute(); - if (StrUtils.isNotBlank(Settings.getInstance().getProxyHost()) && StrUtils.isNotBlank(Settings.getInstance().getProxyPort()) && MathUtils.canParseInt(Settings.getInstance().getProxyPort())) { - HMCLog.log("Initializing customized proxy"); - System.setProperty("http.proxyHost", Settings.getInstance().getProxyHost()); - System.setProperty("http.proxyPort", Settings.getInstance().getProxyPort()); - if (StrUtils.isNotBlank(Settings.getInstance().getProxyUserName()) && StrUtils.isNotBlank(Settings.getInstance().getProxyPassword())) - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(Settings.getInstance().getProxyUserName(), Settings.getInstance().getProxyPassword().toCharArray()); - } - }); - } + if (StrUtils.isNotBlank(Settings.getInstance().getProxyHost()) && StrUtils.isNotBlank(Settings.getInstance().getProxyPort()) && MathUtils.canParseInt(Settings.getInstance().getProxyPort())) { + HMCLog.log("Initializing customized proxy"); + System.setProperty("http.proxyHost", Settings.getInstance().getProxyHost()); + System.setProperty("http.proxyPort", Settings.getInstance().getProxyPort()); + if (StrUtils.isNotBlank(Settings.getInstance().getProxyUserName()) && StrUtils.isNotBlank(Settings.getInstance().getProxyPassword())) { + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(Settings.getInstance().getProxyUserName(), Settings.getInstance().getProxyPassword().toCharArray()); + } + }); + } + } - try { - PluginManager.plugin().showUI(); - } catch (Throwable t) { - new CrashReporter(false).uncaughtException(Thread.currentThread(), t); - System.exit(1); - } - } - } + try { + PluginManager.plugin().showUI(); + } catch (Throwable t) { + new CrashReporter(false).uncaughtException(Thread.currentThread(), t); + System.exit(1); + } + } - @Override - public void run() { - GameLauncher.PROCESS_MANAGER.stopAllProcesses(); - } + @Override + public void run() { + GameLauncher.PROCESS_MANAGER.stopAllProcesses(); + } - public static void invokeUpdate() { - MainFrame.INSTANCE.invokeUpdate(); - } + public static void invokeUpdate() { + MainFrame.INSTANCE.invokeUpdate(); + } - public static ImageIcon getIcon(String path) { - try { - return new ImageIcon(Main.class.getResource("/org/jackhuang/hellominecraft/launcher/" + path)); - } catch (Exception e) { - HMCLog.err("Failed to load icon", e); - return null; - } - } + public static ImageIcon getIcon(String path) { + try { + return new ImageIcon(Main.class.getResource("/org/jackhuang/hellominecraft/launcher/" + path)); + } catch (Exception e) { + HMCLog.err("Failed to load icon", e); + return null; + } + } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java index 1657642f9..88d94c892 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java @@ -193,7 +193,8 @@ public final class Config implements Cloneable { public Config() { clientToken = UUID.randomUUID().toString(); - logintype = downloadtype = 0; + logintype = 0; + downloadtype = DownloadType.Dynamic.ordinal(); enableShadow = false; enableAnimation = true; theme = 4; @@ -203,7 +204,7 @@ public final class Config implements Cloneable { public DownloadType getDownloadSource() { if (downloadtype >= DownloadType.values().length || downloadtype < 0) { - downloadtype = 0; + downloadtype = DownloadType.Dynamic.ordinal(); Settings.save(); } return DownloadType.values()[downloadtype]; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java index 2dcdbaccf..e05c5adf3 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java @@ -22,6 +22,8 @@ import java.io.File; import java.io.IOException; import java.util.Collection; import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.launcher.Main; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java index aae86082a..641f4eb59 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java @@ -48,6 +48,7 @@ import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.launcher.Main; import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.launcher.core.auth.IAuthenticator; +import org.jackhuang.hellominecraft.launcher.core.download.DynamicDownloadProvider; import org.jackhuang.hellominecraft.util.ui.GraphicsUtils; import org.jackhuang.hellominecraft.lookandfeel.Theme; import org.jackhuang.hellominecraft.util.MessageBox; @@ -85,23 +86,27 @@ public final class MainFrame extends DraggableFrame { setUndecorated(!Settings.getInstance().isDecorated()); defaultTitle = isUndecorated() ? Main.makeTitle() : ""; enableShadow = Settings.getInstance().isEnableShadow() && isUndecorated(); - if (enableShadow) - setContentSize(834, 542); - else + if (enableShadow) { + setContentSize(834, 542); + } else { setContentSize(802, 511); + } + setDefaultCloseOperation(EXIT_ON_CLOSE); setTitle(Main.makeTitle()); initComponents(); loadBackground(); + + DynamicDownloadProvider.getInstance().init(); setLocationRelativeTo(null); - if (MainFrame.this.isUndecorated()) + if (MainFrame.this.isUndecorated()) { setResizable(false); + } this.addWindowListener(new WindowListener() { @Override - public void windowOpened(WindowEvent e) { - } + public void windowOpened(WindowEvent e) { } @Override public void windowClosing(WindowEvent e) { @@ -109,16 +114,13 @@ public final class MainFrame extends DraggableFrame { } @Override - public void windowClosed(WindowEvent e) { - } + public void windowClosed(WindowEvent e) { } @Override - public void windowIconified(WindowEvent e) { - } + public void windowIconified(WindowEvent e) { } @Override - public void windowDeiconified(WindowEvent e) { - } + public void windowDeiconified(WindowEvent e) { } @Override public void windowActivated(WindowEvent e) { @@ -131,11 +133,10 @@ public final class MainFrame extends DraggableFrame { } @Override - public void windowDeactivated(WindowEvent e) { - } + public void windowDeactivated(WindowEvent e) { } }); - if (enableShadow) + if (enableShadow) { try { setBackground(new Color(0, 0, 0, 0)); getRootPane().setBorder(border = new DropShadowBorder(borderColor, 4)); @@ -144,6 +145,8 @@ public final class MainFrame extends DraggableFrame { Settings.getInstance().setEnableShadow(false); setSize(802, 511); } + } + ((JPanel) getContentPane()).setOpaque(true); Settings.getInstance().themeChangedEvent.register(this::reloadColor); diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java index d4e97809f..c21c1c4a8 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java @@ -118,7 +118,7 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev this.url = IOUtils.parseURL(p.getResult()); for (int repeat = 0; repeat < 6; repeat++) { - if (repeat > 0) + if (repeat > 0) { if (failedCallbackReturnsNewURL != null) { URL tmp = IOUtils.parseURL(failedCallbackReturnsNewURL.apply(repeat)); if (tmp != null) { @@ -126,6 +126,8 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev HMCLog.warn("Switch to: " + url); } } + } + HMCLog.log("Downloading: " + url + ", to: " + filePath); if (!shouldContinue) break; @@ -260,4 +262,8 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev al.add(pr); return this; } + + public void setFailedCallbackReturnsNewURL() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } } From 4537f9e48f75e93b96ceec26a4d9b9b75d432073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Wed, 29 Jun 2016 15:47:40 +0800 Subject: [PATCH 04/46] =?UTF-8?q?=20=E4=BF=AE=E6=AD=A3library=E8=A1=A5?= =?UTF-8?q?=E5=85=A8Bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/version/LibraryDownloadInfo.java | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java index 7ae1f8960..c91090ea6 100644 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java @@ -39,33 +39,35 @@ public class LibraryDownloadInfo extends GameDownloadInfo { IDownloadProvider provider = dt.getProvider(); String downloadUrl = (forgeURL == null ? provider.getLibraryDownloadURL() : forgeURL); if (StrUtils.isNotBlank(url) && allowSelf) { - downloadUrl = provider.getParsedDownloadURL(url); + downloadUrl = url; } - return getUrlWithBaseUrl(downloadUrl); + return provider.getParsedDownloadURL(getUrlWithBaseUrl(downloadUrl)); } - public String getUrlWithBaseUrl(String baseUrl) { - if (!baseUrl.endsWith(".jar")) { - if (path == null) - return null; - else - baseUrl = IOUtils.addURLSeparator(baseUrl) + path.replace('\\', '/'); - } - return baseUrl; - } - public String getRetryUrl(DownloadType dt) { IDownloadProvider provider = dt.getProvider(); String retryBaseUrl = provider.getRetryLibraryDownloadURL(); - if (StrUtils.isBlank(retryBaseUrl)) { - return null; - } String downloadUrl = (forgeURL == null ? retryBaseUrl : forgeURL); if (StrUtils.isNotBlank(url) && provider.isAllowedToUseSelfURL()) { downloadUrl = url; } - return getUrlWithBaseUrl(downloadUrl); + if (StrUtils.isBlank(downloadUrl)) { + return null; + } + + return provider.getParsedDownloadURL(getUrlWithBaseUrl(downloadUrl)); + } + + private String getUrlWithBaseUrl(String baseUrl) { + if (!baseUrl.endsWith(".jar")) { + if (path == null) { + return null; + } else { + baseUrl = IOUtils.addURLSeparator(baseUrl) + path.replace('\\', '/'); + } + } + return baseUrl; } } From 3dd421a2bfb7719819caf86450ffcc622917749b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Wed, 29 Jun 2016 16:54:29 +0800 Subject: [PATCH 05/46] fix library url parse --- .../launcher/core/download/DynamicDownloadProvider.java | 4 ++-- .../launcher/core/version/LibraryDownloadInfo.java | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java index 29523ab00..cb772d9e2 100644 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java @@ -30,13 +30,13 @@ import org.jackhuang.hellominecraft.util.StrUtils; */ public class DynamicDownloadProvider extends MojangDownloadProvider { - private static final String PROVIDER_ADDR = "http://localhost/provider.php"; + private static final String PROVIDER_ADDR = "http://client.api.mcgogogo.com:81/provider.php"; private volatile static DynamicDownloadProvider instance; private String librariesAddr = null; private String assetsAddr = null; - private String name = "MCHost"; + private String name = "精灵"; public void setName(String name) { this.name = name; diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java index c91090ea6..2182af377 100644 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java @@ -40,7 +40,7 @@ public class LibraryDownloadInfo extends GameDownloadInfo { String downloadUrl = (forgeURL == null ? provider.getLibraryDownloadURL() : forgeURL); if (StrUtils.isNotBlank(url) && allowSelf) { downloadUrl = url; - } + } // forced replace: Let different download sources into force return provider.getParsedDownloadURL(getUrlWithBaseUrl(downloadUrl)); } @@ -57,7 +57,12 @@ public class LibraryDownloadInfo extends GameDownloadInfo { return null; } - return provider.getParsedDownloadURL(getUrlWithBaseUrl(downloadUrl)); + downloadUrl = getUrlWithBaseUrl(downloadUrl); + if (downloadUrl.contains("minecraftforge")) { // fix forge url + downloadUrl = provider.getParsedDownloadURL(downloadUrl); + } + + return downloadUrl; } private String getUrlWithBaseUrl(String baseUrl) { From 27e58edb1f04536e72a6302e4076677464d096bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Thu, 30 Jun 2016 20:05:12 +0800 Subject: [PATCH 06/46] MainPagePanel content --- .../launcher/ui/MainPagePanel.form | 11 + .../launcher/ui/MainPagePanel.java | 15 +- .../launcher/ui/RecommendPanel.java | 245 ++++++++++++++++++ .../hellominecraft/util/NetUtils.java | 19 ++ 4 files changed, 288 insertions(+), 2 deletions(-) create mode 100644 HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form index 4a7db3ca7..7e56b8a94 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form @@ -277,5 +277,16 @@
+ + + + + + + + + + + diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java index c621b7ba7..91f6ba280 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java @@ -61,7 +61,7 @@ public class MainPagePanel extends AnimatedPanel { void initGui() { initComponents(); - + pnlButtons = new javax.swing.JPanel(); pnlButtons.setLayout(null); @@ -84,6 +84,9 @@ public class MainPagePanel extends AnimatedPanel { pnlMore.setBounds(0, 0, pnlMore.getWidth(), DEFAULT_HEIGHT); pnlMore.setBackground(GraphicsUtils.getWebColorWithAlpha("FFFFFF7F")); pnlMore.setOpaque(true); + + recommendPanel = new RecommendPanel(); + contentPanel.add(recommendPanel); Settings.getInstance().authChangedEvent.register(onAuthChanged); Settings.profileLoadingEvent.register(onLoadingProfiles); @@ -122,6 +125,7 @@ public class MainPagePanel extends AnimatedPanel { btnLogout = new javax.swing.JButton(); btnImportModpack = new javax.swing.JButton(); btnExportModpack = new javax.swing.JButton(); + contentPanel = new javax.swing.JPanel(); setLayout(null); @@ -262,7 +266,7 @@ public class MainPagePanel extends AnimatedPanel { .addComponent(lblVersion, javax.swing.GroupLayout.Alignment.TRAILING)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(pnlMoreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(cboProfiles, 0, 128, Short.MAX_VALUE) + .addComponent(cboProfiles, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(cboVersions, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addGroup(pnlMoreLayout.createSequentialGroup() .addGroup(pnlMoreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -306,6 +310,10 @@ public class MainPagePanel extends AnimatedPanel { add(pnlMore); pnlMore.setBounds(0, 0, 190, 480); + + contentPanel.setLayout(null); + add(contentPanel); + contentPanel.setBounds(220, 40, 540, 320); }// //GEN-END:initComponents private void txtPlayerNameFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPlayerNameFocusGained @@ -426,6 +434,8 @@ public class MainPagePanel extends AnimatedPanel { super.onCreate(); Settings.onProfileLoading(); } + + private RecommendPanel recommendPanel; // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnExportModpack; @@ -434,6 +444,7 @@ public class MainPagePanel extends AnimatedPanel { private javax.swing.JComboBox cboLoginMode; private javax.swing.JComboBox cboProfiles; private javax.swing.JComboBox cboVersions; + private javax.swing.JPanel contentPanel; private javax.swing.JLabel jLabel10; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel9; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java new file mode 100644 index 000000000..a4cfc5855 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java @@ -0,0 +1,245 @@ +/* + * Copyright (C) 2016 evilwk + * + * 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 . + */ +package org.jackhuang.hellominecraft.launcher.ui; + +import java.awt.Graphics; +import java.awt.Image; +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutionException; +import javax.imageio.ImageIO; +import javax.swing.JPanel; +import javax.swing.SwingWorker; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import javax.swing.SwingUtilities; +import org.jackhuang.hellominecraft.util.NetUtils; +import org.jackhuang.hellominecraft.util.ui.SwingUtils; + +/** + * + * @author evilwk + */ +public class RecommendPanel extends JPanel { + + private static final int SWITCH_INTERVAL = 10; + + private Image currImage; + private String imageKey = null; + private List recommends; + public ScheduledExecutorService scheduledexec = Executors.newScheduledThreadPool(1); + + public RecommendPanel() { + recommends = new ArrayList(); + new LoadImages().execute(); + + addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + MouseClicked(e); + } + }); + } + + private void MouseClicked(MouseEvent evt) { + if (imageKey == null) { + return; + } + RecommendInfo info = recommends.get(getCurrentImageIndex()); + if (info.link != null && !info.link.equals("")) { + SwingUtils.openLink(info.link); + } + } + + public void showImages() { + if (recommends.isEmpty()) { + return; + } + + new Thread(new Runnable() { + @Override + public void run() { + for (RecommendInfo info : recommends) { + try { + File tempFile = File.createTempFile("hmcl", "png"); + String tempPath = tempFile.getCanonicalPath(); + if (NetUtils.download(info.url, tempPath)) { + info.image = ImageIO.read(tempFile); + } + } catch (IOException ex) { + } + } + + if (getImagesSize() == 0 || showIfOnly()) { + return; + } + scheduledexec.scheduleAtFixedRate(new Runnable() { + @Override + public void run() { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + int showIndex = getNextImageIndex(); + RecommendInfo info = recommends.get(showIndex); + RecommendPanel.this.setImage(info.url, info.image); + } + }); + } + }, 0, SWITCH_INTERVAL, TimeUnit.SECONDS); + } + }).start(); + } + + public int getImagesSize() { + int imageCount = 0; + for (RecommendInfo recommend : recommends) { + if (recommend.image != null) { + imageCount++; + } + } + return imageCount; + } + + public boolean showIfOnly() { + if (getImagesSize() != 1) { + return false; + } + for (RecommendInfo recommend : recommends) { + if (recommend.image != null) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + RecommendPanel.this.setImage(recommend.url, recommend.image); + } + }); + } + } + return true; + } + + public int getNextImageIndex(int showIndex) { + if (showIndex >= recommends.size()) { + showIndex = 0; + } + RecommendInfo info = recommends.get(showIndex); + if (info.image == null) { + showIndex = getNextImageIndex(++showIndex); + } + return showIndex; + } + + public int getNextImageIndex() { + int showIndex = 0; + if (imageKey != null) { + showIndex = getCurrentImageIndex(); + showIndex++; + } + if (showIndex >= recommends.size()) { + showIndex = 0; + } + showIndex = getNextImageIndex(showIndex); + return showIndex >= recommends.size() ? 0 : showIndex; + } + + public int getCurrentImageIndex() { + int currIndex = 0; + for (int i = 0; i < recommends.size(); i++) { + RecommendInfo info = recommends.get(i); + if (imageKey != null && info.url.equals(imageKey)) { + currIndex = i; + break; + } + } + return currIndex; + } + + public void setImage(String key, Image image) { + this.imageKey = key; + this.currImage = image; + setSize(image.getWidth(this), image.getHeight(this)); + SwingUtilities.updateComponentTreeUI(this.getRootPane()); + } + + @Override + public void paintComponent(Graphics g) { + if (null == currImage) { + return; + } + g.drawImage(currImage, 0, 0, currImage.getWidth(this), currImage.getHeight(this), this); + } + + static class RecommendInfo { + String url; + String link; + Image image; + } + + class LoadImages extends SwingWorker>, Void> { + + private static final String RECOMMEND_URL = "http://client.api.mcgogogo.com:81/recommend.php"; + + @Override + protected List> doInBackground() throws Exception { + List> infos = null; + do { + String content = NetUtils.get(RECOMMEND_URL); + if (content == null || content.equals("")) { + break; + } + + Map data = new Gson().fromJson(content, + new TypeToken>() { + }.getType()); + if (data == null) { + break; + } + + infos = (List>) data.get("data"); + } while (false); + return infos; + } + + @Override + protected void done() { + try { + List> infos = this.get(); + if (infos == null) { + return; + } + for (Map info : infos) { + RecommendInfo recommend = new RecommendInfo(); + recommend.url = info.get("url"); + recommend.link = info.get("link"); + recommend.image = null; + recommends.add(recommend); + } + RecommendPanel.this.showImages(); + } catch (InterruptedException | ExecutionException ex) { + } + } + } + +} diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/NetUtils.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/NetUtils.java index adc12fd31..e3b03744e 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/NetUtils.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/NetUtils.java @@ -19,6 +19,8 @@ package org.jackhuang.hellominecraft.util; import org.jackhuang.hellominecraft.util.logging.HMCLog; import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -129,6 +131,23 @@ public final class NetUtils { con.disconnect(); return result; } + + public static boolean download(String url, String saveFile) { + try { + int readCount = 0; + byte[] buffer = new byte[1204]; + InputStream inputStream = new URL(url).openConnection().getInputStream(); + FileOutputStream fs = new FileOutputStream(saveFile); + while ((readCount = inputStream.read(buffer)) != -1) { + fs.write(buffer, 0, readCount); + } + return true; + } catch (FileNotFoundException e) { + return false; + } catch (IOException e) { + return false; + } + } private static final String DEFAULT_CHARSET = "UTF-8"; From 37ddecf629838f293ad1c90092ccb878bb294b7a Mon Sep 17 00:00:00 2001 From: evilwk Date: Sun, 3 Jul 2016 18:33:53 +0800 Subject: [PATCH 07/46] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E5=92=8C=E5=8D=87=E7=BA=A7=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hellominecraft/launcher/Main.java | 5 +- .../launcher/ui/LauncherSettingsPanel.java | 5 +- .../util/upgrade/AppDataUpgrader.java | 85 +++++++++++-------- .../hellominecraft/util/IUpdateChecker.java | 2 + .../hellominecraft/util/UpdateChecker.java | 21 +++-- 5 files changed, 76 insertions(+), 42 deletions(-) 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 fbe1709cd..0e3e52dc2 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java @@ -161,7 +161,10 @@ public final class Main implements Runnable { } Settings.UPDATE_CHECKER.outdated.register(IUpgrader.NOW_UPGRADER); - Settings.UPDATE_CHECKER.process(false).reg(t -> Main.invokeUpdate()).execute(); + Settings.UPDATE_CHECKER.process(false) + .reg(t -> Main.invokeUpdate()) + .regDone(() -> { Settings.UPDATE_CHECKER.checkOutdate(); }) + .execute(); if (StrUtils.isNotBlank(Settings.getInstance().getProxyHost()) && StrUtils.isNotBlank(Settings.getInstance().getProxyPort()) && MathUtils.canParseInt(Settings.getInstance().getProxyPort())) { HMCLog.log("Initializing customized proxy"); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java index 554ca9b66..11c8c034c 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java @@ -389,8 +389,9 @@ public class LauncherSettingsPanel extends AnimatedPanel { }//GEN-LAST:event_txtBackgroundPathFocusLost private void btnCheckUpdateActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCheckUpdateActionPerformed - Settings.UPDATE_CHECKER.process(true); - Settings.UPDATE_CHECKER.checkOutdate(); + Settings.UPDATE_CHECKER.process(true) + .regDone(() -> { Settings.UPDATE_CHECKER.checkOutdate(); }) + .execute(); }//GEN-LAST:event_btnCheckUpdateActionPerformed private void cboThemeItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboThemeItemStateChanged diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java index 784f64a34..a7abc9c81 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java @@ -39,6 +39,7 @@ import java.util.zip.GZIPInputStream; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.launcher.core.MCUtils; +import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.util.tasks.Task; import org.jackhuang.hellominecraft.util.tasks.TaskWindow; import org.jackhuang.hellominecraft.util.tasks.download.FileDownloadTask; @@ -47,9 +48,11 @@ import org.jackhuang.hellominecraft.util.MessageBox; import org.jackhuang.hellominecraft.util.UpdateChecker; import org.jackhuang.hellominecraft.util.Utils; import org.jackhuang.hellominecraft.util.VersionNumber; +import org.jackhuang.hellominecraft.util.func.Consumer; import org.jackhuang.hellominecraft.util.system.FileUtils; import org.jackhuang.hellominecraft.util.system.IOUtils; import org.jackhuang.hellominecraft.util.system.OS; +import org.jackhuang.hellominecraft.util.tasks.TaskList; /** * @@ -100,40 +103,54 @@ public class AppDataUpgrader extends IUpgrader { @Override public boolean call(Object sender, final VersionNumber number) { - ((UpdateChecker) sender).requestDownloadLink().reg(map -> { - 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) - if (map != null && map.containsKey("pack")) - try { - String hash = null; - if (map.containsKey("packsha1")) - hash = map.get("packsha1"); - if (TaskWindow.factory().append(new AppDataUpgraderTask(map.get("pack"), number.version, hash)).create()) { - 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); - } - else { - 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(); + ((UpdateChecker) sender).requestDownloadLink().reg(new Consumer>() { + @Override + public void accept(Map map) { + boolean isForceUpdate = Settings.UPDATE_CHECKER.isForceUpdate(); + if (isForceUpdate || 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) + if (map != null && map.containsKey("pack")) + try { + String hash = null; + if (map.containsKey("packsha1")) { + hash = map.get("packsha1"); + } + AppDataUpgraderTask upgraderTask = new AppDataUpgraderTask(map.get("pack"), number.version, hash); + if (isForceUpdate) { + TaskList tasks = new TaskList(); + tasks.addTask(upgraderTask); + tasks.start(); + } else { + if (TaskWindow.factory().append(upgraderTask).create()) { + 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); + } + else { + 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(); return true; } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/IUpdateChecker.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/IUpdateChecker.java index 9a589ca0d..47c212197 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/IUpdateChecker.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/IUpdateChecker.java @@ -29,6 +29,8 @@ public interface IUpdateChecker { * */ void checkOutdate(); + + boolean isForceUpdate(); /** * Get the cached newest version number, use "process" method to diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java index e440e0995..94b8a0b2c 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java @@ -27,8 +27,12 @@ import java.util.Map; public final class UpdateChecker implements IUpdateChecker { public boolean OUT_DATED = false; + + public String versionString; public VersionNumber base; - public String versionString; + private VersionNumber value; + private boolean isforceUpdate = false; + public String type; private Map download_link = null; @@ -37,16 +41,18 @@ public final class UpdateChecker implements IUpdateChecker { this.type = type; } - VersionNumber value; - @Override public OverridableSwingWorker process(final boolean showMessage) { return new OverridableSwingWorker() { @Override protected void work() throws Exception { if (value == null) { - versionString = NetUtils.get("http://huangyuhui.duapp.com/info.php?type=" + type); - value = VersionNumber.check(versionString); + versionString = NetUtils.get("http://localhost:8080/version.php?type=" + type); + Map versionInfo = C.GSON.fromJson(versionString, Map.class); + if (versionInfo.containsKey("version")) + value = VersionNumber.check((String)versionInfo.get("version")); + if (versionInfo.containsKey("force")) + isforceUpdate = (boolean)versionInfo.get("force"); } if (value == null) { @@ -66,6 +72,11 @@ public final class UpdateChecker implements IUpdateChecker { return value; } + @Override + public boolean isForceUpdate() { + return isforceUpdate; + } + @Override public synchronized OverridableSwingWorker> requestDownloadLink() { return new OverridableSwingWorker() { From 3afff687b2639fa6a3c8509ff90797de69f91848 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Mon, 4 Jul 2016 14:34:04 +0800 Subject: [PATCH 08/46] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jackhuang/hellominecraft/util/UpdateChecker.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java index 94b8a0b2c..aa20418bf 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java @@ -25,7 +25,11 @@ import java.util.Map; * @author huangyuhui */ public final class UpdateChecker implements IUpdateChecker { - + + public static final String VERSION_URL = "http://client.api.mcgogogo.com:81/version.php?type="; + public static final String UPDATE_LINK_URL = "http://client.api.mcgogogo.com:81/update_link.php?type="; + + public boolean OUT_DATED = false; public String versionString; @@ -47,7 +51,7 @@ public final class UpdateChecker implements IUpdateChecker { @Override protected void work() throws Exception { if (value == null) { - versionString = NetUtils.get("http://localhost:8080/version.php?type=" + type); + versionString = NetUtils.get(VERSION_URL + type); Map versionInfo = C.GSON.fromJson(versionString, Map.class); if (versionInfo.containsKey("version")) value = VersionNumber.check((String)versionInfo.get("version")); @@ -84,7 +88,7 @@ public final class UpdateChecker implements IUpdateChecker { protected void work() throws Exception { if (download_link == null) try { - download_link = C.GSON.fromJson(NetUtils.get("http://huangyuhui.duapp.com/update_link.php?type=" + type), Map.class); + download_link = C.GSON.fromJson(NetUtils.get(UPDATE_LINK_URL + type), Map.class); } catch (Exception e) { HMCLog.warn("Failed to get update link.", e); } From b2ea6d449e8d89ae92613f55a4fb955c277b68aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Mon, 4 Jul 2016 17:29:22 +0800 Subject: [PATCH 09/46] =?UTF-8?q?=E5=BF=BD=E7=95=A5=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hellominecraft/launcher/Main.java | 5 +++- .../launcher/setting/Config.java | 29 ++++++++++++++++++- .../launcher/ui/RecommendPanel.java | 4 ++- .../util/upgrade/AppDataUpgrader.java | 27 +++++++++++++---- .../hellominecraft/util/IUpdateChecker.java | 2 ++ .../hellominecraft/util/MessageBox.java | 24 +++++++-------- .../hellominecraft/util/UpdateChecker.java | 21 ++++++++++---- .../jackhuang/hellominecraft/lang/I18N.lang | 2 ++ .../hellominecraft/lang/I18N.properties | 2 ++ .../hellominecraft/lang/I18N_en.lang | 2 ++ .../hellominecraft/lang/I18N_en.properties | 2 ++ .../hellominecraft/lang/I18N_zh_TW.lang | 2 ++ .../hellominecraft/lang/I18N_zh_TW.properties | 2 ++ 13 files changed, 98 insertions(+), 26 deletions(-) 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 0e3e52dc2..fd4104f17 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java @@ -194,7 +194,10 @@ public final class Main implements Runnable { } public static void invokeUpdate() { - MainFrame.INSTANCE.invokeUpdate(); + if (!Settings.getInstance().ignoreUpdate( + Settings.UPDATE_CHECKER.getNewVersion() )) { + MainFrame.INSTANCE.invokeUpdate(); + } } public static ImageIcon getIcon(String path) { diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java index 88d94c892..21a3fc594 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java @@ -28,6 +28,8 @@ import java.util.UUID; import org.jackhuang.hellominecraft.launcher.core.auth.IAuthenticator; import org.jackhuang.hellominecraft.lookandfeel.Theme; import org.jackhuang.hellominecraft.util.EventHandler; +import org.jackhuang.hellominecraft.util.StrUtils; +import org.jackhuang.hellominecraft.util.VersionNumber; import org.jackhuang.hellominecraft.util.system.JdkVersion; import org.jackhuang.hellominecraft.util.system.OS; @@ -72,10 +74,35 @@ public final class Config implements Cloneable { @SerializedName("auth") @SuppressWarnings("FieldMayBeFinal") private Map auth; - + @SerializedName("ignoreUpdateVersion") + private String ignoreUpdateVersion; + public List getJava() { return java == null ? java = new ArrayList<>() : java; } + + public boolean ignoreUpdate(VersionNumber versionNumber) { + boolean ignore = false; + do + { + if (StrUtils.isBlank(ignoreUpdateVersion)) + continue; + + VersionNumber ignoreVersion = VersionNumber.check(ignoreUpdateVersion); + if (ignoreVersion == null) + continue; + + if (versionNumber.compareTo(ignoreVersion) == 0) + ignore = true; + + } while(false); + return ignore; + } + + public void setIgnoreUpdate(VersionNumber versionNumber) { + ignoreUpdateVersion = versionNumber.toString(); + Settings.save(); + } public transient final EventHandler themeChangedEvent = new EventHandler<>(this); public transient final EventHandler downloadTypeChangedEvent = new EventHandler<>(this); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java index a4cfc5855..29c7e44ea 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java @@ -36,6 +36,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.swing.SwingUtilities; +import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.NetUtils; import org.jackhuang.hellominecraft.util.ui.SwingUtils; @@ -55,7 +56,7 @@ public class RecommendPanel extends JPanel { public RecommendPanel() { recommends = new ArrayList(); new LoadImages().execute(); - + addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { @@ -179,6 +180,7 @@ public class RecommendPanel extends JPanel { public void setImage(String key, Image image) { this.imageKey = key; this.currImage = image; + setToolTipText(C.i18n("ui.message.recommend_tip")); setSize(image.getWidth(this), image.getHeight(this)); SwingUtilities.updateComponentTreeUI(this.getRootPane()); } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java index a7abc9c81..eeed30ecc 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java @@ -36,6 +36,7 @@ import java.util.jar.JarFile; import java.util.jar.JarOutputStream; import java.util.jar.Pack200; import java.util.zip.GZIPInputStream; +import javax.swing.JCheckBox; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.launcher.core.MCUtils; @@ -100,18 +101,32 @@ public class AppDataUpgrader extends IUpgrader { } return false; } - + + public boolean askUpdateVersion(VersionNumber versionNumber) { + if (!Settings.UPDATE_CHECKER.isManualUpdate() && + Settings.getInstance().ignoreUpdate(versionNumber)) + return false; + + String content = C.i18n("update.newest_version") + + versionNumber.firstVer + "." + versionNumber.secondVer + "." + + versionNumber.thirdVer + "\n" + + C.i18n("update.should_open_link"); + JCheckBox checkbox = new JCheckBox(C.i18n("update.ignore")); + int ret = MessageBox.Show(new Object[]{content, checkbox}, MessageBox.YES_NO_OPTION); + if (ret == MessageBox.NO_OPTION) { + Settings.getInstance().setIgnoreUpdate(versionNumber); + return false; + } + return true; + } + @Override public boolean call(Object sender, final VersionNumber number) { ((UpdateChecker) sender).requestDownloadLink().reg(new Consumer>() { @Override public void accept(Map map) { boolean isForceUpdate = Settings.UPDATE_CHECKER.isForceUpdate(); - if (isForceUpdate || 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) + if (isForceUpdate || askUpdateVersion(number)) if (map != null && map.containsKey("pack")) try { String hash = null; diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/IUpdateChecker.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/IUpdateChecker.java index 47c212197..c7ae6758b 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/IUpdateChecker.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/IUpdateChecker.java @@ -32,6 +32,8 @@ public interface IUpdateChecker { boolean isForceUpdate(); + boolean isManualUpdate(); + /** * Get the cached newest version number, use "process" method to * download! diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MessageBox.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MessageBox.java index d3fd908f6..b14159f99 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MessageBox.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MessageBox.java @@ -86,23 +86,23 @@ public class MessageBox { /** * Show MsgBox with title and options * - * @param Msg The Message - * @param Title The title of MsgBox. - * @param Option The type of MsgBox. + * @param msg The Message + * @param title The title of MsgBox. + * @param optionType The type of MsgBox. * * @return user operation. */ - public static int Show(String Msg, String Title, int Option) { - switch (Option) { + public static int Show(Object msg, String title, int optionType) { + switch (optionType) { case YES_NO_OPTION: case YES_NO_CANCEL_OPTION: case OK_CANCEL_OPTION: - return SwingUtils.invokeAndWait(() -> JOptionPane.showConfirmDialog(null, Msg, Title, Option - 10)); + return SwingUtils.invokeAndWait(() -> JOptionPane.showConfirmDialog(null, msg, title, optionType - 10)); default: - SwingUtils.invokeAndWait(() -> JOptionPane.showMessageDialog(null, Msg, Title, Option)); + SwingUtils.invokeAndWait(() -> JOptionPane.showMessageDialog(null, msg, title, optionType)); } return 0; - } + } /** * Show MsgBox with options @@ -112,8 +112,8 @@ public class MessageBox { * * @return User Operation */ - public static int Show(String Msg, int Option) { - return Show(Msg, TITLE, Option); + public static int Show(Object msg, int optionType) { + return Show(msg, TITLE, optionType); } /** @@ -123,8 +123,8 @@ public class MessageBox { * * @return User Operation */ - public static int Show(String Msg) { - return Show(Msg, TITLE, INFORMATION_MESSAGE); + public static int Show(Object msg) { + return Show(msg, TITLE, INFORMATION_MESSAGE); } public static int ShowLocalized(String msg) { diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java index aa20418bf..dcfa20984 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java @@ -29,13 +29,13 @@ public final class UpdateChecker implements IUpdateChecker { public static final String VERSION_URL = "http://client.api.mcgogogo.com:81/version.php?type="; public static final String UPDATE_LINK_URL = "http://client.api.mcgogogo.com:81/update_link.php?type="; - public boolean OUT_DATED = false; public String versionString; public VersionNumber base; private VersionNumber value; private boolean isforceUpdate = false; + private boolean isManualUpdate = false; public String type; private Map download_link = null; @@ -50,6 +50,8 @@ public final class UpdateChecker implements IUpdateChecker { return new OverridableSwingWorker() { @Override protected void work() throws Exception { + isManualUpdate = showMessage; + if (value == null) { versionString = NetUtils.get(VERSION_URL + type); Map versionInfo = C.GSON.fromJson(versionString, Map.class); @@ -58,15 +60,19 @@ public final class UpdateChecker implements IUpdateChecker { if (versionInfo.containsKey("force")) isforceUpdate = (boolean)versionInfo.get("force"); } - + if (value == null) { HMCLog.warn("Failed to check update..."); - if (showMessage) + if (showMessage) { MessageBox.Show(C.i18n("update.failed")); - } else if (VersionNumber.isOlder(base, value)) + } + } else if (VersionNumber.isOlder(base, value)) { OUT_DATED = true; - if (OUT_DATED) + } + + if (OUT_DATED) { publish(value); + } } }; } @@ -81,6 +87,11 @@ public final class UpdateChecker implements IUpdateChecker { return isforceUpdate; } + @Override + public boolean isManualUpdate() { + return isManualUpdate; + } + @Override public synchronized OverridableSwingWorker> requestDownloadLink() { return new OverridableSwingWorker() { diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang index cdbeb9c31..069c0526e 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang @@ -168,6 +168,7 @@ ui.message.launching=启动中 ui.message.making=生成中 ui.message.sure_remove=真的要删除配置%s吗? ui.message.update_java=请更新您的Java +ui.message.recommend_tip=点击打开链接 ui.label.settings=选项 ui.label.crashing=Hello Minecraft!遇到了无法处理的错误,请复制下列内容并通过mcbbs、贴吧、Github或Minecraft Forum反馈bug。 @@ -369,6 +370,7 @@ update.should_open_link=是否更新? update.newest_version=最新版本为: update.failed=检查更新失败 update.found=(发现更新!) +update.ignore=不再提醒此版本更新 logwindow.terminate_game=结束游戏进程 logwindow.tieba=贴吧 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties index 2ea8f0ed0..19cf4ec34 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties @@ -168,6 +168,7 @@ ui.message.launching=\u542f\u52a8\u4e2d ui.message.making=\u751f\u6210\u4e2d ui.message.sure_remove=\u771f\u7684\u8981\u5220\u9664\u914d\u7f6e%s\u5417\uff1f ui.message.update_java=\u8bf7\u66f4\u65b0\u60a8\u7684Java +ui.message.recommend_tip=\u70b9\u51fb\u6253\u5f00\u94fe\u63a5 ui.label.settings=\u9009\u9879 ui.label.crashing=Hello Minecraft!\u9047\u5230\u4e86\u65e0\u6cd5\u5904\u7406\u7684\u9519\u8bef\uff0c\u8bf7\u590d\u5236\u4e0b\u5217\u5185\u5bb9\u5e76\u901a\u8fc7mcbbs\u3001\u8d34\u5427\u3001Github\u6216Minecraft Forum\u53cd\u9988bug\u3002 @@ -369,6 +370,7 @@ update.should_open_link=\u662f\u5426\u66f4\u65b0\uff1f update.newest_version=\u6700\u65b0\u7248\u672c\u4e3a\uff1a update.failed=\u68c0\u67e5\u66f4\u65b0\u5931\u8d25 update.found=(\u53d1\u73b0\u66f4\u65b0!) +update.ignore=\u4e0d\u518d\u63d0\u9192\u6b64\u7248\u672c\u66f4\u65b0 logwindow.terminate_game=\u7ed3\u675f\u6e38\u620f\u8fdb\u7a0b logwindow.tieba=\u8d34\u5427 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang index 9d746d0e1..45306da46 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang @@ -168,6 +168,7 @@ ui.message.launching=Launching... ui.message.making=Generating... ui.message.sure_remove=Sure to remove profile %s? ui.message.update_java=Please upgrade your Java. +ui.message.recommend_tip=Click to open link ui.label.settings=Settings ui.label.crashing=Hello Minecraft! Launcher has crashed! @@ -369,6 +370,7 @@ update.should_open_link=Are you willing to upgrade this app? update.newest_version=Newest version: update.failed=Failed to check for updates. update.found=(Found Update!) +update.ignore=Do not remind this version update. logwindow.terminate_game=Terminate Game logwindow.tieba=Baidu Tieba diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties index c1ed34126..97ff8ee36 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties @@ -168,6 +168,7 @@ ui.message.launching=Launching... ui.message.making=Generating... ui.message.sure_remove=Sure to remove profile %s? ui.message.update_java=Please upgrade your Java. +ui.message.recommend_tip=Click to open link ui.label.settings=Settings ui.label.crashing=Hello Minecraft! Launcher has crashed! @@ -369,6 +370,7 @@ update.should_open_link=Are you willing to upgrade this app? update.newest_version=Newest version: update.failed=Failed to check for updates. update.found=(Found Update!) +update.ignore=Do not remind this version update. logwindow.terminate_game=Terminate Game logwindow.tieba=Baidu Tieba diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang index bc0e5c092..26f4c847a 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang @@ -168,6 +168,7 @@ ui.message.launching=啟動中 ui.message.making=生成中 ui.message.sure_remove=真的要删除配置%s吗? ui.message.update_java=请更新您的Java +ui.message.recommend_tip=點擊打開連接 ui.label.settings=選項 ui.label.crashing=Hello Minecraft! Launcher遇到了無法處理的錯誤,請複制下列內容並通過mcbbs、貼吧或Minecraft Forum反饋bug。 @@ -369,6 +370,7 @@ update.should_open_link=是否更新? update.newest_version=最新版本為: update.failed=檢查更新失敗 update.found=(發現更新!) +update.ignore=不再提醒此版本更新 logwindow.terminate_game=結束遊戲進程 logwindow.tieba=貼吧 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties index 1d6f19cd8..dd02f34b6 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties @@ -168,6 +168,7 @@ ui.message.launching=\u555f\u52d5\u4e2d ui.message.making=\u751f\u6210\u4e2d ui.message.sure_remove=\u771f\u7684\u8981\u5220\u9664\u914d\u7f6e%s\u5417\uff1f ui.message.update_java=\u8bf7\u66f4\u65b0\u60a8\u7684Java +ui.message.recommend_tip=\u9ede\u64ca\u6253\u958b\u9023\u63a5 ui.label.settings=\u9078\u9805 ui.label.crashing=Hello Minecraft! Launcher\u9047\u5230\u4e86\u7121\u6cd5\u8655\u7406\u7684\u932f\u8aa4\uff0c\u8acb\u8907\u5236\u4e0b\u5217\u5167\u5bb9\u4e26\u901a\u904emcbbs\u3001\u8cbc\u5427\u6216Minecraft Forum\u53cd\u994bbug\u3002 @@ -369,6 +370,7 @@ update.should_open_link=\u662f\u5426\u66f4\u65b0\uff1f update.newest_version=\u6700\u65b0\u7248\u672c\u70ba\uff1a update.failed=\u6aa2\u67e5\u66f4\u65b0\u5931\u6557 update.found=(\u767c\u73fe\u66f4\u65b0!) +update.ignore=\u4e0d\u518d\u63d0\u9192\u6b64\u7248\u672c\u66f4\u65b0 logwindow.terminate_game=\u7d50\u675f\u904a\u6232\u9032\u7a0b logwindow.tieba=\u8cbc\u5427 From 4fdadd54749e437597b3644cc0b57497ece0006c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Mon, 4 Jul 2016 18:16:34 +0800 Subject: [PATCH 10/46] =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/jackhuang/hellominecraft/util/UpdateChecker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java index dcfa20984..a4b5119ac 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java @@ -53,7 +53,7 @@ public final class UpdateChecker implements IUpdateChecker { isManualUpdate = showMessage; if (value == null) { - versionString = NetUtils.get(VERSION_URL + type); + versionString = NetUtils.get(VERSION_URL + type + "&ver=" + base.toString()); Map versionInfo = C.GSON.fromJson(versionString, Map.class); if (versionInfo.containsKey("version")) value = VersionNumber.check((String)versionInfo.get("version")); From 5f1d0a5936bb48b83bf5ec1a3ca9b4446efa83e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Mon, 4 Jul 2016 18:22:01 +0800 Subject: [PATCH 11/46] =?UTF-8?q?=E5=BC=BA=E5=88=B6=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=80=99=E4=B8=8D=E5=88=B7=E6=96=B0=E6=A0=87?= =?UTF-8?q?=E9=A2=98=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/jackhuang/hellominecraft/launcher/Main.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) 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 fd4104f17..9cfc71340 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java @@ -194,10 +194,15 @@ public final class Main implements Runnable { } public static void invokeUpdate() { - if (!Settings.getInstance().ignoreUpdate( + if (Settings.UPDATE_CHECKER.isForceUpdate()) + return; + + if (Settings.getInstance().ignoreUpdate( Settings.UPDATE_CHECKER.getNewVersion() )) { - MainFrame.INSTANCE.invokeUpdate(); + return; } + + MainFrame.INSTANCE.invokeUpdate(); } public static ImageIcon getIcon(String path) { From f27b60e03118b3b8da8c99ccb724cf936797f018 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Tue, 5 Jul 2016 11:25:36 +0800 Subject: [PATCH 12/46] udpate version --- HMCL/build.gradle | 2 +- .../jackhuang/hellominecraft/launcher/ui/RecommendPanel.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/HMCL/build.gradle b/HMCL/build.gradle index 6bc999f7d..c1abb9dd3 100755 --- a/HMCL/build.gradle +++ b/HMCL/build.gradle @@ -54,7 +54,7 @@ if (buildnumber == null) def versionroot = System.getenv("VERSION_ROOT") if (versionroot == null) - versionroot = "2.4.1" + versionroot = "2.4.2" String mavenGroupId = 'HMCL' String mavenVersion = versionroot + '.' + buildnumber diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java index 29c7e44ea..9c3bb26a4 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java @@ -29,6 +29,7 @@ import javax.swing.SwingWorker; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; +import java.awt.Cursor; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; @@ -56,6 +57,7 @@ public class RecommendPanel extends JPanel { public RecommendPanel() { recommends = new ArrayList(); new LoadImages().execute(); + setCursor(new Cursor(Cursor.HAND_CURSOR)); addMouseListener(new MouseAdapter() { @Override @@ -180,7 +182,7 @@ public class RecommendPanel extends JPanel { public void setImage(String key, Image image) { this.imageKey = key; this.currImage = image; - setToolTipText(C.i18n("ui.message.recommend_tip")); + //setToolTipText(C.i18n("ui.message.recommend_tip")); setSize(image.getWidth(this), image.getHeight(this)); SwingUtilities.updateComponentTreeUI(this.getRootPane()); } From c39f1ad75f7e8f76e6478575b80ff1965209d57f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Tue, 5 Jul 2016 12:03:34 +0800 Subject: [PATCH 13/46] =?UTF-8?q?=E4=BD=BF=E7=94=A8gradle=E7=AE=A1?= =?UTF-8?q?=E7=90=86buildNumber?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HMCL/build.gradle | 19 ++++++++++++++++++- HMCL/version.properties | 2 ++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 HMCL/version.properties diff --git a/HMCL/build.gradle b/HMCL/build.gradle index c1abb9dd3..7fb9f2de6 100755 --- a/HMCL/build.gradle +++ b/HMCL/build.gradle @@ -46,11 +46,28 @@ if (!hasProperty('mainClass')) { ext.mainClass = 'org.jackhuang.hellominecraft.launcher.Main' } + +def readBuildNumber() { + def versionPropsFile = file('version.properties') + + if (versionPropsFile.canRead()) { + def Properties versionProps = new Properties() + versionProps.load(new FileInputStream(versionPropsFile)) + + def code = versionProps['VERSION_CODE'].toInteger() + 1 + versionProps['VERSION_CODE'] = code.toString() + versionProps.store(versionPropsFile.newWriter(), null) + + return code.toString() + } + return "233" +} + def buildnumber = System.getenv("TRAVIS_BUILD_NUMBER") if (buildnumber == null) buildnumber = System.getenv("BUILD_NUMBER") if (buildnumber == null) - buildnumber = "233" + buildnumber = readBuildNumber() def versionroot = System.getenv("VERSION_ROOT") if (versionroot == null) diff --git a/HMCL/version.properties b/HMCL/version.properties new file mode 100644 index 000000000..c76f53efc --- /dev/null +++ b/HMCL/version.properties @@ -0,0 +1,2 @@ +#Tue Jul 05 12:01:21 CST 2016 +VERSION_CODE=63 From 3f15eddb0c219fb9ca9a7047a9c2fa7ff950c87e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Wed, 6 Jul 2016 16:24:33 +0800 Subject: [PATCH 14/46] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=BD=BF=E7=94=A8java?= =?UTF-8?q?=208=20API=E5=AF=BC=E8=87=B4=E5=90=AF=E5=8A=A8=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jackhuang/hellominecraft/util/ui/LogWindowOutputStream.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindowOutputStream.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindowOutputStream.java index a400f150c..4a38b67dd 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindowOutputStream.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindowOutputStream.java @@ -35,8 +35,6 @@ public class LogWindowOutputStream extends OutputStream { private final Level sas; public LogWindowOutputStream(LogWindow logWindow, Level l) { - Objects.nonNull(logWindow); - Objects.nonNull(l); txt = logWindow; sas = l; } From 95af0222f333622e26501173cbe2909cf0413f5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Thu, 7 Jul 2016 14:32:35 +0800 Subject: [PATCH 15/46] update dynamic provider --- HMCL/build.gradle | 2 +- .../launcher/core/download/DownloadType.java | 2 +- .../download/DynamicDownloadProvider.java | 81 +++++++++++-------- .../launcher/ui/LauncherSettingsPanel.form | 2 +- .../launcher/ui/LauncherSettingsPanel.java | 2 +- HMCL/version.properties | 4 +- .../jackhuang/hellominecraft/lang/I18N.lang | 2 +- .../hellominecraft/lang/I18N.properties | 2 +- .../hellominecraft/lang/I18N_en.lang | 2 +- .../hellominecraft/lang/I18N_en.properties | 2 +- .../hellominecraft/lang/I18N_zh_TW.lang | 2 +- .../hellominecraft/lang/I18N_zh_TW.properties | 2 +- 12 files changed, 58 insertions(+), 47 deletions(-) diff --git a/HMCL/build.gradle b/HMCL/build.gradle index 7fb9f2de6..d6864df76 100755 --- a/HMCL/build.gradle +++ b/HMCL/build.gradle @@ -71,7 +71,7 @@ if (buildnumber == null) def versionroot = System.getenv("VERSION_ROOT") if (versionroot == null) - versionroot = "2.4.2" + versionroot = "2.5.0" String mavenGroupId = 'HMCL' String mavenVersion = versionroot + '.' + buildnumber diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java index 14e1711e6..c9dadd4c8 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java @@ -30,7 +30,7 @@ public enum DownloadType { BMCL("download.BMCL", new BMCLAPIDownloadProvider()), //RapidData("download.rapid_data", new RapidDataDownloadProvider()), Curse("Curse CDN", new CurseDownloadProvider()), - Dynamic(DynamicDownloadProvider.getInstance().getName(), DynamicDownloadProvider.getInstance()); + Dynamic("HMCLSoft", DynamicDownloadProvider.getInstance()); private final String name; private final IDownloadProvider provider; diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java index cb772d9e2..0c6535e78 100644 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java @@ -31,37 +31,35 @@ import org.jackhuang.hellominecraft.util.StrUtils; public class DynamicDownloadProvider extends MojangDownloadProvider { private static final String PROVIDER_ADDR = "http://client.api.mcgogogo.com:81/provider.php"; - + private volatile static DynamicDownloadProvider instance; + private String versionManifestAddr = null; + private String launcherMetaAddr = null; + private String launcherAddr = null; + private String librariesAddr = null; private String assetsAddr = null; - private String name = "精灵"; - - public void setName(String name) { - this.name = name; - } - public String getName() { - return name; + public void setVersionManifestAddr(String versionManifestAddr) { + this.versionManifestAddr = versionManifestAddr; } - public String getLibrariesAddr() { - return librariesAddr; + public void setLauncherMetaAddr(String launcherMetaAddr) { + this.launcherMetaAddr = launcherMetaAddr; + } + + public void setLauncherAddr(String launcherAddr) { + this.launcherAddr = launcherAddr; } public void setLibrariesAddr(String librariesAddr) { this.librariesAddr = librariesAddr; } - public String getAssetsAddr() { - return assetsAddr; - } - public void setAssetsAddr(String assetsAddr) { this.assetsAddr = assetsAddr; } - private DynamicDownloadProvider() { @@ -87,7 +85,7 @@ public class DynamicDownloadProvider extends MojangDownloadProvider { public String getRetryLibraryDownloadURL() { return super.getLibraryDownloadURL(); } - + @Override public String getAssetsDownloadURL() { if (StrUtils.isNotBlank(assetsAddr)) { @@ -104,41 +102,54 @@ public class DynamicDownloadProvider extends MojangDownloadProvider { return super.getLibraryDownloadURL(); } + @Override + public String getVersionsListDownloadURL() { + if (StrUtils.isNotBlank(versionManifestAddr)) { + return versionManifestAddr; + } + return super.getVersionsListDownloadURL(); + } + @Override public String getParsedDownloadURL(String str) { if (StrUtils.isNotBlank(librariesAddr)) { str = str.replace("https://libraries.minecraft.net", librariesAddr); } + if (StrUtils.isNotBlank(launcherMetaAddr)) { + str = str.replace("https://launchermeta.mojang.com", launcherMetaAddr); + } + if (StrUtils.isNotBlank(launcherMetaAddr)) { + str = str.replace("https://launcher.mojang.com", launcherAddr); + } return super.getParsedDownloadURL(str); } public void init() { new Thread() { + + private String getValue(Map addrInfo, String key) { + String value = null; + do { + if (!addrInfo.containsKey(key)) + continue; + value = addrInfo.get(key); + } while(false); + return value; + } + @Override public void run() { try { String providerInfo = NetUtils.get(PROVIDER_ADDR); Map addrInfo = null; - addrInfo = C.GSON.fromJson(providerInfo, new TypeToken>(){}.getType()); + addrInfo = C.GSON.fromJson(providerInfo, new TypeToken>() { + }.getType()); if (addrInfo != null) { - if (addrInfo.containsKey("libraries")) { - String librariesAddr = addrInfo.get("libraries"); - if (StrUtils.isNotBlank(librariesAddr)) { - DynamicDownloadProvider.this.setLibrariesAddr(librariesAddr); - } - } - if (addrInfo.containsKey("assets")) { - String assetsAddr = addrInfo.get("assets"); - if (StrUtils.isNotBlank(assetsAddr)) { - DynamicDownloadProvider.this.setAssetsAddr(assetsAddr); - } - } - if (addrInfo.containsKey("name")) { - String name = addrInfo.get("name"); - if (StrUtils.isNotBlank(name)) { - DynamicDownloadProvider.this.setName(name); - } - } + setLibrariesAddr(getValue(addrInfo, "libraries")); + setAssetsAddr(getValue(addrInfo, "assets")); + setLauncherMetaAddr(getValue(addrInfo, "launcherMeta")); + setLauncherAddr(getValue(addrInfo, "launcher")); + setVersionManifestAddr(getValue(addrInfo, "versionManifest")); } } catch (IOException ex) { diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form index 553e2e43d..e63183c93 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form @@ -131,7 +131,7 @@ - + diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java index 11c8c034c..29ebfbc13 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java @@ -349,7 +349,7 @@ public class LauncherSettingsPanel extends AnimatedPanel { .addComponent(btnMCBBS)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lblRestart) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 80, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 134, Short.MAX_VALUE) .addComponent(lblModpack, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lblAbout, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) diff --git a/HMCL/version.properties b/HMCL/version.properties index c76f53efc..600781aa7 100644 --- a/HMCL/version.properties +++ b/HMCL/version.properties @@ -1,2 +1,2 @@ -#Tue Jul 05 12:01:21 CST 2016 -VERSION_CODE=63 +#Thu Jul 07 14:30:49 CST 2016 +VERSION_CODE=92 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang index 069c0526e..783e5efc9 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang @@ -299,7 +299,7 @@ mainwindow.enter_script_name=输入要生成脚本的文件名 mainwindow.make_launch_succeed=启动脚本已生成完毕: mainwindow.no_version=未找到任何版本,是否进入游戏下载? -launcher.about=默认背景图感谢gamerteam提供。
关于作者:
百度ID:huanghongxun20
mcbbs:huanghongxun
邮箱:huanghongxun2008@126.com
Minecraft Forum ID: klkl6523
欢迎提交Bug哦
Copyright (c) 2013-2016 huangyuhui.
免责声明:Minecraft软件版权归Mojang AB所有,使用本软件产生的版权问题本软件制作方概不负责。
本启动器在GPLv3协议下开源:https://github.com/huanghongxun/HMCL/ ,感谢issues和pull requests贡献者
本软件使用了基于Apache License 2.0的Gson项目,感谢贡献者。 +launcher.about=默认背景图感谢gamerteam提供。
关于作者:
邮箱:contact@hmclsoft.com
欢迎提交Bug哦
Copyright (c) 2013-2016 HMCLSoft.
免责声明:Minecraft软件版权归Mojang AB所有,使用本软件产生的版权问题本软件制作方概不负责。
本启动器在GPLv3协议下开源:https://github.com/mclauncher/HMCL,感谢issues和pull requests贡献者
本软件使用了基于Apache License 2.0的Gson项目,感谢贡献者。 launcher.download_source=下载源 launcher.background_location=背景地址 launcher.exit_failed=强制退出失败,可能是Forge 1.7.10及更高版本导致的,无法解决。 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties index 19cf4ec34..9a97e85c5 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties @@ -299,7 +299,7 @@ mainwindow.enter_script_name=\u8f93\u5165\u8981\u751f\u6210\u811a\u672c\u7684\u6 mainwindow.make_launch_succeed=\u542f\u52a8\u811a\u672c\u5df2\u751f\u6210\u5b8c\u6bd5: mainwindow.no_version=\u672a\u627e\u5230\u4efb\u4f55\u7248\u672c\uff0c\u662f\u5426\u8fdb\u5165\u6e38\u620f\u4e0b\u8f7d\uff1f -launcher.about=\u9ed8\u8ba4\u80cc\u666f\u56fe\u611f\u8c22gamerteam\u63d0\u4f9b\u3002
\u5173\u4e8e\u4f5c\u8005\uff1a
\u767e\u5ea6ID\uff1ahuanghongxun20
mcbbs\uff1ahuanghongxun
\u90ae\u7bb1\uff1ahuanghongxun2008@126.com
Minecraft Forum ID: klkl6523
\u6b22\u8fce\u63d0\u4ea4Bug\u54e6
Copyright (c) 2013-2016 huangyuhui.
\u514d\u8d23\u58f0\u660e\uff1aMinecraft\u8f6f\u4ef6\u7248\u6743\u5f52Mojang AB\u6240\u6709\uff0c\u4f7f\u7528\u672c\u8f6f\u4ef6\u4ea7\u751f\u7684\u7248\u6743\u95ee\u9898\u672c\u8f6f\u4ef6\u5236\u4f5c\u65b9\u6982\u4e0d\u8d1f\u8d23\u3002
\u672c\u542f\u52a8\u5668\u5728GPLv3\u534f\u8bae\u4e0b\u5f00\u6e90:https://github.com/huanghongxun/HMCL/ ,\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
\u672c\u8f6f\u4ef6\u4f7f\u7528\u4e86\u57fa\u4e8eApache License 2.0\u7684Gson\u9879\u76ee\uff0c\u611f\u8c22\u8d21\u732e\u8005\u3002 +launcher.about=\u9ed8\u8ba4\u80cc\u666f\u56fe\u611f\u8c22gamerteam\u63d0\u4f9b\u3002
\u5173\u4e8e\u4f5c\u8005\uff1a
\u90ae\u7bb1\uff1acontact@hmclsoft.com
\u6b22\u8fce\u63d0\u4ea4Bug\u54e6
Copyright (c) 2013-2016 HMCLSoft.
\u514d\u8d23\u58f0\u660e\uff1aMinecraft\u8f6f\u4ef6\u7248\u6743\u5f52Mojang AB\u6240\u6709\uff0c\u4f7f\u7528\u672c\u8f6f\u4ef6\u4ea7\u751f\u7684\u7248\u6743\u95ee\u9898\u672c\u8f6f\u4ef6\u5236\u4f5c\u65b9\u6982\u4e0d\u8d1f\u8d23\u3002
\u672c\u542f\u52a8\u5668\u5728GPLv3\u534f\u8bae\u4e0b\u5f00\u6e90\uff1ahttps://github.com/mclauncher/HMCL\uff0c\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
\u672c\u8f6f\u4ef6\u4f7f\u7528\u4e86\u57fa\u4e8eApache License 2.0\u7684Gson\u9879\u76ee\uff0c\u611f\u8c22\u8d21\u732e\u8005\u3002 launcher.download_source=\u4e0b\u8f7d\u6e90 launcher.background_location=\u80cc\u666f\u5730\u5740 launcher.exit_failed=\u5f3a\u5236\u9000\u51fa\u5931\u8d25\uff0c\u53ef\u80fd\u662fForge 1.7.10\u53ca\u66f4\u9ad8\u7248\u672c\u5bfc\u81f4\u7684\uff0c\u65e0\u6cd5\u89e3\u51b3\u3002 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang index 45306da46..ae6fb1bdb 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang @@ -299,7 +299,7 @@ mainwindow.enter_script_name=Enter the script name. mainwindow.make_launch_succeed=Finished script creation. mainwindow.no_version=No version found. Switch to Game Downloads Tab? -launcher.about=About Author
Email:huanghongxun2008@126.com
Minecraft Forum ID: klkl6523
Copyright (c) 2013 huangyuhui
Opened source under GPL v3 license:http://github.com/huanghongxun/HMCL/
This software used project Gson which is under Apache License 2.0, thanks contributors. +launcher.about=About Author
Email: contact@hmclsoft.com
Copyright (c) 2013 HMCLSoft.
Opened source under GPL v3 license: http://github.com/mclauncher/HMCL
This software used project Gson which is under Apache License 2.0, thanks contributors. launcher.download_source=Download Source launcher.background_location=Background Location launcher.exit_failed=Failed to shutdown. diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties index 97ff8ee36..ae6fb1bdb 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties @@ -299,7 +299,7 @@ mainwindow.enter_script_name=Enter the script name. mainwindow.make_launch_succeed=Finished script creation. mainwindow.no_version=No version found. Switch to Game Downloads Tab? -launcher.about=About Author
Email\uff1ahuanghongxun2008@126.com
Minecraft Forum ID: klkl6523
Copyright (c) 2013 huangyuhui
Opened source under GPL v3 license:http://github.com/huanghongxun/HMCL/
This software used project Gson which is under Apache License 2.0, thanks contributors. +launcher.about=About Author
Email: contact@hmclsoft.com
Copyright (c) 2013 HMCLSoft.
Opened source under GPL v3 license: http://github.com/mclauncher/HMCL
This software used project Gson which is under Apache License 2.0, thanks contributors. launcher.download_source=Download Source launcher.background_location=Background Location launcher.exit_failed=Failed to shutdown. diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang index 26f4c847a..49abdb985 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang @@ -299,7 +299,7 @@ mainwindow.enter_script_name=輸入要生成腳本的資料名 mainwindow.make_launch_succeed=啟動腳本已生成完畢: mainwindow.no_version=未找到任何版本,是否進入遊戲下載? -launcher.about=默認背景圖感謝gamerteam提供。
關於作者:
百度ID:huanghongxun20
mcbbs:huanghongxun
郵箱:huanghongxun2008@126.com
Minecraft Forum ID: klkl6523
歡迎提交Bug哦
Copyright (c) 2013-2016 huangyuhui.
免責聲明:Minecraft軟體版權歸Mojang AB所有,遊戲由於誤操作本啟動器而丟失數據的概不負責。
本啟動器在GPLv3協議下開源:http://github.com/huanghongxun/HMCL/ ,感谢issues和pull requests贡献者
本軟體使用了基於Apache License 2.0的Gson項目,感謝貢獻者。 +launcher.about=默認背景圖感謝gamerteam提供。
關於作者:
郵箱:contact@hmclsoft.com
歡迎提交Bug哦
Copyright (c) 2013-2016 HMCLSoft.
免責聲明:Minecraft軟體版權歸Mojang AB所有,遊戲由於誤操作本啟動器而丟失數據的概不負責。
本啟動器在GPLv3協議下開源:http://github.com/huanghongxun/HMCL,感谢issues和pull requests贡献者
本軟體使用了基於Apache License 2.0的Gson項目,感謝貢獻者。 launcher.download_source=下載源 launcher.background_location=背景地址 launcher.exit_failed=強制退出失敗,可能是Forge 1.7.10及更高版本導致的,無法解決。 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties index dd02f34b6..d1da548e3 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties @@ -299,7 +299,7 @@ mainwindow.enter_script_name=\u8f38\u5165\u8981\u751f\u6210\u8173\u672c\u7684\u8 mainwindow.make_launch_succeed=\u555f\u52d5\u8173\u672c\u5df2\u751f\u6210\u5b8c\u7562: mainwindow.no_version=\u672a\u627e\u5230\u4efb\u4f55\u7248\u672c\uff0c\u662f\u5426\u9032\u5165\u904a\u6232\u4e0b\u8f09\uff1f -launcher.about=\u9ed8\u8a8d\u80cc\u666f\u5716\u611f\u8b1dgamerteam\u63d0\u4f9b\u3002
\u5982\u679c\u60a8\u5e0c\u671b\u672c\u8edf\u4ef6\u7e7c\u7e8c\u767c\u5c55\uff0c\u8acb\u8d0a\u52a9
\u95dc\u65bc\u4f5c\u8005\uff1a
\u767e\u5ea6ID\uff1ahuanghongxun20
mcbbs\uff1ahuanghongxun
\u90f5\u7bb1\uff1ahuanghongxun2008@126.com
Minecraft Forum ID: klkl6523
\u6b61\u8fce\u63d0\u4ea4Bug\u54e6
Copyright (c) 2013-2016 huangyuhui.
\u514d\u8cac\u8072\u660e\uff1aMinecraft\u8edf\u9ad4\u7248\u6b0a\u6b78Mojang AB\u6240\u6709\uff0c\u904a\u6232\u7531\u65bc\u8aa4\u64cd\u4f5c\u672c\u555f\u52d5\u5668\u800c\u4e1f\u5931\u6578\u64da\u7684\u6982\u4e0d\u8ca0\u8cac\u3002
\u672c\u555f\u52d5\u5668\u5728GPLv3\u5354\u8b70\u4e0b\u958b\u6e90:http://github.com/huanghongxun/HMCL/ ,\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
\u672c\u8edf\u9ad4\u4f7f\u7528\u4e86\u57fa\u65bcApache License 2.0\u7684Gson\u9805\u76ee\uff0c\u611f\u8b1d\u8ca2\u737b\u8005\u3002 +launcher.about=\u9ed8\u8a8d\u80cc\u666f\u5716\u611f\u8b1dgamerteam\u63d0\u4f9b\u3002
\u95dc\u65bc\u4f5c\u8005\uff1a
\u90f5\u7bb1\uff1acontact@hmclsoft.com
\u6b61\u8fce\u63d0\u4ea4Bug\u54e6
Copyright (c) 2013-2016 HMCLSoft.
\u514d\u8cac\u8072\u660e\uff1aMinecraft\u8edf\u9ad4\u7248\u6b0a\u6b78Mojang AB\u6240\u6709\uff0c\u904a\u6232\u7531\u65bc\u8aa4\u64cd\u4f5c\u672c\u555f\u52d5\u5668\u800c\u4e1f\u5931\u6578\u64da\u7684\u6982\u4e0d\u8ca0\u8cac\u3002
\u672c\u555f\u52d5\u5668\u5728GPLv3\u5354\u8b70\u4e0b\u958b\u6e90\uff1ahttp://github.com/huanghongxun/HMCL\uff0c\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
\u672c\u8edf\u9ad4\u4f7f\u7528\u4e86\u57fa\u65bcApache License 2.0\u7684Gson\u9805\u76ee\uff0c\u611f\u8b1d\u8ca2\u737b\u8005\u3002 launcher.download_source=\u4e0b\u8f09\u6e90 launcher.background_location=\u80cc\u666f\u5730\u5740 launcher.exit_failed=\u5f37\u5236\u9000\u51fa\u5931\u6557\uff0c\u53ef\u80fd\u662fForge 1.7.10\u53ca\u66f4\u9ad8\u7248\u672c\u5c0e\u81f4\u7684\uff0c\u7121\u6cd5\u89e3\u6c7a\u3002 From c07d2dc6d37d4b41174578731cec242e743ef6b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Thu, 7 Jul 2016 16:53:46 +0800 Subject: [PATCH 16/46] update link --- .../launcher/ui/LauncherSettingsPanel.form | 7 ++----- .../launcher/ui/LauncherSettingsPanel.java | 15 +++------------ .../java/org/jackhuang/hellominecraft/util/C.java | 2 +- .../org/jackhuang/hellominecraft/lang/I18N.lang | 6 +++--- .../jackhuang/hellominecraft/lang/I18N.properties | 6 +++--- .../jackhuang/hellominecraft/lang/I18N_en.lang | 4 ++-- .../hellominecraft/lang/I18N_en.properties | 4 ++-- .../jackhuang/hellominecraft/lang/I18N_zh_TW.lang | 6 +++--- .../hellominecraft/lang/I18N_zh_TW.properties | 6 +++--- 9 files changed, 22 insertions(+), 34 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form index e63183c93..580d153de 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form @@ -131,7 +131,7 @@ - + @@ -157,12 +157,9 @@ - + - - - diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java index 29ebfbc13..e78a704d4 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java @@ -125,12 +125,7 @@ public class LauncherSettingsPanel extends AnimatedPanel { }); lblAbout.setText(C.i18n("launcher.about")); // NOI18N - lblAbout.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); - lblAbout.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - lblAboutMouseClicked(evt); - } - }); + lblAbout.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); btnSelBackgroundPath.setText(C.i18n("ui.button.explore")); // NOI18N btnSelBackgroundPath.addActionListener(new java.awt.event.ActionListener() { @@ -349,7 +344,7 @@ public class LauncherSettingsPanel extends AnimatedPanel { .addComponent(btnMCBBS)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lblRestart) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 134, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 116, Short.MAX_VALUE) .addComponent(lblModpack, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lblAbout, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) @@ -399,7 +394,7 @@ public class LauncherSettingsPanel extends AnimatedPanel { }//GEN-LAST:event_cboThemeItemStateChanged private void lblModpackMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblModpackMouseClicked - SwingUtils.openLink("http://huangyuhui.duapp.com/link.php?type=modpack"); + SwingUtils.openLink("http://client.api.mcgogogo.com:81/link.php?type=modpack"); }//GEN-LAST:event_lblModpackMouseClicked private void cboLangItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboLangItemStateChanged @@ -434,10 +429,6 @@ public class LauncherSettingsPanel extends AnimatedPanel { Settings.getInstance().setProxyPassword(txtProxyPassword.getText()); }//GEN-LAST:event_txtProxyPasswordFocusLost - private void lblAboutMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblAboutMouseClicked - SwingUtils.openLink("http://huangyuhui.duapp.com/link.php?type=sponsor"); - }//GEN-LAST:event_lblAboutMouseClicked - private void btnMCBBSActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnMCBBSActionPerformed SwingUtils.openLink(C.URL_PUBLISH); }//GEN-LAST:event_btnMCBBSActionPerformed diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/C.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/C.java index 2c8f5a111..4b19cd905 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/C.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/C.java @@ -32,7 +32,7 @@ public final class C { //http://repo1.maven.org/maven2 public static final String URL_PUBLISH = "http://www.mcbbs.net/thread-142335-1-1.html"; public static final String URL_TIEBA = "http://tieba.baidu.com/f?kw=hellominecraftlauncher"; - public static final String URL_GITHUB = "https://github.com/huanghongxun/HMCL/issues"; + public static final String URL_GITHUB = "https://github.com/mclauncher/HMCL/issues"; public static final String URL_MINECRAFTFORUM = "http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-tools/1265720-hello-minecraft-launcher-1-9-3-mc-1-7-4-auto"; public static final String FILE_MINECRAFT_VERSIONS = "versions"; diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang index 783e5efc9..ab3d0b725 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang @@ -176,7 +176,7 @@ ui.label.crashing_out_dated=Hello Minecraft! Launcher遇到了无法处理 ui.label.failed_set=设置失败: download=下载 -download.mojang=官方 +download.mojang=Mojang官方 download.BMCL=BMCLAPI (bangbang93, http://bmclapi.bangbang93.com/) download.rapid_data=RapidData (锐网云计算, https://www.rapiddata.org/) download.not_200=下载失败,回复码 @@ -299,7 +299,7 @@ mainwindow.enter_script_name=输入要生成脚本的文件名 mainwindow.make_launch_succeed=启动脚本已生成完毕: mainwindow.no_version=未找到任何版本,是否进入游戏下载? -launcher.about=默认背景图感谢gamerteam提供。
关于作者:
邮箱:contact@hmclsoft.com
欢迎提交Bug哦
Copyright (c) 2013-2016 HMCLSoft.
免责声明:Minecraft软件版权归Mojang AB所有,使用本软件产生的版权问题本软件制作方概不负责。
本启动器在GPLv3协议下开源:https://github.com/mclauncher/HMCL,感谢issues和pull requests贡献者
本软件使用了基于Apache License 2.0的Gson项目,感谢贡献者。 +launcher.about=默认背景图感谢gamerteam提供。
关于作者:
主页:http://www.hmclsoft.com
邮箱:contact@hmclsoft.com
欢迎提交Bug哦
Copyright (c) 2013-2016 HMCLSoft.
免责声明:Minecraft软件版权归Mojang AB所有,使用本软件产生的版权问题本软件制作方概不负责。
本启动器在GPLv3协议下开源:https://github.com/mclauncher/HMCL,感谢issues和pull requests贡献者
本软件使用了基于Apache License 2.0的Gson项目,感谢贡献者。 launcher.download_source=下载源 launcher.background_location=背景地址 launcher.exit_failed=强制退出失败,可能是Forge 1.7.10及更高版本导致的,无法解决。 @@ -313,7 +313,7 @@ launcher.enable_shadow=启用窗口阴影 launcher.theme=主题 launcher.proxy=代理 launcher.decorated=启用窗口边框(Linux下可解决程序界面全灰问题) -launcher.modpack=整合包作者帮助 +launcher.modpack=整合包作者帮助 launcher.enable_animation=启用动态效果 launcher.lang=语言 launcher.restart=本界面选项需要重启本启动器生效 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties index 9a97e85c5..9079982dc 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties @@ -176,7 +176,7 @@ ui.label.crashing_out_dated=Hello Minecraft! Launcher\u9047\u5230\u4e86\u6 ui.label.failed_set=\u8bbe\u7f6e\u5931\u8d25\uff1a download=\u4e0b\u8f7d -download.mojang=\u5b98\u65b9 +download.mojang=Mojang\u5b98\u65b9 download.BMCL=BMCLAPI (bangbang93, http://bmclapi.bangbang93.com/) download.rapid_data=RapidData (\u9510\u7f51\u4e91\u8ba1\u7b97, https://www.rapiddata.org/) download.not_200=\u4e0b\u8f7d\u5931\u8d25\uff0c\u56de\u590d\u7801 @@ -299,7 +299,7 @@ mainwindow.enter_script_name=\u8f93\u5165\u8981\u751f\u6210\u811a\u672c\u7684\u6 mainwindow.make_launch_succeed=\u542f\u52a8\u811a\u672c\u5df2\u751f\u6210\u5b8c\u6bd5: mainwindow.no_version=\u672a\u627e\u5230\u4efb\u4f55\u7248\u672c\uff0c\u662f\u5426\u8fdb\u5165\u6e38\u620f\u4e0b\u8f7d\uff1f -launcher.about=\u9ed8\u8ba4\u80cc\u666f\u56fe\u611f\u8c22gamerteam\u63d0\u4f9b\u3002
\u5173\u4e8e\u4f5c\u8005\uff1a
\u90ae\u7bb1\uff1acontact@hmclsoft.com
\u6b22\u8fce\u63d0\u4ea4Bug\u54e6
Copyright (c) 2013-2016 HMCLSoft.
\u514d\u8d23\u58f0\u660e\uff1aMinecraft\u8f6f\u4ef6\u7248\u6743\u5f52Mojang AB\u6240\u6709\uff0c\u4f7f\u7528\u672c\u8f6f\u4ef6\u4ea7\u751f\u7684\u7248\u6743\u95ee\u9898\u672c\u8f6f\u4ef6\u5236\u4f5c\u65b9\u6982\u4e0d\u8d1f\u8d23\u3002
\u672c\u542f\u52a8\u5668\u5728GPLv3\u534f\u8bae\u4e0b\u5f00\u6e90\uff1ahttps://github.com/mclauncher/HMCL\uff0c\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
\u672c\u8f6f\u4ef6\u4f7f\u7528\u4e86\u57fa\u4e8eApache License 2.0\u7684Gson\u9879\u76ee\uff0c\u611f\u8c22\u8d21\u732e\u8005\u3002 +launcher.about=\u9ed8\u8ba4\u80cc\u666f\u56fe\u611f\u8c22gamerteam\u63d0\u4f9b\u3002
\u5173\u4e8e\u4f5c\u8005\uff1a
\u4e3b\u9875\uff1ahttp://www.hmclsoft.com
\u90ae\u7bb1\uff1acontact@hmclsoft.com
\u6b22\u8fce\u63d0\u4ea4Bug\u54e6
Copyright (c) 2013-2016 HMCLSoft.
\u514d\u8d23\u58f0\u660e\uff1aMinecraft\u8f6f\u4ef6\u7248\u6743\u5f52Mojang AB\u6240\u6709\uff0c\u4f7f\u7528\u672c\u8f6f\u4ef6\u4ea7\u751f\u7684\u7248\u6743\u95ee\u9898\u672c\u8f6f\u4ef6\u5236\u4f5c\u65b9\u6982\u4e0d\u8d1f\u8d23\u3002
\u672c\u542f\u52a8\u5668\u5728GPLv3\u534f\u8bae\u4e0b\u5f00\u6e90\uff1ahttps://github.com/mclauncher/HMCL\uff0c\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
\u672c\u8f6f\u4ef6\u4f7f\u7528\u4e86\u57fa\u4e8eApache License 2.0\u7684Gson\u9879\u76ee\uff0c\u611f\u8c22\u8d21\u732e\u8005\u3002 launcher.download_source=\u4e0b\u8f7d\u6e90 launcher.background_location=\u80cc\u666f\u5730\u5740 launcher.exit_failed=\u5f3a\u5236\u9000\u51fa\u5931\u8d25\uff0c\u53ef\u80fd\u662fForge 1.7.10\u53ca\u66f4\u9ad8\u7248\u672c\u5bfc\u81f4\u7684\uff0c\u65e0\u6cd5\u89e3\u51b3\u3002 @@ -313,7 +313,7 @@ launcher.enable_shadow=\u542f\u7528\u7a97\u53e3\u9634\u5f71 launcher.theme=\u4e3b\u9898 launcher.proxy=\u4ee3\u7406 launcher.decorated=\u542f\u7528\u7a97\u53e3\u8fb9\u6846(Linux\u4e0b\u53ef\u89e3\u51b3\u7a0b\u5e8f\u754c\u9762\u5168\u7070\u95ee\u9898) -launcher.modpack=\u6574\u5408\u5305\u4f5c\u8005\u5e2e\u52a9 +launcher.modpack=\u6574\u5408\u5305\u4f5c\u8005\u5e2e\u52a9 launcher.enable_animation=\u542f\u7528\u52a8\u6001\u6548\u679c launcher.lang=\u8bed\u8a00 launcher.restart=\u672c\u754c\u9762\u9009\u9879\u9700\u8981\u91cd\u542f\u672c\u542f\u52a8\u5668\u751f\u6548 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang index ae6fb1bdb..e2a2a7a43 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang @@ -299,7 +299,7 @@ mainwindow.enter_script_name=Enter the script name. mainwindow.make_launch_succeed=Finished script creation. mainwindow.no_version=No version found. Switch to Game Downloads Tab? -launcher.about=About Author
Email: contact@hmclsoft.com
Copyright (c) 2013 HMCLSoft.
Opened source under GPL v3 license: http://github.com/mclauncher/HMCL
This software used project Gson which is under Apache License 2.0, thanks contributors. +launcher.about=About Author
Homepage: http://www.hmclsoft.com
Email: contact@hmclsoft.com
Copyright (c) 2013 HMCLSoft.
Opened source under GPL v3 license: http://github.com/mclauncher/HMCL
This software used project Gson which is under Apache License 2.0, thanks contributors. launcher.download_source=Download Source launcher.background_location=Background Location launcher.exit_failed=Failed to shutdown. @@ -313,7 +313,7 @@ launcher.enable_shadow=Enable Window Shadow launcher.theme=Theme launcher.proxy=Proxy launcher.decorated=Enable system window border(in order to fix the problem that the ui become all gray in Linux OS) -launcher.modpack=Documentations for modpacks. +launcher.modpack=Documentations for modpacks. launcher.enable_animation=Enable Animation launcher.lang=Language launcher.restart=Options will be in operations only if restart this app. diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties index ae6fb1bdb..e2a2a7a43 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties @@ -299,7 +299,7 @@ mainwindow.enter_script_name=Enter the script name. mainwindow.make_launch_succeed=Finished script creation. mainwindow.no_version=No version found. Switch to Game Downloads Tab? -launcher.about=About Author
Email: contact@hmclsoft.com
Copyright (c) 2013 HMCLSoft.
Opened source under GPL v3 license: http://github.com/mclauncher/HMCL
This software used project Gson which is under Apache License 2.0, thanks contributors. +launcher.about=About Author
Homepage: http://www.hmclsoft.com
Email: contact@hmclsoft.com
Copyright (c) 2013 HMCLSoft.
Opened source under GPL v3 license: http://github.com/mclauncher/HMCL
This software used project Gson which is under Apache License 2.0, thanks contributors. launcher.download_source=Download Source launcher.background_location=Background Location launcher.exit_failed=Failed to shutdown. @@ -313,7 +313,7 @@ launcher.enable_shadow=Enable Window Shadow launcher.theme=Theme launcher.proxy=Proxy launcher.decorated=Enable system window border(in order to fix the problem that the ui become all gray in Linux OS) -launcher.modpack=Documentations for modpacks. +launcher.modpack=Documentations for modpacks. launcher.enable_animation=Enable Animation launcher.lang=Language launcher.restart=Options will be in operations only if restart this app. diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang index 49abdb985..f3f02e798 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang @@ -176,7 +176,7 @@ ui.label.crashing_out_dated=Hello Minecraft! Launcher遇到了無法處理 ui.label.failed_set=設定失敗: download=下載 -download.mojang=官方 +download.mojang=Mojang官方 download.BMCL=BMCLAPI (bangbang93, http://bmclapi.bangbang93.com/) download.rapid_data=RapidData (銳網雲計算, https://www.rapiddata.org/) download.not_200=下載失敗,回复码 @@ -299,7 +299,7 @@ mainwindow.enter_script_name=輸入要生成腳本的資料名 mainwindow.make_launch_succeed=啟動腳本已生成完畢: mainwindow.no_version=未找到任何版本,是否進入遊戲下載? -launcher.about=默認背景圖感謝gamerteam提供。
關於作者:
郵箱:contact@hmclsoft.com
歡迎提交Bug哦
Copyright (c) 2013-2016 HMCLSoft.
免責聲明:Minecraft軟體版權歸Mojang AB所有,遊戲由於誤操作本啟動器而丟失數據的概不負責。
本啟動器在GPLv3協議下開源:http://github.com/huanghongxun/HMCL,感谢issues和pull requests贡献者
本軟體使用了基於Apache License 2.0的Gson項目,感謝貢獻者。 +launcher.about=默認背景圖感謝gamerteam提供。
關於作者:
主頁:http://www.hmclsoft.com
郵箱:contact@hmclsoft.com
歡迎提交Bug哦
Copyright (c) 2013-2016 HMCLSoft.
免責聲明:Minecraft軟體版權歸Mojang AB所有,遊戲由於誤操作本啟動器而丟失數據的概不負責。
本啟動器在GPLv3協議下開源:http://github.com/mclauncher/HMCL,感谢issues和pull requests贡献者
本軟體使用了基於Apache License 2.0的Gson項目,感謝貢獻者。 launcher.download_source=下載源 launcher.background_location=背景地址 launcher.exit_failed=強制退出失敗,可能是Forge 1.7.10及更高版本導致的,無法解決。 @@ -313,7 +313,7 @@ launcher.enable_shadow=启用窗口阴影 launcher.theme=主题 launcher.proxy=代理 launcher.decorated=啟用窗口邊框(Linux下可解決程序界面全灰問題) -launcher.modpack=整合包作者帮助 +launcher.modpack=整合包作者帮助 launcher.enable_animation=啟用動態效果 launcher.lang=語言 launcher.restart=本界面選項需要重啟本啟動器生效 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties index d1da548e3..cd868b494 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties @@ -176,7 +176,7 @@ ui.label.crashing_out_dated=Hello Minecraft! Launcher\u9047\u5230\u4e86\u7 ui.label.failed_set=\u8a2d\u5b9a\u5931\u6557\uff1a download=\u4e0b\u8f09 -download.mojang=\u5b98\u65b9 +download.mojang=Mojang\u5b98\u65b9 download.BMCL=BMCLAPI (bangbang93, http://bmclapi.bangbang93.com/) download.rapid_data=RapidData (\u92b3\u7db2\u96f2\u8a08\u7b97, https://www.rapiddata.org/) download.not_200=\u4e0b\u8f09\u5931\u6557\uff0c\u56de\u590d\u7801 @@ -299,7 +299,7 @@ mainwindow.enter_script_name=\u8f38\u5165\u8981\u751f\u6210\u8173\u672c\u7684\u8 mainwindow.make_launch_succeed=\u555f\u52d5\u8173\u672c\u5df2\u751f\u6210\u5b8c\u7562: mainwindow.no_version=\u672a\u627e\u5230\u4efb\u4f55\u7248\u672c\uff0c\u662f\u5426\u9032\u5165\u904a\u6232\u4e0b\u8f09\uff1f -launcher.about=\u9ed8\u8a8d\u80cc\u666f\u5716\u611f\u8b1dgamerteam\u63d0\u4f9b\u3002
\u95dc\u65bc\u4f5c\u8005\uff1a
\u90f5\u7bb1\uff1acontact@hmclsoft.com
\u6b61\u8fce\u63d0\u4ea4Bug\u54e6
Copyright (c) 2013-2016 HMCLSoft.
\u514d\u8cac\u8072\u660e\uff1aMinecraft\u8edf\u9ad4\u7248\u6b0a\u6b78Mojang AB\u6240\u6709\uff0c\u904a\u6232\u7531\u65bc\u8aa4\u64cd\u4f5c\u672c\u555f\u52d5\u5668\u800c\u4e1f\u5931\u6578\u64da\u7684\u6982\u4e0d\u8ca0\u8cac\u3002
\u672c\u555f\u52d5\u5668\u5728GPLv3\u5354\u8b70\u4e0b\u958b\u6e90\uff1ahttp://github.com/huanghongxun/HMCL\uff0c\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
\u672c\u8edf\u9ad4\u4f7f\u7528\u4e86\u57fa\u65bcApache License 2.0\u7684Gson\u9805\u76ee\uff0c\u611f\u8b1d\u8ca2\u737b\u8005\u3002 +launcher.about=\u9ed8\u8a8d\u80cc\u666f\u5716\u611f\u8b1dgamerteam\u63d0\u4f9b\u3002
\u95dc\u65bc\u4f5c\u8005\uff1a
\u4e3b\u9801\uff1ahttp://www.hmclsoft.com
\u90f5\u7bb1\uff1acontact@hmclsoft.com
\u6b61\u8fce\u63d0\u4ea4Bug\u54e6
Copyright (c) 2013-2016 HMCLSoft.
\u514d\u8cac\u8072\u660e\uff1aMinecraft\u8edf\u9ad4\u7248\u6b0a\u6b78Mojang AB\u6240\u6709\uff0c\u904a\u6232\u7531\u65bc\u8aa4\u64cd\u4f5c\u672c\u555f\u52d5\u5668\u800c\u4e1f\u5931\u6578\u64da\u7684\u6982\u4e0d\u8ca0\u8cac\u3002
\u672c\u555f\u52d5\u5668\u5728GPLv3\u5354\u8b70\u4e0b\u958b\u6e90\uff1ahttp://github.com/mclauncher/HMCL\uff0c\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
\u672c\u8edf\u9ad4\u4f7f\u7528\u4e86\u57fa\u65bcApache License 2.0\u7684Gson\u9805\u76ee\uff0c\u611f\u8b1d\u8ca2\u737b\u8005\u3002 launcher.download_source=\u4e0b\u8f09\u6e90 launcher.background_location=\u80cc\u666f\u5730\u5740 launcher.exit_failed=\u5f37\u5236\u9000\u51fa\u5931\u6557\uff0c\u53ef\u80fd\u662fForge 1.7.10\u53ca\u66f4\u9ad8\u7248\u672c\u5c0e\u81f4\u7684\uff0c\u7121\u6cd5\u89e3\u6c7a\u3002 @@ -313,7 +313,7 @@ launcher.enable_shadow=\u542f\u7528\u7a97\u53e3\u9634\u5f71 launcher.theme=\u4e3b\u9898 launcher.proxy=\u4ee3\u7406 launcher.decorated=\u555f\u7528\u7a97\u53e3\u908a\u6846(Linux\u4e0b\u53ef\u89e3\u6c7a\u7a0b\u5e8f\u754c\u9762\u5168\u7070\u554f\u984c) -launcher.modpack=\u6574\u5408\u5305\u4f5c\u8005\u5e2e\u52a9 +launcher.modpack=\u6574\u5408\u5305\u4f5c\u8005\u5e2e\u52a9 launcher.enable_animation=\u555f\u7528\u52d5\u614b\u6548\u679c launcher.lang=\u8a9e\u8a00 launcher.restart=\u672c\u754c\u9762\u9078\u9805\u9700\u8981\u91cd\u555f\u672c\u555f\u52d5\u5668\u751f\u6548 From d87b768fc0c1f37716c74166e5fbb8332accd7ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Thu, 7 Jul 2016 18:01:58 +0800 Subject: [PATCH 17/46] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=A8=A1=E7=BB=84?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E8=A7=A3=E6=9E=90=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../launcher/core/mod/ModInfo.java | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/mod/ModInfo.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/mod/ModInfo.java index f508b2acc..5de1ab074 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/mod/ModInfo.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/mod/ModInfo.java @@ -17,13 +17,15 @@ */ package org.jackhuang.hellominecraft.launcher.core.mod; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import com.google.gson.JsonSyntaxException; import com.google.gson.annotations.SerializedName; import com.google.gson.reflect.TypeToken; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; -import java.lang.reflect.Type; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -60,6 +62,8 @@ public class ModInfo implements Comparable { public String credits; @SerializedName("authorList") public String[] authorList; + @SerializedName("authors") + public String[] authors; public boolean isActive() { return !location.getName().endsWith(".disabled"); @@ -87,6 +91,8 @@ public class ModInfo implements Comparable { public String getAuthor() { if (authorList != null && authorList.length > 0) return StrUtils.parseParams("", authorList, ", "); + else if (authors != null && authors.length > 0) + return StrUtils.parseParams("", authors, ", "); else if (StrUtils.isNotBlank(author)) return author; else @@ -123,18 +129,30 @@ public class ModInfo implements Comparable { return name.endsWith(".zip") || name.endsWith(".jar") || name.endsWith("litemod"); } - private static final Type TYPE = new TypeToken>() { - }.getType(); - private static ModInfo getForgeModInfo(File f, ZipFile jar, ZipEntry entry) throws IOException { - ModInfo i = new ModInfo(); - i.location = f; - List m = C.GSON.fromJson(new InputStreamReader(jar.getInputStream(entry), "UTF-8"), TYPE); - if (m != null && m.size() > 0) { - i = m.get(0); - i.location = f; - } - return i; + ModInfo i = new ModInfo(); + i.location = f; + + InputStreamReader streamReader = new InputStreamReader(jar.getInputStream(entry), "UTF-8"); + + JsonParser parser = new JsonParser(); + JsonElement element = parser.parse(streamReader); + List m = null; + if (element.isJsonArray()) { + m = C.GSON.fromJson(element, new TypeToken>(){}.getType()); + } else if (element.isJsonObject()) { + JsonObject modInfo = element.getAsJsonObject(); + if (modInfo.has("modList") && modInfo.get("modList").isJsonArray()) { + m = C.GSON.fromJson(modInfo.get("modList"), new TypeToken>(){}.getType()); + } + } + + if (m != null && m.size() > 0) { + i = m.get(0); + i.location = f; + } + + return i; } private static ModInfo getLiteLoaderModInfo(File f, ZipFile jar, ZipEntry entry) throws IOException { From 793f81e287d63344c1daa0a9544bf32937622543 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Fri, 8 Jul 2016 19:49:06 +0800 Subject: [PATCH 18/46] update travis --- .nb-gradle-properties | 2 +- .travis.yml | 7 ++++--- HMCL/build.gradle | 11 ++++------- LICENSE | 4 ++-- license-header.txt | 2 +- 5 files changed, 12 insertions(+), 14 deletions(-) diff --git a/.nb-gradle-properties b/.nb-gradle-properties index aa17ec6af..a27e06991 100755 --- a/.nb-gradle-properties +++ b/.nb-gradle-properties @@ -31,6 +31,6 @@ GNU General Public License - huangyuhui + HMCLSoft diff --git a/.travis.yml b/.travis.yml index 9fce3d616..315f05668 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,8 +11,7 @@ before_deploy: - git push -q ${REPO} --tags deploy: provider: releases - api_key: - secure: lfFEwKtij/s9Ao/SKL7oVdsWcfASshZuwT27gllMrTx1ZQqLCG2I5mGJOp5ukx7lb3y4Tu316nFasLjy9NI3eLXSx9f0w4q+wMf0K5Yj9iOwu/TIn7JkLyHDMQ20qRwGxZplS2WUb669gIRg+l6jUHeTBW+dlTxr0mMa6WHIl8UDpHwfFrGC3i6dL4y6WlDwGl2rYktvOoA/iqvtglBcHuXaL2sDfhp5MXRcYULTIw+b9zmiQXP665DQN+Su5I3gwB4y5X8RH72GAacZn13fEIo5i8UUoHM7UQxM8y8DKSO3avyFCfpUle9+9sErQVW7b6JV1c+AoLWuAhNJLMlUTKarZE7UMqfjvoQHxX5hp2B2WHLEON/UJiGf25HJWx6VhJitE0/odujqnG/umesqki2jMTs6gPcxbc9iBjzUg+ZmFztdtC+Emnni7lpqVVl+Y5hsJRn3Z6rIiNgwmaE0r2OQgAm1vRYFc7jvOdRfyFG+uCRZF6nS56BzJ7dLc0WW8dTgSft6YFll4ZYL6hiI9qiIaBAK948y5HV+6VBWuO3xf/G2CUFbE1Y9qUCjToh3ahxNDzZvXB+rXqvlvNQOi5l8n594oQ61n45qIHSKlMBn9Bxhw29oWT5mo1aYIaNXbpzKam2w4mK0T3VrgTszu/3282wRbNr+VAwdGMfwW1s= + api_key: ${DEPLOY_REPO} file: - HMCL/build/libs/HMCL-${HMCL_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}.jar - HMCL/build/libs/HMCL-${HMCL_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}.exe @@ -21,7 +20,7 @@ deploy: - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}.exe - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}-MacOSApp.zip on: - repo: huanghongxun/HMCL + repo: mclauncher/HMCL tags: false skip_cleanup: true install: echo "skip 'gradle assemble' step" @@ -32,3 +31,5 @@ cache: directories: - "$HOME/.gradle/caches/" - "$HOME/.gradle/wrapper/" +git: + depth: 1 \ No newline at end of file diff --git a/HMCL/build.gradle b/HMCL/build.gradle index d6864df76..06cf6ad91 100755 --- a/HMCL/build.gradle +++ b/HMCL/build.gradle @@ -46,7 +46,6 @@ if (!hasProperty('mainClass')) { ext.mainClass = 'org.jackhuang.hellominecraft.launcher.Main' } - def readBuildNumber() { def versionPropsFile = file('version.properties') @@ -68,7 +67,7 @@ if (buildnumber == null) buildnumber = System.getenv("BUILD_NUMBER") if (buildnumber == null) buildnumber = readBuildNumber() - + def versionroot = System.getenv("VERSION_ROOT") if (versionroot == null) versionroot = "2.5.0" @@ -157,22 +156,20 @@ jar { from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } manifest { - attributes 'Created-By' : 'Copyright(c) 2013-2016 huangyuhui.', + attributes 'Created-By' : 'Copyright(c) 2013-2016 HMCLSoft.', 'Main-Class' : mainClass } } launch4j { - launch4jCmd = 'D:\\Develop\\Java\\Launch4j\\launch4j.exe' - //launch4jCmd = '/home/huangyuhui/softwares/launch4j/launch4j' - supportUrl = 'http://www.mcbbs.net/thread-142335-1-1.html' + supportUrl = 'http://www.hmclsoft.com' jreMinVersion = '1.6.0' mainClassName = mainClass icon = new File(project.buildDir, '../icon.ico').absolutePath version = mavenVersion downloadUrl = 'http://java.com/download' - copyright = "Copyright(c) 2013-2015 huangyuhui." + copyright = "Copyright(c) 2013-2015 HMCLSoft." jar = new File(project.buildDir, 'libs/' + mavenGroupId + '-' + mavenVersion + '.jar').absolutePath outfile = mavenGroupId + '-' + mavenVersion + '.exe' diff --git a/LICENSE b/LICENSE index 074b814ad..2b4d6a2c3 100755 --- a/LICENSE +++ b/LICENSE @@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Hello Minecraft! Launcher, a Minecraft Launcher which is easy to use. - Copyright (C) 2014 huangyuhui + Copyright (C) 2016 HMCLSoft. 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 @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - Hello Minecraft! Launcher Copyright (C) 2014 huangyuhui + Hello Minecraft! Launcher Copyright (C) 2016 HMCLSoft. This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. diff --git a/license-header.txt b/license-header.txt index 15cd12760..3ac193d02 100755 --- a/license-header.txt +++ b/license-header.txt @@ -1,6 +1,6 @@ /* * Hello Minecraft! Launcher. - * Copyright (C) 2013 huangyuhui + * Copyright (C) 2016 HMCLSoft. * * 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 From 93273d555d88e09d3970ef375df02567fd12749b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Fri, 8 Jul 2016 19:54:48 +0800 Subject: [PATCH 19/46] update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8140b02f4..b7e2a1556 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Hello Minecraft! Launcher [![Build Status](https://travis-ci.org/huanghongxun/HMCL.svg?branch=master)](https://travis-ci.org/huanghongxun/HMCL) +# Hello Minecraft! Launcher [![Build Status](https://travis-ci.org/mclauncher/HMCL.svg?branch=master)](https://travis-ci.org/mclauncher/HMCL) 开源协议为GPL v3, 详情参见http://www.gnu.org/licenses/gpl.html ## 介绍 From c15ec71be96afe10f7b864e6c94f56e2032b8d6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Fri, 8 Jul 2016 20:31:25 +0800 Subject: [PATCH 20/46] update travis --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 315f05668..7da8083a4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,6 @@ deploy: - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}.exe - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}-MacOSApp.zip on: - repo: mclauncher/HMCL tags: false skip_cleanup: true install: echo "skip 'gradle assemble' step" From ba763b2d2ad9f072699317a31bdb79eade896c58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Fri, 8 Jul 2016 20:40:55 +0800 Subject: [PATCH 21/46] Synchronize version.properties --- HMCL/version.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HMCL/version.properties b/HMCL/version.properties index 600781aa7..1f20bd6d9 100644 --- a/HMCL/version.properties +++ b/HMCL/version.properties @@ -1,2 +1,2 @@ #Thu Jul 07 14:30:49 CST 2016 -VERSION_CODE=92 +VERSION_CODE=63 From bd4c07a013548bfb4940ad9bc937119b54fbfd5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Sat, 9 Jul 2016 21:01:37 +0800 Subject: [PATCH 22/46] read buildNumber from travis --- HMCL/build.gradle | 37 ++++++++++++++++++++++++++++--------- HMCL/version.properties | 2 -- 2 files changed, 28 insertions(+), 11 deletions(-) delete mode 100644 HMCL/version.properties diff --git a/HMCL/build.gradle b/HMCL/build.gradle index 06cf6ad91..56b1b8eab 100755 --- a/HMCL/build.gradle +++ b/HMCL/build.gradle @@ -27,6 +27,7 @@ buildscript { classpath 'net.sf.proguard:proguard-gradle:4.10' classpath 'edu.sc.seis.gradle:launch4j:1.0.6' classpath 'me.tatarka:gradle-retrolambda:3.1.0' + classpath 'com.google.code.gson:gson:2.2.4' } } } @@ -38,6 +39,7 @@ plugins { import java.util.jar.JarOutputStream import java.util.zip.ZipEntry import java.util.zip.ZipFile +import com.google.gson.JsonParser apply plugin: 'launch4j' apply plugin: 'me.tatarka.retrolambda' @@ -47,19 +49,35 @@ if (!hasProperty('mainClass')) { } def readBuildNumber() { - def versionPropsFile = file('version.properties') + def versionPropsFile = file('version.properties') + def Properties versionProps = new Properties() if (versionPropsFile.canRead()) { - def Properties versionProps = new Properties() versionProps.load(new FileInputStream(versionPropsFile)) - def code = versionProps['VERSION_CODE'].toInteger() + 1 - versionProps['VERSION_CODE'] = code.toString() - versionProps.store(versionPropsFile.newWriter(), null) - - return code.toString() - } - return "233" + + return code.toString() + } else { + versionPropsFile.createNewFile() + + String url = 'https://api.travis-ci.org/repos/mclauncher/HMCL/branches' + def json = new JsonParser().parse(url.toURL().text); + if (json.has('branches') && json.get('branches').isJsonArray()) { + def branches = json.getAsJsonArray('branches') + if (branches != null && branches.size() > 0) { + def info = branches.get(0).getAsJsonObject() + def code = info.get('number').getAsInt() + 1 + versionProps['VERSION_CODE'] = code.toString() + versionProps.store(versionPropsFile.newWriter(), null) + return code.toString() + } + } + } + return '233' +} + +task cleanVersionFile << { + file("version.properties").delete() } def buildnumber = System.getenv("TRAVIS_BUILD_NUMBER") @@ -182,6 +200,7 @@ processResources { } } +build.dependsOn cleanVersionFile build.dependsOn makeExecutable build.dependsOn makePackGZ build.dependsOn macAppCompressed \ No newline at end of file diff --git a/HMCL/version.properties b/HMCL/version.properties deleted file mode 100644 index 1f20bd6d9..000000000 --- a/HMCL/version.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Thu Jul 07 14:30:49 CST 2016 -VERSION_CODE=63 From b6be41e5c5a75ac7247797f870cad0c9d618256a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Sat, 9 Jul 2016 21:02:57 +0800 Subject: [PATCH 23/46] update git ignore file --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d98830a22..e01d42c6f 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,5 @@ HMCLServer/ HMCSM/build/ MetroLookAndFeel/build/ /HMCUtils/build/ -/HMCLaF/build/ \ No newline at end of file +/HMCLaF/build/ +HMCL/version.properties From c33a99d9ed76850ff444601b692feccdaa36cb0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Sat, 9 Jul 2016 22:04:43 +0800 Subject: [PATCH 24/46] show update log --- .../util/upgrade/AppDataUpgrader.java | 41 +++++++++++++++++-- .../hellominecraft/util/IUpdateChecker.java | 18 +++++++- .../hellominecraft/util/UpdateChecker.java | 20 +++++++-- 3 files changed, 70 insertions(+), 9 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java index eeed30ecc..6f34819db 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java @@ -17,6 +17,7 @@ */ package org.jackhuang.hellominecraft.launcher.util.upgrade; +import java.awt.Dimension; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -36,16 +37,21 @@ import java.util.jar.JarFile; import java.util.jar.JarOutputStream; import java.util.jar.Pack200; import java.util.zip.GZIPInputStream; +import javax.swing.BorderFactory; +import javax.swing.BoxLayout; import javax.swing.JCheckBox; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextPane; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.launcher.core.MCUtils; import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.util.tasks.Task; -import org.jackhuang.hellominecraft.util.tasks.TaskWindow; import org.jackhuang.hellominecraft.util.tasks.download.FileDownloadTask; import org.jackhuang.hellominecraft.util.ArrayUtils; import org.jackhuang.hellominecraft.util.MessageBox; +import org.jackhuang.hellominecraft.util.StrUtils; import org.jackhuang.hellominecraft.util.UpdateChecker; import org.jackhuang.hellominecraft.util.Utils; import org.jackhuang.hellominecraft.util.VersionNumber; @@ -54,6 +60,7 @@ import org.jackhuang.hellominecraft.util.system.FileUtils; import org.jackhuang.hellominecraft.util.system.IOUtils; import org.jackhuang.hellominecraft.util.system.OS; import org.jackhuang.hellominecraft.util.tasks.TaskList; +import org.jackhuang.hellominecraft.util.tasks.TaskWindow; /** * @@ -111,12 +118,38 @@ public class AppDataUpgrader extends IUpgrader { versionNumber.firstVer + "." + versionNumber.secondVer + "." + versionNumber.thirdVer + "\n" + C.i18n("update.should_open_link"); + JCheckBox checkbox = new JCheckBox(C.i18n("update.ignore")); - int ret = MessageBox.Show(new Object[]{content, checkbox}, MessageBox.YES_NO_OPTION); - if (ret == MessageBox.NO_OPTION) { - Settings.getInstance().setIgnoreUpdate(versionNumber); + + JPanel logPanel = new JPanel(); + logPanel.setLayout(new BoxLayout(logPanel, BoxLayout.X_AXIS)); + logPanel.setPreferredSize(new Dimension(300,150)); + logPanel.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 5)); + + JScrollPane scrollPane = new JScrollPane(); + JTextPane textPane = new JTextPane(); + textPane.setContentType("text/plain"); + textPane.setEditable(false); + + scrollPane.setViewportView(textPane); + logPanel.add(scrollPane); + + int msgRet; + String updateLog = Settings.UPDATE_CHECKER.getUpdateLog(); + if (StrUtils.isBlank(updateLog)) { + msgRet = MessageBox.Show(new Object[]{content, checkbox}, MessageBox.YES_NO_OPTION); + } else { + textPane.setText(updateLog); + msgRet = MessageBox.Show(new Object[]{content, logPanel, checkbox}, MessageBox.YES_NO_OPTION); + } + + if (msgRet == MessageBox.NO_OPTION) { + if (checkbox.isSelected()) { + Settings.getInstance().setIgnoreUpdate(versionNumber); + } return false; } + return true; } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/IUpdateChecker.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/IUpdateChecker.java index c7ae6758b..7ae79d962 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/IUpdateChecker.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/IUpdateChecker.java @@ -26,12 +26,26 @@ import java.util.Map; public interface IUpdateChecker { /** - * + * Update response */ void checkOutdate(); + /** + * + * @return Update log + */ + String getUpdateLog(); + + /** + * + * @return Server to assign a mandatory update + */ boolean isForceUpdate(); - + + /** + * + * @return User manual update + */ boolean isManualUpdate(); /** diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java index a4b5119ac..4d9c78300 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java @@ -19,6 +19,7 @@ package org.jackhuang.hellominecraft.util; import org.jackhuang.hellominecraft.util.logging.HMCLog; import java.util.Map; +import org.jackhuang.hellominecraft.util.lang.SupportedLocales; /** * @@ -34,9 +35,12 @@ public final class UpdateChecker implements IUpdateChecker { public String versionString; public VersionNumber base; private VersionNumber value; + private boolean isforceUpdate = false; private boolean isManualUpdate = false; + private String updateLog = null; + public String type; private Map download_link = null; @@ -53,12 +57,17 @@ public final class UpdateChecker implements IUpdateChecker { isManualUpdate = showMessage; if (value == null) { - versionString = NetUtils.get(VERSION_URL + type + "&ver=" + base.toString()); + versionString = NetUtils.get(VERSION_URL + type + + "&ver=" + base.toString() + + "&lang=" + SupportedLocales.NOW_LOCALE.self); + Map versionInfo = C.GSON.fromJson(versionString, Map.class); if (versionInfo.containsKey("version")) - value = VersionNumber.check((String)versionInfo.get("version")); + value = VersionNumber.check((String) versionInfo.get("version")); if (versionInfo.containsKey("force")) - isforceUpdate = (boolean)versionInfo.get("force"); + isforceUpdate = (boolean) versionInfo.get("force"); + if (versionInfo.containsKey("log")) + updateLog = (String) versionInfo.get("log"); } if (value == null) { @@ -92,6 +101,11 @@ public final class UpdateChecker implements IUpdateChecker { return isManualUpdate; } + @Override + public String getUpdateLog() { + return updateLog; + } + @Override public synchronized OverridableSwingWorker> requestDownloadLink() { return new OverridableSwingWorker() { From 3b4b63e57b61edbb18057d7a3a98d5f35e88ce34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Mon, 11 Jul 2016 11:47:12 +0800 Subject: [PATCH 25/46] Modify publish link --- .gitignore | 1 + .../launcher/ui/LauncherSettingsPanel.form | 12 ++++++---- .../launcher/ui/LauncherSettingsPanel.java | 20 ++++++++-------- .../org/jackhuang/hellominecraft/util/C.java | 6 ++--- .../hellominecraft/util/ui/LogWindow.form | 12 ++++++---- .../hellominecraft/util/ui/LogWindow.java | 24 +++++++++---------- .../jackhuang/hellominecraft/lang/I18N.lang | 2 ++ .../hellominecraft/lang/I18N.properties | 2 ++ .../hellominecraft/lang/I18N_en.lang | 2 ++ .../hellominecraft/lang/I18N_en.properties | 2 ++ .../hellominecraft/lang/I18N_zh_TW.lang | 2 ++ .../hellominecraft/lang/I18N_zh_TW.properties | 2 ++ 12 files changed, 52 insertions(+), 35 deletions(-) diff --git a/.gitignore b/.gitignore index e01d42c6f..efb879487 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ MetroLookAndFeel/build/ /HMCUtils/build/ /HMCLaF/build/ HMCL/version.properties +.idea/ diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form index 580d153de..a25ac8a11 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form @@ -27,7 +27,7 @@ - + @@ -127,7 +127,7 @@ - + @@ -345,13 +345,15 @@
- + - + + + - + diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java index e78a704d4..63f59fb4a 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java @@ -116,7 +116,7 @@ public class LauncherSettingsPanel extends AnimatedPanel { cboLang = new javax.swing.JComboBox(); lblLang = new javax.swing.JLabel(); lblRestart = new javax.swing.JLabel(); - btnMCBBS = new javax.swing.JButton(); + btnHomepage = new javax.swing.JButton(); cboDownloadSource.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { @@ -236,11 +236,11 @@ public class LauncherSettingsPanel extends AnimatedPanel { lblRestart.setText(C.i18n("launcher.restart")); // NOI18N - btnMCBBS.setText("MCBBS"); - btnMCBBS.setToolTipText(""); - btnMCBBS.addActionListener(new java.awt.event.ActionListener() { + btnHomepage.setText(C.i18n("launcher.homepage")); // NOI18N + btnHomepage.setToolTipText(""); + btnHomepage.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - btnMCBBSActionPerformed(evt); + btnHomepageActionPerformed(evt); } }); @@ -258,7 +258,7 @@ public class LauncherSettingsPanel extends AnimatedPanel { .addGroup(layout.createSequentialGroup() .addComponent(btnCheckUpdate) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(btnMCBBS) + .addComponent(btnHomepage) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(chkDecorated)) .addGroup(layout.createSequentialGroup() @@ -341,7 +341,7 @@ public class LauncherSettingsPanel extends AnimatedPanel { .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnCheckUpdate, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(chkDecorated) - .addComponent(btnMCBBS)) + .addComponent(btnHomepage)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lblRestart) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 116, Short.MAX_VALUE) @@ -429,13 +429,13 @@ public class LauncherSettingsPanel extends AnimatedPanel { Settings.getInstance().setProxyPassword(txtProxyPassword.getText()); }//GEN-LAST:event_txtProxyPasswordFocusLost - private void btnMCBBSActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnMCBBSActionPerformed + private void btnHomepageActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnHomepageActionPerformed SwingUtils.openLink(C.URL_PUBLISH); - }//GEN-LAST:event_btnMCBBSActionPerformed + }//GEN-LAST:event_btnHomepageActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnCheckUpdate; - private javax.swing.JButton btnMCBBS; + private javax.swing.JButton btnHomepage; private javax.swing.JButton btnSelBackgroundPath; private javax.swing.JComboBox cboDownloadSource; private javax.swing.JComboBox cboLang; diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/C.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/C.java index 4b19cd905..aacc9df08 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/C.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/C.java @@ -29,10 +29,10 @@ public final class C { public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - //http://repo1.maven.org/maven2 - public static final String URL_PUBLISH = "http://www.mcbbs.net/thread-142335-1-1.html"; - public static final String URL_TIEBA = "http://tieba.baidu.com/f?kw=hellominecraftlauncher"; + public static final String URL_PUBLISH = "http://www.hmclsoft.com"; public static final String URL_GITHUB = "https://github.com/mclauncher/HMCL/issues"; + + public static final String URL_TIEBA = "http://tieba.baidu.com/f?kw=hellominecraftlauncher"; public static final String URL_MINECRAFTFORUM = "http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-tools/1265720-hello-minecraft-launcher-1-9-3-mc-1-7-4-auto"; public static final String FILE_MINECRAFT_VERSIONS = "versions"; diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.form b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.form index 227ef10f2..92a53fa5a 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.form +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.form @@ -36,7 +36,7 @@ - + @@ -68,7 +68,7 @@ - + @@ -117,12 +117,14 @@ - + - + + + - + diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.java index 1377be174..fc0de00eb 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.java @@ -69,7 +69,7 @@ public class LogWindow extends javax.swing.JFrame { btnClose = new javax.swing.JButton(); btnCopy = new javax.swing.JButton(); lblCrash = new javax.swing.JLabel(); - btnMCBBS = new javax.swing.JButton(); + btnHomepage = new javax.swing.JButton(); btnTieBa = new javax.swing.JButton(); btnMCF = new javax.swing.JButton(); btnTerminateGame = new javax.swing.JButton(); @@ -108,10 +108,10 @@ public class LogWindow extends javax.swing.JFrame { lblCrash.setText(C.i18n("ui.label.crashing")); // NOI18N - btnMCBBS.setText("MCBBS"); - btnMCBBS.addActionListener(new java.awt.event.ActionListener() { + btnHomepage.setText(C.i18n("logwindow.homepage")); // NOI18N + btnHomepage.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - btnMCBBSActionPerformed(evt); + btnHomepageActionPerformed(evt); } }); @@ -156,7 +156,7 @@ public class LogWindow extends javax.swing.JFrame { .addGroup(layout.createSequentialGroup() .addComponent(btnTieBa) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(btnMCBBS) + .addComponent(btnHomepage) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnMCF) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) @@ -184,7 +184,7 @@ public class LogWindow extends javax.swing.JFrame { .addComponent(btnClear) .addComponent(btnClose) .addComponent(btnCopy) - .addComponent(btnMCBBS) + .addComponent(btnHomepage) .addComponent(btnTieBa) .addComponent(btnMCF) .addComponent(btnTerminateGame) @@ -209,9 +209,9 @@ public class LogWindow extends javax.swing.JFrame { Utils.setClipborad(this.txtLog.getText()); }//GEN-LAST:event_btnCopyActionPerformed - private void btnMCBBSActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnMCBBSActionPerformed + private void btnHomepageActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnHomepageActionPerformed SwingUtils.openLink(C.URL_PUBLISH); - }//GEN-LAST:event_btnMCBBSActionPerformed + }//GEN-LAST:event_btnHomepageActionPerformed private void btnTieBaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnTieBaActionPerformed SwingUtils.openLink(C.URL_TIEBA); @@ -284,7 +284,7 @@ public class LogWindow extends javax.swing.JFrame { @Override public void setVisible(boolean b) { lblCrash.setVisible(false); - btnMCBBS.setVisible(false); + btnHomepage.setVisible(false); btnTieBa.setVisible(false); btnMCF.setVisible(false); super.setVisible(b); @@ -293,13 +293,13 @@ public class LogWindow extends javax.swing.JFrame { public void showAsCrashWindow(boolean out_date) { if (out_date) { lblCrash.setVisible(false); - btnMCBBS.setVisible(false); + btnHomepage.setVisible(false); btnTieBa.setVisible(false); btnMCF.setVisible(false); lblCrash.setText(C.i18n("ui.label.crashing_out_dated")); } else { lblCrash.setVisible(true); - btnMCBBS.setVisible(true); + btnHomepage.setVisible(true); btnTieBa.setVisible(true); btnMCF.setVisible(true); lblCrash.setText(C.i18n("ui.label.crashing")); @@ -313,7 +313,7 @@ public class LogWindow extends javax.swing.JFrame { private javax.swing.JButton btnClose; private javax.swing.JButton btnCopy; private javax.swing.JButton btnGitHub; - private javax.swing.JButton btnMCBBS; + private javax.swing.JButton btnHomepage; private javax.swing.JButton btnMCF; private javax.swing.JButton btnTerminateGame; private javax.swing.JButton btnTieBa; diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang index ab3d0b725..b2cc75711 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang @@ -301,6 +301,7 @@ mainwindow.no_version=未找到任何版本,是否进入游戏下载? launcher.about=默认背景图感谢gamerteam提供。
关于作者:
主页:http://www.hmclsoft.com
邮箱:contact@hmclsoft.com
欢迎提交Bug哦
Copyright (c) 2013-2016 HMCLSoft.
免责声明:Minecraft软件版权归Mojang AB所有,使用本软件产生的版权问题本软件制作方概不负责。
本启动器在GPLv3协议下开源:https://github.com/mclauncher/HMCL,感谢issues和pull requests贡献者
本软件使用了基于Apache License 2.0的Gson项目,感谢贡献者。 launcher.download_source=下载源 +launcher.homepage=官网 launcher.background_location=背景地址 launcher.exit_failed=强制退出失败,可能是Forge 1.7.10及更高版本导致的,无法解决。 launcher.versions_json_not_matched=版本%s格式不规范!该版本文件夹下有json:%s,是否更名这个文件来规范格式? @@ -375,6 +376,7 @@ update.ignore=不再提醒此版本更新 logwindow.terminate_game=结束游戏进程 logwindow.tieba=贴吧 logwindow.title=日志 +logwindow.homepage=官网 selector.choose=选择 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties index 9079982dc..e02b4b6aa 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties @@ -301,6 +301,7 @@ mainwindow.no_version=\u672a\u627e\u5230\u4efb\u4f55\u7248\u672c\uff0c\u662f\u54 launcher.about=\u9ed8\u8ba4\u80cc\u666f\u56fe\u611f\u8c22gamerteam\u63d0\u4f9b\u3002
\u5173\u4e8e\u4f5c\u8005\uff1a
\u4e3b\u9875\uff1ahttp://www.hmclsoft.com
\u90ae\u7bb1\uff1acontact@hmclsoft.com
\u6b22\u8fce\u63d0\u4ea4Bug\u54e6
Copyright (c) 2013-2016 HMCLSoft.
\u514d\u8d23\u58f0\u660e\uff1aMinecraft\u8f6f\u4ef6\u7248\u6743\u5f52Mojang AB\u6240\u6709\uff0c\u4f7f\u7528\u672c\u8f6f\u4ef6\u4ea7\u751f\u7684\u7248\u6743\u95ee\u9898\u672c\u8f6f\u4ef6\u5236\u4f5c\u65b9\u6982\u4e0d\u8d1f\u8d23\u3002
\u672c\u542f\u52a8\u5668\u5728GPLv3\u534f\u8bae\u4e0b\u5f00\u6e90\uff1ahttps://github.com/mclauncher/HMCL\uff0c\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
\u672c\u8f6f\u4ef6\u4f7f\u7528\u4e86\u57fa\u4e8eApache License 2.0\u7684Gson\u9879\u76ee\uff0c\u611f\u8c22\u8d21\u732e\u8005\u3002 launcher.download_source=\u4e0b\u8f7d\u6e90 +launcher.homepage=\u5b98\u7f51 launcher.background_location=\u80cc\u666f\u5730\u5740 launcher.exit_failed=\u5f3a\u5236\u9000\u51fa\u5931\u8d25\uff0c\u53ef\u80fd\u662fForge 1.7.10\u53ca\u66f4\u9ad8\u7248\u672c\u5bfc\u81f4\u7684\uff0c\u65e0\u6cd5\u89e3\u51b3\u3002 launcher.versions_json_not_matched=\u7248\u672c%s\u683c\u5f0f\u4e0d\u89c4\u8303\uff01\u8be5\u7248\u672c\u6587\u4ef6\u5939\u4e0b\u6709json:%s\uff0c\u662f\u5426\u66f4\u540d\u8fd9\u4e2a\u6587\u4ef6\u6765\u89c4\u8303\u683c\u5f0f\uff1f @@ -375,6 +376,7 @@ update.ignore=\u4e0d\u518d\u63d0\u9192\u6b64\u7248\u672c\u66f4\u65b0 logwindow.terminate_game=\u7ed3\u675f\u6e38\u620f\u8fdb\u7a0b logwindow.tieba=\u8d34\u5427 logwindow.title=\u65e5\u5fd7 +logwindow.homepage=\u5b98\u7f51 selector.choose=\u9009\u62e9 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang index e2a2a7a43..4772ce29d 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang @@ -301,6 +301,7 @@ mainwindow.no_version=No version found. Switch to Game Downloads Tab? launcher.about=About Author
Homepage: http://www.hmclsoft.com
Email: contact@hmclsoft.com
Copyright (c) 2013 HMCLSoft.
Opened source under GPL v3 license: http://github.com/mclauncher/HMCL
This software used project Gson which is under Apache License 2.0, thanks contributors. launcher.download_source=Download Source +launcher.homepage=Homepage 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? @@ -375,6 +376,7 @@ update.ignore=Do not remind this version update. logwindow.terminate_game=Terminate Game logwindow.tieba=Baidu Tieba logwindow.title=Log +logwindow.homepage=Homepage selector.choose=Choose diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties index e2a2a7a43..4772ce29d 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties @@ -301,6 +301,7 @@ mainwindow.no_version=No version found. Switch to Game Downloads Tab? launcher.about=About Author
Homepage: http://www.hmclsoft.com
Email: contact@hmclsoft.com
Copyright (c) 2013 HMCLSoft.
Opened source under GPL v3 license: http://github.com/mclauncher/HMCL
This software used project Gson which is under Apache License 2.0, thanks contributors. launcher.download_source=Download Source +launcher.homepage=Homepage 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? @@ -375,6 +376,7 @@ update.ignore=Do not remind this version update. logwindow.terminate_game=Terminate Game logwindow.tieba=Baidu Tieba logwindow.title=Log +logwindow.homepage=Homepage selector.choose=Choose diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang index f3f02e798..0655138de 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang @@ -301,6 +301,7 @@ mainwindow.no_version=未找到任何版本,是否進入遊戲下載? launcher.about=默認背景圖感謝gamerteam提供。
關於作者:
主頁:http://www.hmclsoft.com
郵箱:contact@hmclsoft.com
歡迎提交Bug哦
Copyright (c) 2013-2016 HMCLSoft.
免責聲明:Minecraft軟體版權歸Mojang AB所有,遊戲由於誤操作本啟動器而丟失數據的概不負責。
本啟動器在GPLv3協議下開源:http://github.com/mclauncher/HMCL,感谢issues和pull requests贡献者
本軟體使用了基於Apache License 2.0的Gson項目,感謝貢獻者。 launcher.download_source=下載源 +launcher.homepage=官網 launcher.background_location=背景地址 launcher.exit_failed=強制退出失敗,可能是Forge 1.7.10及更高版本導致的,無法解決。 launcher.versions_json_not_matched=版本%s格式不規範!該版本資料夾下有json:%s,是否更名這個資料來規範格式? @@ -375,6 +376,7 @@ update.ignore=不再提醒此版本更新 logwindow.terminate_game=結束遊戲進程 logwindow.tieba=貼吧 logwindow.title=日志 +logwindow.homepage=官網 selector.choose=選擇 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties index cd868b494..312245694 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties @@ -301,6 +301,7 @@ mainwindow.no_version=\u672a\u627e\u5230\u4efb\u4f55\u7248\u672c\uff0c\u662f\u54 launcher.about=\u9ed8\u8a8d\u80cc\u666f\u5716\u611f\u8b1dgamerteam\u63d0\u4f9b\u3002
\u95dc\u65bc\u4f5c\u8005\uff1a
\u4e3b\u9801\uff1ahttp://www.hmclsoft.com
\u90f5\u7bb1\uff1acontact@hmclsoft.com
\u6b61\u8fce\u63d0\u4ea4Bug\u54e6
Copyright (c) 2013-2016 HMCLSoft.
\u514d\u8cac\u8072\u660e\uff1aMinecraft\u8edf\u9ad4\u7248\u6b0a\u6b78Mojang AB\u6240\u6709\uff0c\u904a\u6232\u7531\u65bc\u8aa4\u64cd\u4f5c\u672c\u555f\u52d5\u5668\u800c\u4e1f\u5931\u6578\u64da\u7684\u6982\u4e0d\u8ca0\u8cac\u3002
\u672c\u555f\u52d5\u5668\u5728GPLv3\u5354\u8b70\u4e0b\u958b\u6e90\uff1ahttp://github.com/mclauncher/HMCL\uff0c\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
\u672c\u8edf\u9ad4\u4f7f\u7528\u4e86\u57fa\u65bcApache License 2.0\u7684Gson\u9805\u76ee\uff0c\u611f\u8b1d\u8ca2\u737b\u8005\u3002 launcher.download_source=\u4e0b\u8f09\u6e90 +launcher.homepage=\u5b98\u7db2 launcher.background_location=\u80cc\u666f\u5730\u5740 launcher.exit_failed=\u5f37\u5236\u9000\u51fa\u5931\u6557\uff0c\u53ef\u80fd\u662fForge 1.7.10\u53ca\u66f4\u9ad8\u7248\u672c\u5c0e\u81f4\u7684\uff0c\u7121\u6cd5\u89e3\u6c7a\u3002 launcher.versions_json_not_matched=\u7248\u672c%s\u683c\u5f0f\u4e0d\u898f\u7bc4\uff01\u8a72\u7248\u672c\u8cc7\u6599\u593e\u4e0b\u6709json:%s\uff0c\u662f\u5426\u66f4\u540d\u9019\u500b\u8cc7\u6599\u4f86\u898f\u7bc4\u683c\u5f0f\uff1f @@ -375,6 +376,7 @@ update.ignore=\u4e0d\u518d\u63d0\u9192\u6b64\u7248\u672c\u66f4\u65b0 logwindow.terminate_game=\u7d50\u675f\u904a\u6232\u9032\u7a0b logwindow.tieba=\u8cbc\u5427 logwindow.title=\u65e5\u5fd7 +logwindow.homepage=\u5b98\u7db2 selector.choose=\u9078\u64c7 From 2f4287379370e48aa0a572b3495bb73aa7afa85d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Mon, 11 Jul 2016 11:54:22 +0800 Subject: [PATCH 26/46] Fix gradle build file --- HMCL/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/HMCL/build.gradle b/HMCL/build.gradle index 56b1b8eab..b8ea5e2ca 100755 --- a/HMCL/build.gradle +++ b/HMCL/build.gradle @@ -66,10 +66,10 @@ def readBuildNumber() { def branches = json.getAsJsonArray('branches') if (branches != null && branches.size() > 0) { def info = branches.get(0).getAsJsonObject() - def code = info.get('number').getAsInt() + 1 + def code = info.get('number').getAsInt() versionProps['VERSION_CODE'] = code.toString() versionProps.store(versionPropsFile.newWriter(), null) - return code.toString() + return (code + 1).toString() } } } From fd5b5ebd8d16f1870083057c9a162298d1320c26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Mon, 11 Jul 2016 15:23:10 +0800 Subject: [PATCH 27/46] Try test travis --- .travis.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7da8083a4..ebe5a4620 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,6 +29,4 @@ before_cache: cache: directories: - "$HOME/.gradle/caches/" - - "$HOME/.gradle/wrapper/" -git: - depth: 1 \ No newline at end of file + - "$HOME/.gradle/wrapper/" \ No newline at end of file From 5d2b4d435f79c4d344f2dd19684d7e346949b894 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Mon, 11 Jul 2016 16:59:06 +0800 Subject: [PATCH 28/46] Modify download type --- .../org/jackhuang/hellominecraft/launcher/setting/Config.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java index 21a3fc594..8b8ee10b7 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java @@ -67,7 +67,7 @@ public final class Config implements Cloneable { private String localization; @SerializedName("logintype") private int logintype; - @SerializedName("downloadtype") + @SerializedName("downloadSourcetype") private int downloadtype; @SerializedName("configurations") private TreeMap configurations; From c0ef592f72a0be18a6091dd34ec7aa813def50fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Tue, 12 Jul 2016 10:37:18 +0800 Subject: [PATCH 29/46] Restore icon and must manually add tag --- .travis.yml | 7 +------ HMCL/src/main/icon.icns | Bin 158805 -> 114786 bytes .../hellominecraft/launcher/icon.png | Bin 28154 -> 5362 bytes 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index ebe5a4620..2c4f2b56f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,11 +4,6 @@ jdk: branches: only: - master -before_deploy: - - git config --global user.email ${GITHUB_EMAIL} - - git config --global user.name ${GITHUB_NAME} - - git tag ${TRAVIS_BUILD_NUMBER} - - git push -q ${REPO} --tags deploy: provider: releases api_key: ${DEPLOY_REPO} @@ -20,7 +15,7 @@ deploy: - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}.exe - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}-MacOSApp.zip on: - tags: false + tags: true skip_cleanup: true install: echo "skip 'gradle assemble' step" script: gradle build --continue diff --git a/HMCL/src/main/icon.icns b/HMCL/src/main/icon.icns index 17f903023ddf8c7169553c759c00af6b87fe5ca3..dc329d24ba3c08a97dcfe1883bb97ea43bba26f3 100755 GIT binary patch literal 114786 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

C;?os{$ZWi#$ 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 literal 158805 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�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

MZJ~#!I_ys4`PaAliz) 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 Qng9R*07*qoM6N<$f=Q}6H2?qr literal 28154 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
  • dnmJZA8q#&MkaaMdygpVo`6Ey@$@a)&eRoPKm3# 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 Z5;|-;2h(UC8LemZo#%nw6+1&S{sTA*fqDP{ From 1a3c31a1413813cefcbfff1e53c644100c013cb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Tue, 12 Jul 2016 14:17:17 +0800 Subject: [PATCH 30/46] Fix Library resolve bug --- .../download/DynamicDownloadProvider.java | 2 +- .../core/version/MinecraftLibrary.java | 222 +++++++++--------- 2 files changed, 112 insertions(+), 112 deletions(-) diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java index 0c6535e78..11154f835 100644 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java @@ -118,7 +118,7 @@ public class DynamicDownloadProvider extends MojangDownloadProvider { if (StrUtils.isNotBlank(launcherMetaAddr)) { str = str.replace("https://launchermeta.mojang.com", launcherMetaAddr); } - if (StrUtils.isNotBlank(launcherMetaAddr)) { + if (StrUtils.isNotBlank(launcherAddr)) { str = str.replace("https://launcher.mojang.com", launcherAddr); } return super.getParsedDownloadURL(str); diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftLibrary.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftLibrary.java index b4266a53c..ebe2ef844 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftLibrary.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftLibrary.java @@ -31,122 +31,122 @@ import org.jackhuang.hellominecraft.util.StrUtils; */ public class MinecraftLibrary extends IMinecraftLibrary { - @SerializedName("rules") - public ArrayList rules; - @SerializedName("url") - public String url; - @SerializedName("natives") - public Natives natives; - @SerializedName("extract") - public Extract extract; - @SerializedName("downloads") - public LibrariesDownloadInfo downloads; + @SerializedName("rules") + public ArrayList rules; + @SerializedName("url") + public String url; + @SerializedName("natives") + public Natives natives; + @SerializedName("extract") + public Extract extract; + @SerializedName("downloads") + public LibrariesDownloadInfo downloads; - public MinecraftLibrary(String name) { - super(name); - } + public MinecraftLibrary(String name) { + super(name); + } - public MinecraftLibrary(ArrayList rules, String url, Natives natives, String name, Extract extract, LibraryDownloadInfo downloads) { - super(name); - this.rules = (rules == null) ? null : (ArrayList) rules.clone(); - this.url = url; - this.natives = (natives == null) ? null : (Natives) natives.clone(); - this.extract = (extract == null) ? null : (Extract) extract.clone(); - } + public MinecraftLibrary(ArrayList rules, String url, Natives natives, String name, Extract extract, LibraryDownloadInfo downloads) { + super(name); + this.rules = (rules == null) ? null : (ArrayList) rules.clone(); + this.url = url; + this.natives = (natives == null) ? null : (Natives) natives.clone(); + this.extract = (extract == null) ? null : (Extract) extract.clone(); + } - @Override - public boolean allow() { - if (rules != null) { - boolean flag = false; - for (Rules r : rules) { - if ("disallow".equals(r.action())) - return false; - else if ("allow".equals(r.action())) - flag = true; - } - return flag; - } - return true; - } - - private String formatArch(String nati) { - return nati == null ? "" : nati.replace("${arch}", Platform.getPlatform().getBit()); - } - - private String getNative() { - switch (OS.os()) { - case WINDOWS: - return formatArch(natives.windows); - case OSX: - return formatArch(natives.osx); - default: - return formatArch(natives.linux); - } - } - - @Override - public boolean isRequiredToUnzip() { - return natives != null && allow(); - } - - public String formatName() { - String[] s = name.split(":"); - if (s.length < 3) { - return null; - } - - StringBuilder sb = new StringBuilder(s[0].replace('.', '/')).append('/').append(s[1]).append('/').append(s[2]).append('/').append(s[1]).append('-').append(s[2]); - if (natives != null) { - sb.append('-').append(getNative()); - } - - return sb.append(".jar").toString(); - } - - @Override - public File getFilePath(File gameDir) { - LibraryDownloadInfo info = getDownloadInfo(); - if (info == null) { - return null; - } - return new File(gameDir, "libraries/" + info.path); - } - - @Override - public Extract getDecompressExtractRules() { - return extract == null ? new Extract() : extract; - } - - public LibraryDownloadInfo getDownloadInfo() { - if (downloads == null) { - downloads = new LibrariesDownloadInfo(); - } - - LibraryDownloadInfo info = null; - if (natives != null) { - if (downloads.classifiers == null) { - downloads.classifiers = new HashMap<>(); - } else { - if (!downloads.classifiers.containsKey(getNative())) { - downloads.classifiers.put(getNative(), info = new LibraryDownloadInfo()); - } else { - info = downloads.classifiers.get(getNative()); + @Override + public boolean allow() { + if (rules != null) { + boolean flag = false; + for (Rules r : rules) { + if ("disallow".equals(r.action())) { + return false; + } else if ("allow".equals(r.action())) { + flag = true; } } - } else if (downloads.artifact == null) { - downloads.artifact = info = new LibraryDownloadInfo(); - } else { - info = downloads.artifact; + return flag; } - - if (StrUtils.isBlank(info.path)) { - info.path = formatName(); - if (info.path == null) { - return null; + return true; + } + + private String formatArch(String nati) { + return nati == null ? "" : nati.replace("${arch}", Platform.getPlatform().getBit()); + } + + private String getNative() { + switch (OS.os()) { + case WINDOWS: + return formatArch(natives.windows); + case OSX: + return formatArch(natives.osx); + default: + return formatArch(natives.linux); + } + } + + @Override + public boolean isRequiredToUnzip() { + return natives != null && allow(); + } + + public String formatName() { + String[] s = name.split(":"); + if (s.length < 3) { + return null; + } + + StringBuilder sb = new StringBuilder(s[0].replace('.', '/')).append('/').append(s[1]).append('/').append(s[2]).append('/').append(s[1]).append('-').append(s[2]); + if (natives != null) { + sb.append('-').append(getNative()); + } + + return sb.append(".jar").toString(); + } + + @Override + public File getFilePath(File gameDir) { + LibraryDownloadInfo info = getDownloadInfo(); + if (info == null) { + return null; + } + return new File(gameDir, "libraries/" + info.path); + } + + @Override + public Extract getDecompressExtractRules() { + return extract == null ? new Extract() : extract; + } + + public LibraryDownloadInfo getDownloadInfo() { + if (downloads == null) { + downloads = new LibrariesDownloadInfo(); + } + + LibraryDownloadInfo info = null; + if (natives != null) { + if (downloads.classifiers == null) { + downloads.classifiers = new HashMap<>(); } - } - - info.forgeURL = this.url; - return info; - } + if (!downloads.classifiers.containsKey(getNative())) { + downloads.classifiers.put(getNative(), info = new LibraryDownloadInfo()); + } else { + info = downloads.classifiers.get(getNative()); + } + } else if (downloads.artifact == null) { + downloads.artifact = info = new LibraryDownloadInfo(); + } else { + info = downloads.artifact; + } + + if (StrUtils.isBlank(info.path)) { + info.path = formatName(); + if (info.path == null) { + return null; + } + } + + info.forgeURL = this.url; + return info; + } } From e6ed1eab71c833edc180c6c93b56491ad5391272 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Tue, 12 Jul 2016 14:34:14 +0800 Subject: [PATCH 31/46] =?UTF-8?q?=E9=9A=BE=E7=94=A8=E7=9A=84travis-ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2c4f2b56f..ebe5a4620 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,11 @@ jdk: branches: only: - master +before_deploy: + - git config --global user.email ${GITHUB_EMAIL} + - git config --global user.name ${GITHUB_NAME} + - git tag ${TRAVIS_BUILD_NUMBER} + - git push -q ${REPO} --tags deploy: provider: releases api_key: ${DEPLOY_REPO} @@ -15,7 +20,7 @@ deploy: - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}.exe - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}-MacOSApp.zip on: - tags: true + tags: false skip_cleanup: true install: echo "skip 'gradle assemble' step" script: gradle build --continue From 65900b58811b4821a44db94ee50f9f5489f94282 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Tue, 12 Jul 2016 14:37:13 +0800 Subject: [PATCH 32/46] update tag style --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ebe5a4620..de295404d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ branches: before_deploy: - git config --global user.email ${GITHUB_EMAIL} - git config --global user.name ${GITHUB_NAME} - - git tag ${TRAVIS_BUILD_NUMBER} + - git tag HMCL-${HMCL_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER} - git push -q ${REPO} --tags deploy: provider: releases From d824122219fd73aa001f262f2f503bb9af6ab7f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Tue, 12 Jul 2016 14:49:32 +0800 Subject: [PATCH 33/46] Fix travis-ci file --- .travis.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index de295404d..05d0314db 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,11 +4,6 @@ jdk: branches: only: - master -before_deploy: - - git config --global user.email ${GITHUB_EMAIL} - - git config --global user.name ${GITHUB_NAME} - - git tag HMCL-${HMCL_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER} - - git push -q ${REPO} --tags deploy: provider: releases api_key: ${DEPLOY_REPO} @@ -20,7 +15,8 @@ deploy: - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}.exe - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}-MacOSApp.zip on: - tags: false + tags: true + all_branches: true skip_cleanup: true install: echo "skip 'gradle assemble' step" script: gradle build --continue From f966793490fc8f74baaaa978618a93a654b293f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Tue, 12 Jul 2016 15:06:03 +0800 Subject: [PATCH 34/46] Fix travis --- .travis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 05d0314db..c7c970aa0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,6 @@ language: java jdk: - oraclejdk8 -branches: - only: - - master deploy: provider: releases api_key: ${DEPLOY_REPO} From 8d687158f63117968164251e1a2661c2d68803e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Tue, 12 Jul 2016 15:28:55 +0800 Subject: [PATCH 35/46] Update travis --- .travis.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index c7c970aa0..5d84a39f5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,14 @@ language: java jdk: - oraclejdk8 +branches: + only: + - master +before_deploy: + - git config --global user.email ${GITHUB_EMAIL} + - git config --global user.name ${GITHUB_NAME} + - git tag ${HMCL_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER} + - git push -q ${REPO} --tags deploy: provider: releases api_key: ${DEPLOY_REPO} @@ -12,8 +20,7 @@ deploy: - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}.exe - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}-MacOSApp.zip on: - tags: true - all_branches: true + tags: false skip_cleanup: true install: echo "skip 'gradle assemble' step" script: gradle build --continue From 48a8c99c83fcacc8723c40bf4de212d603a30d74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Tue, 12 Jul 2016 16:17:09 +0800 Subject: [PATCH 36/46] Update travis --- .travis.yml | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5d84a39f5..1bc767edc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,14 +1,6 @@ language: java jdk: - oraclejdk8 -branches: - only: - - master -before_deploy: - - git config --global user.email ${GITHUB_EMAIL} - - git config --global user.name ${GITHUB_NAME} - - git tag ${HMCL_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER} - - git push -q ${REPO} --tags deploy: provider: releases api_key: ${DEPLOY_REPO} @@ -19,9 +11,9 @@ deploy: - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}.jar - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}.exe - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}-MacOSApp.zip - on: - tags: false skip_cleanup: true + on: + tags: true install: echo "skip 'gradle assemble' step" script: gradle build --continue before_cache: From 3325e393bcdf21ce889ff274bd0b92afcfd80947 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Tue, 12 Jul 2016 17:51:07 +0800 Subject: [PATCH 37/46] try fix travis file --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 1bc767edc..0cc506b47 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ language: java +sudo: false jdk: - oraclejdk8 deploy: @@ -14,6 +15,8 @@ deploy: skip_cleanup: true on: tags: true + all_branches: true + repo: mclauncher/HMCL install: echo "skip 'gradle assemble' step" script: gradle build --continue before_cache: From 07b757b3c1bcaf9d84fd48c0b5f9ce16e48187e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Tue, 12 Jul 2016 18:03:04 +0800 Subject: [PATCH 38/46] try fix travis --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0cc506b47..ff3dcd9f3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,9 +14,9 @@ deploy: - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}-MacOSApp.zip skip_cleanup: true on: - tags: true - all_branches: true repo: mclauncher/HMCL + branch: master + tags: true install: echo "skip 'gradle assemble' step" script: gradle build --continue before_cache: From f7153678499ce229a120136aebd2adbc7dfe890e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Tue, 12 Jul 2016 19:07:15 +0800 Subject: [PATCH 39/46] Update HMCL version --- .travis.yml | 2 +- HMCL/build.gradle | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index ff3dcd9f3..7e48f78b0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,11 +12,11 @@ deploy: - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}.jar - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}.exe - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}-MacOSApp.zip - skip_cleanup: true on: repo: mclauncher/HMCL branch: master tags: true + skip_cleanup: true install: echo "skip 'gradle assemble' step" script: gradle build --continue before_cache: diff --git a/HMCL/build.gradle b/HMCL/build.gradle index b8ea5e2ca..a394d7d39 100755 --- a/HMCL/build.gradle +++ b/HMCL/build.gradle @@ -54,8 +54,7 @@ def readBuildNumber() { if (versionPropsFile.canRead()) { versionProps.load(new FileInputStream(versionPropsFile)) - def code = versionProps['VERSION_CODE'].toInteger() + 1 - + def code = versionProps['VERSION_CODE'].toInteger() return code.toString() } else { versionPropsFile.createNewFile() @@ -66,10 +65,10 @@ def readBuildNumber() { def branches = json.getAsJsonArray('branches') if (branches != null && branches.size() > 0) { def info = branches.get(0).getAsJsonObject() - def code = info.get('number').getAsInt() - versionProps['VERSION_CODE'] = code.toString() + def code = info.get('number').getAsInt().toString() + versionProps['VERSION_CODE'] = code versionProps.store(versionPropsFile.newWriter(), null) - return (code + 1).toString() + return code } } } @@ -88,7 +87,7 @@ if (buildnumber == null) def versionroot = System.getenv("VERSION_ROOT") if (versionroot == null) - versionroot = "2.5.0" + versionroot = "2.5.1" String mavenGroupId = 'HMCL' String mavenVersion = versionroot + '.' + buildnumber From b9308f060f92d0e3d43c8c4b66db3a58cdeddb18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Thu, 18 Aug 2016 11:25:03 +0800 Subject: [PATCH 40/46] =?UTF-8?q?oschina=E7=9A=84Maven=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HMCL/build.gradle | 2 +- .../launcher/core/download/MojangDownloadProvider.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/HMCL/build.gradle b/HMCL/build.gradle index a394d7d39..cc124b358 100755 --- a/HMCL/build.gradle +++ b/HMCL/build.gradle @@ -186,7 +186,7 @@ launch4j { icon = new File(project.buildDir, '../icon.ico').absolutePath version = mavenVersion downloadUrl = 'http://java.com/download' - copyright = "Copyright(c) 2013-2015 HMCLSoft." + copyright = "Copyright(c) 2013-2016 HMCLSoft." jar = new File(project.buildDir, 'libs/' + mavenGroupId + '-' + mavenVersion + '.jar').absolutePath outfile = mavenGroupId + '-' + mavenVersion + '.exe' diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MojangDownloadProvider.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MojangDownloadProvider.java index aa015fe75..a161effd7 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MojangDownloadProvider.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MojangDownloadProvider.java @@ -85,7 +85,7 @@ public class MojangDownloadProvider extends IDownloadProvider { return str.replace("http://files.minecraftforge.net/maven", "http://ftb.cursecdn.com/FTB2/maven/"); else if (str.contains("typesafe") || str.contains("scala")) if (SupportedLocales.NOW_LOCALE.self == Locale.CHINA) - return str.replace("http://files.minecraftforge.net/maven", "http://maven.oschina.net/content/groups/public"); + return str.replace("http://files.minecraftforge.net/maven", "http://maven.aliyun.com/nexus/content/groups/public"); else return str.replace("http://files.minecraftforge.net/maven", "http://repo1.maven.org/maven2"); else From 5bb53622cab502d36262f570439c110879368f21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Thu, 18 Aug 2016 11:36:36 +0800 Subject: [PATCH 41/46] Update HMCL version --- HMCL/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HMCL/build.gradle b/HMCL/build.gradle index cc124b358..d0c4afee4 100755 --- a/HMCL/build.gradle +++ b/HMCL/build.gradle @@ -87,7 +87,7 @@ if (buildnumber == null) def versionroot = System.getenv("VERSION_ROOT") if (versionroot == null) - versionroot = "2.5.1" + versionroot = "2.5.2" String mavenGroupId = 'HMCL' String mavenVersion = versionroot + '.' + buildnumber From 6db34fcdc73b6b441d11e02ce63e7ac8c71c74bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Mon, 22 Aug 2016 10:23:27 +0800 Subject: [PATCH 42/46] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/download/DynamicDownloadProvider.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java index 11154f835..e0eacfcdc 100644 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java @@ -112,14 +112,16 @@ public class DynamicDownloadProvider extends MojangDownloadProvider { @Override public String getParsedDownloadURL(String str) { - if (StrUtils.isNotBlank(librariesAddr)) { - str = str.replace("https://libraries.minecraft.net", librariesAddr); - } - if (StrUtils.isNotBlank(launcherMetaAddr)) { - str = str.replace("https://launchermeta.mojang.com", launcherMetaAddr); - } - if (StrUtils.isNotBlank(launcherAddr)) { - str = str.replace("https://launcher.mojang.com", launcherAddr); + if (str != null) { + if (StrUtils.isNotBlank(librariesAddr)) { + str = str.replace("https://libraries.minecraft.net", librariesAddr); + } + if (StrUtils.isNotBlank(launcherMetaAddr)) { + str = str.replace("https://launchermeta.mojang.com", launcherMetaAddr); + } + if (StrUtils.isNotBlank(launcherAddr)) { + str = str.replace("https://launcher.mojang.com", launcherAddr); + } } return super.getParsedDownloadURL(str); } From 90451e6da933453d77e6015f779542d07fe27612 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Wed, 24 Aug 2016 13:46:06 +0800 Subject: [PATCH 43/46] =?UTF-8?q?=E6=9C=80=E5=A4=A7=E9=99=90=E5=BA=A6?= =?UTF-8?q?=E7=9A=84=E6=8D=95=E8=8E=B7=E5=BC=82=E5=B8=B8=EF=BC=8C=E9=98=B2?= =?UTF-8?q?=E6=AD=A2=E5=AE=A2=E6=88=B7=E7=AB=AF=E5=B4=A9=E6=BA=83=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=85=B3=E9=97=AD=E6=8E=A8=E8=8D=90=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../download/DynamicDownloadProvider.java | 5 +- .../launcher/setting/Config.java | 12 ++ .../launcher/ui/RecommendPanel.java | 121 ++++++++++++++---- .../launcher/util/CrashReporter.java | 4 +- .../hellominecraft/launcher/re_close.png | Bin 0 -> 1182 bytes .../launcher/re_close_enter.png | Bin 0 -> 1117 bytes 6 files changed, 111 insertions(+), 31 deletions(-) create mode 100644 HMCL/src/main/resources/org/jackhuang/hellominecraft/launcher/re_close.png create mode 100644 HMCL/src/main/resources/org/jackhuang/hellominecraft/launcher/re_close_enter.png diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java index e0eacfcdc..8cbe9dbf1 100644 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java @@ -144,8 +144,7 @@ public class DynamicDownloadProvider extends MojangDownloadProvider { try { String providerInfo = NetUtils.get(PROVIDER_ADDR); Map addrInfo = null; - addrInfo = C.GSON.fromJson(providerInfo, new TypeToken>() { - }.getType()); + addrInfo = C.GSON.fromJson(providerInfo, new TypeToken>() {}.getType()); if (addrInfo != null) { setLibrariesAddr(getValue(addrInfo, "libraries")); setAssetsAddr(getValue(addrInfo, "assets")); @@ -153,7 +152,7 @@ public class DynamicDownloadProvider extends MojangDownloadProvider { setLauncherAddr(getValue(addrInfo, "launcher")); setVersionManifestAddr(getValue(addrInfo, "versionManifest")); } - } catch (IOException ex) { + } catch (Throwable t) { } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java index 8b8ee10b7..53a215aad 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java @@ -21,8 +21,10 @@ import org.jackhuang.hellominecraft.launcher.core.download.DownloadType; import com.google.gson.annotations.SerializedName; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.TreeMap; import java.util.UUID; import org.jackhuang.hellominecraft.launcher.core.auth.IAuthenticator; @@ -76,6 +78,16 @@ public final class Config implements Cloneable { private Map auth; @SerializedName("ignoreUpdateVersion") private String ignoreUpdateVersion; + @SerializedName("ignoreRecommend") + private Set ignoreRecommend; + + public Set getIgnoreRecommend() { + if (ignoreRecommend == null) { + ignoreRecommend = new HashSet<>(); + Settings.save(); + } + return ignoreRecommend; + } public List getJava() { return java == null ? java = new ArrayList<>() : java; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java index 9c3bb26a4..1c19c2f14 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java @@ -36,9 +36,15 @@ import java.util.ArrayList; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import javax.swing.BorderFactory; +import javax.swing.ImageIcon; +import javax.swing.JButton; import javax.swing.SwingUtilities; +import org.jackhuang.hellominecraft.launcher.Main; +import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.NetUtils; +import org.jackhuang.hellominecraft.util.StrUtils; import org.jackhuang.hellominecraft.util.ui.SwingUtils; /** @@ -49,12 +55,21 @@ public class RecommendPanel extends JPanel { private static final int SWITCH_INTERVAL = 10; + private static final int SPACE = 10; + private static final int TOP_POSITION = 2; + + private JButton closeButton; + private Image currImage; private String imageKey = null; + private boolean ignoreSwitch = false; private List recommends; + public ScheduledExecutorService scheduledexec = Executors.newScheduledThreadPool(1); public RecommendPanel() { + initComponents(); + recommends = new ArrayList(); new LoadImages().execute(); setCursor(new Cursor(Cursor.HAND_CURSOR)); @@ -67,6 +82,31 @@ public class RecommendPanel extends JPanel { }); } + private void initComponents() { + this.setLayout(null); + + closeButton = new JButton(Main.getIcon("re_close.png")); + closeButton.setRolloverIcon(Main.getIcon("re_close_enter.png")); + closeButton.setBorder(BorderFactory.createEmptyBorder()); + closeButton.setContentAreaFilled(false); + closeButton.addActionListener((e) -> { + synchronized(RecommendPanel.class) { + if (StrUtils.isNotBlank(imageKey)) { + Settings.getInstance().getIgnoreRecommend().add(imageKey); + Settings.save(); + + ignoreSwitch = true; + showNext(); + } + } + }); + closeButton.setCursor(new Cursor(Cursor.HAND_CURSOR)); + closeButton.setFocusable(false); + closeButton.setBounds(0, 0, 12, 12); + closeButton.setVisible(false); + this.add(closeButton); + } + private void MouseClicked(MouseEvent evt) { if (imageKey == null) { return; @@ -86,13 +126,14 @@ public class RecommendPanel extends JPanel { @Override public void run() { for (RecommendInfo info : recommends) { - try { - File tempFile = File.createTempFile("hmcl", "png"); - String tempPath = tempFile.getCanonicalPath(); - if (NetUtils.download(info.url, tempPath)) { - info.image = ImageIO.read(tempFile); - } - } catch (IOException ex) { + if (!ignoreShowUrl(info.url)) { + try { + File tempFile = File.createTempFile("hmcl", "png"); + String tempPath = tempFile.getCanonicalPath(); + if (NetUtils.download(info.url, tempPath)) { + info.image = ImageIO.read(tempFile); + } + } catch (Throwable t) { } } } @@ -105,9 +146,13 @@ public class RecommendPanel extends JPanel { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - int showIndex = getNextImageIndex(); - RecommendInfo info = recommends.get(showIndex); - RecommendPanel.this.setImage(info.url, info.image); + synchronized(RecommendPanel.class) { + if (ignoreSwitch) { + ignoreSwitch = false; + } else { + showNext(); + } + } } }); } @@ -142,25 +187,45 @@ public class RecommendPanel extends JPanel { } return true; } + + private void showNext() { + if (getCanShowImageCount() == 0) { + setVisible(false); + } else { + int showIndex = getNextImageIndex(); + RecommendInfo info = recommends.get(showIndex); + setImage(info.url, info.image); + } + } + + private boolean ignoreShowUrl(String url) { + return Settings.getInstance().getIgnoreRecommend().contains(url); + } + public int getCanShowImageCount() { + int imageCount = 0; + for (RecommendInfo recommend : recommends) { + if (recommend.image != null && !ignoreShowUrl(recommend.url)) { + imageCount++; + } + } + return imageCount; + } + public int getNextImageIndex(int showIndex) { if (showIndex >= recommends.size()) { showIndex = 0; } RecommendInfo info = recommends.get(showIndex); - if (info.image == null) { - showIndex = getNextImageIndex(++showIndex); + if (info.image == null || ignoreShowUrl(info.url)) { + showIndex = getNextImageIndex(++showIndex); } return showIndex; } public int getNextImageIndex() { - int showIndex = 0; - if (imageKey != null) { - showIndex = getCurrentImageIndex(); - showIndex++; - } - if (showIndex >= recommends.size()) { + int showIndex = getCurrentImageIndex(); + if (++showIndex >= recommends.size()) { showIndex = 0; } showIndex = getNextImageIndex(showIndex); @@ -178,21 +243,26 @@ public class RecommendPanel extends JPanel { } return currIndex; } - + public void setImage(String key, Image image) { this.imageKey = key; this.currImage = image; - //setToolTipText(C.i18n("ui.message.recommend_tip")); - setSize(image.getWidth(this), image.getHeight(this)); + + int btnWidth = closeButton.getWidth(); + + setSize(image.getWidth(this) + SPACE + btnWidth, image.getHeight(this)); + closeButton.setLocation(getWidth() - btnWidth, TOP_POSITION); + closeButton.setVisible(true); + SwingUtilities.updateComponentTreeUI(this.getRootPane()); } @Override public void paintComponent(Graphics g) { - if (null == currImage) { - return; + if (currImage != null) { + g.drawImage(currImage, 0, 0, currImage.getWidth(this), currImage.getHeight(this), this); } - g.drawImage(currImage, 0, 0, currImage.getWidth(this), currImage.getHeight(this), this); + super.paintComponent(g); } static class RecommendInfo { @@ -215,8 +285,7 @@ public class RecommendPanel extends JPanel { } Map data = new Gson().fromJson(content, - new TypeToken>() { - }.getType()); + new TypeToken>() {}.getType()); if (data == null) { break; } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java index ba507757d..9ff47c0aa 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java @@ -139,8 +139,8 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { map.put("CrashReport", text); try { NetUtils.post(NetUtils.constantURL("http://huangyuhui.duapp.com/crash.php"), map); - } catch (IOException ex) { - LOGGER.log(Level.SEVERE, "Failed to post HMCL server.", ex); + } catch (Throwable error) { + LOGGER.log(Level.SEVERE, "Failed to post HMCL server.", error); } }); t.setDaemon(true); diff --git a/HMCL/src/main/resources/org/jackhuang/hellominecraft/launcher/re_close.png b/HMCL/src/main/resources/org/jackhuang/hellominecraft/launcher/re_close.png new file mode 100644 index 0000000000000000000000000000000000000000..c006673dcc2267c7a5ff3bf29d99688638ab616a GIT binary patch literal 1182 zcmbVMU2M}<6gH~px@v$XApz5*U5xmtw8VB|JF%Cn*l|oVNU73jWExWE+PAG~?CaS# z#I4x)lLj4{ShWY>X%FzQY0`w$$D(x-LKBnLzU-G5wlWEA6c`LN73jL_w(0gz@i5Ew z{qgy}@0@eb@km$at~ISMv{DqcrqH34$oO3Jv^10V>$Uwi$*>9ME4Ul=;kw~NO0iHc z1O>iaE%$fsTT+p&K`4YEmOBR%*#PeE?7n8ZX$Z@Kc;`3=e znM+G4A(zq{94lcZB`<2M!itiT;<&sh30hv)m6W2Xd`jo|2Dab^*ln|a@``>vCnobR1eys<5`SWgT8$bTDp%Mu#jKbUO}Hv zE3BI2bwv=RDDJe7PUHnuWmPF9Nvc9GVXgm@Gln?BM8)x+VrguV3XG=9rB4>i%>!N1 zF+ORH^~sT2q^%|knoubBc>gee7rRM3eF>a2U sJ$mlky{~REhkxFDrQ^@D%`Gf-z7V#i~bmee5dxg`qr_30QN%Te*v-}*t*zE%U2}yljx$G{Z03wJXWLmL zrFsY<=mwEc>Qg-gLD5q;DZ9TFQel=*kkLa@LRpb^MqTTnZJ3#J;rqV-KmY%o&Z^2y zu0@55D2j4LH;ZvHE_S~BJo4X>+Brgo<+wbFt5G9POD3ek3Tl8Ls!2^S4kabi`WOZ& zY96g7k~kULCdf$hNDjthYX)IcRIt=GB)J7*&;XlMJw%V*=%azEgy`Bp%o{Tzuvy*Q zX2R;W%7on3BJ&Dex&Z`jfe2_2OTgCl>6T!J=qX)+%$;q922&8+5~8P*O2(={1ep*7 zJbt(AWm&*+9=15ZaqK$a^Rhn1OJ2^+77GDR@Rfj>hbGZXrBR5B6*IBODnvJ9YzPdK zPNzL-zXzF349oMpqv7+p3BqkhZahiGHG1nDkqd7L`*1Q zWF`>Wm#tz|Gs4JfMh1vfb6`!asw*gMt)0ThVnS56u%yc{Du!sH;89gY@QdN%3O~nk zd>N^FImdGxzrMuJM~e9}F1+5C<%&p7X;8;muJVWL%gJ@Dpcy2x2u*cAR4PoQfvF=4 zYR+5&6*={0xJvF^yg9iHNrrJ6`&Xm0Tf{xibk??HF>8FN6Steh)*n|KI7zO=)2J9u z*n*~7dI+v_I@e{7j)Ku=aTgS&<3>SslsqYIeBd$t zx%2wx_rlA}kGBt!0mHgtzP>#<@$A;ap6(;#rR@{HTwnS}`zAZa#;&&B8DO6UFU*;{ Ym|7Uzdau7XKi|3V(eg_1a#{W1-%==kv;Y7A literal 0 HcmV?d00001 From c0b935e3f1eb4e715cfd88d1a71d9d1ef6ce5bd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Thu, 25 Aug 2016 14:33:40 +0800 Subject: [PATCH 44/46] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E5=B4=A9=E6=BA=83?= =?UTF-8?q?=E6=94=B6=E9=9B=86=20=E6=94=B9=E8=BF=9B=E6=8E=A8=E8=8D=90?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E5=85=B3=E9=97=AD=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../launcher/ui/RecommendPanel.java | 72 ++++++++++++------- .../launcher/util/CrashReporter.java | 2 +- 2 files changed, 47 insertions(+), 27 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java index 1c19c2f14..1b8861000 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java @@ -19,7 +19,6 @@ package org.jackhuang.hellominecraft.launcher.ui; import java.awt.Graphics; import java.awt.Image; import java.io.File; -import java.io.IOException; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; @@ -37,12 +36,10 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.swing.BorderFactory; -import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.SwingUtilities; import org.jackhuang.hellominecraft.launcher.Main; import org.jackhuang.hellominecraft.launcher.setting.Settings; -import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.NetUtils; import org.jackhuang.hellominecraft.util.StrUtils; import org.jackhuang.hellominecraft.util.ui.SwingUtils; @@ -65,7 +62,7 @@ public class RecommendPanel extends JPanel { private boolean ignoreSwitch = false; private List recommends; - public ScheduledExecutorService scheduledexec = Executors.newScheduledThreadPool(1); + public final ScheduledExecutorService scheduledexec = Executors.newScheduledThreadPool(1); public RecommendPanel() { initComponents(); @@ -89,17 +86,7 @@ public class RecommendPanel extends JPanel { closeButton.setRolloverIcon(Main.getIcon("re_close_enter.png")); closeButton.setBorder(BorderFactory.createEmptyBorder()); closeButton.setContentAreaFilled(false); - closeButton.addActionListener((e) -> { - synchronized(RecommendPanel.class) { - if (StrUtils.isNotBlank(imageKey)) { - Settings.getInstance().getIgnoreRecommend().add(imageKey); - Settings.save(); - - ignoreSwitch = true; - showNext(); - } - } - }); + closeButton.addActionListener((e) -> ignoreTheRecommend(imageKey)); closeButton.setCursor(new Cursor(Cursor.HAND_CURSOR)); closeButton.setFocusable(false); closeButton.setBounds(0, 0, 12, 12); @@ -107,12 +94,27 @@ public class RecommendPanel extends JPanel { this.add(closeButton); } + private void ignoreTheRecommend(String url) { + synchronized(RecommendPanel.class) { + if (StrUtils.isNotBlank(url)) { + Settings.getInstance().getIgnoreRecommend().add(url); + Settings.save(); + + ignoreSwitch = true; + showNext(); + } + } + } + private void MouseClicked(MouseEvent evt) { if (imageKey == null) { return; } RecommendInfo info = recommends.get(getCurrentImageIndex()); - if (info.link != null && !info.link.equals("")) { + if (StrUtils.isNotBlank(info.link)) { + if (info.once) { + ignoreTheRecommend(info.url); + } SwingUtils.openLink(info.link); } } @@ -191,6 +193,7 @@ public class RecommendPanel extends JPanel { private void showNext() { if (getCanShowImageCount() == 0) { setVisible(false); + scheduledexec.shutdown(); } else { int showIndex = getNextImageIndex(); RecommendInfo info = recommends.get(showIndex); @@ -199,6 +202,9 @@ public class RecommendPanel extends JPanel { } private boolean ignoreShowUrl(String url) { + if (StrUtils.isBlank(url)) { + return true; + } return Settings.getInstance().getIgnoreRecommend().contains(url); } @@ -236,7 +242,7 @@ public class RecommendPanel extends JPanel { int currIndex = 0; for (int i = 0; i < recommends.size(); i++) { RecommendInfo info = recommends.get(i); - if (imageKey != null && info.url.equals(imageKey)) { + if (StrUtils.isNotBlank(imageKey) && info.url.equals(imageKey)) { currIndex = i; break; } @@ -268,16 +274,17 @@ public class RecommendPanel extends JPanel { static class RecommendInfo { String url; String link; + boolean once; Image image; } - class LoadImages extends SwingWorker>, Void> { + class LoadImages extends SwingWorker>, Void> { private static final String RECOMMEND_URL = "http://client.api.mcgogogo.com:81/recommend.php"; - + @Override - protected List> doInBackground() throws Exception { - List> infos = null; + protected List> doInBackground() throws Exception { + List> infos = null; do { String content = NetUtils.get(RECOMMEND_URL); if (content == null || content.equals("")) { @@ -290,7 +297,7 @@ public class RecommendPanel extends JPanel { break; } - infos = (List>) data.get("data"); + infos = (List>) data.get("data"); } while (false); return infos; } @@ -298,14 +305,27 @@ public class RecommendPanel extends JPanel { @Override protected void done() { try { - List> infos = this.get(); + List> infos = this.get(); if (infos == null) { return; } - for (Map info : infos) { + for (Map info : infos) { RecommendInfo recommend = new RecommendInfo(); - recommend.url = info.get("url"); - recommend.link = info.get("link"); + if (info.get("url") != null) { + recommend.url = (String) info.get("url"); + } else { + recommend.url = ""; + } + if (info.get("link") != null) { + recommend.link = (String) info.get("link"); + } else { + recommend.link = ""; + } + if (info.get("once") != null) { + recommend.once = (boolean) info.get("once"); + } else { + recommend.once = false; + } recommend.image = null; recommends.add(recommend); } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java index 9ff47c0aa..12125d007 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java @@ -138,7 +138,7 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { HashMap map = new HashMap<>(); map.put("CrashReport", text); try { - NetUtils.post(NetUtils.constantURL("http://huangyuhui.duapp.com/crash.php"), map); + NetUtils.post(NetUtils.constantURL("http://client.api.mcgogogo.com:81/crash_report.php"), map); } catch (Throwable error) { LOGGER.log(Level.SEVERE, "Failed to post HMCL server.", error); } From 130b95087863e2f5f2ac0fc74b424682bfd47d52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Mon, 29 Aug 2016 17:13:00 +0800 Subject: [PATCH 45/46] update version --- HMCL/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/HMCL/build.gradle b/HMCL/build.gradle index d0c4afee4..19c436e0a 100755 --- a/HMCL/build.gradle +++ b/HMCL/build.gradle @@ -85,9 +85,9 @@ if (buildnumber == null) if (buildnumber == null) buildnumber = readBuildNumber() -def versionroot = System.getenv("VERSION_ROOT") +def versionroot = System.getenv("HMCL_VERSION_ROOT") if (versionroot == null) - versionroot = "2.5.2" + versionroot = "2.5.3" String mavenGroupId = 'HMCL' String mavenVersion = versionroot + '.' + buildnumber From 9ab853d0ea0db8c9141f576ca50312649e8cffff Mon Sep 17 00:00:00 2001 From: huangyuhui Date: Wed, 1 Feb 2017 12:21:19 +0800 Subject: [PATCH 46/46] Revert --- .gitignore | 4 +- .nb-gradle-properties | 2 +- .travis.yml | 19 +- HMCL/build.gradle | 50 +-- .../core/asset/AssetsMojangLoader.java | 2 +- .../launcher/core/asset/IAssetsHandler.java | 49 +-- .../core/asset/MinecraftAssetService.java | 3 +- .../core/download/DownloadLibraryJob.java | 4 +- .../launcher/core/download/DownloadType.java | 5 +- .../download/DynamicDownloadProvider.java | 161 --------- .../core/download/IDownloadProvider.java | 10 +- .../download/MinecraftDownloadService.java | 25 +- .../core/download/MojangDownloadProvider.java | 15 +- .../core/install/InstallerVersionList.java | 165 ++++----- .../forge/MinecraftForgeVersionList.java | 7 +- .../core/launch/LibraryDownloadTask.java | 14 +- .../launcher/core/mod/ModInfo.java | 42 +-- .../core/version/LibraryDownloadInfo.java | 48 +-- .../core/version/MinecraftLibrary.java | 206 +++++------ HMCL/src/main/icon.icns | Bin 114786 -> 158805 bytes .../hellominecraft/launcher/Main.java | 246 ++++++------- .../launcher/setting/Config.java | 46 +-- .../launcher/setting/Settings.java | 2 - .../launcher/ui/InstallerPanel.java | 150 ++++---- .../launcher/ui/LauncherSettingsPanel.form | 19 +- .../launcher/ui/LauncherSettingsPanel.java | 40 ++- .../hellominecraft/launcher/ui/MainFrame.java | 35 +- .../launcher/ui/MainPagePanel.form | 11 - .../launcher/ui/MainPagePanel.java | 15 +- .../launcher/ui/RecommendPanel.java | 338 ------------------ .../launcher/util/CrashReporter.java | 6 +- .../util/upgrade/AppDataUpgrader.java | 135 ++----- .../hellominecraft/launcher/icon.png | Bin 5362 -> 28154 bytes .../hellominecraft/launcher/re_close.png | Bin 1182 -> 0 bytes .../launcher/re_close_enter.png | Bin 1117 -> 0 bytes .../org/jackhuang/hellominecraft/util/C.java | 6 +- .../hellominecraft/util/IUpdateChecker.java | 20 +- .../hellominecraft/util/MessageBox.java | 24 +- .../hellominecraft/util/NetUtils.java | 19 - .../hellominecraft/util/UpdateChecker.java | 62 +--- .../util/tasks/download/FileDownloadTask.java | 8 +- .../hellominecraft/util/ui/LogWindow.form | 12 +- .../hellominecraft/util/ui/LogWindow.java | 24 +- .../util/ui/LogWindowOutputStream.java | 2 + .../jackhuang/hellominecraft/lang/I18N.lang | 10 +- .../hellominecraft/lang/I18N.properties | 10 +- .../hellominecraft/lang/I18N_en.lang | 8 +- .../hellominecraft/lang/I18N_en.properties | 8 +- .../hellominecraft/lang/I18N_zh_TW.lang | 10 +- .../hellominecraft/lang/I18N_zh_TW.properties | 10 +- LICENSE | 4 +- README.md | 3 +- license-header.txt | 2 +- 53 files changed, 592 insertions(+), 1524 deletions(-) delete mode 100644 HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java delete mode 100644 HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java delete mode 100644 HMCL/src/main/resources/org/jackhuang/hellominecraft/launcher/re_close.png delete mode 100644 HMCL/src/main/resources/org/jackhuang/hellominecraft/launcher/re_close_enter.png diff --git a/.gitignore b/.gitignore index efb879487..d98830a22 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,4 @@ HMCLServer/ HMCSM/build/ MetroLookAndFeel/build/ /HMCUtils/build/ -/HMCLaF/build/ -HMCL/version.properties -.idea/ +/HMCLaF/build/ \ No newline at end of file diff --git a/.nb-gradle-properties b/.nb-gradle-properties index a27e06991..aa17ec6af 100755 --- a/.nb-gradle-properties +++ b/.nb-gradle-properties @@ -31,6 +31,6 @@ GNU General Public License - HMCLSoft + huangyuhui diff --git a/.travis.yml b/.travis.yml index 7e48f78b0..9fce3d616 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,18 @@ language: java -sudo: false jdk: - oraclejdk8 +branches: + only: + - master +before_deploy: + - git config --global user.email ${GITHUB_EMAIL} + - git config --global user.name ${GITHUB_NAME} + - git tag ${TRAVIS_BUILD_NUMBER} + - git push -q ${REPO} --tags deploy: provider: releases - api_key: ${DEPLOY_REPO} + api_key: + secure: lfFEwKtij/s9Ao/SKL7oVdsWcfASshZuwT27gllMrTx1ZQqLCG2I5mGJOp5ukx7lb3y4Tu316nFasLjy9NI3eLXSx9f0w4q+wMf0K5Yj9iOwu/TIn7JkLyHDMQ20qRwGxZplS2WUb669gIRg+l6jUHeTBW+dlTxr0mMa6WHIl8UDpHwfFrGC3i6dL4y6WlDwGl2rYktvOoA/iqvtglBcHuXaL2sDfhp5MXRcYULTIw+b9zmiQXP665DQN+Su5I3gwB4y5X8RH72GAacZn13fEIo5i8UUoHM7UQxM8y8DKSO3avyFCfpUle9+9sErQVW7b6JV1c+AoLWuAhNJLMlUTKarZE7UMqfjvoQHxX5hp2B2WHLEON/UJiGf25HJWx6VhJitE0/odujqnG/umesqki2jMTs6gPcxbc9iBjzUg+ZmFztdtC+Emnni7lpqVVl+Y5hsJRn3Z6rIiNgwmaE0r2OQgAm1vRYFc7jvOdRfyFG+uCRZF6nS56BzJ7dLc0WW8dTgSft6YFll4ZYL6hiI9qiIaBAK948y5HV+6VBWuO3xf/G2CUFbE1Y9qUCjToh3ahxNDzZvXB+rXqvlvNQOi5l8n594oQ61n45qIHSKlMBn9Bxhw29oWT5mo1aYIaNXbpzKam2w4mK0T3VrgTszu/3282wRbNr+VAwdGMfwW1s= file: - HMCL/build/libs/HMCL-${HMCL_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}.jar - HMCL/build/libs/HMCL-${HMCL_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}.exe @@ -13,9 +21,8 @@ deploy: - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}.exe - HMCSM/build/libs/HMCSM-${HMCSM_VERSION_ROOT}.${TRAVIS_BUILD_NUMBER}-MacOSApp.zip on: - repo: mclauncher/HMCL - branch: master - tags: true + repo: huanghongxun/HMCL + tags: false skip_cleanup: true install: echo "skip 'gradle assemble' step" script: gradle build --continue @@ -24,4 +31,4 @@ before_cache: cache: directories: - "$HOME/.gradle/caches/" - - "$HOME/.gradle/wrapper/" \ No newline at end of file + - "$HOME/.gradle/wrapper/" diff --git a/HMCL/build.gradle b/HMCL/build.gradle index 19c436e0a..6bc999f7d 100755 --- a/HMCL/build.gradle +++ b/HMCL/build.gradle @@ -27,7 +27,6 @@ buildscript { classpath 'net.sf.proguard:proguard-gradle:4.10' classpath 'edu.sc.seis.gradle:launch4j:1.0.6' classpath 'me.tatarka:gradle-retrolambda:3.1.0' - classpath 'com.google.code.gson:gson:2.2.4' } } } @@ -39,7 +38,6 @@ plugins { import java.util.jar.JarOutputStream import java.util.zip.ZipEntry import java.util.zip.ZipFile -import com.google.gson.JsonParser apply plugin: 'launch4j' apply plugin: 'me.tatarka.retrolambda' @@ -48,46 +46,15 @@ if (!hasProperty('mainClass')) { ext.mainClass = 'org.jackhuang.hellominecraft.launcher.Main' } -def readBuildNumber() { - def versionPropsFile = file('version.properties') - def Properties versionProps = new Properties() - - if (versionPropsFile.canRead()) { - versionProps.load(new FileInputStream(versionPropsFile)) - def code = versionProps['VERSION_CODE'].toInteger() - return code.toString() - } else { - versionPropsFile.createNewFile() - - String url = 'https://api.travis-ci.org/repos/mclauncher/HMCL/branches' - def json = new JsonParser().parse(url.toURL().text); - if (json.has('branches') && json.get('branches').isJsonArray()) { - def branches = json.getAsJsonArray('branches') - if (branches != null && branches.size() > 0) { - def info = branches.get(0).getAsJsonObject() - def code = info.get('number').getAsInt().toString() - versionProps['VERSION_CODE'] = code - versionProps.store(versionPropsFile.newWriter(), null) - return code - } - } - } - return '233' -} - -task cleanVersionFile << { - file("version.properties").delete() -} - def buildnumber = System.getenv("TRAVIS_BUILD_NUMBER") if (buildnumber == null) buildnumber = System.getenv("BUILD_NUMBER") if (buildnumber == null) - buildnumber = readBuildNumber() - -def versionroot = System.getenv("HMCL_VERSION_ROOT") + buildnumber = "233" + +def versionroot = System.getenv("VERSION_ROOT") if (versionroot == null) - versionroot = "2.5.3" + versionroot = "2.4.1" String mavenGroupId = 'HMCL' String mavenVersion = versionroot + '.' + buildnumber @@ -173,20 +140,22 @@ jar { from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } manifest { - attributes 'Created-By' : 'Copyright(c) 2013-2016 HMCLSoft.', + attributes 'Created-By' : 'Copyright(c) 2013-2016 huangyuhui.', 'Main-Class' : mainClass } } launch4j { - supportUrl = 'http://www.hmclsoft.com' + launch4jCmd = 'D:\\Develop\\Java\\Launch4j\\launch4j.exe' + //launch4jCmd = '/home/huangyuhui/softwares/launch4j/launch4j' + supportUrl = 'http://www.mcbbs.net/thread-142335-1-1.html' jreMinVersion = '1.6.0' mainClassName = mainClass icon = new File(project.buildDir, '../icon.ico').absolutePath version = mavenVersion downloadUrl = 'http://java.com/download' - copyright = "Copyright(c) 2013-2016 HMCLSoft." + copyright = "Copyright(c) 2013-2015 huangyuhui." jar = new File(project.buildDir, 'libs/' + mavenGroupId + '-' + mavenVersion + '.jar').absolutePath outfile = mavenGroupId + '-' + mavenVersion + '.exe' @@ -199,7 +168,6 @@ processResources { } } -build.dependsOn cleanVersionFile build.dependsOn makeExecutable build.dependsOn makePackGZ build.dependsOn macAppCompressed \ No newline at end of file diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/AssetsMojangLoader.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/AssetsMojangLoader.java index 126788fd4..ad24a5015 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/AssetsMojangLoader.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/AssetsMojangLoader.java @@ -98,7 +98,7 @@ public class AssetsMojangLoader extends IAssetsHandler { @Override public Task getDownloadTask(IDownloadProvider sourceType) { - return new AssetsTask(sourceType.getAssetsDownloadURL(), sourceType.getRetryAssetsDownloadURL()); + return new AssetsTask(sourceType.getAssetsDownloadURL()); } @Override diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/IAssetsHandler.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/IAssetsHandler.java index 96b772a56..7302fba16 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/IAssetsHandler.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/IAssetsHandler.java @@ -34,8 +34,6 @@ import org.jackhuang.hellominecraft.util.code.DigestUtils; import org.jackhuang.hellominecraft.util.system.IOUtils; import org.jackhuang.hellominecraft.util.NetUtils; import org.jackhuang.hellominecraft.util.OverridableSwingWorker; -import org.jackhuang.hellominecraft.util.StrUtils; -import org.jackhuang.hellominecraft.util.func.Function; import org.jackhuang.hellominecraft.util.tasks.TaskInfo; /** @@ -91,37 +89,30 @@ public abstract class IAssetsHandler { protected class AssetsTask extends TaskInfo { - ArrayList tasks; - String baseUrl; - String retryBaseUrl; + ArrayList al; + String u; - public AssetsTask(String url, String retryUrl) { + public AssetsTask(String url) { super(C.i18n("assets.download")); - this.baseUrl = url; - this.retryBaseUrl = retryUrl; + this.u = url; } @Override public void executeTask() { if (assetsDownloadURLs == null || assetsLocalNames == null || contents == null) throw new IllegalStateException(C.i18n("assets.not_refreshed")); - - tasks = new ArrayList<>(); int max = assetsDownloadURLs.size(); + al = new ArrayList<>(); int hasDownloaded = 0; for (int i = 0; i < max; i++) { String mark = assetsDownloadURLs.get(i); - String downloadUrl = baseUrl + mark; - String downloadRetryUrl = StrUtils.isNotBlank(retryBaseUrl) ? retryBaseUrl + mark : ""; + String url = u + mark; File location = assetsLocalNames.get(i); - if (!location.getParentFile().exists() && !location.getParentFile().mkdirs()) HMCLog.warn("Failed to make directories: " + location.getParent()); - if (location.isDirectory()) continue; - - boolean needDownload = true; + boolean need = true; try { if (location.exists()) { FileInputStream fis = new FileInputStream(location); @@ -130,39 +121,23 @@ public abstract class IAssetsHandler { if (contents.get(i).geteTag().equals(sha)) { ++hasDownloaded; HMCLog.log("File " + assetsLocalNames.get(i) + " has been downloaded successfully, skipped downloading."); - if (ppl != null) { + if (ppl != null) ppl.setProgress(this, hasDownloaded, max); - } continue; } } } catch (IOException e) { HMCLog.warn("Failed to get hash: " + location, e); - needDownload = !location.exists(); + need = !location.exists(); } - - if (needDownload) { - FileDownloadTask fileDownloadTask = new FileDownloadTask(downloadUrl, location); - fileDownloadTask.setTag(mark); - - // retry - if (StrUtils.isNotBlank(downloadRetryUrl)) { - fileDownloadTask.setFailedCallbackReturnsNewURL(new Function() { - @Override - public String apply(Integer t) { - return downloadRetryUrl; - } - }); - } - - tasks.add(fileDownloadTask); - } + if (need) + al.add(new FileDownloadTask(url, location).setTag(mark)); } } @Override public Collection getAfterTasks() { - return tasks; + return al; } } } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java index 6070e8117..626dbe7cf 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java @@ -56,8 +56,7 @@ public class MinecraftAssetService extends IMinecraftAssetService { public Task downloadAssets(final MinecraftVersion mv) { if (mv == null) return null; - return IAssetsHandler.ASSETS_HANDLER.getList(mv, service.asset()) - .after(IAssetsHandler.ASSETS_HANDLER.getDownloadTask(service.getDownloadType().getProvider())); + return IAssetsHandler.ASSETS_HANDLER.getList(mv, service.asset()).after(IAssetsHandler.ASSETS_HANDLER.getDownloadTask(service.getDownloadType().getProvider())); } @Override diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadLibraryJob.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadLibraryJob.java index a3735004d..7c5e28592 100644 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadLibraryJob.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadLibraryJob.java @@ -29,12 +29,10 @@ public class DownloadLibraryJob { public IMinecraftLibrary lib; public String url; - public String retryUrl; public File path; - public DownloadLibraryJob(IMinecraftLibrary n, String u, String retry, File p) { + public DownloadLibraryJob(IMinecraftLibrary n, String u, File p) { url = u; - retryUrl = retry; lib = n; path = IOUtils.tryGetCanonicalFile(p); } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java index c9dadd4c8..1a7644ef7 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java @@ -29,8 +29,7 @@ public enum DownloadType { Mojang("download.mojang", new MojangDownloadProvider()), BMCL("download.BMCL", new BMCLAPIDownloadProvider()), //RapidData("download.rapid_data", new RapidDataDownloadProvider()), - Curse("Curse CDN", new CurseDownloadProvider()), - Dynamic("HMCLSoft", DynamicDownloadProvider.getInstance()); + Curse("Curse CDN", new CurseDownloadProvider()); private final String name; private final IDownloadProvider provider; @@ -48,7 +47,7 @@ public enum DownloadType { return C.i18n(name); } - private static DownloadType suggestedDownloadType = Dynamic; + private static DownloadType suggestedDownloadType = Mojang; public static DownloadType getSuggestedDownloadType() { return suggestedDownloadType; diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java deleted file mode 100644 index 8cbe9dbf1..000000000 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Hello Minecraft! Launcher. - * Copyright (C) 2013 huangyuhui - * - * 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.core.download; - -import com.google.gson.reflect.TypeToken; -import java.io.IOException; -import java.util.Map; -import org.jackhuang.hellominecraft.util.C; -import org.jackhuang.hellominecraft.util.NetUtils; -import org.jackhuang.hellominecraft.util.StrUtils; - -/** - * - * @author evilwk - */ -public class DynamicDownloadProvider extends MojangDownloadProvider { - - private static final String PROVIDER_ADDR = "http://client.api.mcgogogo.com:81/provider.php"; - - private volatile static DynamicDownloadProvider instance; - - private String versionManifestAddr = null; - private String launcherMetaAddr = null; - private String launcherAddr = null; - - private String librariesAddr = null; - private String assetsAddr = null; - - public void setVersionManifestAddr(String versionManifestAddr) { - this.versionManifestAddr = versionManifestAddr; - } - - public void setLauncherMetaAddr(String launcherMetaAddr) { - this.launcherMetaAddr = launcherMetaAddr; - } - - public void setLauncherAddr(String launcherAddr) { - this.launcherAddr = launcherAddr; - } - - public void setLibrariesAddr(String librariesAddr) { - this.librariesAddr = librariesAddr; - } - - public void setAssetsAddr(String assetsAddr) { - this.assetsAddr = assetsAddr; - } - - private DynamicDownloadProvider() { - - } - - public static DynamicDownloadProvider getInstance() { - if (instance == null) { - synchronized (DynamicDownloadProvider.class) { - if (instance == null) { - instance = new DynamicDownloadProvider(); - } - } - } - return instance; - } - - @Override - public String getRetryAssetsDownloadURL() { - return super.getAssetsDownloadURL(); - } - - @Override - public String getRetryLibraryDownloadURL() { - return super.getLibraryDownloadURL(); - } - - @Override - public String getAssetsDownloadURL() { - if (StrUtils.isNotBlank(assetsAddr)) { - return assetsAddr; - } - return super.getAssetsDownloadURL(); - } - - @Override - public String getLibraryDownloadURL() { - if (StrUtils.isNotBlank(librariesAddr)) { - return librariesAddr; - } - return super.getLibraryDownloadURL(); - } - - @Override - public String getVersionsListDownloadURL() { - if (StrUtils.isNotBlank(versionManifestAddr)) { - return versionManifestAddr; - } - return super.getVersionsListDownloadURL(); - } - - @Override - public String getParsedDownloadURL(String str) { - if (str != null) { - if (StrUtils.isNotBlank(librariesAddr)) { - str = str.replace("https://libraries.minecraft.net", librariesAddr); - } - if (StrUtils.isNotBlank(launcherMetaAddr)) { - str = str.replace("https://launchermeta.mojang.com", launcherMetaAddr); - } - if (StrUtils.isNotBlank(launcherAddr)) { - str = str.replace("https://launcher.mojang.com", launcherAddr); - } - } - return super.getParsedDownloadURL(str); - } - - public void init() { - new Thread() { - - private String getValue(Map addrInfo, String key) { - String value = null; - do { - if (!addrInfo.containsKey(key)) - continue; - value = addrInfo.get(key); - } while(false); - return value; - } - - @Override - public void run() { - try { - String providerInfo = NetUtils.get(PROVIDER_ADDR); - Map addrInfo = null; - addrInfo = C.GSON.fromJson(providerInfo, new TypeToken>() {}.getType()); - if (addrInfo != null) { - setLibrariesAddr(getValue(addrInfo, "libraries")); - setAssetsAddr(getValue(addrInfo, "assets")); - setLauncherMetaAddr(getValue(addrInfo, "launcherMeta")); - setLauncherAddr(getValue(addrInfo, "launcher")); - setVersionManifestAddr(getValue(addrInfo, "versionManifest")); - } - } catch (Throwable t) { - - } - } - }.start(); - } -} diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/IDownloadProvider.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/IDownloadProvider.java index 2d01c09b9..b6142969d 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/IDownloadProvider.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/IDownloadProvider.java @@ -38,7 +38,7 @@ public abstract class IDownloadProvider { return null; } } - + public abstract InstallerVersionList getForgeInstaller(); public abstract InstallerVersionList getLiteLoaderInstaller(); @@ -46,10 +46,6 @@ public abstract class IDownloadProvider { public abstract InstallerVersionList getOptiFineInstaller(); public abstract String getLibraryDownloadURL(); - - public String getRetryLibraryDownloadURL() { - return ""; - } public abstract String getVersionsDownloadURL(); @@ -59,10 +55,6 @@ public abstract class IDownloadProvider { public abstract String getAssetsDownloadURL(); - public String getRetryAssetsDownloadURL() { - return ""; - } - /** * For example, minecraft.json/assetIndex/url or * minecraft.json/downloads/client/url diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java index e8c5feb51..478ce10f5 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java @@ -31,7 +31,6 @@ import org.jackhuang.hellominecraft.launcher.core.GameException; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.launcher.core.version.GameDownloadInfo; import org.jackhuang.hellominecraft.launcher.core.version.IMinecraftLibrary; -import org.jackhuang.hellominecraft.launcher.core.version.LibraryDownloadInfo; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion; import org.jackhuang.hellominecraft.util.tasks.download.FileDownloadTask; import org.jackhuang.hellominecraft.util.func.Function; @@ -54,17 +53,14 @@ public class MinecraftDownloadService extends IMinecraftDownloadService { ArrayList downloadLibraries = new ArrayList<>(); if (mv == null) return downloadLibraries; - MinecraftVersion v = mv.resolve(service.version()); - for (IMinecraftLibrary libraryInfo : v.getLibraries()) - if (libraryInfo != null && libraryInfo.allow() && libraryInfo.getDownloadInfo() != null) { - File ff = libraryInfo.getFilePath(service.baseDirectory()); + for (IMinecraftLibrary l : v.getLibraries()) + if (l != null && l.allow() && l.getDownloadInfo() != null) { + File ff = l.getFilePath(service.baseDirectory()); if (!ff.exists()) { - LibraryDownloadInfo downloadInfo = libraryInfo.getDownloadInfo(); - String downloadUrl = downloadInfo.getUrl(service.getDownloadType()); - String retryDownloadUrl = downloadInfo.getRetryUrl(service.getDownloadType()); - if (downloadUrl != null) - downloadLibraries.add(new DownloadLibraryJob(libraryInfo, downloadUrl, retryDownloadUrl, ff)); + String libURL = l.getDownloadInfo().getUrl(service.getDownloadType()); + if (libURL != null) + downloadLibraries.add(new DownloadLibraryJob(l, libURL, ff)); } } return downloadLibraries; @@ -118,13 +114,10 @@ public class MinecraftDownloadService extends IMinecraftDownloadService { } @Override - public String apply(Integer repeat) { - int index = repeat / 2; - if (index > DownloadType.values().length) { - index = 0; - } - return DownloadType.values()[index].getProvider().getVersionsDownloadURL() + suffix; + public String apply(Integer t) { + return DownloadType.values()[t / 2].getProvider().getVersionsDownloadURL() + suffix; } + } @Override diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MojangDownloadProvider.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MojangDownloadProvider.java index a161effd7..6882922dd 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MojangDownloadProvider.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MojangDownloadProvider.java @@ -41,32 +41,27 @@ public class MojangDownloadProvider extends IDownloadProvider { public InstallerVersionList getOptiFineInstaller() { return org.jackhuang.hellominecraft.launcher.core.install.optifine.vanilla.OptiFineVersionList.getInstance(); } - - // jars + @Override public String getLibraryDownloadURL() { return "https://libraries.minecraft.net"; } - // jars @Override public String getVersionsDownloadURL() { return "http://s3.amazonaws.com/Minecraft.Download/versions/"; } - - // resource + @Override public String getIndexesDownloadURL() { return "http://s3.amazonaws.com/Minecraft.Download/indexes/"; } - - // game versions json + @Override public String getVersionsListDownloadURL() { return "https://launchermeta.mojang.com/mc/game/version_manifest.json"; } - - // resource + @Override public String getAssetsDownloadURL() { return "https://resources.download.minecraft.net/"; @@ -85,7 +80,7 @@ public class MojangDownloadProvider extends IDownloadProvider { return str.replace("http://files.minecraftforge.net/maven", "http://ftb.cursecdn.com/FTB2/maven/"); else if (str.contains("typesafe") || str.contains("scala")) if (SupportedLocales.NOW_LOCALE.self == Locale.CHINA) - return str.replace("http://files.minecraftforge.net/maven", "http://maven.aliyun.com/nexus/content/groups/public"); + return str.replace("http://files.minecraftforge.net/maven", "http://maven.oschina.net/content/groups/public"); else return str.replace("http://files.minecraftforge.net/maven", "http://repo1.maven.org/maven2"); else diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/InstallerVersionList.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/InstallerVersionList.java index c7eb180d4..2aefcea2c 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/InstallerVersionList.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/InstallerVersionList.java @@ -30,110 +30,91 @@ import org.jackhuang.hellominecraft.util.tasks.Task; */ public abstract class InstallerVersionList { - /** - * Refresh installer versions list from the downloaded content. - * - * @param versions Minecraft versions you need to refresh - * - * @throws java.lang.Exception including network exceptions, IO exceptions. - */ - public abstract Task refresh(String[] versions); + /** + * Refresh installer versions list from the downloaded content. + * + * @param versions Minecraft versions you need to refresh + * + * @throws java.lang.Exception including network exceptions, IO exceptions. + */ + public abstract Task refresh(String[] versions); - /** - * Installer name. - * - * @return installer name. - */ - public abstract String getName(); + /** + * Installer name. + * + * @return installer name. + */ + public abstract String getName(); - /** - * Get installers you want. - * - * @param mcVersion the installers to this Minecraft version. - * - * @return cached result. - */ - protected abstract List getVersionsImpl(String mcVersion); + /** + * Get installers you want. + * + * @param mcVersion the installers to this Minecraft version. + * + * @return cached result. + */ + protected abstract List getVersionsImpl(String mcVersion); - /** - * Get installers you want, please cache this method's result to save time. - * - * @param mcVersion the installers to this Minecraft version. - * - * @return a copy of the cached data to prevent - * ConcurrentModificationException. - */ - public List getVersions(String mcVersion) { - List a = getVersionsImpl(mcVersion); - if (a == null) { - return null; - } else { - return new ArrayList<>(a); - } - } + /** + * Get installers you want, please cache this method's result to save time. + * + * @param mcVersion the installers to this Minecraft version. + * + * @return a copy of the cached data to prevent + * ConcurrentModificationException. + */ + public List getVersions(String mcVersion) { + List a = getVersionsImpl(mcVersion); + if (a == null) + return null; + else + return new ArrayList<>(a); + } - public static int compareVersion(String verOne, String verTwo) { - String[] verInfoOne = verOne.split("\\."); - String[] verInfoTwo = verTwo.split("\\."); - int idx = 0; - int minLength = Math.min(verInfoOne.length, verInfoTwo.length); - int diff = 0; - while (idx < minLength - && (diff = verInfoOne[idx].length() - verInfoTwo[idx].length()) == 0 - && (diff = verInfoOne[idx].compareTo(verInfoTwo[idx])) == 0) { - ++idx; - } - diff = (diff != 0) ? diff : verInfoOne.length - verInfoTwo.length; - return (diff == 0) ? 0 : (diff < 0 ? -1 : 1); - } + public static class InstallerVersion implements Comparable { - public static class InstallerVersion implements Comparable { + public String selfVersion, mcVersion; + public String installer, universal; + public String changelog; - public String selfVersion, mcVersion; - public String installer, universal; - public String changelog; + public InstallerVersion(String selfVersion, String mcVersion) { + this.selfVersion = selfVersion; + this.mcVersion = mcVersion; + } - public InstallerVersion(String selfVersion, String mcVersion) { - this.selfVersion = selfVersion; - this.mcVersion = mcVersion; - } + @Override + public int compareTo(InstallerVersion o) { + return selfVersion.compareTo(o.selfVersion); + } - @Override - public int compareTo(InstallerVersion o) { - return compareVersion(selfVersion, o.selfVersion); - } + @Override + public int hashCode() { + return selfVersion.hashCode(); + } - @Override - public int hashCode() { - return selfVersion.hashCode(); - } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final InstallerVersion other = (InstallerVersion) obj; + return Objects.equals(this.selfVersion, other.selfVersion); + } - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final InstallerVersion other = (InstallerVersion) obj; - return Objects.equals(this.selfVersion, other.selfVersion); - } + } - } + public static class InstallerVersionComparator implements Comparator, Serializable { - public static class InstallerVersionComparator implements Comparator, Serializable { + private static final long serialVersionUID = 3276198781795213723L; - private static final long serialVersionUID = 3276198781795213723L; + public static final InstallerVersionComparator INSTANCE = new InstallerVersionComparator(); - public static final InstallerVersionComparator INSTANCE = new InstallerVersionComparator(); - - @Override - public int compare(InstallerVersion o1, InstallerVersion o2) { - return o2.compareTo(o1); - } - } + @Override + public int compare(InstallerVersion o1, InstallerVersion o2) { + return o2.compareTo(o1); + } + } } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/forge/MinecraftForgeVersionList.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/forge/MinecraftForgeVersionList.java index 725b73328..984425ca1 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/forge/MinecraftForgeVersionList.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/forge/MinecraftForgeVersionList.java @@ -76,13 +76,10 @@ public class MinecraftForgeVersionList extends InstallerVersionList { for (Map.Entry arr : root.mcversion.entrySet()) { String mcver = StrUtils.formatVersion(arr.getKey()); - if (mcver == null) { - mcver = arr.getKey(); - } ArrayList al = new ArrayList<>(); for (int num : arr.getValue()) { MinecraftForgeVersion v = root.number.get(num); - InstallerVersion iv = new InstallerVersion(v.version, v.mcversion); + InstallerVersion iv = new InstallerVersion(v.version, StrUtils.formatVersion(v.mcversion)); for (String[] f : v.files) { String ver = v.mcversion + "-" + v.version; @@ -111,7 +108,7 @@ public class MinecraftForgeVersionList extends InstallerVersionList { versions.add(iv); } - versionMap.put(mcver, al); + versionMap.put(StrUtils.formatVersion(mcver), al); } Collections.sort(versions, new InstallerVersionComparator()); diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/LibraryDownloadTask.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/LibraryDownloadTask.java index c088f74ed..3cd1cfbb9 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/LibraryDownloadTask.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/LibraryDownloadTask.java @@ -21,8 +21,6 @@ import java.io.File; import java.net.URL; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.launcher.core.download.DownloadLibraryJob; -import org.jackhuang.hellominecraft.util.StrUtils; -import org.jackhuang.hellominecraft.util.func.Function; import org.jackhuang.hellominecraft.util.tasks.download.FileDownloadTask; /** @@ -51,20 +49,12 @@ public class LibraryDownloadTask extends FileDownloadTask { if (s.length == 3 && s[2].length() > 3) job.url = "http://dl.liteloader.com/versions/com/mumfrey/liteloader/" + s[2].substring(0, s[2].length() - 3) + "/liteloader-" + s[2] + ".jar"; } - download(new URL(job.url), job.retryUrl, job.path); + download(new URL(job.url), job.path); } - void download(URL url, String retryUrl, File filePath) throws Throwable { + void download(URL url, File filePath) throws Throwable { this.url = url; this.filePath = filePath; - if (StrUtils.isNotBlank(retryUrl)) { - this.failedCallbackReturnsNewURL = new Function() { - @Override - public String apply(Integer t) { - return retryUrl; - } - }; - } super.executeTask(); } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/mod/ModInfo.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/mod/ModInfo.java index 5de1ab074..f508b2acc 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/mod/ModInfo.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/mod/ModInfo.java @@ -17,15 +17,13 @@ */ package org.jackhuang.hellominecraft.launcher.core.mod; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import com.google.gson.JsonSyntaxException; import com.google.gson.annotations.SerializedName; import com.google.gson.reflect.TypeToken; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; +import java.lang.reflect.Type; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -62,8 +60,6 @@ public class ModInfo implements Comparable { public String credits; @SerializedName("authorList") public String[] authorList; - @SerializedName("authors") - public String[] authors; public boolean isActive() { return !location.getName().endsWith(".disabled"); @@ -91,8 +87,6 @@ public class ModInfo implements Comparable { public String getAuthor() { if (authorList != null && authorList.length > 0) return StrUtils.parseParams("", authorList, ", "); - else if (authors != null && authors.length > 0) - return StrUtils.parseParams("", authors, ", "); else if (StrUtils.isNotBlank(author)) return author; else @@ -129,30 +123,18 @@ public class ModInfo implements Comparable { return name.endsWith(".zip") || name.endsWith(".jar") || name.endsWith("litemod"); } - private static ModInfo getForgeModInfo(File f, ZipFile jar, ZipEntry entry) throws IOException { - ModInfo i = new ModInfo(); - i.location = f; + private static final Type TYPE = new TypeToken>() { + }.getType(); - InputStreamReader streamReader = new InputStreamReader(jar.getInputStream(entry), "UTF-8"); - - JsonParser parser = new JsonParser(); - JsonElement element = parser.parse(streamReader); - List m = null; - if (element.isJsonArray()) { - m = C.GSON.fromJson(element, new TypeToken>(){}.getType()); - } else if (element.isJsonObject()) { - JsonObject modInfo = element.getAsJsonObject(); - if (modInfo.has("modList") && modInfo.get("modList").isJsonArray()) { - m = C.GSON.fromJson(modInfo.get("modList"), new TypeToken>(){}.getType()); - } - } - - if (m != null && m.size() > 0) { - i = m.get(0); - i.location = f; - } - - return i; + private static ModInfo getForgeModInfo(File f, ZipFile jar, ZipEntry entry) throws IOException { + ModInfo i = new ModInfo(); + i.location = f; + List m = C.GSON.fromJson(new InputStreamReader(jar.getInputStream(entry), "UTF-8"), TYPE); + if (m != null && m.size() > 0) { + i = m.get(0); + i.location = f; + } + return i; } private static ModInfo getLiteLoaderModInfo(File f, ZipFile jar, ZipEntry entry) throws IOException { diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java index 2182af377..f2cb07a3e 100644 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java @@ -19,7 +19,6 @@ package org.jackhuang.hellominecraft.launcher.core.version; import com.google.gson.annotations.SerializedName; import org.jackhuang.hellominecraft.launcher.core.download.DownloadType; -import org.jackhuang.hellominecraft.launcher.core.download.IDownloadProvider; import org.jackhuang.hellominecraft.util.StrUtils; import org.jackhuang.hellominecraft.util.system.IOUtils; @@ -36,43 +35,14 @@ public class LibraryDownloadInfo extends GameDownloadInfo { @Override public String getUrl(DownloadType dt, boolean allowSelf) { - IDownloadProvider provider = dt.getProvider(); - String downloadUrl = (forgeURL == null ? provider.getLibraryDownloadURL() : forgeURL); - if (StrUtils.isNotBlank(url) && allowSelf) { - downloadUrl = url; - } // forced replace: Let different download sources into force - return provider.getParsedDownloadURL(getUrlWithBaseUrl(downloadUrl)); - } - - public String getRetryUrl(DownloadType dt) { - IDownloadProvider provider = dt.getProvider(); - String retryBaseUrl = provider.getRetryLibraryDownloadURL(); - - String downloadUrl = (forgeURL == null ? retryBaseUrl : forgeURL); - if (StrUtils.isNotBlank(url) && provider.isAllowedToUseSelfURL()) { - downloadUrl = url; - } - - if (StrUtils.isBlank(downloadUrl)) { - return null; - } - - downloadUrl = getUrlWithBaseUrl(downloadUrl); - if (downloadUrl.contains("minecraftforge")) { // fix forge url - downloadUrl = provider.getParsedDownloadURL(downloadUrl); - } - - return downloadUrl; - } - - private String getUrlWithBaseUrl(String baseUrl) { - if (!baseUrl.endsWith(".jar")) { - if (path == null) { + String myURL = (forgeURL == null ? dt.getProvider().getLibraryDownloadURL() : forgeURL); + if (StrUtils.isNotBlank(url) && allowSelf) + myURL = url; + if (!myURL.endsWith(".jar")) + if (path == null) return null; - } else { - baseUrl = IOUtils.addURLSeparator(baseUrl) + path.replace('\\', '/'); - } - } - return baseUrl; - } + else + myURL = IOUtils.addURLSeparator(myURL) + path.replace('\\', '/'); + return myURL; + } } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftLibrary.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftLibrary.java index ebe2ef844..5c6baede3 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftLibrary.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftLibrary.java @@ -31,122 +31,112 @@ import org.jackhuang.hellominecraft.util.StrUtils; */ public class MinecraftLibrary extends IMinecraftLibrary { - @SerializedName("rules") - public ArrayList rules; - @SerializedName("url") - public String url; - @SerializedName("natives") - public Natives natives; - @SerializedName("extract") - public Extract extract; - @SerializedName("downloads") - public LibrariesDownloadInfo downloads; + @SerializedName("rules") + public ArrayList rules; + @SerializedName("url") + public String url; + @SerializedName("natives") + public Natives natives; + @SerializedName("extract") + public Extract extract; + @SerializedName("downloads") + public LibrariesDownloadInfo downloads; - public MinecraftLibrary(String name) { - super(name); - } + public MinecraftLibrary(String name) { + super(name); + } - public MinecraftLibrary(ArrayList rules, String url, Natives natives, String name, Extract extract, LibraryDownloadInfo downloads) { - super(name); - this.rules = (rules == null) ? null : (ArrayList) rules.clone(); - this.url = url; - this.natives = (natives == null) ? null : (Natives) natives.clone(); - this.extract = (extract == null) ? null : (Extract) extract.clone(); - } + public MinecraftLibrary(ArrayList rules, String url, Natives natives, String name, Extract extract, LibraryDownloadInfo downloads) { + super(name); + this.rules = rules == null ? null : (ArrayList) rules.clone(); + this.url = url; + this.natives = natives == null ? null : (Natives) natives.clone(); + this.extract = extract == null ? null : (Extract) extract.clone(); + } - @Override - public boolean allow() { - if (rules != null) { - boolean flag = false; - for (Rules r : rules) { - if ("disallow".equals(r.action())) { - return false; - } else if ("allow".equals(r.action())) { - flag = true; - } - } - return flag; - } - return true; - } + /** + * is the library allowed to load. + * + * @return + */ + @Override + public boolean allow() { + if (rules != null) { + boolean flag = false; + for (Rules r : rules) + if ("disallow".equals(r.action())) + return false; + else if ("allow".equals(r.action())) + flag = true; + return flag; + } else + return true; + } - private String formatArch(String nati) { - return nati == null ? "" : nati.replace("${arch}", Platform.getPlatform().getBit()); - } + private String formatArch(String nati) { + return nati == null ? "" : nati.replace("${arch}", Platform.getPlatform().getBit()); + } - private String getNative() { - switch (OS.os()) { - case WINDOWS: - return formatArch(natives.windows); - case OSX: - return formatArch(natives.osx); - default: - return formatArch(natives.linux); - } - } + private String getNative() { + switch (OS.os()) { + case WINDOWS: + return formatArch(natives.windows); + case OSX: + return formatArch(natives.osx); + default: + return formatArch(natives.linux); + } + } - @Override - public boolean isRequiredToUnzip() { - return natives != null && allow(); - } + @Override + public boolean isRequiredToUnzip() { + return natives != null && allow(); + } - public String formatName() { - String[] s = name.split(":"); - if (s.length < 3) { - return null; - } + public String formatName() { + String[] s = name.split(":"); + if (s.length < 3) + return null; + StringBuilder sb = new StringBuilder(s[0].replace('.', '/')).append('/').append(s[1]).append('/').append(s[2]).append('/').append(s[1]).append('-').append(s[2]); + if (natives != null) + sb.append('-').append(getNative()); + return sb.append(".jar").toString(); + } - StringBuilder sb = new StringBuilder(s[0].replace('.', '/')).append('/').append(s[1]).append('/').append(s[2]).append('/').append(s[1]).append('-').append(s[2]); - if (natives != null) { - sb.append('-').append(getNative()); - } + @Override + public File getFilePath(File gameDir) { + LibraryDownloadInfo info = getDownloadInfo(); + if (info == null) + return null; + return new File(gameDir, "libraries/" + info.path); + } - return sb.append(".jar").toString(); - } + @Override + public Extract getDecompressExtractRules() { + return extract == null ? new Extract() : extract; + } - @Override - public File getFilePath(File gameDir) { - LibraryDownloadInfo info = getDownloadInfo(); - if (info == null) { - return null; - } - return new File(gameDir, "libraries/" + info.path); - } - - @Override - public Extract getDecompressExtractRules() { - return extract == null ? new Extract() : extract; - } - - public LibraryDownloadInfo getDownloadInfo() { - if (downloads == null) { - downloads = new LibrariesDownloadInfo(); - } - - LibraryDownloadInfo info = null; - if (natives != null) { - if (downloads.classifiers == null) { - downloads.classifiers = new HashMap<>(); - } - if (!downloads.classifiers.containsKey(getNative())) { - downloads.classifiers.put(getNative(), info = new LibraryDownloadInfo()); - } else { - info = downloads.classifiers.get(getNative()); - } - } else if (downloads.artifact == null) { - downloads.artifact = info = new LibraryDownloadInfo(); - } else { - info = downloads.artifact; - } - - if (StrUtils.isBlank(info.path)) { - info.path = formatName(); - if (info.path == null) { - return null; - } - } - - info.forgeURL = this.url; - return info; - } + public LibraryDownloadInfo getDownloadInfo() { + if (downloads == null) + downloads = new LibrariesDownloadInfo(); + LibraryDownloadInfo info; + if (natives != null) { + if (downloads.classifiers == null) + downloads.classifiers = new HashMap<>(); + if (!downloads.classifiers.containsKey(getNative())) + downloads.classifiers.put(getNative(), info = new LibraryDownloadInfo()); + else + info = downloads.classifiers.get(getNative()); + } else if (downloads.artifact == null) + downloads.artifact = info = new LibraryDownloadInfo(); + else + info = downloads.artifact; + if (StrUtils.isBlank(info.path)) { + info.path = formatName(); + if (info.path == null) + return null; + } + info.forgeURL = this.url; + return info; + } } diff --git a/HMCL/src/main/icon.icns b/HMCL/src/main/icon.icns index dc329d24ba3c08a97dcfe1883bb97ea43bba26f3..17f903023ddf8c7169553c759c00af6b87fe5ca3 100755 GIT binary patch literal 158805 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�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
    MZJ~#!I_ys4`PaAliz) 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

    C;?os{$ZWi#$ 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 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 9cfc71340..a4e8d2689 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java @@ -59,158 +59,144 @@ import org.jackhuang.hellominecraft.util.VersionNumber; */ public final class Main implements Runnable { - private static final X509TrustManager XTM = new X509TrustManager() { - @Override - public void checkClientTrusted(X509Certificate[] chain, String authType) { - } + 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 void checkServerTrusted(X509Certificate[] chain, String authType) { + } - @Override - public X509Certificate[] getAcceptedIssuers() { - return new X509Certificate[0]; - } - }; - private static final HostnameVerifier HNV = (hostname, session) -> true; + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + }; + private static final HostnameVerifier HNV = (hostname, session) -> true; - static { - SSLContext sslContext = null; + 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()); - } + 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); - } + HttpsURLConnection.setDefaultHostnameVerifier(HNV); + } - public static final String LAUNCHER_NAME = "Hello Minecraft! Launcher"; - public static final String LAUNCHER_VERSION = "@HELLO_MINECRAFT_LAUNCHER_VERSION_FOR_GRADLE_REPLACING@"; - public static final int MINIMUM_LAUNCHER_VERSION = 16; + public static final String LAUNCHER_NAME = "Hello Minecraft! Launcher"; + public static final String LAUNCHER_VERSION = "@HELLO_MINECRAFT_LAUNCHER_VERSION_FOR_GRADLE_REPLACING@"; + public static final int MINIMUM_LAUNCHER_VERSION = 16; - public static VersionNumber getVersionNumber() { - return VersionNumber.check(LAUNCHER_VERSION); - } + public static VersionNumber getVersionNumber() { + return VersionNumber.check(LAUNCHER_VERSION); + } - /** - * Make the main window title. - * - * @return the MainWindow title. - */ - public static String makeTitle() { - return LAUNCHER_NAME + ' ' + LAUNCHER_VERSION; - } + /** + * Make the main window title. + * + * @return the MainWindow title. + */ + public static String makeTitle() { + return LAUNCHER_NAME + ' ' + LAUNCHER_VERSION; + } - public static String shortTitle() { - return "HMCL" + ' ' + LAUNCHER_VERSION; - } + public static String shortTitle() { + return "HMCL" + ' ' + LAUNCHER_VERSION; + } - public static final Main INSTANCE = new Main(); - private static HelloMinecraftLookAndFeel LOOK_AND_FEEL; + public static final Main INSTANCE = new Main(); + private static HelloMinecraftLookAndFeel LOOK_AND_FEEL; - private static final Logger LOGGER = Logger.getLogger(Main.class.getName()); + private static final Logger LOGGER = Logger.getLogger(Main.class.getName()); - @SuppressWarnings({"CallToPrintStackTrace", "UseSpecificCatch"}) - public static void main(String[] args) throws IOException { - PluginManager.getPlugin(DefaultPlugin.class); - if (IUpgrader.NOW_UPGRADER.parseArguments(getVersionNumber(), args)) { - return; - } + @SuppressWarnings({ "CallToPrintStackTrace", "UseSpecificCatch" }) + public static void main(String[] args) throws IOException { + { + PluginManager.getPlugin(DefaultPlugin.class); + if (IUpgrader.NOW_UPGRADER.parseArguments(getVersionNumber(), args)) + return; - System.setProperty("awt.useSystemAAFontSettings", "on"); - System.setProperty("swing.aatext", "true"); - System.setProperty("sun.java2d.noddraw", "true"); - System.setProperty("sun.java2d.dpiaware", "false"); - Thread.setDefaultUncaughtExceptionHandler(new CrashReporter(true)); + System.setProperty("awt.useSystemAAFontSettings", "on"); + System.setProperty("swing.aatext", "true"); + System.setProperty("sun.java2d.noddraw", "true"); + System.setProperty("sun.java2d.dpiaware", "false"); + Thread.setDefaultUncaughtExceptionHandler(new CrashReporter(true)); - try { - File file = new File("hmcl.log"); - if (!file.exists() && !file.createNewFile()) { - HMCLog.warn("Failed to create log file " + file); - } - Configuration.DEFAULT.appenders.add(new ConsoleAppender("File", new DefaultLayout(), true, new FileOutputStream(file), true)); - } catch (IOException ex) { - LOGGER.log(Level.SEVERE, "Failed to add log appender File because an error occurred while creating or opening hmcl.log", ex); - } + try { + File file = new File("hmcl.log"); + if (!file.exists() && !file.createNewFile()) + HMCLog.warn("Failed to create log file " + file); + Configuration.DEFAULT.appenders.add(new ConsoleAppender("File", new DefaultLayout(), true, new FileOutputStream(file), true)); + } catch (IOException ex) { + LOGGER.log(Level.SEVERE, "Failed to add log appender File because an error occurred while creating or opening hmcl.log", ex); + } - HMCLog.log("*** " + Main.makeTitle() + " ***"); + HMCLog.log("*** " + Main.makeTitle() + " ***"); - String s = Settings.getInstance().getLocalization(); - for (SupportedLocales sl : SupportedLocales.values()) { - if (sl.name().equals(s)) { - SupportedLocales.NOW_LOCALE = sl; - Locale.setDefault(sl.self); - } - } + String s = Settings.getInstance().getLocalization(); + for (SupportedLocales sl : SupportedLocales.values()) + if (sl.name().equals(s)) { + SupportedLocales.NOW_LOCALE = sl; + Locale.setDefault(sl.self); + } - LogWindow.INSTANCE.clean(); - LogWindow.INSTANCE.setTerminateGame(GameLauncher.PROCESS_MANAGER::stopAllProcesses); + LogWindow.INSTANCE.clean(); + LogWindow.INSTANCE.setTerminateGame(GameLauncher.PROCESS_MANAGER::stopAllProcesses); - try { - LOOK_AND_FEEL = new HelloMinecraftLookAndFeel(Settings.getInstance().getTheme().settings); - UIManager.setLookAndFeel(LOOK_AND_FEEL); - } catch (ParseException | UnsupportedLookAndFeelException ex) { - HMCLog.warn("Failed to set look and feel...", ex); - } + try { + LOOK_AND_FEEL = new HelloMinecraftLookAndFeel(Settings.getInstance().getTheme().settings); + UIManager.setLookAndFeel(LOOK_AND_FEEL); + } catch (ParseException | UnsupportedLookAndFeelException ex) { + HMCLog.warn("Failed to set look and feel...", ex); + } - Settings.UPDATE_CHECKER.outdated.register(IUpgrader.NOW_UPGRADER); - Settings.UPDATE_CHECKER.process(false) - .reg(t -> Main.invokeUpdate()) - .regDone(() -> { Settings.UPDATE_CHECKER.checkOutdate(); }) - .execute(); + Settings.UPDATE_CHECKER.outdated.register(IUpgrader.NOW_UPGRADER); + Settings.UPDATE_CHECKER.process(false).reg(t -> Main.invokeUpdate()).execute(); - if (StrUtils.isNotBlank(Settings.getInstance().getProxyHost()) && StrUtils.isNotBlank(Settings.getInstance().getProxyPort()) && MathUtils.canParseInt(Settings.getInstance().getProxyPort())) { - HMCLog.log("Initializing customized proxy"); - System.setProperty("http.proxyHost", Settings.getInstance().getProxyHost()); - System.setProperty("http.proxyPort", Settings.getInstance().getProxyPort()); - if (StrUtils.isNotBlank(Settings.getInstance().getProxyUserName()) && StrUtils.isNotBlank(Settings.getInstance().getProxyPassword())) { - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(Settings.getInstance().getProxyUserName(), Settings.getInstance().getProxyPassword().toCharArray()); - } - }); - } - } + if (StrUtils.isNotBlank(Settings.getInstance().getProxyHost()) && StrUtils.isNotBlank(Settings.getInstance().getProxyPort()) && MathUtils.canParseInt(Settings.getInstance().getProxyPort())) { + HMCLog.log("Initializing customized proxy"); + System.setProperty("http.proxyHost", Settings.getInstance().getProxyHost()); + System.setProperty("http.proxyPort", Settings.getInstance().getProxyPort()); + if (StrUtils.isNotBlank(Settings.getInstance().getProxyUserName()) && StrUtils.isNotBlank(Settings.getInstance().getProxyPassword())) + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(Settings.getInstance().getProxyUserName(), Settings.getInstance().getProxyPassword().toCharArray()); + } + }); + } - try { - PluginManager.plugin().showUI(); - } catch (Throwable t) { - new CrashReporter(false).uncaughtException(Thread.currentThread(), t); - System.exit(1); - } - } + try { + PluginManager.plugin().showUI(); + } catch (Throwable t) { + new CrashReporter(false).uncaughtException(Thread.currentThread(), t); + System.exit(1); + } + } + } - @Override - public void run() { - GameLauncher.PROCESS_MANAGER.stopAllProcesses(); - } + @Override + public void run() { + GameLauncher.PROCESS_MANAGER.stopAllProcesses(); + } - public static void invokeUpdate() { - if (Settings.UPDATE_CHECKER.isForceUpdate()) - return; - - if (Settings.getInstance().ignoreUpdate( - Settings.UPDATE_CHECKER.getNewVersion() )) { - return; - } - - MainFrame.INSTANCE.invokeUpdate(); - } + public static void invokeUpdate() { + MainFrame.INSTANCE.invokeUpdate(); + } - public static ImageIcon getIcon(String path) { - try { - return new ImageIcon(Main.class.getResource("/org/jackhuang/hellominecraft/launcher/" + path)); - } catch (Exception e) { - HMCLog.err("Failed to load icon", e); - return null; - } - } + public static ImageIcon getIcon(String path) { + try { + return new ImageIcon(Main.class.getResource("/org/jackhuang/hellominecraft/launcher/" + path)); + } catch (Exception e) { + HMCLog.err("Failed to load icon", e); + return null; + } + } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java index 53a215aad..1657642f9 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java @@ -21,17 +21,13 @@ import org.jackhuang.hellominecraft.launcher.core.download.DownloadType; import com.google.gson.annotations.SerializedName; import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.TreeMap; import java.util.UUID; import org.jackhuang.hellominecraft.launcher.core.auth.IAuthenticator; import org.jackhuang.hellominecraft.lookandfeel.Theme; import org.jackhuang.hellominecraft.util.EventHandler; -import org.jackhuang.hellominecraft.util.StrUtils; -import org.jackhuang.hellominecraft.util.VersionNumber; import org.jackhuang.hellominecraft.util.system.JdkVersion; import org.jackhuang.hellominecraft.util.system.OS; @@ -69,52 +65,17 @@ public final class Config implements Cloneable { private String localization; @SerializedName("logintype") private int logintype; - @SerializedName("downloadSourcetype") + @SerializedName("downloadtype") private int downloadtype; @SerializedName("configurations") private TreeMap configurations; @SerializedName("auth") @SuppressWarnings("FieldMayBeFinal") private Map auth; - @SerializedName("ignoreUpdateVersion") - private String ignoreUpdateVersion; - @SerializedName("ignoreRecommend") - private Set ignoreRecommend; - public Set getIgnoreRecommend() { - if (ignoreRecommend == null) { - ignoreRecommend = new HashSet<>(); - Settings.save(); - } - return ignoreRecommend; - } - public List getJava() { return java == null ? java = new ArrayList<>() : java; } - - public boolean ignoreUpdate(VersionNumber versionNumber) { - boolean ignore = false; - do - { - if (StrUtils.isBlank(ignoreUpdateVersion)) - continue; - - VersionNumber ignoreVersion = VersionNumber.check(ignoreUpdateVersion); - if (ignoreVersion == null) - continue; - - if (versionNumber.compareTo(ignoreVersion) == 0) - ignore = true; - - } while(false); - return ignore; - } - - public void setIgnoreUpdate(VersionNumber versionNumber) { - ignoreUpdateVersion = versionNumber.toString(); - Settings.save(); - } public transient final EventHandler themeChangedEvent = new EventHandler<>(this); public transient final EventHandler downloadTypeChangedEvent = new EventHandler<>(this); @@ -232,8 +193,7 @@ public final class Config implements Cloneable { public Config() { clientToken = UUID.randomUUID().toString(); - logintype = 0; - downloadtype = DownloadType.Dynamic.ordinal(); + logintype = downloadtype = 0; enableShadow = false; enableAnimation = true; theme = 4; @@ -243,7 +203,7 @@ public final class Config implements Cloneable { public DownloadType getDownloadSource() { if (downloadtype >= DownloadType.values().length || downloadtype < 0) { - downloadtype = DownloadType.Dynamic.ordinal(); + downloadtype = 0; Settings.save(); } return DownloadType.values()[downloadtype]; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java index e05c5adf3..2dcdbaccf 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java @@ -22,8 +22,6 @@ import java.io.File; import java.io.IOException; import java.util.Collection; import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.launcher.Main; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java index 32e2e2240..26ebaad1b 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java @@ -17,13 +17,9 @@ */ package org.jackhuang.hellominecraft.launcher.ui; -import java.util.Comparator; import java.util.List; -import javax.swing.RowSorter; import javax.swing.SwingUtilities; import javax.swing.table.DefaultTableModel; -import javax.swing.table.TableModel; -import javax.swing.table.TableRowSorter; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.launcher.core.install.InstallerType; @@ -40,45 +36,29 @@ import org.jackhuang.hellominecraft.util.ui.SwingUtils; */ public class InstallerPanel extends AnimatedPanel { - GameSettingsPanel gsp; + GameSettingsPanel gsp; - private static class VerComparator implements Comparator { + /** + * Creates new form InstallerPanel + * + * @param gsp To get the minecraft version + * @param installerType load which installer + */ + public InstallerPanel(GameSettingsPanel gsp, InstallerType installerType) { + initComponents(); - @Override - public int compare(String o1, String o2) { - return InstallerVersionList.compareVersion(o1, o2); - } - }; + setOpaque(false); + this.gsp = gsp; + id = installerType; + list = Settings.getInstance().getDownloadSource().getProvider().getInstallerByType(id); + } - /** - * Creates new form InstallerPanel - * - * @param gsp To get the minecraft version - * @param installerType load which installer - */ - public InstallerPanel(GameSettingsPanel gsp, InstallerType installerType) { - initComponents(); - - //表格排序 - TableRowSorter sorter = new TableRowSorter(lstInstallers.getModel()); - VerComparator verComparator = new VerComparator(); - for (int i = 0; i < lstInstallers.getColumnCount(); i++) { - sorter.setComparator(i, verComparator); - } - lstInstallers.setRowSorter(sorter); - - setOpaque(false); - this.gsp = gsp; - id = installerType; - list = Settings.getInstance().getDownloadSource().getProvider().getInstallerByType(id); - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents private void initComponents() { @@ -129,64 +109,60 @@ public class InstallerPanel extends AnimatedPanel { }// //GEN-END:initComponents private void btnInstallActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnInstallActionPerformed - downloadSelectedRow(); + downloadSelectedRow(); }//GEN-LAST:event_btnInstallActionPerformed private void btnRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRefreshActionPerformed - refreshVersions(); + refreshVersions(); }//GEN-LAST:event_btnRefreshActionPerformed - transient List versions; - transient InstallerVersionList list; - InstallerType id; + transient List versions; + transient InstallerVersionList list; + InstallerType id; - void refreshVersions() { - if (TaskWindow.execute(list.refresh(new String[]{gsp.getMinecraftVersionFormatted()}))) { - loadVersions(); - } - } + void refreshVersions() { + if (TaskWindow.execute(list.refresh(new String[] { gsp.getMinecraftVersionFormatted() }))) + loadVersions(); + } - public synchronized InstallerVersionList.InstallerVersion getVersion(int idx) { - return versions.get(idx); - } + public synchronized InstallerVersionList.InstallerVersion getVersion(int idx) { + return versions.get(idx); + } - synchronized void downloadSelectedRow() { - int idx = lstInstallers.getSelectedRow(); - if (versions == null || idx < 0 || idx >= versions.size()) { - MessageBox.Show(C.i18n("install.not_refreshed")); - return; - } - TaskWindow.execute(Settings.getLastProfile().service().install().download(Settings.getLastProfile().getSelectedVersion(), getVersion(idx), id), - new TaskRunnable(this::refreshVersions)); - } + synchronized void downloadSelectedRow() { + int idx = lstInstallers.getSelectedRow(); + if (versions == null || idx < 0 || idx >= versions.size()) { + MessageBox.Show(C.i18n("install.not_refreshed")); + return; + } + TaskWindow.execute(Settings.getLastProfile().service().install().download(Settings.getLastProfile().getSelectedVersion(), getVersion(idx), id), + new TaskRunnable(this::refreshVersions)); + } - public void loadVersions() { - SwingUtilities.invokeLater(() -> { - synchronized (InstallerPanel.this) { - DefaultTableModel model = (DefaultTableModel) lstInstallers.getModel(); - String mcver = StrUtils.formatVersion(gsp.getMinecraftVersionFormatted()); - versions = list.getVersions(mcver); - SwingUtils.clearDefaultTable(lstInstallers); - if (versions != null) { - for (InstallerVersionList.InstallerVersion v : versions) { - if (v != null) { - model.addRow(new Object[]{v.selfVersion == null ? "null" : v.selfVersion, v.mcVersion == null ? "null" : v.mcVersion}); - } - } - } - } - }); - } + public void loadVersions() { + SwingUtilities.invokeLater(() -> { + synchronized (InstallerPanel.this) { + DefaultTableModel model = (DefaultTableModel) lstInstallers.getModel(); + String mcver = StrUtils.formatVersion(gsp.getMinecraftVersionFormatted()); + versions = list.getVersions(mcver); + SwingUtils.clearDefaultTable(lstInstallers); + if (versions != null) + for (InstallerVersionList.InstallerVersion v : versions) + if (v != null) + model.addRow(new Object[] { v.selfVersion == null ? "null" : v.selfVersion, v.mcVersion == null ? "null" : v.mcVersion }); + } + }); + } - boolean refreshed = false; + boolean refreshed = false; - @Override - public void onSelect() { - if (!refreshed) { - refreshVersions(); - refreshed = true; - } - } + @Override + public void onSelect() { + if (!refreshed) { + refreshVersions(); + refreshed = true; + } + } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnInstall; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form index a25ac8a11..9eabf0b12 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form @@ -27,7 +27,7 @@ - + @@ -127,11 +127,11 @@ - + - + @@ -157,9 +157,12 @@ - + + + + @@ -345,15 +348,13 @@ - + - - - + - + diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java index 63f59fb4a..29203424f 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java @@ -116,7 +116,7 @@ public class LauncherSettingsPanel extends AnimatedPanel { cboLang = new javax.swing.JComboBox(); lblLang = new javax.swing.JLabel(); lblRestart = new javax.swing.JLabel(); - btnHomepage = new javax.swing.JButton(); + btnMCBBS = new javax.swing.JButton(); cboDownloadSource.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { @@ -125,7 +125,12 @@ public class LauncherSettingsPanel extends AnimatedPanel { }); lblAbout.setText(C.i18n("launcher.about")); // NOI18N - lblAbout.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); + lblAbout.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + lblAbout.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + lblAboutMouseClicked(evt); + } + }); btnSelBackgroundPath.setText(C.i18n("ui.button.explore")); // NOI18N btnSelBackgroundPath.addActionListener(new java.awt.event.ActionListener() { @@ -236,11 +241,11 @@ public class LauncherSettingsPanel extends AnimatedPanel { lblRestart.setText(C.i18n("launcher.restart")); // NOI18N - btnHomepage.setText(C.i18n("launcher.homepage")); // NOI18N - btnHomepage.setToolTipText(""); - btnHomepage.addActionListener(new java.awt.event.ActionListener() { + btnMCBBS.setText("MCBBS"); + btnMCBBS.setToolTipText(""); + btnMCBBS.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - btnHomepageActionPerformed(evt); + btnMCBBSActionPerformed(evt); } }); @@ -258,7 +263,7 @@ public class LauncherSettingsPanel extends AnimatedPanel { .addGroup(layout.createSequentialGroup() .addComponent(btnCheckUpdate) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(btnHomepage) + .addComponent(btnMCBBS) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(chkDecorated)) .addGroup(layout.createSequentialGroup() @@ -341,10 +346,10 @@ public class LauncherSettingsPanel extends AnimatedPanel { .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnCheckUpdate, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(chkDecorated) - .addComponent(btnHomepage)) + .addComponent(btnMCBBS)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lblRestart) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 116, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 65, Short.MAX_VALUE) .addComponent(lblModpack, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lblAbout, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) @@ -384,9 +389,8 @@ public class LauncherSettingsPanel extends AnimatedPanel { }//GEN-LAST:event_txtBackgroundPathFocusLost private void btnCheckUpdateActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCheckUpdateActionPerformed - Settings.UPDATE_CHECKER.process(true) - .regDone(() -> { Settings.UPDATE_CHECKER.checkOutdate(); }) - .execute(); + Settings.UPDATE_CHECKER.process(true); + Settings.UPDATE_CHECKER.checkOutdate(); }//GEN-LAST:event_btnCheckUpdateActionPerformed private void cboThemeItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboThemeItemStateChanged @@ -394,7 +398,7 @@ public class LauncherSettingsPanel extends AnimatedPanel { }//GEN-LAST:event_cboThemeItemStateChanged private void lblModpackMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblModpackMouseClicked - SwingUtils.openLink("http://client.api.mcgogogo.com:81/link.php?type=modpack"); + SwingUtils.openLink("http://huangyuhui.duapp.com/link.php?type=modpack"); }//GEN-LAST:event_lblModpackMouseClicked private void cboLangItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboLangItemStateChanged @@ -429,13 +433,17 @@ public class LauncherSettingsPanel extends AnimatedPanel { Settings.getInstance().setProxyPassword(txtProxyPassword.getText()); }//GEN-LAST:event_txtProxyPasswordFocusLost - private void btnHomepageActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnHomepageActionPerformed + private void lblAboutMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblAboutMouseClicked + SwingUtils.openLink("http://huangyuhui.duapp.com/link.php?type=sponsor"); + }//GEN-LAST:event_lblAboutMouseClicked + + private void btnMCBBSActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnMCBBSActionPerformed SwingUtils.openLink(C.URL_PUBLISH); - }//GEN-LAST:event_btnHomepageActionPerformed + }//GEN-LAST:event_btnMCBBSActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnCheckUpdate; - private javax.swing.JButton btnHomepage; + private javax.swing.JButton btnMCBBS; private javax.swing.JButton btnSelBackgroundPath; private javax.swing.JComboBox cboDownloadSource; private javax.swing.JComboBox cboLang; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java index 641f4eb59..8457cba22 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java @@ -48,7 +48,6 @@ import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.launcher.Main; import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.launcher.core.auth.IAuthenticator; -import org.jackhuang.hellominecraft.launcher.core.download.DynamicDownloadProvider; import org.jackhuang.hellominecraft.util.ui.GraphicsUtils; import org.jackhuang.hellominecraft.lookandfeel.Theme; import org.jackhuang.hellominecraft.util.MessageBox; @@ -86,27 +85,23 @@ public final class MainFrame extends DraggableFrame { setUndecorated(!Settings.getInstance().isDecorated()); defaultTitle = isUndecorated() ? Main.makeTitle() : ""; enableShadow = Settings.getInstance().isEnableShadow() && isUndecorated(); - if (enableShadow) { - setContentSize(834, 542); - } else { + if (enableShadow) + setContentSize(834, 542); + else setContentSize(802, 511); - } - - setDefaultCloseOperation(EXIT_ON_CLOSE); + setDefaultCloseOperation(3); setTitle(Main.makeTitle()); initComponents(); loadBackground(); - - DynamicDownloadProvider.getInstance().init(); setLocationRelativeTo(null); - if (MainFrame.this.isUndecorated()) { + if (MainFrame.this.isUndecorated()) setResizable(false); - } this.addWindowListener(new WindowListener() { @Override - public void windowOpened(WindowEvent e) { } + public void windowOpened(WindowEvent e) { + } @Override public void windowClosing(WindowEvent e) { @@ -114,13 +109,16 @@ public final class MainFrame extends DraggableFrame { } @Override - public void windowClosed(WindowEvent e) { } + public void windowClosed(WindowEvent e) { + } @Override - public void windowIconified(WindowEvent e) { } + public void windowIconified(WindowEvent e) { + } @Override - public void windowDeiconified(WindowEvent e) { } + public void windowDeiconified(WindowEvent e) { + } @Override public void windowActivated(WindowEvent e) { @@ -133,10 +131,11 @@ public final class MainFrame extends DraggableFrame { } @Override - public void windowDeactivated(WindowEvent e) { } + public void windowDeactivated(WindowEvent e) { + } }); - if (enableShadow) { + if (enableShadow) try { setBackground(new Color(0, 0, 0, 0)); getRootPane().setBorder(border = new DropShadowBorder(borderColor, 4)); @@ -145,8 +144,6 @@ public final class MainFrame extends DraggableFrame { Settings.getInstance().setEnableShadow(false); setSize(802, 511); } - } - ((JPanel) getContentPane()).setOpaque(true); Settings.getInstance().themeChangedEvent.register(this::reloadColor); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form index 7e56b8a94..4a7db3ca7 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form @@ -277,16 +277,5 @@ - - - - - - - - - - - diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java index 91f6ba280..c621b7ba7 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java @@ -61,7 +61,7 @@ public class MainPagePanel extends AnimatedPanel { void initGui() { initComponents(); - + pnlButtons = new javax.swing.JPanel(); pnlButtons.setLayout(null); @@ -84,9 +84,6 @@ public class MainPagePanel extends AnimatedPanel { pnlMore.setBounds(0, 0, pnlMore.getWidth(), DEFAULT_HEIGHT); pnlMore.setBackground(GraphicsUtils.getWebColorWithAlpha("FFFFFF7F")); pnlMore.setOpaque(true); - - recommendPanel = new RecommendPanel(); - contentPanel.add(recommendPanel); Settings.getInstance().authChangedEvent.register(onAuthChanged); Settings.profileLoadingEvent.register(onLoadingProfiles); @@ -125,7 +122,6 @@ public class MainPagePanel extends AnimatedPanel { btnLogout = new javax.swing.JButton(); btnImportModpack = new javax.swing.JButton(); btnExportModpack = new javax.swing.JButton(); - contentPanel = new javax.swing.JPanel(); setLayout(null); @@ -266,7 +262,7 @@ public class MainPagePanel extends AnimatedPanel { .addComponent(lblVersion, javax.swing.GroupLayout.Alignment.TRAILING)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(pnlMoreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(cboProfiles, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(cboProfiles, 0, 128, Short.MAX_VALUE) .addComponent(cboVersions, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addGroup(pnlMoreLayout.createSequentialGroup() .addGroup(pnlMoreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -310,10 +306,6 @@ public class MainPagePanel extends AnimatedPanel { add(pnlMore); pnlMore.setBounds(0, 0, 190, 480); - - contentPanel.setLayout(null); - add(contentPanel); - contentPanel.setBounds(220, 40, 540, 320); }// //GEN-END:initComponents private void txtPlayerNameFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPlayerNameFocusGained @@ -434,8 +426,6 @@ public class MainPagePanel extends AnimatedPanel { super.onCreate(); Settings.onProfileLoading(); } - - private RecommendPanel recommendPanel; // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnExportModpack; @@ -444,7 +434,6 @@ public class MainPagePanel extends AnimatedPanel { private javax.swing.JComboBox cboLoginMode; private javax.swing.JComboBox cboProfiles; private javax.swing.JComboBox cboVersions; - private javax.swing.JPanel contentPanel; private javax.swing.JLabel jLabel10; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel9; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java deleted file mode 100644 index 1b8861000..000000000 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Copyright (C) 2016 evilwk - * - * 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 . - */ -package org.jackhuang.hellominecraft.launcher.ui; - -import java.awt.Graphics; -import java.awt.Image; -import java.io.File; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutionException; -import javax.imageio.ImageIO; -import javax.swing.JPanel; -import javax.swing.SwingWorker; - -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import java.awt.Cursor; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.SwingUtilities; -import org.jackhuang.hellominecraft.launcher.Main; -import org.jackhuang.hellominecraft.launcher.setting.Settings; -import org.jackhuang.hellominecraft.util.NetUtils; -import org.jackhuang.hellominecraft.util.StrUtils; -import org.jackhuang.hellominecraft.util.ui.SwingUtils; - -/** - * - * @author evilwk - */ -public class RecommendPanel extends JPanel { - - private static final int SWITCH_INTERVAL = 10; - - private static final int SPACE = 10; - private static final int TOP_POSITION = 2; - - private JButton closeButton; - - private Image currImage; - private String imageKey = null; - private boolean ignoreSwitch = false; - private List recommends; - - public final ScheduledExecutorService scheduledexec = Executors.newScheduledThreadPool(1); - - public RecommendPanel() { - initComponents(); - - recommends = new ArrayList(); - new LoadImages().execute(); - setCursor(new Cursor(Cursor.HAND_CURSOR)); - - addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - MouseClicked(e); - } - }); - } - - private void initComponents() { - this.setLayout(null); - - closeButton = new JButton(Main.getIcon("re_close.png")); - closeButton.setRolloverIcon(Main.getIcon("re_close_enter.png")); - closeButton.setBorder(BorderFactory.createEmptyBorder()); - closeButton.setContentAreaFilled(false); - closeButton.addActionListener((e) -> ignoreTheRecommend(imageKey)); - closeButton.setCursor(new Cursor(Cursor.HAND_CURSOR)); - closeButton.setFocusable(false); - closeButton.setBounds(0, 0, 12, 12); - closeButton.setVisible(false); - this.add(closeButton); - } - - private void ignoreTheRecommend(String url) { - synchronized(RecommendPanel.class) { - if (StrUtils.isNotBlank(url)) { - Settings.getInstance().getIgnoreRecommend().add(url); - Settings.save(); - - ignoreSwitch = true; - showNext(); - } - } - } - - private void MouseClicked(MouseEvent evt) { - if (imageKey == null) { - return; - } - RecommendInfo info = recommends.get(getCurrentImageIndex()); - if (StrUtils.isNotBlank(info.link)) { - if (info.once) { - ignoreTheRecommend(info.url); - } - SwingUtils.openLink(info.link); - } - } - - public void showImages() { - if (recommends.isEmpty()) { - return; - } - - new Thread(new Runnable() { - @Override - public void run() { - for (RecommendInfo info : recommends) { - if (!ignoreShowUrl(info.url)) { - try { - File tempFile = File.createTempFile("hmcl", "png"); - String tempPath = tempFile.getCanonicalPath(); - if (NetUtils.download(info.url, tempPath)) { - info.image = ImageIO.read(tempFile); - } - } catch (Throwable t) { } - } - } - - if (getImagesSize() == 0 || showIfOnly()) { - return; - } - scheduledexec.scheduleAtFixedRate(new Runnable() { - @Override - public void run() { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - synchronized(RecommendPanel.class) { - if (ignoreSwitch) { - ignoreSwitch = false; - } else { - showNext(); - } - } - } - }); - } - }, 0, SWITCH_INTERVAL, TimeUnit.SECONDS); - } - }).start(); - } - - public int getImagesSize() { - int imageCount = 0; - for (RecommendInfo recommend : recommends) { - if (recommend.image != null) { - imageCount++; - } - } - return imageCount; - } - - public boolean showIfOnly() { - if (getImagesSize() != 1) { - return false; - } - for (RecommendInfo recommend : recommends) { - if (recommend.image != null) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - RecommendPanel.this.setImage(recommend.url, recommend.image); - } - }); - } - } - return true; - } - - private void showNext() { - if (getCanShowImageCount() == 0) { - setVisible(false); - scheduledexec.shutdown(); - } else { - int showIndex = getNextImageIndex(); - RecommendInfo info = recommends.get(showIndex); - setImage(info.url, info.image); - } - } - - private boolean ignoreShowUrl(String url) { - if (StrUtils.isBlank(url)) { - return true; - } - return Settings.getInstance().getIgnoreRecommend().contains(url); - } - - public int getCanShowImageCount() { - int imageCount = 0; - for (RecommendInfo recommend : recommends) { - if (recommend.image != null && !ignoreShowUrl(recommend.url)) { - imageCount++; - } - } - return imageCount; - } - - public int getNextImageIndex(int showIndex) { - if (showIndex >= recommends.size()) { - showIndex = 0; - } - RecommendInfo info = recommends.get(showIndex); - if (info.image == null || ignoreShowUrl(info.url)) { - showIndex = getNextImageIndex(++showIndex); - } - return showIndex; - } - - public int getNextImageIndex() { - int showIndex = getCurrentImageIndex(); - if (++showIndex >= recommends.size()) { - showIndex = 0; - } - showIndex = getNextImageIndex(showIndex); - return showIndex >= recommends.size() ? 0 : showIndex; - } - - public int getCurrentImageIndex() { - int currIndex = 0; - for (int i = 0; i < recommends.size(); i++) { - RecommendInfo info = recommends.get(i); - if (StrUtils.isNotBlank(imageKey) && info.url.equals(imageKey)) { - currIndex = i; - break; - } - } - return currIndex; - } - - public void setImage(String key, Image image) { - this.imageKey = key; - this.currImage = image; - - int btnWidth = closeButton.getWidth(); - - setSize(image.getWidth(this) + SPACE + btnWidth, image.getHeight(this)); - closeButton.setLocation(getWidth() - btnWidth, TOP_POSITION); - closeButton.setVisible(true); - - SwingUtilities.updateComponentTreeUI(this.getRootPane()); - } - - @Override - public void paintComponent(Graphics g) { - if (currImage != null) { - g.drawImage(currImage, 0, 0, currImage.getWidth(this), currImage.getHeight(this), this); - } - super.paintComponent(g); - } - - static class RecommendInfo { - String url; - String link; - boolean once; - Image image; - } - - class LoadImages extends SwingWorker>, Void> { - - private static final String RECOMMEND_URL = "http://client.api.mcgogogo.com:81/recommend.php"; - - @Override - protected List> doInBackground() throws Exception { - List> infos = null; - do { - String content = NetUtils.get(RECOMMEND_URL); - if (content == null || content.equals("")) { - break; - } - - Map data = new Gson().fromJson(content, - new TypeToken>() {}.getType()); - if (data == null) { - break; - } - - infos = (List>) data.get("data"); - } while (false); - return infos; - } - - @Override - protected void done() { - try { - List> infos = this.get(); - if (infos == null) { - return; - } - for (Map info : infos) { - RecommendInfo recommend = new RecommendInfo(); - if (info.get("url") != null) { - recommend.url = (String) info.get("url"); - } else { - recommend.url = ""; - } - if (info.get("link") != null) { - recommend.link = (String) info.get("link"); - } else { - recommend.link = ""; - } - if (info.get("once") != null) { - recommend.once = (boolean) info.get("once"); - } else { - recommend.once = false; - } - recommend.image = null; - recommends.add(recommend); - } - RecommendPanel.this.showImages(); - } catch (InterruptedException | ExecutionException ex) { - } - } - } - -} diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java index 12125d007..ba507757d 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java @@ -138,9 +138,9 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { HashMap map = new HashMap<>(); map.put("CrashReport", text); try { - NetUtils.post(NetUtils.constantURL("http://client.api.mcgogogo.com:81/crash_report.php"), map); - } catch (Throwable error) { - LOGGER.log(Level.SEVERE, "Failed to post HMCL server.", error); + NetUtils.post(NetUtils.constantURL("http://huangyuhui.duapp.com/crash.php"), map); + } catch (IOException ex) { + LOGGER.log(Level.SEVERE, "Failed to post HMCL server.", ex); } }); t.setDaemon(true); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java index 6f34819db..784f64a34 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java @@ -17,7 +17,6 @@ */ package org.jackhuang.hellominecraft.launcher.util.upgrade; -import java.awt.Dimension; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -37,30 +36,20 @@ import java.util.jar.JarFile; import java.util.jar.JarOutputStream; import java.util.jar.Pack200; import java.util.zip.GZIPInputStream; -import javax.swing.BorderFactory; -import javax.swing.BoxLayout; -import javax.swing.JCheckBox; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextPane; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.launcher.core.MCUtils; -import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.util.tasks.Task; +import org.jackhuang.hellominecraft.util.tasks.TaskWindow; import org.jackhuang.hellominecraft.util.tasks.download.FileDownloadTask; import org.jackhuang.hellominecraft.util.ArrayUtils; import org.jackhuang.hellominecraft.util.MessageBox; -import org.jackhuang.hellominecraft.util.StrUtils; import org.jackhuang.hellominecraft.util.UpdateChecker; import org.jackhuang.hellominecraft.util.Utils; import org.jackhuang.hellominecraft.util.VersionNumber; -import org.jackhuang.hellominecraft.util.func.Consumer; import org.jackhuang.hellominecraft.util.system.FileUtils; import org.jackhuang.hellominecraft.util.system.IOUtils; import org.jackhuang.hellominecraft.util.system.OS; -import org.jackhuang.hellominecraft.util.tasks.TaskList; -import org.jackhuang.hellominecraft.util.tasks.TaskWindow; /** * @@ -108,97 +97,43 @@ public class AppDataUpgrader extends IUpgrader { } return false; } - - public boolean askUpdateVersion(VersionNumber versionNumber) { - if (!Settings.UPDATE_CHECKER.isManualUpdate() && - Settings.getInstance().ignoreUpdate(versionNumber)) - return false; - - String content = C.i18n("update.newest_version") + - versionNumber.firstVer + "." + versionNumber.secondVer + "." + - versionNumber.thirdVer + "\n" + - C.i18n("update.should_open_link"); - - JCheckBox checkbox = new JCheckBox(C.i18n("update.ignore")); - - JPanel logPanel = new JPanel(); - logPanel.setLayout(new BoxLayout(logPanel, BoxLayout.X_AXIS)); - logPanel.setPreferredSize(new Dimension(300,150)); - logPanel.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 5)); - - JScrollPane scrollPane = new JScrollPane(); - JTextPane textPane = new JTextPane(); - textPane.setContentType("text/plain"); - textPane.setEditable(false); - scrollPane.setViewportView(textPane); - logPanel.add(scrollPane); - - int msgRet; - String updateLog = Settings.UPDATE_CHECKER.getUpdateLog(); - if (StrUtils.isBlank(updateLog)) { - msgRet = MessageBox.Show(new Object[]{content, checkbox}, MessageBox.YES_NO_OPTION); - } else { - textPane.setText(updateLog); - msgRet = MessageBox.Show(new Object[]{content, logPanel, checkbox}, MessageBox.YES_NO_OPTION); - } - - if (msgRet == MessageBox.NO_OPTION) { - if (checkbox.isSelected()) { - Settings.getInstance().setIgnoreUpdate(versionNumber); - } - return false; - } - - return true; - } - @Override public boolean call(Object sender, final VersionNumber number) { - ((UpdateChecker) sender).requestDownloadLink().reg(new Consumer>() { - @Override - public void accept(Map map) { - boolean isForceUpdate = Settings.UPDATE_CHECKER.isForceUpdate(); - if (isForceUpdate || askUpdateVersion(number)) - if (map != null && map.containsKey("pack")) - try { - String hash = null; - if (map.containsKey("packsha1")) { - hash = map.get("packsha1"); - } - AppDataUpgraderTask upgraderTask = new AppDataUpgraderTask(map.get("pack"), number.version, hash); - if (isForceUpdate) { - TaskList tasks = new TaskList(); - tasks.addTask(upgraderTask); - tasks.start(); - } else { - if (TaskWindow.factory().append(upgraderTask).create()) { - 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); - } - else { - 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(); + ((UpdateChecker) sender).requestDownloadLink().reg(map -> { + 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) + if (map != null && map.containsKey("pack")) + try { + String hash = null; + if (map.containsKey("packsha1")) + hash = map.get("packsha1"); + if (TaskWindow.factory().append(new AppDataUpgraderTask(map.get("pack"), number.version, hash)).create()) { + 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); + } + else { + 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(); return true; } diff --git a/HMCL/src/main/resources/org/jackhuang/hellominecraft/launcher/icon.png b/HMCL/src/main/resources/org/jackhuang/hellominecraft/launcher/icon.png index 25f3cf6c80eeddc17c9e24683ac340ea142427a7..1cbfd01d295f6d77133001491fdfefb8aa2672b7 100755 GIT binary patch literal 28154 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

  • dnmJZA8q#&MkaaMdygpVo`6Ey@$@a)&eRoPKm3# zE8LXv7}#ft2yKOxtntEJ)sjQbJUeESfzOeCbo^wk)X3V~t=WQ-2hd?N*&fCg^d~Yi z675F2GSbb-k|&#cq-oD?OLt$;_qpnRXU#I<+|a%BmC}BN?q>yG7Vw7CoRI$a5fI0r zqcYwco!LIBkKcE_Cr_NXZQq1FdDv{Bj`@Oo?`44Hh$L)p>vvMZj{#QW z(7|pTwJ{R8d+j97j=kyUeXGafD62vroTtPuGBYx03GLhSTx2qD+{gr8<(zpM8HCl7 z-(^RpW@uMjLhx(%ohB;G7lQHEX>LOG-Ro)P+#NeuEcTuz%Wa+#D9JZ-;DI48^fqY@hLR#Uz%%?uj{TjyqJ#a zseLN?#^7Cky?8c4&392;%<;-+;>Q4+3UnrNfCQxkEi~ZC9#BGz4F^gPL#ju!wW|yx z_Rqgg&yQtJq zlr&T=8fXOfbfAq4nLeR$0hH9eJ2Y@Ft7hoUz>sHJUF0R1uPp7J-?k01SlC~fqc}=h z#eX>!lm#sYO<&IzPg!Xr*0YoDY(X2rJua!;fH$=@MHa^+Z|(4i3vPaSg^&RZ)gzx$H4Xa1kO>$R$BiR+I8tKcX zkC(}f-w{r;-a}_2$eUb&0*gx5^yP+64Ie=`72bs{Ux zbzvyeBh=iW3`<8Fmc68u`G__uqFOeW9Gb*&R9B&4#%@1mpy=0{{p;Y~f4Z-q1-rj` zBcZ1`c-if)AAEeT3-U~tc%udhvup77ws*FerMVaGr(XTo;fs*OqsA483Qw)pjaFgl zcX$}LgDq7*nTIOKxH9~Gseq6oiw~+bd|hE2WMOoz>+C5b6f;I|U39rXT0BJN`1IRY z^X!rATgBL+;c`r92fj`B9?Q3>On1!F0Q0O~ql|`@xrr9UYPJ^P5B%g z>UhvxM?T}>_Fo$p7+V z*2V8HwUMhmZ1R$R<-qS6XN`e4bDckPGD6M zee4#cL(|0fLY5N8UcP7IZDXt#lyOlH0#qUkgR+R?Rb2(wIY*RF(CD*$mOKJ;j~B6{ z3@LcqyG(2EeIGb7Wr$2G`lNQsn%GMG<74NeQ|nLLu2tufrgG&v`VMxyBc$jKpXvLX zR)@o19SGCo0>lMVQqOP`uLf+{tcP+Ob`;8V z?ws|@3ekw0MO-h^;J~rlsXh8+- z5%9LGH^i!{CJjw64e}%>1UFmEh>|X7hn*_8MXqyfX1T&|G`5D_!G-8w2B5+DNSsXl zItxrimVT6%1nu;+ezD3b0v*(=Gu~2jrfyk-<6u>o*fY%>#>4HnNeM?hUiU#vm^i!k z`NPFCs_BdUEmO zb21ljRLb82@pUUr=EoWIPdH4L9S(8S23StS+qUC}WxRR&580uOQQXK~=8JY`PM#%E zRx=$ZGB{g_wOcco?V)kU*w+OJc)f4G3kt&MxBESi*rV0Nxk#HM4d^4Wwvy#J7Y)mc z0T{K{9y#t@xOruD&CHu^=$Ip|G60mZ=X`hj<>{?pE4|AAmQ1;;h0C9w3%cuDnr9Bw#K_C4n~tDwIJr%Z}LIS?pU7` z>+*(g7Rk)oh1Q`B@;X->?2Oq`>t^aFZUnXUE{2z{suP)%aKbQ0S>mm8sJ`>*iInIuii zs4U{cl)p#iucMr+3T7j@_FKK3`2vEt!mwMDr@5;F=Y_5{93;-Fshb4Kz@s#8_Zzka z$%wlQDPSRLS(Xx56Y1MQ=G!=%B8NPUa@Xo`MY{w!uPiSq&TyMbiwwX$OSiodo@^4p zOYZuDMht3_WD0L;SS~PlXU)LzT?{vk_+%4|7B19DmN5@aQUy~F$vGAas%M&4_MV{I z{01E?1CoEH8=GYs$>R+_NrlpA@Yw?(6UFrj-78ab#FHnv*Wj0wAQYwJ^AAi!c=?_E2#rZOv#-+*=WZuPo(|U;Z?pJtfO%yW;c7{Pi&uS%aG6JB!K<2k@KG3-XJor}luxC`gX&$lcrB&O zt>vml=uh_Re3jdnKNas&*}FP)vEl2N=br9o=FEFQNAfM5xvXWsh~Dt^;^5^|PUY#DJU{$qs8IZ;7jRx7bDu60IH4*m(p$ z#rYZBYI?VWtq5EIh_ss}9(|uVZ`YC+6qB>G`%<;^~!*% zBcv#`wblqP6R2DY?HQv5Z`7M&M$AIJcR*YGK@ksm6diEGxk#5cHXotEq{~%SvrsT- zqs+HRG!Hp+NGu<9zi_e1(!op^I|9PZ z)^t1!gF7aaG&5%T%*3E$?7^-BVfn8b`a%-apR7Mht$~J;I-wie%BPQI#~v3)WJ0Nq zP-@tB!2dbP9ZvQNj@(y`UddD5O4 zF_Opj-0ZG-2x#0YE2_z5RV`}`BIf8=cS@Dvt_Z&XB-}v&U zsU|yQo0X&uB|@ww;wPC-GL(4L@wh!!5CIFl)H;4pFD$}{`K59-F{doB_0y|pw| zacnp^8*;~*05`=H?0f|2 zjo4}~M+ZSwnpR?48i>{Q!;o28_(wpEeSRfB&HD0Zg6WR57W@=|fYTTI4S%(T@=sIi zzf+E)r~c)B+t>NoPT%}jtiLGtr~4u>ssCP2k7@E>koY=3c+CQ*|4ss)a^PgEKYX#v zM4A5ei*l~?&+x}x#AiQ+uxXH1><6JHU!uVnSVCQOtoR{0S*QNVj|RaX77@XsB&H55 zg)|<~Dq%@eyTN(%(^S4gd^y^LW zn6B6t?f#3Ve9`VdA@Oy7W{Am!FiXlb+b{a#i+W5Gv7Ns8>-0RPul-B8e>wfXm-~Ma z;Xm5_^(s?NZb{RQ0k<|n2I-)jMpL8N5-#044TMn}1K-)C-!TKYTf3{Qnc9 Z5;|-;2h(UC8LemZo#%nw6+1&S{sTA*fqDP{ literal 5362 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 Qng9R*07*qoM6N<$f=Q}6H2?qr diff --git a/HMCL/src/main/resources/org/jackhuang/hellominecraft/launcher/re_close.png b/HMCL/src/main/resources/org/jackhuang/hellominecraft/launcher/re_close.png deleted file mode 100644 index c006673dcc2267c7a5ff3bf29d99688638ab616a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1182 zcmbVMU2M}<6gH~px@v$XApz5*U5xmtw8VB|JF%Cn*l|oVNU73jWExWE+PAG~?CaS# z#I4x)lLj4{ShWY>X%FzQY0`w$$D(x-LKBnLzU-G5wlWEA6c`LN73jL_w(0gz@i5Ew z{qgy}@0@eb@km$at~ISMv{DqcrqH34$oO3Jv^10V>$Uwi$*>9ME4Ul=;kw~NO0iHc z1O>iaE%$fsTT+p&K`4YEmOBR%*#PeE?7n8ZX$Z@Kc;`3=e znM+G4A(zq{94lcZB`<2M!itiT;<&sh30hv)m6W2Xd`jo|2Dab^*ln|a@``>vCnobR1eys<5`SWgT8$bTDp%Mu#jKbUO}Hv zE3BI2bwv=RDDJe7PUHnuWmPF9Nvc9GVXgm@Gln?BM8)x+VrguV3XG=9rB4>i%>!N1 zF+ORH^~sT2q^%|knoubBc>gee7rRM3eF>a2U sJ$mlky{~REhkxFDrQ^@D%`Gf-z7V#i~bmee5dxg`qr_30QN%Te*v-}*t*zE%U2}yljx$G{Z03wJXWLmL zrFsY<=mwEc>Qg-gLD5q;DZ9TFQel=*kkLa@LRpb^MqTTnZJ3#J;rqV-KmY%o&Z^2y zu0@55D2j4LH;ZvHE_S~BJo4X>+Brgo<+wbFt5G9POD3ek3Tl8Ls!2^S4kabi`WOZ& zY96g7k~kULCdf$hNDjthYX)IcRIt=GB)J7*&;XlMJw%V*=%azEgy`Bp%o{Tzuvy*Q zX2R;W%7on3BJ&Dex&Z`jfe2_2OTgCl>6T!J=qX)+%$;q922&8+5~8P*O2(={1ep*7 zJbt(AWm&*+9=15ZaqK$a^Rhn1OJ2^+77GDR@Rfj>hbGZXrBR5B6*IBODnvJ9YzPdK zPNzL-zXzF349oMpqv7+p3BqkhZahiGHG1nDkqd7L`*1Q zWF`>Wm#tz|Gs4JfMh1vfb6`!asw*gMt)0ThVnS56u%yc{Du!sH;89gY@QdN%3O~nk zd>N^FImdGxzrMuJM~e9}F1+5C<%&p7X;8;muJVWL%gJ@Dpcy2x2u*cAR4PoQfvF=4 zYR+5&6*={0xJvF^yg9iHNrrJ6`&Xm0Tf{xibk??HF>8FN6Steh)*n|KI7zO=)2J9u z*n*~7dI+v_I@e{7j)Ku=aTgS&<3>SslsqYIeBd$t zx%2wx_rlA}kGBt!0mHgtzP>#<@$A;ap6(;#rR@{HTwnS}`zAZa#;&&B8DO6UFU*;{ Ym|7Uzdau7XKi|3V(eg_1a#{W1-%==kv;Y7A diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/C.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/C.java index aacc9df08..2c8f5a111 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/C.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/C.java @@ -29,10 +29,10 @@ public final class C { public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - public static final String URL_PUBLISH = "http://www.hmclsoft.com"; - public static final String URL_GITHUB = "https://github.com/mclauncher/HMCL/issues"; - + //http://repo1.maven.org/maven2 + public static final String URL_PUBLISH = "http://www.mcbbs.net/thread-142335-1-1.html"; public static final String URL_TIEBA = "http://tieba.baidu.com/f?kw=hellominecraftlauncher"; + public static final String URL_GITHUB = "https://github.com/huanghongxun/HMCL/issues"; public static final String URL_MINECRAFTFORUM = "http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-tools/1265720-hello-minecraft-launcher-1-9-3-mc-1-7-4-auto"; public static final String FILE_MINECRAFT_VERSIONS = "versions"; diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/IUpdateChecker.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/IUpdateChecker.java index 7ae79d962..9a589ca0d 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/IUpdateChecker.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/IUpdateChecker.java @@ -26,27 +26,9 @@ import java.util.Map; public interface IUpdateChecker { /** - * Update response + * */ void checkOutdate(); - - /** - * - * @return Update log - */ - String getUpdateLog(); - - /** - * - * @return Server to assign a mandatory update - */ - boolean isForceUpdate(); - - /** - * - * @return User manual update - */ - boolean isManualUpdate(); /** * Get the cached newest version number, use "process" method to diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MessageBox.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MessageBox.java index b14159f99..d3fd908f6 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MessageBox.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MessageBox.java @@ -86,23 +86,23 @@ public class MessageBox { /** * Show MsgBox with title and options * - * @param msg The Message - * @param title The title of MsgBox. - * @param optionType The type of MsgBox. + * @param Msg The Message + * @param Title The title of MsgBox. + * @param Option The type of MsgBox. * * @return user operation. */ - public static int Show(Object msg, String title, int optionType) { - switch (optionType) { + public static int Show(String Msg, String Title, int Option) { + switch (Option) { case YES_NO_OPTION: case YES_NO_CANCEL_OPTION: case OK_CANCEL_OPTION: - return SwingUtils.invokeAndWait(() -> JOptionPane.showConfirmDialog(null, msg, title, optionType - 10)); + return SwingUtils.invokeAndWait(() -> JOptionPane.showConfirmDialog(null, Msg, Title, Option - 10)); default: - SwingUtils.invokeAndWait(() -> JOptionPane.showMessageDialog(null, msg, title, optionType)); + SwingUtils.invokeAndWait(() -> JOptionPane.showMessageDialog(null, Msg, Title, Option)); } return 0; - } + } /** * Show MsgBox with options @@ -112,8 +112,8 @@ public class MessageBox { * * @return User Operation */ - public static int Show(Object msg, int optionType) { - return Show(msg, TITLE, optionType); + public static int Show(String Msg, int Option) { + return Show(Msg, TITLE, Option); } /** @@ -123,8 +123,8 @@ public class MessageBox { * * @return User Operation */ - public static int Show(Object msg) { - return Show(msg, TITLE, INFORMATION_MESSAGE); + public static int Show(String Msg) { + return Show(Msg, TITLE, INFORMATION_MESSAGE); } public static int ShowLocalized(String msg) { diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/NetUtils.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/NetUtils.java index e3b03744e..adc12fd31 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/NetUtils.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/NetUtils.java @@ -19,8 +19,6 @@ package org.jackhuang.hellominecraft.util; import org.jackhuang.hellominecraft.util.logging.HMCLog; import java.io.ByteArrayOutputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -131,23 +129,6 @@ public final class NetUtils { con.disconnect(); return result; } - - public static boolean download(String url, String saveFile) { - try { - int readCount = 0; - byte[] buffer = new byte[1204]; - InputStream inputStream = new URL(url).openConnection().getInputStream(); - FileOutputStream fs = new FileOutputStream(saveFile); - while ((readCount = inputStream.read(buffer)) != -1) { - fs.write(buffer, 0, readCount); - } - return true; - } catch (FileNotFoundException e) { - return false; - } catch (IOException e) { - return false; - } - } private static final String DEFAULT_CHARSET = "UTF-8"; diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java index 4d9c78300..e440e0995 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java @@ -19,28 +19,16 @@ package org.jackhuang.hellominecraft.util; import org.jackhuang.hellominecraft.util.logging.HMCLog; import java.util.Map; -import org.jackhuang.hellominecraft.util.lang.SupportedLocales; /** * * @author huangyuhui */ public final class UpdateChecker implements IUpdateChecker { - - public static final String VERSION_URL = "http://client.api.mcgogogo.com:81/version.php?type="; - public static final String UPDATE_LINK_URL = "http://client.api.mcgogogo.com:81/update_link.php?type="; - + public boolean OUT_DATED = false; - - public String versionString; public VersionNumber base; - private VersionNumber value; - - private boolean isforceUpdate = false; - private boolean isManualUpdate = false; - - private String updateLog = null; - + public String versionString; public String type; private Map download_link = null; @@ -49,39 +37,26 @@ public final class UpdateChecker implements IUpdateChecker { this.type = type; } + VersionNumber value; + @Override public OverridableSwingWorker process(final boolean showMessage) { return new OverridableSwingWorker() { @Override protected void work() throws Exception { - isManualUpdate = showMessage; - if (value == null) { - versionString = NetUtils.get(VERSION_URL + type + - "&ver=" + base.toString() + - "&lang=" + SupportedLocales.NOW_LOCALE.self); - - Map versionInfo = C.GSON.fromJson(versionString, Map.class); - if (versionInfo.containsKey("version")) - value = VersionNumber.check((String) versionInfo.get("version")); - if (versionInfo.containsKey("force")) - isforceUpdate = (boolean) versionInfo.get("force"); - if (versionInfo.containsKey("log")) - updateLog = (String) versionInfo.get("log"); + versionString = NetUtils.get("http://huangyuhui.duapp.com/info.php?type=" + type); + value = VersionNumber.check(versionString); } - + if (value == null) { HMCLog.warn("Failed to check update..."); - if (showMessage) { + if (showMessage) MessageBox.Show(C.i18n("update.failed")); - } - } else if (VersionNumber.isOlder(base, value)) { + } else if (VersionNumber.isOlder(base, value)) OUT_DATED = true; - } - - if (OUT_DATED) { + if (OUT_DATED) publish(value); - } } }; } @@ -91,21 +66,6 @@ public final class UpdateChecker implements IUpdateChecker { return value; } - @Override - public boolean isForceUpdate() { - return isforceUpdate; - } - - @Override - public boolean isManualUpdate() { - return isManualUpdate; - } - - @Override - public String getUpdateLog() { - return updateLog; - } - @Override public synchronized OverridableSwingWorker> requestDownloadLink() { return new OverridableSwingWorker() { @@ -113,7 +73,7 @@ public final class UpdateChecker implements IUpdateChecker { protected void work() throws Exception { if (download_link == null) try { - download_link = C.GSON.fromJson(NetUtils.get(UPDATE_LINK_URL + type), Map.class); + download_link = C.GSON.fromJson(NetUtils.get("http://huangyuhui.duapp.com/update_link.php?type=" + type), Map.class); } catch (Exception e) { HMCLog.warn("Failed to get update link.", e); } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java index c21c1c4a8..d4e97809f 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java @@ -118,7 +118,7 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev this.url = IOUtils.parseURL(p.getResult()); for (int repeat = 0; repeat < 6; repeat++) { - if (repeat > 0) { + if (repeat > 0) if (failedCallbackReturnsNewURL != null) { URL tmp = IOUtils.parseURL(failedCallbackReturnsNewURL.apply(repeat)); if (tmp != null) { @@ -126,8 +126,6 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev HMCLog.warn("Switch to: " + url); } } - } - HMCLog.log("Downloading: " + url + ", to: " + filePath); if (!shouldContinue) break; @@ -262,8 +260,4 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev al.add(pr); return this; } - - public void setFailedCallbackReturnsNewURL() { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.form b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.form index 92a53fa5a..227ef10f2 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.form +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.form @@ -36,7 +36,7 @@ - + @@ -68,7 +68,7 @@ - + @@ -117,14 +117,12 @@ - + - - - + - + diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.java index fc0de00eb..1377be174 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.java @@ -69,7 +69,7 @@ public class LogWindow extends javax.swing.JFrame { btnClose = new javax.swing.JButton(); btnCopy = new javax.swing.JButton(); lblCrash = new javax.swing.JLabel(); - btnHomepage = new javax.swing.JButton(); + btnMCBBS = new javax.swing.JButton(); btnTieBa = new javax.swing.JButton(); btnMCF = new javax.swing.JButton(); btnTerminateGame = new javax.swing.JButton(); @@ -108,10 +108,10 @@ public class LogWindow extends javax.swing.JFrame { lblCrash.setText(C.i18n("ui.label.crashing")); // NOI18N - btnHomepage.setText(C.i18n("logwindow.homepage")); // NOI18N - btnHomepage.addActionListener(new java.awt.event.ActionListener() { + btnMCBBS.setText("MCBBS"); + btnMCBBS.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - btnHomepageActionPerformed(evt); + btnMCBBSActionPerformed(evt); } }); @@ -156,7 +156,7 @@ public class LogWindow extends javax.swing.JFrame { .addGroup(layout.createSequentialGroup() .addComponent(btnTieBa) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(btnHomepage) + .addComponent(btnMCBBS) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnMCF) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) @@ -184,7 +184,7 @@ public class LogWindow extends javax.swing.JFrame { .addComponent(btnClear) .addComponent(btnClose) .addComponent(btnCopy) - .addComponent(btnHomepage) + .addComponent(btnMCBBS) .addComponent(btnTieBa) .addComponent(btnMCF) .addComponent(btnTerminateGame) @@ -209,9 +209,9 @@ public class LogWindow extends javax.swing.JFrame { Utils.setClipborad(this.txtLog.getText()); }//GEN-LAST:event_btnCopyActionPerformed - private void btnHomepageActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnHomepageActionPerformed + private void btnMCBBSActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnMCBBSActionPerformed SwingUtils.openLink(C.URL_PUBLISH); - }//GEN-LAST:event_btnHomepageActionPerformed + }//GEN-LAST:event_btnMCBBSActionPerformed private void btnTieBaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnTieBaActionPerformed SwingUtils.openLink(C.URL_TIEBA); @@ -284,7 +284,7 @@ public class LogWindow extends javax.swing.JFrame { @Override public void setVisible(boolean b) { lblCrash.setVisible(false); - btnHomepage.setVisible(false); + btnMCBBS.setVisible(false); btnTieBa.setVisible(false); btnMCF.setVisible(false); super.setVisible(b); @@ -293,13 +293,13 @@ public class LogWindow extends javax.swing.JFrame { public void showAsCrashWindow(boolean out_date) { if (out_date) { lblCrash.setVisible(false); - btnHomepage.setVisible(false); + btnMCBBS.setVisible(false); btnTieBa.setVisible(false); btnMCF.setVisible(false); lblCrash.setText(C.i18n("ui.label.crashing_out_dated")); } else { lblCrash.setVisible(true); - btnHomepage.setVisible(true); + btnMCBBS.setVisible(true); btnTieBa.setVisible(true); btnMCF.setVisible(true); lblCrash.setText(C.i18n("ui.label.crashing")); @@ -313,7 +313,7 @@ public class LogWindow extends javax.swing.JFrame { private javax.swing.JButton btnClose; private javax.swing.JButton btnCopy; private javax.swing.JButton btnGitHub; - private javax.swing.JButton btnHomepage; + private javax.swing.JButton btnMCBBS; private javax.swing.JButton btnMCF; private javax.swing.JButton btnTerminateGame; private javax.swing.JButton btnTieBa; diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindowOutputStream.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindowOutputStream.java index 4a38b67dd..a400f150c 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindowOutputStream.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindowOutputStream.java @@ -35,6 +35,8 @@ public class LogWindowOutputStream extends OutputStream { private final Level sas; public LogWindowOutputStream(LogWindow logWindow, Level l) { + Objects.nonNull(logWindow); + Objects.nonNull(l); txt = logWindow; sas = l; } diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang index b2cc75711..c57982610 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang @@ -168,7 +168,6 @@ ui.message.launching=启动中 ui.message.making=生成中 ui.message.sure_remove=真的要删除配置%s吗? ui.message.update_java=请更新您的Java -ui.message.recommend_tip=点击打开链接 ui.label.settings=选项 ui.label.crashing=Hello Minecraft!遇到了无法处理的错误,请复制下列内容并通过mcbbs、贴吧、Github或Minecraft Forum反馈bug。 @@ -176,7 +175,7 @@ ui.label.crashing_out_dated=Hello Minecraft! Launcher遇到了无法处理 ui.label.failed_set=设置失败: download=下载 -download.mojang=Mojang官方 +download.mojang=官方 download.BMCL=BMCLAPI (bangbang93, http://bmclapi.bangbang93.com/) download.rapid_data=RapidData (锐网云计算, https://www.rapiddata.org/) download.not_200=下载失败,回复码 @@ -299,9 +298,8 @@ mainwindow.enter_script_name=输入要生成脚本的文件名 mainwindow.make_launch_succeed=启动脚本已生成完毕: mainwindow.no_version=未找到任何版本,是否进入游戏下载? -launcher.about=默认背景图感谢gamerteam提供。
    关于作者:
    主页:http://www.hmclsoft.com
    邮箱:contact@hmclsoft.com
    欢迎提交Bug哦
    Copyright (c) 2013-2016 HMCLSoft.
    免责声明:Minecraft软件版权归Mojang AB所有,使用本软件产生的版权问题本软件制作方概不负责。
    本启动器在GPLv3协议下开源:https://github.com/mclauncher/HMCL,感谢issues和pull requests贡献者
    本软件使用了基于Apache License 2.0的Gson项目,感谢贡献者。 +launcher.about=默认背景图感谢gamerteam提供。
    如果您希望本软件继续发展,请赞助
    关于作者:
    百度ID:huanghongxun20
    mcbbs:huanghongxun
    邮箱:huanghongxun2008@126.com
    Minecraft Forum ID: klkl6523
    欢迎提交Bug哦
    Copyright (c) 2013-2016 huangyuhui.
    免责声明:Minecraft软件版权归Mojang AB所有,使用本软件产生的版权问题本软件制作方概不负责。
    本启动器在GPLv3协议下开源:https://github.com/huanghongxun/HMCL/ ,感谢issues和pull requests贡献者
    本软件使用了基于Apache License 2.0的Gson项目,感谢贡献者。 launcher.download_source=下载源 -launcher.homepage=官网 launcher.background_location=背景地址 launcher.exit_failed=强制退出失败,可能是Forge 1.7.10及更高版本导致的,无法解决。 launcher.versions_json_not_matched=版本%s格式不规范!该版本文件夹下有json:%s,是否更名这个文件来规范格式? @@ -314,7 +312,7 @@ launcher.enable_shadow=启用窗口阴影 launcher.theme=主题 launcher.proxy=代理 launcher.decorated=启用窗口边框(Linux下可解决程序界面全灰问题) -launcher.modpack=整合包作者帮助 +launcher.modpack=整合包作者帮助 launcher.enable_animation=启用动态效果 launcher.lang=语言 launcher.restart=本界面选项需要重启本启动器生效 @@ -371,12 +369,10 @@ update.should_open_link=是否更新? update.newest_version=最新版本为: update.failed=检查更新失败 update.found=(发现更新!) -update.ignore=不再提醒此版本更新 logwindow.terminate_game=结束游戏进程 logwindow.tieba=贴吧 logwindow.title=日志 -logwindow.homepage=官网 selector.choose=选择 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties index e02b4b6aa..642388d74 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties @@ -168,7 +168,6 @@ ui.message.launching=\u542f\u52a8\u4e2d ui.message.making=\u751f\u6210\u4e2d ui.message.sure_remove=\u771f\u7684\u8981\u5220\u9664\u914d\u7f6e%s\u5417\uff1f ui.message.update_java=\u8bf7\u66f4\u65b0\u60a8\u7684Java -ui.message.recommend_tip=\u70b9\u51fb\u6253\u5f00\u94fe\u63a5 ui.label.settings=\u9009\u9879 ui.label.crashing=Hello Minecraft!\u9047\u5230\u4e86\u65e0\u6cd5\u5904\u7406\u7684\u9519\u8bef\uff0c\u8bf7\u590d\u5236\u4e0b\u5217\u5185\u5bb9\u5e76\u901a\u8fc7mcbbs\u3001\u8d34\u5427\u3001Github\u6216Minecraft Forum\u53cd\u9988bug\u3002 @@ -176,7 +175,7 @@ ui.label.crashing_out_dated=Hello Minecraft! Launcher\u9047\u5230\u4e86\u6 ui.label.failed_set=\u8bbe\u7f6e\u5931\u8d25\uff1a download=\u4e0b\u8f7d -download.mojang=Mojang\u5b98\u65b9 +download.mojang=\u5b98\u65b9 download.BMCL=BMCLAPI (bangbang93, http://bmclapi.bangbang93.com/) download.rapid_data=RapidData (\u9510\u7f51\u4e91\u8ba1\u7b97, https://www.rapiddata.org/) download.not_200=\u4e0b\u8f7d\u5931\u8d25\uff0c\u56de\u590d\u7801 @@ -299,9 +298,8 @@ mainwindow.enter_script_name=\u8f93\u5165\u8981\u751f\u6210\u811a\u672c\u7684\u6 mainwindow.make_launch_succeed=\u542f\u52a8\u811a\u672c\u5df2\u751f\u6210\u5b8c\u6bd5: mainwindow.no_version=\u672a\u627e\u5230\u4efb\u4f55\u7248\u672c\uff0c\u662f\u5426\u8fdb\u5165\u6e38\u620f\u4e0b\u8f7d\uff1f -launcher.about=\u9ed8\u8ba4\u80cc\u666f\u56fe\u611f\u8c22gamerteam\u63d0\u4f9b\u3002
    \u5173\u4e8e\u4f5c\u8005\uff1a
    \u4e3b\u9875\uff1ahttp://www.hmclsoft.com
    \u90ae\u7bb1\uff1acontact@hmclsoft.com
    \u6b22\u8fce\u63d0\u4ea4Bug\u54e6
    Copyright (c) 2013-2016 HMCLSoft.
    \u514d\u8d23\u58f0\u660e\uff1aMinecraft\u8f6f\u4ef6\u7248\u6743\u5f52Mojang AB\u6240\u6709\uff0c\u4f7f\u7528\u672c\u8f6f\u4ef6\u4ea7\u751f\u7684\u7248\u6743\u95ee\u9898\u672c\u8f6f\u4ef6\u5236\u4f5c\u65b9\u6982\u4e0d\u8d1f\u8d23\u3002
    \u672c\u542f\u52a8\u5668\u5728GPLv3\u534f\u8bae\u4e0b\u5f00\u6e90\uff1ahttps://github.com/mclauncher/HMCL\uff0c\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
    \u672c\u8f6f\u4ef6\u4f7f\u7528\u4e86\u57fa\u4e8eApache License 2.0\u7684Gson\u9879\u76ee\uff0c\u611f\u8c22\u8d21\u732e\u8005\u3002 +launcher.about=\u9ed8\u8ba4\u80cc\u666f\u56fe\u611f\u8c22gamerteam\u63d0\u4f9b\u3002
    \u5982\u679c\u60a8\u5e0c\u671b\u672c\u8f6f\u4ef6\u7ee7\u7eed\u53d1\u5c55\uff0c\u8bf7\u8d5e\u52a9
    \u5173\u4e8e\u4f5c\u8005\uff1a
    \u767e\u5ea6ID\uff1ahuanghongxun20
    mcbbs\uff1ahuanghongxun
    \u90ae\u7bb1\uff1ahuanghongxun2008@126.com
    Minecraft Forum ID: klkl6523
    \u6b22\u8fce\u63d0\u4ea4Bug\u54e6
    Copyright (c) 2013-2016 huangyuhui.
    \u514d\u8d23\u58f0\u660e\uff1aMinecraft\u8f6f\u4ef6\u7248\u6743\u5f52Mojang AB\u6240\u6709\uff0c\u4f7f\u7528\u672c\u8f6f\u4ef6\u4ea7\u751f\u7684\u7248\u6743\u95ee\u9898\u672c\u8f6f\u4ef6\u5236\u4f5c\u65b9\u6982\u4e0d\u8d1f\u8d23\u3002
    \u672c\u542f\u52a8\u5668\u5728GPLv3\u534f\u8bae\u4e0b\u5f00\u6e90:https://github.com/huanghongxun/HMCL/ ,\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
    \u672c\u8f6f\u4ef6\u4f7f\u7528\u4e86\u57fa\u4e8eApache License 2.0\u7684Gson\u9879\u76ee\uff0c\u611f\u8c22\u8d21\u732e\u8005\u3002 launcher.download_source=\u4e0b\u8f7d\u6e90 -launcher.homepage=\u5b98\u7f51 launcher.background_location=\u80cc\u666f\u5730\u5740 launcher.exit_failed=\u5f3a\u5236\u9000\u51fa\u5931\u8d25\uff0c\u53ef\u80fd\u662fForge 1.7.10\u53ca\u66f4\u9ad8\u7248\u672c\u5bfc\u81f4\u7684\uff0c\u65e0\u6cd5\u89e3\u51b3\u3002 launcher.versions_json_not_matched=\u7248\u672c%s\u683c\u5f0f\u4e0d\u89c4\u8303\uff01\u8be5\u7248\u672c\u6587\u4ef6\u5939\u4e0b\u6709json:%s\uff0c\u662f\u5426\u66f4\u540d\u8fd9\u4e2a\u6587\u4ef6\u6765\u89c4\u8303\u683c\u5f0f\uff1f @@ -314,7 +312,7 @@ launcher.enable_shadow=\u542f\u7528\u7a97\u53e3\u9634\u5f71 launcher.theme=\u4e3b\u9898 launcher.proxy=\u4ee3\u7406 launcher.decorated=\u542f\u7528\u7a97\u53e3\u8fb9\u6846(Linux\u4e0b\u53ef\u89e3\u51b3\u7a0b\u5e8f\u754c\u9762\u5168\u7070\u95ee\u9898) -launcher.modpack=\u6574\u5408\u5305\u4f5c\u8005\u5e2e\u52a9 +launcher.modpack=\u6574\u5408\u5305\u4f5c\u8005\u5e2e\u52a9 launcher.enable_animation=\u542f\u7528\u52a8\u6001\u6548\u679c launcher.lang=\u8bed\u8a00 launcher.restart=\u672c\u754c\u9762\u9009\u9879\u9700\u8981\u91cd\u542f\u672c\u542f\u52a8\u5668\u751f\u6548 @@ -371,12 +369,10 @@ update.should_open_link=\u662f\u5426\u66f4\u65b0\uff1f update.newest_version=\u6700\u65b0\u7248\u672c\u4e3a\uff1a update.failed=\u68c0\u67e5\u66f4\u65b0\u5931\u8d25 update.found=(\u53d1\u73b0\u66f4\u65b0!) -update.ignore=\u4e0d\u518d\u63d0\u9192\u6b64\u7248\u672c\u66f4\u65b0 logwindow.terminate_game=\u7ed3\u675f\u6e38\u620f\u8fdb\u7a0b logwindow.tieba=\u8d34\u5427 logwindow.title=\u65e5\u5fd7 -logwindow.homepage=\u5b98\u7f51 selector.choose=\u9009\u62e9 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang index 4772ce29d..9d746d0e1 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang @@ -168,7 +168,6 @@ ui.message.launching=Launching... ui.message.making=Generating... ui.message.sure_remove=Sure to remove profile %s? ui.message.update_java=Please upgrade your Java. -ui.message.recommend_tip=Click to open link ui.label.settings=Settings ui.label.crashing=Hello Minecraft! Launcher has crashed! @@ -299,9 +298,8 @@ mainwindow.enter_script_name=Enter the script name. mainwindow.make_launch_succeed=Finished script creation. mainwindow.no_version=No version found. Switch to Game Downloads Tab? -launcher.about=About Author
    Homepage: http://www.hmclsoft.com
    Email: contact@hmclsoft.com
    Copyright (c) 2013 HMCLSoft.
    Opened source under GPL v3 license: http://github.com/mclauncher/HMCL
    This software used project Gson which is under Apache License 2.0, thanks contributors. +launcher.about=About Author
    Email:huanghongxun2008@126.com
    Minecraft Forum ID: klkl6523
    Copyright (c) 2013 huangyuhui
    Opened source under GPL v3 license:http://github.com/huanghongxun/HMCL/
    This software used project Gson which is under Apache License 2.0, thanks contributors. launcher.download_source=Download Source -launcher.homepage=Homepage 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? @@ -314,7 +312,7 @@ launcher.enable_shadow=Enable Window Shadow launcher.theme=Theme launcher.proxy=Proxy launcher.decorated=Enable system window border(in order to fix the problem that the ui become all gray in Linux OS) -launcher.modpack=Documentations for modpacks. +launcher.modpack=Documentations for modpacks. launcher.enable_animation=Enable Animation launcher.lang=Language launcher.restart=Options will be in operations only if restart this app. @@ -371,12 +369,10 @@ update.should_open_link=Are you willing to upgrade this app? update.newest_version=Newest version: update.failed=Failed to check for updates. update.found=(Found Update!) -update.ignore=Do not remind this version update. logwindow.terminate_game=Terminate Game logwindow.tieba=Baidu Tieba logwindow.title=Log -logwindow.homepage=Homepage selector.choose=Choose diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties index 4772ce29d..c1ed34126 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties @@ -168,7 +168,6 @@ ui.message.launching=Launching... ui.message.making=Generating... ui.message.sure_remove=Sure to remove profile %s? ui.message.update_java=Please upgrade your Java. -ui.message.recommend_tip=Click to open link ui.label.settings=Settings ui.label.crashing=Hello Minecraft! Launcher has crashed! @@ -299,9 +298,8 @@ mainwindow.enter_script_name=Enter the script name. mainwindow.make_launch_succeed=Finished script creation. mainwindow.no_version=No version found. Switch to Game Downloads Tab? -launcher.about=About Author
    Homepage: http://www.hmclsoft.com
    Email: contact@hmclsoft.com
    Copyright (c) 2013 HMCLSoft.
    Opened source under GPL v3 license: http://github.com/mclauncher/HMCL
    This software used project Gson which is under Apache License 2.0, thanks contributors. +launcher.about=About Author
    Email\uff1ahuanghongxun2008@126.com
    Minecraft Forum ID: klkl6523
    Copyright (c) 2013 huangyuhui
    Opened source under GPL v3 license:http://github.com/huanghongxun/HMCL/
    This software used project Gson which is under Apache License 2.0, thanks contributors. launcher.download_source=Download Source -launcher.homepage=Homepage 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? @@ -314,7 +312,7 @@ launcher.enable_shadow=Enable Window Shadow launcher.theme=Theme launcher.proxy=Proxy launcher.decorated=Enable system window border(in order to fix the problem that the ui become all gray in Linux OS) -launcher.modpack=Documentations for modpacks. +launcher.modpack=Documentations for modpacks. launcher.enable_animation=Enable Animation launcher.lang=Language launcher.restart=Options will be in operations only if restart this app. @@ -371,12 +369,10 @@ update.should_open_link=Are you willing to upgrade this app? update.newest_version=Newest version: update.failed=Failed to check for updates. update.found=(Found Update!) -update.ignore=Do not remind this version update. logwindow.terminate_game=Terminate Game logwindow.tieba=Baidu Tieba logwindow.title=Log -logwindow.homepage=Homepage selector.choose=Choose diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang index 0655138de..feaaa638c 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang @@ -168,7 +168,6 @@ ui.message.launching=啟動中 ui.message.making=生成中 ui.message.sure_remove=真的要删除配置%s吗? ui.message.update_java=请更新您的Java -ui.message.recommend_tip=點擊打開連接 ui.label.settings=選項 ui.label.crashing=Hello Minecraft! Launcher遇到了無法處理的錯誤,請複制下列內容並通過mcbbs、貼吧或Minecraft Forum反饋bug。 @@ -176,7 +175,7 @@ ui.label.crashing_out_dated=Hello Minecraft! Launcher遇到了無法處理 ui.label.failed_set=設定失敗: download=下載 -download.mojang=Mojang官方 +download.mojang=官方 download.BMCL=BMCLAPI (bangbang93, http://bmclapi.bangbang93.com/) download.rapid_data=RapidData (銳網雲計算, https://www.rapiddata.org/) download.not_200=下載失敗,回复码 @@ -299,9 +298,8 @@ mainwindow.enter_script_name=輸入要生成腳本的資料名 mainwindow.make_launch_succeed=啟動腳本已生成完畢: mainwindow.no_version=未找到任何版本,是否進入遊戲下載? -launcher.about=默認背景圖感謝gamerteam提供。
    關於作者:
    主頁:http://www.hmclsoft.com
    郵箱:contact@hmclsoft.com
    歡迎提交Bug哦
    Copyright (c) 2013-2016 HMCLSoft.
    免責聲明:Minecraft軟體版權歸Mojang AB所有,遊戲由於誤操作本啟動器而丟失數據的概不負責。
    本啟動器在GPLv3協議下開源:http://github.com/mclauncher/HMCL,感谢issues和pull requests贡献者
    本軟體使用了基於Apache License 2.0的Gson項目,感謝貢獻者。 +launcher.about=默認背景圖感謝gamerteam提供。
    如果您希望本軟件繼續發展,請贊助
    關於作者:
    百度ID:huanghongxun20
    mcbbs:huanghongxun
    郵箱:huanghongxun2008@126.com
    Minecraft Forum ID: klkl6523
    歡迎提交Bug哦
    Copyright (c) 2013-2016 huangyuhui.
    免責聲明:Minecraft軟體版權歸Mojang AB所有,遊戲由於誤操作本啟動器而丟失數據的概不負責。
    本啟動器在GPLv3協議下開源:http://github.com/huanghongxun/HMCL/ ,感谢issues和pull requests贡献者
    本軟體使用了基於Apache License 2.0的Gson項目,感謝貢獻者。 launcher.download_source=下載源 -launcher.homepage=官網 launcher.background_location=背景地址 launcher.exit_failed=強制退出失敗,可能是Forge 1.7.10及更高版本導致的,無法解決。 launcher.versions_json_not_matched=版本%s格式不規範!該版本資料夾下有json:%s,是否更名這個資料來規範格式? @@ -314,7 +312,7 @@ launcher.enable_shadow=启用窗口阴影 launcher.theme=主题 launcher.proxy=代理 launcher.decorated=啟用窗口邊框(Linux下可解決程序界面全灰問題) -launcher.modpack=整合包作者帮助 +launcher.modpack=整合包作者帮助 launcher.enable_animation=啟用動態效果 launcher.lang=語言 launcher.restart=本界面選項需要重啟本啟動器生效 @@ -371,12 +369,10 @@ update.should_open_link=是否更新? update.newest_version=最新版本為: update.failed=檢查更新失敗 update.found=(發現更新!) -update.ignore=不再提醒此版本更新 logwindow.terminate_game=結束遊戲進程 logwindow.tieba=貼吧 logwindow.title=日志 -logwindow.homepage=官網 selector.choose=選擇 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties index 312245694..1d6f19cd8 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties @@ -168,7 +168,6 @@ ui.message.launching=\u555f\u52d5\u4e2d ui.message.making=\u751f\u6210\u4e2d ui.message.sure_remove=\u771f\u7684\u8981\u5220\u9664\u914d\u7f6e%s\u5417\uff1f ui.message.update_java=\u8bf7\u66f4\u65b0\u60a8\u7684Java -ui.message.recommend_tip=\u9ede\u64ca\u6253\u958b\u9023\u63a5 ui.label.settings=\u9078\u9805 ui.label.crashing=Hello Minecraft! Launcher\u9047\u5230\u4e86\u7121\u6cd5\u8655\u7406\u7684\u932f\u8aa4\uff0c\u8acb\u8907\u5236\u4e0b\u5217\u5167\u5bb9\u4e26\u901a\u904emcbbs\u3001\u8cbc\u5427\u6216Minecraft Forum\u53cd\u994bbug\u3002 @@ -176,7 +175,7 @@ ui.label.crashing_out_dated=Hello Minecraft! Launcher\u9047\u5230\u4e86\u7 ui.label.failed_set=\u8a2d\u5b9a\u5931\u6557\uff1a download=\u4e0b\u8f09 -download.mojang=Mojang\u5b98\u65b9 +download.mojang=\u5b98\u65b9 download.BMCL=BMCLAPI (bangbang93, http://bmclapi.bangbang93.com/) download.rapid_data=RapidData (\u92b3\u7db2\u96f2\u8a08\u7b97, https://www.rapiddata.org/) download.not_200=\u4e0b\u8f09\u5931\u6557\uff0c\u56de\u590d\u7801 @@ -299,9 +298,8 @@ mainwindow.enter_script_name=\u8f38\u5165\u8981\u751f\u6210\u8173\u672c\u7684\u8 mainwindow.make_launch_succeed=\u555f\u52d5\u8173\u672c\u5df2\u751f\u6210\u5b8c\u7562: mainwindow.no_version=\u672a\u627e\u5230\u4efb\u4f55\u7248\u672c\uff0c\u662f\u5426\u9032\u5165\u904a\u6232\u4e0b\u8f09\uff1f -launcher.about=\u9ed8\u8a8d\u80cc\u666f\u5716\u611f\u8b1dgamerteam\u63d0\u4f9b\u3002
    \u95dc\u65bc\u4f5c\u8005\uff1a
    \u4e3b\u9801\uff1ahttp://www.hmclsoft.com
    \u90f5\u7bb1\uff1acontact@hmclsoft.com
    \u6b61\u8fce\u63d0\u4ea4Bug\u54e6
    Copyright (c) 2013-2016 HMCLSoft.
    \u514d\u8cac\u8072\u660e\uff1aMinecraft\u8edf\u9ad4\u7248\u6b0a\u6b78Mojang AB\u6240\u6709\uff0c\u904a\u6232\u7531\u65bc\u8aa4\u64cd\u4f5c\u672c\u555f\u52d5\u5668\u800c\u4e1f\u5931\u6578\u64da\u7684\u6982\u4e0d\u8ca0\u8cac\u3002
    \u672c\u555f\u52d5\u5668\u5728GPLv3\u5354\u8b70\u4e0b\u958b\u6e90\uff1ahttp://github.com/mclauncher/HMCL\uff0c\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
    \u672c\u8edf\u9ad4\u4f7f\u7528\u4e86\u57fa\u65bcApache License 2.0\u7684Gson\u9805\u76ee\uff0c\u611f\u8b1d\u8ca2\u737b\u8005\u3002 +launcher.about=\u9ed8\u8a8d\u80cc\u666f\u5716\u611f\u8b1dgamerteam\u63d0\u4f9b\u3002
    \u5982\u679c\u60a8\u5e0c\u671b\u672c\u8edf\u4ef6\u7e7c\u7e8c\u767c\u5c55\uff0c\u8acb\u8d0a\u52a9
    \u95dc\u65bc\u4f5c\u8005\uff1a
    \u767e\u5ea6ID\uff1ahuanghongxun20
    mcbbs\uff1ahuanghongxun
    \u90f5\u7bb1\uff1ahuanghongxun2008@126.com
    Minecraft Forum ID: klkl6523
    \u6b61\u8fce\u63d0\u4ea4Bug\u54e6
    Copyright (c) 2013-2016 huangyuhui.
    \u514d\u8cac\u8072\u660e\uff1aMinecraft\u8edf\u9ad4\u7248\u6b0a\u6b78Mojang AB\u6240\u6709\uff0c\u904a\u6232\u7531\u65bc\u8aa4\u64cd\u4f5c\u672c\u555f\u52d5\u5668\u800c\u4e1f\u5931\u6578\u64da\u7684\u6982\u4e0d\u8ca0\u8cac\u3002
    \u672c\u555f\u52d5\u5668\u5728GPLv3\u5354\u8b70\u4e0b\u958b\u6e90:http://github.com/huanghongxun/HMCL/ ,\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
    \u672c\u8edf\u9ad4\u4f7f\u7528\u4e86\u57fa\u65bcApache License 2.0\u7684Gson\u9805\u76ee\uff0c\u611f\u8b1d\u8ca2\u737b\u8005\u3002 launcher.download_source=\u4e0b\u8f09\u6e90 -launcher.homepage=\u5b98\u7db2 launcher.background_location=\u80cc\u666f\u5730\u5740 launcher.exit_failed=\u5f37\u5236\u9000\u51fa\u5931\u6557\uff0c\u53ef\u80fd\u662fForge 1.7.10\u53ca\u66f4\u9ad8\u7248\u672c\u5c0e\u81f4\u7684\uff0c\u7121\u6cd5\u89e3\u6c7a\u3002 launcher.versions_json_not_matched=\u7248\u672c%s\u683c\u5f0f\u4e0d\u898f\u7bc4\uff01\u8a72\u7248\u672c\u8cc7\u6599\u593e\u4e0b\u6709json:%s\uff0c\u662f\u5426\u66f4\u540d\u9019\u500b\u8cc7\u6599\u4f86\u898f\u7bc4\u683c\u5f0f\uff1f @@ -314,7 +312,7 @@ launcher.enable_shadow=\u542f\u7528\u7a97\u53e3\u9634\u5f71 launcher.theme=\u4e3b\u9898 launcher.proxy=\u4ee3\u7406 launcher.decorated=\u555f\u7528\u7a97\u53e3\u908a\u6846(Linux\u4e0b\u53ef\u89e3\u6c7a\u7a0b\u5e8f\u754c\u9762\u5168\u7070\u554f\u984c) -launcher.modpack=\u6574\u5408\u5305\u4f5c\u8005\u5e2e\u52a9 +launcher.modpack=\u6574\u5408\u5305\u4f5c\u8005\u5e2e\u52a9 launcher.enable_animation=\u555f\u7528\u52d5\u614b\u6548\u679c launcher.lang=\u8a9e\u8a00 launcher.restart=\u672c\u754c\u9762\u9078\u9805\u9700\u8981\u91cd\u555f\u672c\u555f\u52d5\u5668\u751f\u6548 @@ -371,12 +369,10 @@ update.should_open_link=\u662f\u5426\u66f4\u65b0\uff1f update.newest_version=\u6700\u65b0\u7248\u672c\u70ba\uff1a update.failed=\u6aa2\u67e5\u66f4\u65b0\u5931\u6557 update.found=(\u767c\u73fe\u66f4\u65b0!) -update.ignore=\u4e0d\u518d\u63d0\u9192\u6b64\u7248\u672c\u66f4\u65b0 logwindow.terminate_game=\u7d50\u675f\u904a\u6232\u9032\u7a0b logwindow.tieba=\u8cbc\u5427 logwindow.title=\u65e5\u5fd7 -logwindow.homepage=\u5b98\u7db2 selector.choose=\u9078\u64c7 diff --git a/LICENSE b/LICENSE index 2b4d6a2c3..074b814ad 100755 --- a/LICENSE +++ b/LICENSE @@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Hello Minecraft! Launcher, a Minecraft Launcher which is easy to use. - Copyright (C) 2016 HMCLSoft. + Copyright (C) 2014 huangyuhui 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 @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - Hello Minecraft! Launcher Copyright (C) 2016 HMCLSoft. + Hello Minecraft! Launcher Copyright (C) 2014 huangyuhui This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. diff --git a/README.md b/README.md index b7e2a1556..d636c0f41 100755 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ -# Hello Minecraft! Launcher [![Build Status](https://travis-ci.org/mclauncher/HMCL.svg?branch=master)](https://travis-ci.org/mclauncher/HMCL) +# Hello Minecraft! Launcher [![Build Status](https://travis-ci.org/huanghongxun/HMCL.svg?branch=master)](https://travis-ci.org/huanghongxun/HMCL) 开源协议为GPL v3, 详情参见http://www.gnu.org/licenses/gpl.html ## 介绍 HMCL是一个Minecraft启动器,支持Mod管理,游戏定制,自动安装,整合包制作,界面主题定制等功能。 +并且一天的使用次数在工作日时有40万左右、节假日有150万左右的使用次数,也就是说日活跃用户在10万以上。 但是本项目的代码不够完善,希望有更多的人能加入HMCL的开发。 ## 贡献 diff --git a/license-header.txt b/license-header.txt index 3ac193d02..15cd12760 100755 --- a/license-header.txt +++ b/license-header.txt @@ -1,6 +1,6 @@ /* * Hello Minecraft! Launcher. - * Copyright (C) 2016 HMCLSoft. + * Copyright (C) 2013 huangyuhui * * 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