New animationsublime_text launch4jlinux.cpp

This commit is contained in:
huanghongxun 2015-12-12 21:00:32 +08:00
parent 68a734adb0
commit b3fb372e3b
16 changed files with 169 additions and 52 deletions

View File

@ -80,7 +80,8 @@ jar {
}
launch4j {
launch4jCmd = 'D:\\Develop\\Java\\Launch4j\\launch4j.exe'
//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'

View File

@ -104,7 +104,7 @@ public final class Main implements Runnable {
}
public static String launcherName = "Hello Minecraft! Launcher";
public static byte firstVer = 2, secondVer = 3, thirdVer = 5, forthVer = 5;
public static byte firstVer = 2, secondVer = 3, thirdVer = 5, forthVer = 6;
public static int minimumLauncherVersion = 16;
//public static Proxy PROXY;

View File

@ -46,16 +46,16 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler {
public boolean checkThrowable(Throwable e) {
String s = StrUtils.getStackTrace(e);
if (s.contains("MessageBox") || s.contains("AWTError")) {
if (s.contains("MessageBox") || s.contains("AWTError"))
return false;
} else if (s.contains("JFileChooser") || s.contains("JceSecurityManager")) {
else if (s.contains("JFileChooser") || s.contains("JceSecurityManager")) {
System.out.println("Is not your operating system installed completely? ");
return false;
}
if (s.contains("sun.awt.shell.Win32ShellFolder2") || s.contains("UnsatisfiedLinkError")) {
System.out.println(C.i18n("crash.user_fault"));
try {
MessageBox.Show(C.i18n("crash.user_fault"));
showMessage(C.i18n("crash.user_fault"));
} catch (Throwable t) {
t.printStackTrace();
}
@ -63,7 +63,7 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler {
} else if (s.contains("java.awt.HeadlessException")) {
System.out.println(C.i18n("crash.headless"));
try {
MessageBox.Show(C.i18n("crash.headless"));
showMessage(C.i18n("crash.headless"));
} catch (Throwable t) {
t.printStackTrace();
}
@ -71,7 +71,7 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler {
} else if (s.contains("java.lang.NoClassDefFoundError") || s.contains("java.lang.VerifyError") || s.contains("java.lang.NoSuchMethodError") || s.contains("java.lang.IncompatibleClassChangeError") || s.contains("java.lang.ClassFormatError")) {
System.out.println(C.i18n("crash.NoClassDefFound"));
try {
MessageBox.Show(C.i18n("crash.NoClassDefFound"));
showMessage(C.i18n("crash.NoClassDefFound"));
} catch (Throwable t) {
t.printStackTrace();
}
@ -110,25 +110,26 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler {
reportToServer(text, s);
}
} catch (Throwable ex) {
try {
MessageBox.Show(e.getMessage() + "\n" + ex.getMessage(), "ERROR", MessageBox.ERROR_MESSAGE);
} catch (Throwable exx) {
System.out.println("Failed to catch exception thrown by " + t + " on " + Main.makeVersion() + ".");
exx.printStackTrace();
}
showMessage(e.getMessage() + "\n" + ex.getMessage());
ex.printStackTrace();
}
}
void showMessage() {
void showMessage(String s) {
try {
MessageBox.Show(s, "ERROR", MessageBox.ERROR_MESSAGE);
} catch (Throwable e) {
System.err.println("ERROR: " + s);
e.printStackTrace();
}
}
private static final HashSet<String> throwableSet = new HashSet<>();
private static final HashSet<String> THROWABLE_SET = new HashSet<>();
void reportToServer(String text, String stacktrace) {
if (throwableSet.contains(stacktrace))
if (THROWABLE_SET.contains(stacktrace))
return;
throwableSet.add(stacktrace);
THROWABLE_SET.add(stacktrace);
new Thread(() -> {
HashMap<String, String> map = new HashMap<>();
map.put("CrashReport", text);

View File

@ -0,0 +1,85 @@
/*
* Hello Minecraft! Launcher.
* Copyright (C) 2013 huangyuhui <huanghongxun2008@126.com>
*
* 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.views;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
/**
*
* @author huangyuhui
*/
public class AnimatedPanel extends JPanel {
private static final int ANIMATION_LENGTH = 10;
public AnimatedPanel() {
timer = new Timer(1, (e) -> {
SwingUtilities.invokeLater(() -> {
AnimatedPanel.this.repaint();
offsetX += 0.15;
if (offsetX >= ANIMATION_LENGTH) {
timer.stop();
AnimatedPanel.this.repaint();
}
});
});
}
double offsetX = ANIMATION_LENGTH;
Timer timer;
public void animate() {
offsetX = 0;
timer.start();
}
@Override
public void paint(Graphics g) {
double pgs = 1 - Math.sin(Math.PI / 2 / ANIMATION_LENGTH * offsetX);
if(Math.abs(ANIMATION_LENGTH - offsetX) < 0.1) {
super.paint(g);
return;
}
if (pgs > 1)
pgs = 1;
if (pgs < 0)
pgs = 0;
Graphics2D gg = (Graphics2D) g;
int width = this.getWidth();
int height = this.getHeight();
if (isOpaque()) {
g.setColor(getBackground());
g.fillRect(0, 0, width, height);
}
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = image.createGraphics();
g2d.translate((int) (pgs * 50), 0);
super.paint(g2d);
g2d.dispose();
gg.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, (float) (1 - pgs)));
g.drawImage(image, 0, 0, this);
}
}

View File

@ -5,6 +5,7 @@
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="ff" green="ff" red="ff" type="rgb"/>
</Property>
<Property name="opaque" type="boolean" value="false"/>
</Properties>
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
@ -67,6 +68,9 @@
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
<SubComponents>
<Container class="javax.swing.JPanel" name="pnlSettings">
<AuxValues>
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new AnimatedPanel()"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="&#x666e;&#x901a;&#x8bbe;&#x7f6e;">
@ -337,6 +341,9 @@
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="pnlAdvancedSettings">
<AuxValues>
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new AnimatedPanel()"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="&#x9ad8;&#x7ea7;&#x8bbe;&#x7f6e;">
@ -523,6 +530,9 @@
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="pnlModManagement">
<AuxValues>
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new AnimatedPanel()"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="Mod&#x7ba1;&#x7406;">
@ -654,6 +664,9 @@
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="pnlAutoInstall">
<AuxValues>
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new AnimatedPanel()"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="&#x81ea;&#x52a8;&#x5b89;&#x88c5;">
@ -684,6 +697,9 @@
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="pnlGameDownloads">
<AuxValues>
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new AnimatedPanel()"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="&#x6e38;&#x620f;&#x4e0b;&#x8f7d;">

View File

@ -66,13 +66,13 @@ import rx.concurrency.Schedulers;
*
* @author huangyuhui
*/
public final class GameSettingsPanel extends javax.swing.JPanel implements DropTargetListener {
public final class GameSettingsPanel extends AnimatedPanel implements DropTargetListener {
boolean isLoading = false;
public MinecraftVersionRequest minecraftVersion;
String mcVersion;
InstallerPanel installerPanels[] = new InstallerPanel[InstallerType.values().length];
final InstallerPanel installerPanels[] = new InstallerPanel[InstallerType.values().length];
/**
* Creates new form GameSettingsPanel
@ -206,6 +206,8 @@ public final class GameSettingsPanel extends javax.swing.JPanel implements DropT
@Override
public void stateChanged(ChangeEvent e) {
if (tabVersionEdit.getSelectedComponent() instanceof AnimatedPanel)
((AnimatedPanel) tabVersionEdit.getSelectedComponent()).animate();
if (tabVersionEdit.getSelectedComponent() == pnlGameDownloads && !a) {
a = true;
refreshDownloads();
@ -215,8 +217,8 @@ public final class GameSettingsPanel extends javax.swing.JPanel implements DropT
}
}
});
for (InstallerType type : InstallerType.values())
tabInstallers.addTab(type.getLocalizedName(), new InstallerPanel(this, type));
for (int i = 0; i < InstallerType.values().length; i++)
tabInstallers.addTab(InstallerType.values()[i].getLocalizedName(), installerPanels[i]);
tabInstallers.addChangeListener(new ChangeListener() {
boolean refreshed[] = new boolean[InstallerType.values().length];
@ -242,7 +244,7 @@ public final class GameSettingsPanel extends javax.swing.JPanel implements DropT
private void initComponents() {
tabVersionEdit = new javax.swing.JTabbedPane();
pnlSettings = new javax.swing.JPanel();
pnlSettings = new AnimatedPanel();
lblGameDir = new javax.swing.JLabel();
txtGameDir = new javax.swing.JTextField();
lblDimension = new javax.swing.JLabel();
@ -263,7 +265,7 @@ public final class GameSettingsPanel extends javax.swing.JPanel implements DropT
btnChoosingJavaDir = new javax.swing.JButton();
cboJava = new javax.swing.JComboBox();
btnChoosingGameDir = new javax.swing.JButton();
pnlAdvancedSettings = new javax.swing.JPanel();
pnlAdvancedSettings = new AnimatedPanel();
chkDebug = new javax.swing.JCheckBox();
lblJavaArgs = new javax.swing.JLabel();
txtJavaArgs = new javax.swing.JTextField();
@ -277,16 +279,16 @@ public final class GameSettingsPanel extends javax.swing.JPanel implements DropT
txtPrecalledCommand = new javax.swing.JTextField();
lblServerIP = new javax.swing.JLabel();
txtServerIP = new javax.swing.JTextField();
pnlModManagement = new javax.swing.JPanel();
pnlModManagement = new AnimatedPanel();
pnlModManagementContent = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
lstExternalMods = new javax.swing.JTable();
btnAddMod = new javax.swing.JButton();
btnRemoveMod = new javax.swing.JButton();
lblModInfo = new javax.swing.JLabel();
pnlAutoInstall = new javax.swing.JPanel();
pnlAutoInstall = new AnimatedPanel();
tabInstallers = new javax.swing.JTabbedPane();
pnlGameDownloads = new javax.swing.JPanel();
pnlGameDownloads = new AnimatedPanel();
btnDownload = new javax.swing.JButton();
jScrollPane2 = new javax.swing.JScrollPane();
lstDownloads = new javax.swing.JTable();
@ -310,6 +312,7 @@ public final class GameSettingsPanel extends javax.swing.JPanel implements DropT
btnCleanGame = new javax.swing.JButton();
setBackground(new java.awt.Color(255, 255, 255));
setOpaque(false);
tabVersionEdit.setName("tabVersionEdit"); // NOI18N
@ -1350,7 +1353,7 @@ public final class GameSettingsPanel extends javax.swing.JPanel implements DropT
@Override
public void drop(DropTargetDropEvent dtde) {
}
private void refreshVersions() {
getProfile().getMinecraftProvider().refreshVersions();
loadVersions();

View File

@ -37,7 +37,7 @@ import org.jackhuang.hellominecraft.utils.SwingUtils;
*
* @author huangyuhui
*/
public class InstallerPanel extends javax.swing.JPanel {
public class InstallerPanel extends AnimatedPanel {
GameSettingsPanel gsp;
@ -50,10 +50,10 @@ public class InstallerPanel extends javax.swing.JPanel {
public InstallerPanel(GameSettingsPanel gsp, InstallerType installerType) {
initComponents();
setOpaque(false);
this.gsp = gsp;
id = installerType;
list = Settings.getInstance().getDownloadSource().getProvider().getInstallerByType(id);
((DefaultTableModel) lstInstallers.getModel()).addRow(new Object[] {"hehe", "hehe"});
}
/**
@ -138,7 +138,7 @@ public class InstallerPanel extends javax.swing.JPanel {
void downloadSelectedRow() {
int idx = lstInstallers.getSelectedRow();
if (idx < 0 || idx >= versions.size()) {
if (versions == null || idx < 0 || idx >= versions.size()) {
MessageBox.Show(C.i18n("install.not_refreshed"));
return;
}
@ -147,20 +147,18 @@ public class InstallerPanel extends javax.swing.JPanel {
public void loadVersions() {
SwingUtilities.invokeLater(() -> {
versions = loadVersions(list, lstInstallers);
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)
model.addRow(new Object[] {v.selfVersion == null ? "null" : v.selfVersion, v.mcVersion == null ? "null" : v.mcVersion});
}
});
}
private List<InstallerVersionList.InstallerVersion> loadVersions(InstallerVersionList list, JTable table) {
DefaultTableModel model = (DefaultTableModel) table.getModel();
String mcver = StrUtils.formatVersion(gsp.getMinecraftVersionFormatted());
List<InstallerVersionList.InstallerVersion> ver = list.getVersions(mcver);
SwingUtils.clearDefaultTable(table);
if (ver != null)
for (InstallerVersionList.InstallerVersion v : ver)
model.addRow(new Object[] {v.selfVersion == null ? "null" : v.selfVersion, v.mcVersion == null ? "null" : v.mcVersion});
return ver;
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnInstall;

View File

@ -34,7 +34,7 @@ import rx.Observable;
*
* @author huangyuhui
*/
public class LauncherSettingsPanel extends javax.swing.JPanel {
public class LauncherSettingsPanel extends AnimatedPanel {
/**
* Creates new form LancherSettingsPanel

View File

@ -244,6 +244,7 @@ public final class MainFrame extends DraggableFrame {
}
public void selectTab(String tabName) {
boolean a = mainTab.isActive(), b = gameTab.isActive(), c = launcherTab.isActive();
this.mainTab.setIsActive(false);
this.gameTab.setIsActive(false);
this.launcherTab.setIsActive(false);
@ -255,6 +256,8 @@ public final class MainFrame extends DraggableFrame {
}
this.mainTab.setIsActive(true);
this.mainPanel.onSelected();
if (!a)
mainPanel.animate();
} else if (tabName.equalsIgnoreCase("game")) {
if (gamePanel == null) {
gamePanel = new GameSettingsPanel();
@ -262,12 +265,16 @@ public final class MainFrame extends DraggableFrame {
}
this.gameTab.setIsActive(true);
this.gamePanel.onSelected();
if (!b)
gamePanel.animate();
} else if (tabName.equalsIgnoreCase("launcher")) {
if (launcherPanel == null) {
launcherPanel = new LauncherSettingsPanel();
launcherPanelWrapper.add(launcherPanel);
}
this.launcherTab.setIsActive(true);
if (!c)
launcherPanel.animate();
}
this.infoLayout.show(this.infoSwap, tabName);

View File

@ -47,7 +47,7 @@ import org.jackhuang.hellominecraft.utils.functions.Consumer;
*
* @author huangyuhui
*/
public class MainPagePanel extends javax.swing.JPanel {
public class MainPagePanel extends AnimatedPanel {
/**
* Creates new form MainPagePanel
@ -336,6 +336,7 @@ public class MainPagePanel extends javax.swing.JPanel {
if (l.isLoggedIn())
l.logout();
cl.first(pnlPassword);
pnlPassword.repaint();
}//GEN-LAST:event_btnLogoutActionPerformed
private void txtPlayerNameKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtPlayerNameKeyPressed
@ -423,7 +424,7 @@ public class MainPagePanel extends javax.swing.JPanel {
if (0 <= loginType && loginType < cboLoginMode.getItemCount()) {
preparingAuth = false;
//cboLoginMode.setSelectedIndex(loginType);
cboLoginMode.setSelectedIndex(loginType);
cboLoginModeItemStateChanged(null);
}

View File

@ -175,7 +175,8 @@ public class TaskWindow extends javax.swing.JDialog
tasks.clear();
if (!this.failReasons.isEmpty()) {
SwingUtilities.invokeLater(() -> MessageBox.Show(StrUtils.parseParams("", failReasons.toArray(), "\n"), C.i18n("message.error"), MessageBox.ERROR_MESSAGE));
String str = StrUtils.parseParams("", failReasons.toArray(), "\n");
SwingUtilities.invokeLater(() -> MessageBox.Show(str, C.i18n("message.error"), MessageBox.ERROR_MESSAGE));
failReasons.clear();
}

View File

@ -46,7 +46,7 @@ public class SwingUtils {
* @return
*/
public static DefaultTableModel makeDefaultTableModel(String[] titleA, final Class[] typesA, final boolean[] canEditA) {
return new javax.swing.table.DefaultTableModel(
return new DefaultTableModel(
new Object[][] {},
titleA) {
Class[] types = typesA;

View File

@ -57,6 +57,7 @@ install.mcversion=\u6e38\u620f\u7248\u672c
install.time=\u65f6\u95f4
install.release_time=\u91ca\u653e\u65f6\u95f4
install.type=\u7c7b\u578b
install.please_refresh=\u5982\u9700\u4f7f\u7528\u81ea\u52a8\u5b89\u88c5\u8bf7\u70b9\u51fb\u53f3\u4fa7\u5237\u65b0\u6309\u94ae
crash.launcher=\u542f\u52a8\u5668\u5d29\u6e83\u4e86\uff01
crash.minecraft=Minecraft\u5d29\u6e83\u4e86\uff01\u8bf7\u8ba4\u771f\u9605\u8bfb\u5efa\u8bae\u3002
@ -204,7 +205,7 @@ settings.physical_memory=\u7269\u7406\u5185\u5b58\u5927\u5c0f
settings.choose_javapath=\u9009\u62e9Java\u8def\u5f84
settings.default=\u9ed8\u8ba4
settings.custom=\u81ea\u5b9a\u4e49
settings.choose_gamepath=\u9009\u62e9\u6e38\u620f\u8def\u5f84
settings.choose_gamedir=\u9009\u62e9\u6e38\u620f\u8def\u5f84
settings.failed_load=\u8bbe\u7f6e\u6587\u4ef6\u52a0\u8f7d\u5931\u8d25\uff0c\u53ef\u80fd\u662f\u5347\u7ea7\u4e86\u542f\u52a8\u5668\u6216\u88ab\u4eba\u5de5\u4fee\u6539\u9020\u6210\u9519\u8bef\uff0c\u662f\u5426\u6e05\u9664\uff1f

View File

@ -57,6 +57,7 @@ install.mcversion=Game Version
install.time=Time
install.release_time=Release Time
install.type=Type
install.please_refresh=If you want to install something, please click "Refresh" button.
crash.launcher=Launcher has crashed!
crash.minecraft=Minecraft has crashed!
@ -204,7 +205,7 @@ settings.physical_memory=Physical Memory Size
settings.choose_javapath=Choose Java Directory.
settings.default=Default
settings.custom=Custom
settings.choose_gamepath=Choose Game Directory
settings.choose_gamedir=Choose Game Directory
settings.failed_load=Failed to load settings file. Remove it?

View File

@ -57,6 +57,7 @@ install.mcversion=\u904a\u6232\u7248\u672c
install.time=\u6642\u9593
install.release_time=\u91cb\u653e\u6642\u9593
install.type=\u985e\u578b
install.please_refresh=\u5982\u9700\u4f7f\u7528\u81ea\u52a8\u5b89\u88c5\u8bf7\u70b9\u51fb\u53f3\u4fa7\u5237\u65b0\u6309\u94ae
crash.launcher=\u555f\u52d5\u5668\u5d29\u6f70\u4e86\uff01
crash.minecraft=Minecraft\u5d29\u6f70\u4e86\uff01
@ -204,7 +205,7 @@ settings.physical_memory=\u7269\u7406\u5185\u5b58\u5927\u5c0f
settings.choose_javapath=\u9009\u62e9Java\u8def\u5f84
settings.default=\u9ed8\u8a8d
settings.custom=\u81ea\u5b9a\u7fa9
settings.choose_gamepath=\u9009\u62e9\u6e38\u620f\u8def\u5f84
settings.choose_gamedir=\u9009\u62e9\u6e38\u620f\u8def\u5f84
settings.failed_load=\u8a2d\u5b9a\u6587\u4ef6\u52a0\u8f09\u5931\u6557\uff0c\u53ef\u80fd\u662f\u5347\u7d1a\u4e86\u555f\u52d5\u5668\u6216\u88ab\u4eba\u5de5\u4fee\u6539\u9020\u6210\u932f\u8aa4\uff0c\u662f\u5426\u6e05\u9664\uff1f

View File

@ -57,6 +57,7 @@ install.mcversion=\u6e38\u620f\u7248\u672c
install.time=\u65f6\u95f4
install.release_time=\u91ca\u653e\u65f6\u95f4
install.type=\u7c7b\u578b
install.please_refresh=\u5982\u9700\u4f7f\u7528\u81ea\u52a8\u5b89\u88c5\u8bf7\u70b9\u51fb\u53f3\u4fa7\u5237\u65b0\u6309\u94ae
crash.launcher=\u542f\u52a8\u5668\u5d29\u6e83\u4e86\uff01
crash.minecraft=Minecraft\u5d29\u6e83\u4e86\uff01\u8bf7\u8ba4\u771f\u9605\u8bfb\u5efa\u8bae\u3002
@ -204,7 +205,7 @@ settings.physical_memory=\u7269\u7406\u5185\u5b58\u5927\u5c0f
settings.choose_javapath=\u9009\u62e9Java\u8def\u5f84
settings.default=\u9ed8\u8ba4
settings.custom=\u81ea\u5b9a\u4e49
settings.choose_gamepath=\u9009\u62e9\u6e38\u620f\u8def\u5f84
settings.choose_gamedir=\u9009\u62e9\u6e38\u620f\u8def\u5f84
settings.failed_load=\u8bbe\u7f6e\u6587\u4ef6\u52a0\u8f7d\u5931\u8d25\uff0c\u53ef\u80fd\u662f\u5347\u7ea7\u4e86\u542f\u52a8\u5668\u6216\u88ab\u4eba\u5de5\u4fee\u6539\u9020\u6210\u9519\u8bef\uff0c\u662f\u5426\u6e05\u9664\uff1f