mirror of
https://github.com/HMCL-dev/HMCL.git
synced 2025-09-18 08:16:58 -04:00
New launcher visibility mode: hide and reopen later
This commit is contained in:
parent
7436736040
commit
a34875e804
@ -117,7 +117,7 @@ public class GameDownloadPanel extends Page {
|
|||||||
lstDownloads.requestFocus();
|
lstDownloads.requestFocus();
|
||||||
if (model.getRowCount() > 0)
|
if (model.getRowCount() > 0)
|
||||||
model.removeRow(0);
|
model.removeRow(0);
|
||||||
})).execute();
|
})).runAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
void downloadMinecraft() {
|
void downloadMinecraft() {
|
||||||
|
@ -297,7 +297,7 @@
|
|||||||
<Component class="javax.swing.JComboBox" name="cboLauncherVisibility">
|
<Component class="javax.swing.JComboBox" name="cboLauncherVisibility">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new javax.swing.DefaultComboBoxModel(new String[] { C.i18n("advancedsettings.launcher_visibility.close"), C.i18n("advancedsettings.launcher_visibility.hide"), C.i18n("advancedsettings.launcher_visibility.keep") })" type="code"/>
|
<Connection code="new javax.swing.DefaultComboBoxModel(new String[] { C.i18n("advancedsettings.launcher_visibility.close"), C.i18n("advancedsettings.launcher_visibility.hide"), C.i18n("advancedsettings.launcher_visibility.keep"),C.i18n("advancedsettings.launcher_visibility.hide_reopen") })" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Events>
|
<Events>
|
||||||
|
@ -405,7 +405,7 @@ public final class GameSettingsPanel extends RepaintPage implements DropTargetLi
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
cboLauncherVisibility.setModel(new javax.swing.DefaultComboBoxModel(new String[] { C.i18n("advancedsettings.launcher_visibility.close"), C.i18n("advancedsettings.launcher_visibility.hide"), C.i18n("advancedsettings.launcher_visibility.keep") }));
|
cboLauncherVisibility.setModel(new javax.swing.DefaultComboBoxModel(new String[] { C.i18n("advancedsettings.launcher_visibility.close"), C.i18n("advancedsettings.launcher_visibility.hide"), C.i18n("advancedsettings.launcher_visibility.keep"),C.i18n("advancedsettings.launcher_visibility.hide_reopen") }));
|
||||||
cboLauncherVisibility.addItemListener(new java.awt.event.ItemListener() {
|
cboLauncherVisibility.addItemListener(new java.awt.event.ItemListener() {
|
||||||
public void itemStateChanged(java.awt.event.ItemEvent evt) {
|
public void itemStateChanged(java.awt.event.ItemEvent evt) {
|
||||||
cboLauncherVisibilityItemStateChanged(evt);
|
cboLauncherVisibilityItemStateChanged(evt);
|
||||||
@ -950,7 +950,7 @@ public final class GameSettingsPanel extends RepaintPage implements DropTargetLi
|
|||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(layout.createSequentialGroup()
|
||||||
.addContainerGap()
|
.addContainerGap()
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(tabVersionEdit, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 766, Short.MAX_VALUE)
|
.addComponent(tabVersionEdit, javax.swing.GroupLayout.Alignment.TRAILING)
|
||||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||||
.addGap(0, 0, Short.MAX_VALUE)
|
.addGap(0, 0, Short.MAX_VALUE)
|
||||||
.addComponent(btnMakeLaunchScript)
|
.addComponent(btnMakeLaunchScript)
|
||||||
|
@ -140,9 +140,12 @@
|
|||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Component id="chkDecorated" min="-2" max="-2" attributes="0"/>
|
<Component id="chkDecorated" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
<Group type="103" groupAlignment="0" max="-2" attributes="0">
|
||||||
<Component id="btnCheckUpdate" alignment="3" min="-2" pref="26" max="-2" attributes="0"/>
|
<Component id="btnCheckUpdate" min="-2" pref="26" max="-2" attributes="0"/>
|
||||||
<Component id="btnMCBBS" alignment="3" max="32767" attributes="0"/>
|
<Group type="102" attributes="0">
|
||||||
|
<Component id="btnMCBBS" pref="26" max="32767" attributes="0"/>
|
||||||
|
<EmptySpace min="1" pref="1" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Component id="lblRestart" min="-2" max="-2" attributes="0"/>
|
<Component id="lblRestart" min="-2" max="-2" attributes="0"/>
|
||||||
|
@ -308,12 +308,12 @@ public class LauncherSettingsPanel extends RepaintPage {
|
|||||||
.addComponent(chkEnableBlur)
|
.addComponent(chkEnableBlur)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addComponent(chkEnableAnimation))
|
.addComponent(chkEnableAnimation))
|
||||||
.addComponent(lblAbout)
|
.addComponent(lblAbout, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(layout.createSequentialGroup()
|
||||||
.addComponent(btnCheckUpdate)
|
.addComponent(btnCheckUpdate)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addComponent(btnMCBBS))
|
.addComponent(btnMCBBS))
|
||||||
.addComponent(lblModpack)
|
.addComponent(lblModpack, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(lblRestart))
|
.addComponent(lblRestart))
|
||||||
.addGap(0, 0, Short.MAX_VALUE))
|
.addGap(0, 0, Short.MAX_VALUE))
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(layout.createSequentialGroup()
|
||||||
@ -382,15 +382,17 @@ public class LauncherSettingsPanel extends RepaintPage {
|
|||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addComponent(chkDecorated)
|
.addComponent(chkDecorated)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
|
||||||
.addComponent(btnCheckUpdate, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(btnCheckUpdate, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(btnMCBBS, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addComponent(btnMCBBS, javax.swing.GroupLayout.DEFAULT_SIZE, 26, Short.MAX_VALUE)
|
||||||
|
.addGap(1, 1, 1)))
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addComponent(lblRestart)
|
.addComponent(lblRestart)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addComponent(lblModpack)
|
.addComponent(lblModpack, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addComponent(lblAbout)
|
.addComponent(lblAbout, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addContainerGap())
|
.addContainerGap())
|
||||||
);
|
);
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
@ -38,6 +38,8 @@ import org.jackhuang.hmcl.util.C;
|
|||||||
import org.jackhuang.hmcl.util.MessageBox;
|
import org.jackhuang.hmcl.util.MessageBox;
|
||||||
import org.jackhuang.hmcl.api.func.Consumer;
|
import org.jackhuang.hmcl.api.func.Consumer;
|
||||||
import org.jackhuang.hmcl.api.HMCLog;
|
import org.jackhuang.hmcl.api.HMCLog;
|
||||||
|
import org.jackhuang.hmcl.api.event.SimpleEvent;
|
||||||
|
import org.jackhuang.hmcl.api.event.launch.LaunchingState;
|
||||||
import org.jackhuang.hmcl.util.DefaultPlugin;
|
import org.jackhuang.hmcl.util.DefaultPlugin;
|
||||||
import org.jackhuang.hmcl.util.sys.FileUtils;
|
import org.jackhuang.hmcl.util.sys.FileUtils;
|
||||||
import org.jackhuang.hmcl.util.sys.ProcessMonitor;
|
import org.jackhuang.hmcl.util.sys.ProcessMonitor;
|
||||||
@ -61,11 +63,12 @@ public class LaunchingUIDaemon {
|
|||||||
else {
|
else {
|
||||||
if (LogWindow.INSTANCE.isVisible())
|
if (LogWindow.INSTANCE.isVisible())
|
||||||
LogWindow.INSTANCE.setExit(() -> true);
|
LogWindow.INSTANCE.setExit(() -> true);
|
||||||
MainFrame.INSTANCE.dispose();
|
HMCLApi.EVENT_BUS.fireChannel(new LaunchingStateChangedEvent(obj, LaunchingState.WaitingForGameLaunching));
|
||||||
}
|
}
|
||||||
// We promise that JavaProcessMonitor.tag is LauncherVisibility
|
// We promise that JavaProcessMonitor.tag is LauncherVisibility
|
||||||
// See events below.
|
// See events below.
|
||||||
ProcessMonitor monitor = new ProcessMonitor(p.getValue());
|
ProcessMonitor monitor = new ProcessMonitor(p.getValue());
|
||||||
|
monitor.registerPrintlnEvent(PRINTLN);
|
||||||
monitor.setTag(tag.launcherVisibility);
|
monitor.setTag(tag.launcherVisibility);
|
||||||
monitor.start();
|
monitor.start();
|
||||||
});
|
});
|
||||||
@ -103,7 +106,7 @@ public class LaunchingUIDaemon {
|
|||||||
noExitThisTime = true;
|
noExitThisTime = true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean noExitThisTime = false;
|
boolean noExitThisTime = false;
|
||||||
|
|
||||||
void runGame(Profile profile) {
|
void runGame(Profile profile) {
|
||||||
@ -131,6 +134,15 @@ public class LaunchingUIDaemon {
|
|||||||
}, MainFrame.INSTANCE::failed, Settings.getInstance().getAuthenticator().getPassword());
|
}, MainFrame.INSTANCE::failed, Settings.getInstance().getAuthenticator().getPassword());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final Consumer<SimpleEvent<String>> PRINTLN = t -> {
|
||||||
|
LauncherVisibility l = ((LauncherVisibility) ((ProcessMonitor) t.getSource()).getTag());
|
||||||
|
if (t.getValue().contains("LWJGL Version: ") && l != LauncherVisibility.KEEP)
|
||||||
|
if (l != LauncherVisibility.HIDE_AND_REOPEN)
|
||||||
|
MainFrame.INSTANCE.dispose();
|
||||||
|
else
|
||||||
|
MainFrame.INSTANCE.setVisible(false);
|
||||||
|
};
|
||||||
|
|
||||||
private static final Consumer<LaunchingStateChangedEvent> LAUNCHING_STATE_CHANGED = t -> {
|
private static final Consumer<LaunchingStateChangedEvent> LAUNCHING_STATE_CHANGED = t -> {
|
||||||
String message = null;
|
String message = null;
|
||||||
switch (t.getValue()) {
|
switch (t.getValue()) {
|
||||||
@ -146,6 +158,9 @@ public class LaunchingUIDaemon {
|
|||||||
case DecompressingNatives:
|
case DecompressingNatives:
|
||||||
message = "launch.state.decompressing_natives";
|
message = "launch.state.decompressing_natives";
|
||||||
break;
|
break;
|
||||||
|
case WaitingForGameLaunching:
|
||||||
|
message = "launch.state.waiting_launching";
|
||||||
|
break;
|
||||||
case Done:
|
case Done:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -162,7 +177,10 @@ public class LaunchingUIDaemon {
|
|||||||
};
|
};
|
||||||
|
|
||||||
private void checkExit(LauncherVisibility v) {
|
private void checkExit(LauncherVisibility v) {
|
||||||
if (v != LauncherVisibility.KEEP && !LogWindow.INSTANCE.isVisible() && !noExitThisTime) {
|
if (v == LauncherVisibility.HIDE_AND_REOPEN) {
|
||||||
|
HMCLog.log("Launcher will not exit now.");
|
||||||
|
MainFrame.INSTANCE.setVisible(true);
|
||||||
|
} else if (v != LauncherVisibility.KEEP && !LogWindow.INSTANCE.isVisible() && !noExitThisTime) {
|
||||||
HMCLog.log("Launcher will exit now.");
|
HMCLog.log("Launcher will exit now.");
|
||||||
System.exit(0);
|
System.exit(0);
|
||||||
} else {
|
} else {
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
package org.jackhuang.hmcl.ui;
|
package org.jackhuang.hmcl.ui;
|
||||||
|
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import javax.swing.JScrollBar;
|
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
import javax.swing.text.Document;
|
import javax.swing.text.Document;
|
||||||
import javax.swing.text.SimpleAttributeSet;
|
import javax.swing.text.SimpleAttributeSet;
|
||||||
|
@ -36,5 +36,9 @@ public enum LauncherVisibility {
|
|||||||
/**
|
/**
|
||||||
* Keep the launcher visible even if the game launched successfully.
|
* Keep the launcher visible even if the game launched successfully.
|
||||||
*/
|
*/
|
||||||
KEEP;
|
KEEP,
|
||||||
|
/**
|
||||||
|
* Hide the launcher and reopen it when game closes.
|
||||||
|
*/
|
||||||
|
HIDE_AND_REOPEN
|
||||||
}
|
}
|
||||||
|
@ -27,5 +27,6 @@ public enum LaunchingState {
|
|||||||
GeneratingLaunchingCodes,
|
GeneratingLaunchingCodes,
|
||||||
DownloadingLibraries,
|
DownloadingLibraries,
|
||||||
DecompressingNatives,
|
DecompressingNatives,
|
||||||
|
WaitingForGameLaunching,
|
||||||
Done
|
Done
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ import com.google.gson.annotations.SerializedName;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import org.jackhuang.hmcl.util.C;
|
import org.jackhuang.hmcl.util.C;
|
||||||
import org.jackhuang.hmcl.util.net.NetUtils;
|
import org.jackhuang.hmcl.util.net.NetUtils;
|
||||||
import org.jackhuang.hmcl.util.AbstractSwingWorker;
|
import org.jackhuang.hmcl.util.task.TaskWorker;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -40,12 +40,12 @@ public class MinecraftRemoteVersions {
|
|||||||
public static RemoteVersionsTask getRemoteVersions(DownloadType type) {
|
public static RemoteVersionsTask getRemoteVersions(DownloadType type) {
|
||||||
return new RemoteVersionsTask(type) {
|
return new RemoteVersionsTask(type) {
|
||||||
@Override
|
@Override
|
||||||
public void work() throws Exception {
|
public void executeTask(boolean b) throws Exception {
|
||||||
synchronized (INSTANCE_LOCK) {
|
synchronized (INSTANCE_LOCK) {
|
||||||
if (INSTANCE != null)
|
if (INSTANCE != null)
|
||||||
send(INSTANCE.versions.toArray(new MinecraftRemoteVersion[INSTANCE.versions.size()]));
|
send(INSTANCE.versions.toArray(new MinecraftRemoteVersion[INSTANCE.versions.size()]));
|
||||||
else
|
else
|
||||||
super.work();
|
super.executeTask(b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -55,7 +55,7 @@ public class MinecraftRemoteVersions {
|
|||||||
return new RemoteVersionsTask(type);
|
return new RemoteVersionsTask(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class RemoteVersionsTask extends AbstractSwingWorker<MinecraftRemoteVersion> {
|
public static class RemoteVersionsTask extends TaskWorker<MinecraftRemoteVersion> {
|
||||||
|
|
||||||
DownloadType type;
|
DownloadType type;
|
||||||
|
|
||||||
@ -64,7 +64,7 @@ public class MinecraftRemoteVersions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void work() throws Exception {
|
public void executeTask(boolean b) throws Exception {
|
||||||
MinecraftRemoteVersions r = C.GSON.fromJson(NetUtils.get(type.getProvider().getVersionsListDownloadURL()), MinecraftRemoteVersions.class);
|
MinecraftRemoteVersions r = C.GSON.fromJson(NetUtils.get(type.getProvider().getVersionsListDownloadURL()), MinecraftRemoteVersions.class);
|
||||||
if (r != null && r.versions != null) {
|
if (r != null && r.versions != null) {
|
||||||
INSTANCE = r;
|
INSTANCE = r;
|
||||||
|
@ -66,7 +66,7 @@ public abstract class AbstractSwingWorker<T> extends SwingWorker<Void, T> {
|
|||||||
|
|
||||||
final List<T> lastChunks = new ArrayList<>();
|
final List<T> lastChunks = new ArrayList<>();
|
||||||
|
|
||||||
protected void send(T... t) {
|
public void send(T... t) {
|
||||||
lastChunks.addAll(Arrays.asList(t));
|
lastChunks.addAll(Arrays.asList(t));
|
||||||
publish(t);
|
publish(t);
|
||||||
}
|
}
|
||||||
|
@ -98,7 +98,7 @@ public class FileDownloadTask extends Task implements PreviousResult<File>, Prev
|
|||||||
|
|
||||||
// Download file.
|
// Download file.
|
||||||
@Override
|
@Override
|
||||||
public void executeTask(boolean areDependTasksSucceeded) throws Throwable {
|
public void executeTask(boolean areDependTasksSucceeded) throws Exception {
|
||||||
for (PreviousResult<String> p : al)
|
for (PreviousResult<String> p : al)
|
||||||
this.url = IOUtils.parseURL(p.getResult());
|
this.url = IOUtils.parseURL(p.getResult());
|
||||||
|
|
||||||
|
@ -28,6 +28,8 @@ import org.jackhuang.hmcl.util.StrUtils;
|
|||||||
import org.jackhuang.hmcl.api.HMCLog;
|
import org.jackhuang.hmcl.api.HMCLog;
|
||||||
import org.jackhuang.hmcl.util.log.Level;
|
import org.jackhuang.hmcl.util.log.Level;
|
||||||
import org.jackhuang.hmcl.api.IProcess;
|
import org.jackhuang.hmcl.api.IProcess;
|
||||||
|
import org.jackhuang.hmcl.api.event.SimpleEvent;
|
||||||
|
import org.jackhuang.hmcl.api.func.Consumer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -42,6 +44,11 @@ public class ProcessMonitor {
|
|||||||
|
|
||||||
public ProcessMonitor(IProcess p) {
|
public ProcessMonitor(IProcess p) {
|
||||||
this.p = p;
|
this.p = p;
|
||||||
|
inputThread = new ProcessThread(this, false);
|
||||||
|
errorThread = new ProcessThread(this, true);
|
||||||
|
inputThread.stopEvent.register(this::threadStopped);
|
||||||
|
inputThread.stopEvent.register(event -> processThreadStopped((ProcessThread) event.getSource()));
|
||||||
|
errorThread.stopEvent.register(this::threadStopped);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IProcess getProcess() {
|
public IProcess getProcess() {
|
||||||
@ -57,16 +64,17 @@ public class ProcessMonitor {
|
|||||||
public void setTag(Object tag) {
|
public void setTag(Object tag) {
|
||||||
this.tag = tag;
|
this.tag = tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void registerPrintlnEvent(Consumer<SimpleEvent<String>> c) {
|
||||||
|
inputThread.printlnEvent.register(c);
|
||||||
|
errorThread.printlnEvent.register(c);
|
||||||
|
}
|
||||||
|
|
||||||
public void start() {
|
public void start() {
|
||||||
MONITORS.add(this);
|
MONITORS.add(this);
|
||||||
HMCLApi.EVENT_BUS.fireChannel(new JavaProcessStartingEvent(this, p));
|
HMCLApi.EVENT_BUS.fireChannel(new JavaProcessStartingEvent(this, p));
|
||||||
inputThread = new ProcessThread(p, false);
|
|
||||||
errorThread = new ProcessThread(p, true);
|
|
||||||
inputThread.stopEvent.register(this::threadStopped);
|
|
||||||
inputThread.stopEvent.register(event -> processThreadStopped((ProcessThread) event.getSource()));
|
|
||||||
errorThread.stopEvent.register(this::threadStopped);
|
|
||||||
inputThread.start();
|
inputThread.start();
|
||||||
|
errorThread.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void threadStopped() {
|
private void threadStopped() {
|
||||||
|
@ -33,25 +33,26 @@ import org.jackhuang.hmcl.api.IProcess;
|
|||||||
*/
|
*/
|
||||||
public class ProcessThread extends Thread {
|
public class ProcessThread extends Thread {
|
||||||
|
|
||||||
IProcess p;
|
ProcessMonitor monitor;
|
||||||
boolean readError;
|
boolean readError;
|
||||||
public final EventHandler<SimpleEvent<String>> printlnEvent = new EventHandler<>();
|
public final EventHandler<SimpleEvent<String>> printlnEvent = new EventHandler<>();
|
||||||
public final EventHandler<SimpleEvent<IProcess>> stopEvent = new EventHandler<>();
|
public final EventHandler<SimpleEvent<IProcess>> stopEvent = new EventHandler<>();
|
||||||
|
|
||||||
public ProcessThread(IProcess process, boolean readError) {
|
public ProcessThread(ProcessMonitor monitor, boolean readError) {
|
||||||
p = process;
|
this.monitor = monitor;
|
||||||
this.readError = readError;
|
this.readError = readError;
|
||||||
setDaemon(readError);
|
setDaemon(readError);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IProcess getProcess() {
|
public IProcess getProcess() {
|
||||||
return p;
|
return monitor.getProcess();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
setName("ProcessMonitor");
|
setName("ProcessMonitor");
|
||||||
BufferedReader br = null;
|
BufferedReader br = null;
|
||||||
|
IProcess p = monitor.getProcess();
|
||||||
try {
|
try {
|
||||||
InputStream in = readError ? p.getRawProcess().getErrorStream() : p.getRawProcess().getInputStream();
|
InputStream in = readError ? p.getRawProcess().getErrorStream() : p.getRawProcess().getInputStream();
|
||||||
br = new BufferedReader(new InputStreamReader(in, Charsets.toCharset()));
|
br = new BufferedReader(new InputStreamReader(in, Charsets.toCharset()));
|
||||||
@ -59,12 +60,12 @@ public class ProcessThread extends Thread {
|
|||||||
String line;
|
String line;
|
||||||
while (p.isRunning())
|
while (p.isRunning())
|
||||||
while ((line = br.readLine()) != null) {
|
while ((line = br.readLine()) != null) {
|
||||||
printlnEvent.fire(new SimpleEvent<>(this, line));
|
printlnEvent.fire(new SimpleEvent<>(monitor, line));
|
||||||
System.out.println("MC: " + line);
|
System.out.println("MC: " + line);
|
||||||
p.getStdOutLines().add(line);
|
p.getStdOutLines().add(line);
|
||||||
}
|
}
|
||||||
while ((line = br.readLine()) != null) {
|
while ((line = br.readLine()) != null) {
|
||||||
printlnEvent.fire(new SimpleEvent<>(this, line));
|
printlnEvent.fire(new SimpleEvent<>(monitor, line));
|
||||||
System.out.println("MC: " + line);
|
System.out.println("MC: " + line);
|
||||||
p.getStdOutLines().add(line);
|
p.getStdOutLines().add(line);
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,7 @@ public class DeleteFileTask extends Task {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void executeTask(boolean areDependTasksSucceeded) throws Throwable {
|
public void executeTask(boolean areDependTasksSucceeded) throws IOException {
|
||||||
if (!f.delete()) throw new IOException("Failed to delete" + f);
|
if (!f.delete()) throw new IOException("Failed to delete" + f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ public class DoubleTask extends TaskInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void executeTask(boolean areDependTasksSucceeded) throws Throwable {
|
public void executeTask(boolean areDependTasksSucceeded) throws IllegalStateException {
|
||||||
if (!areDependTasksSucceeded)
|
if (!areDependTasksSucceeded)
|
||||||
throw new IllegalStateException("Depend tasks failed.");
|
throw new IllegalStateException("Depend tasks failed.");
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,7 @@ public abstract class Task {
|
|||||||
* @param areDependTasksSucceeded Would be true if all of tasks which this task depends on have succeed.
|
* @param areDependTasksSucceeded Would be true if all of tasks which this task depends on have succeed.
|
||||||
* @throws java.lang.Throwable If a task throws an exception, this task will be marked as `failed`.
|
* @throws java.lang.Throwable If a task throws an exception, this task will be marked as `failed`.
|
||||||
*/
|
*/
|
||||||
public abstract void executeTask(boolean areDependTasksSucceeded) throws Throwable;
|
public abstract void executeTask(boolean areDependTasksSucceeded) throws Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* if this func returns false, TaskList will force abort the thread. run in
|
* if this func returns false, TaskList will force abort the thread. run in
|
||||||
@ -56,10 +56,10 @@ public abstract class Task {
|
|||||||
return hidden;
|
return hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Throwable getFailReason() {
|
public Exception getFailReason() {
|
||||||
return failReason;
|
return failReason;
|
||||||
}
|
}
|
||||||
protected Throwable failReason = null;
|
protected Exception failReason = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method can be only invoked by TaskList.
|
* This method can be only invoked by TaskList.
|
||||||
|
@ -33,6 +33,7 @@ launch.state.logging_in=Logging In
|
|||||||
launch.state.generating_launching_codes=Generating Launching Codes
|
launch.state.generating_launching_codes=Generating Launching Codes
|
||||||
launch.state.downloading_libraries=Downloading dependencies
|
launch.state.downloading_libraries=Downloading dependencies
|
||||||
launch.state.decompressing_natives=Decompressing natives
|
launch.state.decompressing_natives=Decompressing natives
|
||||||
|
launch.state.waiting_launching=Waiting for game launching
|
||||||
|
|
||||||
install.no_version=The version is not found.
|
install.no_version=The version is not found.
|
||||||
install.no_version_if_intall=The required version is not found, do you wish to install the version automatically?
|
install.no_version_if_intall=The required version is not found, do you wish to install the version automatically?
|
||||||
@ -288,6 +289,7 @@ advancedsettings.Minecraft_arguments=Minecraft Arguments
|
|||||||
advancedsettings.launcher_visibility.close=Close the launcher when the game launched.
|
advancedsettings.launcher_visibility.close=Close the launcher when the game launched.
|
||||||
advancedsettings.launcher_visibility.hide=Hide the launcher when the game launched.
|
advancedsettings.launcher_visibility.hide=Hide the launcher when the game launched.
|
||||||
advancedsettings.launcher_visibility.keep=Keep the launcher visible.
|
advancedsettings.launcher_visibility.keep=Keep the launcher visible.
|
||||||
|
advancedsettings.launcher_visibility.hide_reopen=Hide the launcher and re-open when game closes.
|
||||||
advancedsettings.game_dir.default=Default (.minecraft/)
|
advancedsettings.game_dir.default=Default (.minecraft/)
|
||||||
advancedsettings.game_dir.independent=Independent (.minecraft/versions/<version name>/, except assets,libraries)
|
advancedsettings.game_dir.independent=Independent (.minecraft/versions/<version name>/, except assets,libraries)
|
||||||
advancedsettings.no_jvm_args=No Default JVM Args
|
advancedsettings.no_jvm_args=No Default JVM Args
|
||||||
|
@ -33,6 +33,7 @@ launch.state.logging_in=Logging In
|
|||||||
launch.state.generating_launching_codes=Generating Launching Codes
|
launch.state.generating_launching_codes=Generating Launching Codes
|
||||||
launch.state.downloading_libraries=Downloading dependencies
|
launch.state.downloading_libraries=Downloading dependencies
|
||||||
launch.state.decompressing_natives=Decompressing natives
|
launch.state.decompressing_natives=Decompressing natives
|
||||||
|
launch.state.waiting_launching=Waiting for game launching
|
||||||
|
|
||||||
install.no_version=The version is not found.
|
install.no_version=The version is not found.
|
||||||
install.no_version_if_intall=The required version is not found, do you wish to install the version automatically?
|
install.no_version_if_intall=The required version is not found, do you wish to install the version automatically?
|
||||||
@ -288,6 +289,7 @@ advancedsettings.Minecraft_arguments=Minecraft Arguments
|
|||||||
advancedsettings.launcher_visibility.close=Close the launcher when the game launched.
|
advancedsettings.launcher_visibility.close=Close the launcher when the game launched.
|
||||||
advancedsettings.launcher_visibility.hide=Hide the launcher when the game launched.
|
advancedsettings.launcher_visibility.hide=Hide the launcher when the game launched.
|
||||||
advancedsettings.launcher_visibility.keep=Keep the launcher visible.
|
advancedsettings.launcher_visibility.keep=Keep the launcher visible.
|
||||||
|
advancedsettings.launcher_visibility.hide_reopen=Hide the launcher and re-open when game closes.
|
||||||
advancedsettings.game_dir.default=Default (.minecraft/)
|
advancedsettings.game_dir.default=Default (.minecraft/)
|
||||||
advancedsettings.game_dir.independent=Independent (.minecraft/versions/<version name>/, except assets,libraries)
|
advancedsettings.game_dir.independent=Independent (.minecraft/versions/<version name>/, except assets,libraries)
|
||||||
advancedsettings.no_jvm_args=No Default JVM Args
|
advancedsettings.no_jvm_args=No Default JVM Args
|
||||||
|
@ -33,6 +33,7 @@ launch.state.logging_in=Đang đăng nhập...
|
|||||||
launch.state.generating_launching_codes=Đang tạo code chạy minecraft
|
launch.state.generating_launching_codes=Đang tạo code chạy minecraft
|
||||||
launch.state.downloading_libraries=Downloading...
|
launch.state.downloading_libraries=Downloading...
|
||||||
launch.state.decompressing_natives=Giải nén...
|
launch.state.decompressing_natives=Giải nén...
|
||||||
|
launch.state.waiting_launching=Waiting for game launching
|
||||||
|
|
||||||
install.no_version=Không tìm thấy phiên bản minecraft.
|
install.no_version=Không tìm thấy phiên bản minecraft.
|
||||||
install.no_version_if_intall=Phiên bản cần thiết không thấy, có nên cài đặt phiên bản tự động không?
|
install.no_version_if_intall=Phiên bản cần thiết không thấy, có nên cài đặt phiên bản tự động không?
|
||||||
@ -286,6 +287,7 @@ advancedsettings.Minecraft_arguments=Arguments của minecraft
|
|||||||
advancedsettings.launcher_visibility.close=Đóng launcher sau khi minecraft được mở.
|
advancedsettings.launcher_visibility.close=Đóng launcher sau khi minecraft được mở.
|
||||||
advancedsettings.launcher_visibility.hide=Ẩn launcher sau khi minecraft được mở.
|
advancedsettings.launcher_visibility.hide=Ẩn launcher sau khi minecraft được mở.
|
||||||
advancedsettings.launcher_visibility.keep=Để cho launcher hiển thị.
|
advancedsettings.launcher_visibility.keep=Để cho launcher hiển thị.
|
||||||
|
advancedsettings.launcher_visibility.hide_reopen=Hide the launcher and re-open when game closes.
|
||||||
advancedsettings.game_dir.default=Mặc định (.minecraft/)
|
advancedsettings.game_dir.default=Mặc định (.minecraft/)
|
||||||
advancedsettings.game_dir.independent=Independent (.minecraft/versions/<version name>/, trừ thư mục assets,libraries)
|
advancedsettings.game_dir.independent=Independent (.minecraft/versions/<version name>/, trừ thư mục assets,libraries)
|
||||||
advancedsettings.no_jvm_args=Không có arguments mặc định cho máy ảo java
|
advancedsettings.no_jvm_args=Không có arguments mặc định cho máy ảo java
|
||||||
|
@ -33,6 +33,7 @@ launch.state.logging_in=\u0110ang \u0111\u0103ng nh\u1eadp...
|
|||||||
launch.state.generating_launching_codes=\u0110ang t\u1ea1o code ch\u1ea1y minecraft
|
launch.state.generating_launching_codes=\u0110ang t\u1ea1o code ch\u1ea1y minecraft
|
||||||
launch.state.downloading_libraries=Downloading...
|
launch.state.downloading_libraries=Downloading...
|
||||||
launch.state.decompressing_natives=Gi\u1ea3i n\u00e9n...
|
launch.state.decompressing_natives=Gi\u1ea3i n\u00e9n...
|
||||||
|
launch.state.waiting_launching=Waiting for game launching
|
||||||
|
|
||||||
install.no_version=Kh\u00f4ng t\u00ecm th\u1ea5y phi\u00ean b\u1ea3n minecraft.
|
install.no_version=Kh\u00f4ng t\u00ecm th\u1ea5y phi\u00ean b\u1ea3n minecraft.
|
||||||
install.no_version_if_intall=Phi\u00ean b\u1ea3n c\u1ea7n thi\u1ebft kh\u00f4ng th\u1ea5y, c\u00f3 n\u00ean c\u00e0i \u0111\u1eb7t phi\u00ean b\u1ea3n t\u1ef1 \u0111\u1ed9ng kh\u00f4ng?
|
install.no_version_if_intall=Phi\u00ean b\u1ea3n c\u1ea7n thi\u1ebft kh\u00f4ng th\u1ea5y, c\u00f3 n\u00ean c\u00e0i \u0111\u1eb7t phi\u00ean b\u1ea3n t\u1ef1 \u0111\u1ed9ng kh\u00f4ng?
|
||||||
@ -286,6 +287,7 @@ advancedsettings.Minecraft_arguments=Arguments c\u1ee7a minecraft
|
|||||||
advancedsettings.launcher_visibility.close=\u0110\u00f3ng launcher sau khi minecraft \u0111\u01b0\u1ee3c m\u1edf.
|
advancedsettings.launcher_visibility.close=\u0110\u00f3ng launcher sau khi minecraft \u0111\u01b0\u1ee3c m\u1edf.
|
||||||
advancedsettings.launcher_visibility.hide=\u1ea8n launcher sau khi minecraft \u0111\u01b0\u1ee3c m\u1edf.
|
advancedsettings.launcher_visibility.hide=\u1ea8n launcher sau khi minecraft \u0111\u01b0\u1ee3c m\u1edf.
|
||||||
advancedsettings.launcher_visibility.keep=\u0110\u1ec3 cho launcher hi\u1ec3n th\u1ecb.
|
advancedsettings.launcher_visibility.keep=\u0110\u1ec3 cho launcher hi\u1ec3n th\u1ecb.
|
||||||
|
advancedsettings.launcher_visibility.hide_reopen=Hide the launcher and re-open when game closes.
|
||||||
advancedsettings.game_dir.default=M\u1eb7c \u0111\u1ecbnh (.minecraft/)
|
advancedsettings.game_dir.default=M\u1eb7c \u0111\u1ecbnh (.minecraft/)
|
||||||
advancedsettings.game_dir.independent=Independent (.minecraft/versions/<version name>/, tr\u1eeb th\u01b0 m\u1ee5c assets,libraries)
|
advancedsettings.game_dir.independent=Independent (.minecraft/versions/<version name>/, tr\u1eeb th\u01b0 m\u1ee5c assets,libraries)
|
||||||
advancedsettings.no_jvm_args=Kh\u00f4ng c\u00f3 arguments m\u1eb7c \u0111\u1ecbnh cho m\u00e1y \u1ea3o java
|
advancedsettings.no_jvm_args=Kh\u00f4ng c\u00f3 arguments m\u1eb7c \u0111\u1ecbnh cho m\u00e1y \u1ea3o java
|
||||||
|
@ -33,6 +33,7 @@ launch.state.logging_in=登錄中
|
|||||||
launch.state.generating_launching_codes=正在生成啟動代碼
|
launch.state.generating_launching_codes=正在生成啟動代碼
|
||||||
launch.state.downloading_libraries=正在下載必要文件
|
launch.state.downloading_libraries=正在下載必要文件
|
||||||
launch.state.decompressing_natives=正在釋放執行庫
|
launch.state.decompressing_natives=正在釋放執行庫
|
||||||
|
launch.state.waiting_launching=等待遊戲啟動
|
||||||
|
|
||||||
install.no_version=未找到要安裝的對應MC版本
|
install.no_version=未找到要安裝的對應MC版本
|
||||||
install.no_version_if_intall=未找到要安裝的對應MC版本,是否自動安裝需要的MC版本?
|
install.no_version_if_intall=未找到要安裝的對應MC版本,是否自動安裝需要的MC版本?
|
||||||
@ -288,6 +289,7 @@ advancedsettings.Minecraft_arguments=Minecraft額外參數(不必填寫)
|
|||||||
advancedsettings.launcher_visibility.close=遊戲啟動後結束啟動器
|
advancedsettings.launcher_visibility.close=遊戲啟動後結束啟動器
|
||||||
advancedsettings.launcher_visibility.hide=遊戲啟動後隱藏啟動器
|
advancedsettings.launcher_visibility.hide=遊戲啟動後隱藏啟動器
|
||||||
advancedsettings.launcher_visibility.keep=保持啟動器可見
|
advancedsettings.launcher_visibility.keep=保持啟動器可見
|
||||||
|
advancedsettings.launcher_visibility.hide_reopen=隱藏啟動器並在遊戲結束後重新打開
|
||||||
advancedsettings.game_dir.default=預設(.minecraft/)
|
advancedsettings.game_dir.default=預設(.minecraft/)
|
||||||
advancedsettings.game_dir.independent=各版本獨立(.minecraft/versions/<版本名>/,除assets,libraries)
|
advancedsettings.game_dir.independent=各版本獨立(.minecraft/versions/<版本名>/,除assets,libraries)
|
||||||
advancedsettings.no_jvm_args=不添加預設的JVM參數(使用Java9時必勾)
|
advancedsettings.no_jvm_args=不添加預設的JVM參數(使用Java9時必勾)
|
||||||
|
@ -33,6 +33,7 @@ launch.state.logging_in=\u767b\u9304\u4e2d
|
|||||||
launch.state.generating_launching_codes=\u6b63\u5728\u751f\u6210\u555f\u52d5\u4ee3\u78bc
|
launch.state.generating_launching_codes=\u6b63\u5728\u751f\u6210\u555f\u52d5\u4ee3\u78bc
|
||||||
launch.state.downloading_libraries=\u6b63\u5728\u4e0b\u8f09\u5fc5\u8981\u6587\u4ef6
|
launch.state.downloading_libraries=\u6b63\u5728\u4e0b\u8f09\u5fc5\u8981\u6587\u4ef6
|
||||||
launch.state.decompressing_natives=\u6b63\u5728\u91cb\u653e\u57f7\u884c\u5eab
|
launch.state.decompressing_natives=\u6b63\u5728\u91cb\u653e\u57f7\u884c\u5eab
|
||||||
|
launch.state.waiting_launching=\u7b49\u5f85\u904a\u6232\u555f\u52d5
|
||||||
|
|
||||||
install.no_version=\u672a\u627e\u5230\u8981\u5b89\u88dd\u7684\u5c0d\u61c9MC\u7248\u672c
|
install.no_version=\u672a\u627e\u5230\u8981\u5b89\u88dd\u7684\u5c0d\u61c9MC\u7248\u672c
|
||||||
install.no_version_if_intall=\u672a\u627e\u5230\u8981\u5b89\u88dd\u7684\u5c0d\u61c9MC\u7248\u672c\uff0c\u662f\u5426\u81ea\u52d5\u5b89\u88dd\u9700\u8981\u7684MC\u7248\u672c\uff1f
|
install.no_version_if_intall=\u672a\u627e\u5230\u8981\u5b89\u88dd\u7684\u5c0d\u61c9MC\u7248\u672c\uff0c\u662f\u5426\u81ea\u52d5\u5b89\u88dd\u9700\u8981\u7684MC\u7248\u672c\uff1f
|
||||||
@ -288,6 +289,7 @@ advancedsettings.Minecraft_arguments=Minecraft\u984d\u5916\u53c3\u6578(\u4e0d\u5
|
|||||||
advancedsettings.launcher_visibility.close=\u904a\u6232\u555f\u52d5\u5f8c\u7d50\u675f\u555f\u52d5\u5668
|
advancedsettings.launcher_visibility.close=\u904a\u6232\u555f\u52d5\u5f8c\u7d50\u675f\u555f\u52d5\u5668
|
||||||
advancedsettings.launcher_visibility.hide=\u904a\u6232\u555f\u52d5\u5f8c\u96b1\u85cf\u555f\u52d5\u5668
|
advancedsettings.launcher_visibility.hide=\u904a\u6232\u555f\u52d5\u5f8c\u96b1\u85cf\u555f\u52d5\u5668
|
||||||
advancedsettings.launcher_visibility.keep=\u4fdd\u6301\u555f\u52d5\u5668\u53ef\u898b
|
advancedsettings.launcher_visibility.keep=\u4fdd\u6301\u555f\u52d5\u5668\u53ef\u898b
|
||||||
|
advancedsettings.launcher_visibility.hide_reopen=\u96b1\u85cf\u555f\u52d5\u5668\u4e26\u5728\u904a\u6232\u7d50\u675f\u5f8c\u91cd\u65b0\u6253\u958b
|
||||||
advancedsettings.game_dir.default=\u9810\u8a2d(.minecraft/)
|
advancedsettings.game_dir.default=\u9810\u8a2d(.minecraft/)
|
||||||
advancedsettings.game_dir.independent=\u5404\u7248\u672c\u7368\u7acb(.minecraft/versions/<\u7248\u672c\u540d>/,\u9664assets,libraries)
|
advancedsettings.game_dir.independent=\u5404\u7248\u672c\u7368\u7acb(.minecraft/versions/<\u7248\u672c\u540d>/,\u9664assets,libraries)
|
||||||
advancedsettings.no_jvm_args=\u4e0d\u6dfb\u52a0\u9810\u8a2d\u7684JVM\u53c3\u6578(\u4f7f\u7528Java9\u6642\u5fc5\u52fe)
|
advancedsettings.no_jvm_args=\u4e0d\u6dfb\u52a0\u9810\u8a2d\u7684JVM\u53c3\u6578(\u4f7f\u7528Java9\u6642\u5fc5\u52fe)
|
||||||
|
@ -33,6 +33,7 @@ launch.state.logging_in=登录中
|
|||||||
launch.state.generating_launching_codes=正在生成启动代码
|
launch.state.generating_launching_codes=正在生成启动代码
|
||||||
launch.state.downloading_libraries=正在下载必要文件
|
launch.state.downloading_libraries=正在下载必要文件
|
||||||
launch.state.decompressing_natives=正在释放本地文件
|
launch.state.decompressing_natives=正在释放本地文件
|
||||||
|
launch.state.waiting_launching=等待游戏启动
|
||||||
|
|
||||||
install.no_version=未找到要安装的对应MC版本
|
install.no_version=未找到要安装的对应MC版本
|
||||||
install.no_version_if_intall=未找到要安装的对应MC版本,是否自动安装需要的MC版本?
|
install.no_version_if_intall=未找到要安装的对应MC版本,是否自动安装需要的MC版本?
|
||||||
@ -288,6 +289,7 @@ advancedsettings.Minecraft_arguments=Minecraft额外参数(不必填写)
|
|||||||
advancedsettings.launcher_visibility.close=游戏启动后结束启动器
|
advancedsettings.launcher_visibility.close=游戏启动后结束启动器
|
||||||
advancedsettings.launcher_visibility.hide=游戏启动后隐藏启动器
|
advancedsettings.launcher_visibility.hide=游戏启动后隐藏启动器
|
||||||
advancedsettings.launcher_visibility.keep=保持启动器可见
|
advancedsettings.launcher_visibility.keep=保持启动器可见
|
||||||
|
advancedsettings.launcher_visibility.hide_reopen=隐藏启动器并在游戏结束后重新打开
|
||||||
advancedsettings.game_dir.default=默认(.minecraft/)
|
advancedsettings.game_dir.default=默认(.minecraft/)
|
||||||
advancedsettings.game_dir.independent=各版本独立(.minecraft/versions/<版本名>/,除assets,libraries)
|
advancedsettings.game_dir.independent=各版本独立(.minecraft/versions/<版本名>/,除assets,libraries)
|
||||||
advancedsettings.no_jvm_args=不添加默认的JVM参数(使用Java9时必勾)
|
advancedsettings.no_jvm_args=不添加默认的JVM参数(使用Java9时必勾)
|
||||||
|
@ -33,6 +33,7 @@ launch.state.logging_in=\u767b\u5f55\u4e2d
|
|||||||
launch.state.generating_launching_codes=\u6b63\u5728\u751f\u6210\u542f\u52a8\u4ee3\u7801
|
launch.state.generating_launching_codes=\u6b63\u5728\u751f\u6210\u542f\u52a8\u4ee3\u7801
|
||||||
launch.state.downloading_libraries=\u6b63\u5728\u4e0b\u8f7d\u5fc5\u8981\u6587\u4ef6
|
launch.state.downloading_libraries=\u6b63\u5728\u4e0b\u8f7d\u5fc5\u8981\u6587\u4ef6
|
||||||
launch.state.decompressing_natives=\u6b63\u5728\u91ca\u653e\u672c\u5730\u6587\u4ef6
|
launch.state.decompressing_natives=\u6b63\u5728\u91ca\u653e\u672c\u5730\u6587\u4ef6
|
||||||
|
launch.state.waiting_launching=\u7b49\u5f85\u6e38\u620f\u542f\u52a8
|
||||||
|
|
||||||
install.no_version=\u672a\u627e\u5230\u8981\u5b89\u88c5\u7684\u5bf9\u5e94MC\u7248\u672c
|
install.no_version=\u672a\u627e\u5230\u8981\u5b89\u88c5\u7684\u5bf9\u5e94MC\u7248\u672c
|
||||||
install.no_version_if_intall=\u672a\u627e\u5230\u8981\u5b89\u88c5\u7684\u5bf9\u5e94MC\u7248\u672c\uff0c\u662f\u5426\u81ea\u52a8\u5b89\u88c5\u9700\u8981\u7684MC\u7248\u672c\uff1f
|
install.no_version_if_intall=\u672a\u627e\u5230\u8981\u5b89\u88c5\u7684\u5bf9\u5e94MC\u7248\u672c\uff0c\u662f\u5426\u81ea\u52a8\u5b89\u88c5\u9700\u8981\u7684MC\u7248\u672c\uff1f
|
||||||
@ -288,6 +289,7 @@ advancedsettings.Minecraft_arguments=Minecraft\u989d\u5916\u53c2\u6570(\u4e0d\u5
|
|||||||
advancedsettings.launcher_visibility.close=\u6e38\u620f\u542f\u52a8\u540e\u7ed3\u675f\u542f\u52a8\u5668
|
advancedsettings.launcher_visibility.close=\u6e38\u620f\u542f\u52a8\u540e\u7ed3\u675f\u542f\u52a8\u5668
|
||||||
advancedsettings.launcher_visibility.hide=\u6e38\u620f\u542f\u52a8\u540e\u9690\u85cf\u542f\u52a8\u5668
|
advancedsettings.launcher_visibility.hide=\u6e38\u620f\u542f\u52a8\u540e\u9690\u85cf\u542f\u52a8\u5668
|
||||||
advancedsettings.launcher_visibility.keep=\u4fdd\u6301\u542f\u52a8\u5668\u53ef\u89c1
|
advancedsettings.launcher_visibility.keep=\u4fdd\u6301\u542f\u52a8\u5668\u53ef\u89c1
|
||||||
|
advancedsettings.launcher_visibility.hide_reopen=\u9690\u85cf\u542f\u52a8\u5668\u5e76\u5728\u6e38\u620f\u7ed3\u675f\u540e\u91cd\u65b0\u6253\u5f00
|
||||||
advancedsettings.game_dir.default=\u9ed8\u8ba4(.minecraft/)
|
advancedsettings.game_dir.default=\u9ed8\u8ba4(.minecraft/)
|
||||||
advancedsettings.game_dir.independent=\u5404\u7248\u672c\u72ec\u7acb(.minecraft/versions/<\u7248\u672c\u540d>/,\u9664assets,libraries)
|
advancedsettings.game_dir.independent=\u5404\u7248\u672c\u72ec\u7acb(.minecraft/versions/<\u7248\u672c\u540d>/,\u9664assets,libraries)
|
||||||
advancedsettings.no_jvm_args=\u4e0d\u6dfb\u52a0\u9ed8\u8ba4\u7684JVM\u53c2\u6570(\u4f7f\u7528Java9\u65f6\u5fc5\u52fe)
|
advancedsettings.no_jvm_args=\u4e0d\u6dfb\u52a0\u9ed8\u8ba4\u7684JVM\u53c2\u6570(\u4f7f\u7528Java9\u65f6\u5fc5\u52fe)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user