diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/DefaultGameLauncher.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/DefaultGameLauncher.java index b7ad56ab2..cffcb6256 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/DefaultGameLauncher.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/DefaultGameLauncher.java @@ -18,6 +18,7 @@ package org.jackhuang.hellominecraft.launcher.launch; import java.io.IOException; +import javax.swing.SwingUtilities; import org.jackhuang.hellominecraft.C; import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.launcher.launch.GameLauncher.DownloadLibraryJob; @@ -30,6 +31,8 @@ import org.jackhuang.hellominecraft.utils.system.Compressor; import org.jackhuang.hellominecraft.utils.MessageBox; public class DefaultGameLauncher extends GameLauncher { + + private boolean fuckingFlag; public DefaultGameLauncher(Profile version, LoginInfo info, IAuthenticator lg) { super(version, info, lg); @@ -43,12 +46,23 @@ public class DefaultGameLauncher extends GameLauncher { for (DownloadLibraryJob s : t) parallelTask.addDependsTask(new LibraryDownloadTask(s)); dw.addTask(parallelTask); - boolean flag = true; - if (t.size() > 0) - flag = dw.start(); - if (!flag && MessageBox.Show(C.i18n("launch.not_finished_downloading_libraries"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) - flag = true; - return flag; + Runnable r = () -> { + boolean flag = true; + if (t.size() > 0) + flag = dw.start(); + if (!flag && MessageBox.Show(C.i18n("launch.not_finished_downloading_libraries"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) + flag = true; + synchronized(DefaultGameLauncher.this) { + fuckingFlag = flag; + } + }; + try { + SwingUtilities.invokeAndWait(r); + } catch (Exception e) { + HMCLog.err("InvokeAndWait failed.", e); + r.run(); + } + return fuckingFlag; }); decompressNativesEvent.register((sender, value) -> { if (value == null) diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/MinecraftLoader.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/MinecraftLoader.java index 066d7ca68..08ec31515 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/MinecraftLoader.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/MinecraftLoader.java @@ -22,6 +22,7 @@ import java.io.File; import java.io.IOException; import java.util.List; import java.util.Map; +import javax.swing.SwingUtilities; import org.jackhuang.hellominecraft.C; import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.launcher.utils.auth.UserProfileProvider; @@ -37,7 +38,6 @@ import org.jackhuang.hellominecraft.launcher.version.MinecraftVersion; import org.jackhuang.hellominecraft.tasks.TaskWindow; import org.jackhuang.hellominecraft.utils.system.FileUtils; import org.jackhuang.hellominecraft.utils.MessageBox; -import rx.concurrency.Schedulers; /** * @@ -74,11 +74,19 @@ public class MinecraftLoader extends AbstractMinecraftLoader { String[] splitted = org.jackhuang.hellominecraft.utils.StrUtils.tokenize(arg); if (!checkAssetsExist()) - if (MessageBox.Show(C.i18n("assets.no_assets"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) - IAssetsHandler.ASSETS_HANDLER.getList(version, provider) - .subscribeOn(Schedulers.newThread()) - .observeOn(Schedulers.eventQueue()) - .subscribe((value) -> TaskWindow.getInstance().addTask(IAssetsHandler.ASSETS_HANDLER.getDownloadTask(dt.getProvider())).start()); + if (MessageBox.Show(C.i18n("assets.no_assets"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) { + IAssetsHandler.ASSETS_HANDLER.getList(version, provider).subscribe(a -> { + }); + Runnable r = () + -> TaskWindow.getInstance().addTask(IAssetsHandler.ASSETS_HANDLER.getDownloadTask(provider.profile.getDownloadType().getProvider())).start(); + + try { + SwingUtilities.invokeAndWait(r); + } catch (Exception e) { + HMCLog.err("Failed invokeAndWait", e); + r.run(); + } + } String game_assets = reconstructAssets().getAbsolutePath(); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/ModInfo.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/ModInfo.java index 1e77f1c7c..8c9a411da 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/ModInfo.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/ModInfo.java @@ -54,7 +54,7 @@ public class ModInfo implements Comparable { if (f.renameTo(newf)) location = newf; } - + public void showURL() { if (url != null) Utils.openLink(url); @@ -100,7 +100,28 @@ public class ModInfo implements Comparable { boolean disabled = name.endsWith(".disabled"); if (disabled) name = name.substring(0, name.length() - ".disabled".length()); - return name.endsWith(".zip") || name.endsWith(".jar"); + 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; + List m = C.gson.fromJson(new InputStreamReader(jar.getInputStream(entry)), + 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 { + ModInfo m = C.gson.fromJson(new InputStreamReader(jar.getInputStream(entry)), + ModInfo.class); + if (m == null) m = new ModInfo(); + m.location = f; + return m; } public static ModInfo readModInfo(File f) { @@ -109,19 +130,12 @@ public class ModInfo implements Comparable { try { try (ZipFile jar = new ZipFile(f)) { ZipEntry entry = jar.getEntry("mcmod.info"); - if (entry == null) - entry = jar.getEntry("litemod.json"); - if (entry == null) - return i; - else { - List m = C.gson.fromJson(new InputStreamReader(jar.getInputStream(entry)), - new TypeToken>() { - }.getType()); - if (m != null && m.size() > 0) { - i = m.get(0); - i.location = f; - } - } + if (entry != null) + return getForgeModInfo(f, jar, entry); + entry = jar.getEntry("litemod.json"); + if (entry != null) + return getLiteLoaderModInfo(f, jar, entry); + return i; } } catch (IOException ex) { HMCLog.warn("File " + f + " is not a jar.", ex); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/vanilla/MinecraftForgeVersionList.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/vanilla/MinecraftForgeVersionList.java index cebfe2500..fb52f52f6 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/vanilla/MinecraftForgeVersionList.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/vanilla/MinecraftForgeVersionList.java @@ -49,9 +49,9 @@ public class MinecraftForgeVersionList extends InstallerVersionList { @Override public void refreshList(String[] needed) throws Exception { - String s = NetUtils.get(Settings.getInstance().getDownloadSource().getProvider().getParsedLibraryDownloadURL(C.URL_FORGE_LIST)); if (root != null) return; + String s = NetUtils.get(Settings.getInstance().getDownloadSource().getProvider().getParsedLibraryDownloadURL(C.URL_FORGE_LIST)); root = C.gson.fromJson(s, MinecraftForgeVersionRoot.class); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java index dd06ca4ca..5d494d029 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java @@ -185,7 +185,13 @@ public final class GameSettingsPanel extends javax.swing.JPanel implements DropT boolean hasLink = m.url != null; String text = "" + (hasLink ? "" : "") + m.getName() + (hasLink ? "" : ""); text += " by " + m.getAuthor(); - text += "
" + (m.description == null ? "No mcmod.info found" : SwingUtils.getParsedJPanelText(lblModInfo, m.description)); + String description = "No mod description found"; + if (m.description != null) { + description = ""; + for (String desc : m.description.split("\n")) + description += SwingUtils.getParsedJPanelText(lblModInfo, desc) + "
"; + } + text += "
" + description; lblModInfo.setText(text); lblModInfo.setCursor(new java.awt.Cursor(hasLink ? java.awt.Cursor.HAND_CURSOR : java.awt.Cursor.DEFAULT_CURSOR)); } @@ -208,7 +214,7 @@ public final class GameSettingsPanel extends javax.swing.JPanel implements DropT public void stateChanged(ChangeEvent e) { if (tabVersionEdit.getSelectedComponent() == pnlGameDownloads && !a) { a = true; - refreshDownloads(Settings.getInstance().getDownloadSource()); + refreshDownloads(); } else if (tabVersionEdit.getSelectedComponent() == pnlAutoInstall && !b) { b = true; forge.refreshVersions(); @@ -1172,12 +1178,12 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { }//GEN-LAST:event_btnRefreshLiteLoaderActionPerformed private void btnDownloadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDownloadActionPerformed - downloadMinecraft(Settings.getInstance().getDownloadSource()); + downloadMinecraft(); refreshVersions(); }//GEN-LAST:event_btnDownloadActionPerformed private void btnRefreshGameDownloadsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRefreshGameDownloadsActionPerformed - refreshDownloads(Settings.getInstance().getDownloadSource()); + refreshDownloads(); }//GEN-LAST:event_btnRefreshGameDownloadsActionPerformed private void btnExploreMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnExploreMouseClicked @@ -1487,7 +1493,7 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { // // - public void refreshDownloads(final DownloadType provider) { + public void refreshDownloads() { DefaultTableModel model = (DefaultTableModel) lstDownloads.getModel(); while (model.getRowCount() > 0) model.removeRow(0); @@ -1501,12 +1507,8 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { }, lstDownloads::updateUI); } - void downloadMinecraft(DownloadType index) { - if (profile == null) - return; - if (lstDownloads.getSelectedRow() < 0) - refreshDownloads(Settings.getInstance().getDownloadSource()); - if (lstDownloads.getSelectedRow() < 0) { + void downloadMinecraft() { + if (profile == null || lstDownloads.getSelectedRow() < 0) { MessageBox.Show(C.i18n("gamedownload.not_refreshed")); return; } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java index be9a8ef06..497a7edc3 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java @@ -386,7 +386,7 @@ public class MainPagePanel extends javax.swing.JPanel { } final IAuthenticator l = IAuthenticator.LOGINS.get(index); final LoginInfo li = new LoginInfo(Settings.getInstance().getUsername(), l.isLoggedIn() || l.isHidePasswordBox() ? null : new String(txtPassword.getPassword())); - Thread t = new Thread() { + new Thread() { @Override public void run() { Thread.currentThread().setName("Game Launcher"); @@ -405,8 +405,7 @@ public class MainPagePanel extends javax.swing.JPanel { listener.accept(gl); gl.makeLaunchCommand(); } - }; - t.start(); + }.start(); } // diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskWindow.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskWindow.java index a44e59264..b21265993 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskWindow.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskWindow.java @@ -219,8 +219,8 @@ implements ProgressProviderListener, Runnable, DoingDoneListener { @Override public void run() { + SwingUtilities.invokeLater(this::dispose); suc = true; - this.dispose(); HMCLog.log("Tasks are finished."); } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/CollectionUtils.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/CollectionUtils.java index 9d5847075..5e9c0dfb2 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/CollectionUtils.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/CollectionUtils.java @@ -31,7 +31,7 @@ public final class CollectionUtils { public static ArrayList map(Collection coll, Predicate p) { ArrayList newColl = new ArrayList<>(); - Observable.from(coll).filter(p).subscribe(newColl::add); + Observable.from(coll).filter(t -> p.apply(t)).subscribe(t -> newColl.add(t)); return newColl; } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/SwingUtils.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/SwingUtils.java index 2e50afa3d..dab00959c 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/SwingUtils.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/SwingUtils.java @@ -161,7 +161,7 @@ public class SwingUtils { char[] chars = longString.toCharArray(); FontMetrics fontMetrics = jLabel1.getFontMetrics(jLabel1.getFont()); for (int beginIndex = 0, limit = 1;; limit++) { - if (beginIndex + limit >= chars.length) + if (beginIndex + limit > chars.length) break; if (fontMetrics.charsWidth(chars, beginIndex, limit) < jLabel1.getWidth()) { if (beginIndex + limit < chars.length)