2018-01-16 19:34:53 +08:00
|
|
|
/*
|
|
|
|
|
* Hello Minecraft! Launcher.
|
2018-02-20 18:03:34 +08:00
|
|
|
* Copyright (C) 2018 huangyuhui <huanghongxun2008@126.com>
|
2018-01-16 19:34:53 +08:00
|
|
|
*
|
|
|
|
|
* 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.hmcl;
|
|
|
|
|
|
|
|
|
|
import com.jfoenix.concurrency.JFXUtilities;
|
|
|
|
|
import javafx.application.Application;
|
|
|
|
|
import javafx.application.Platform;
|
|
|
|
|
import javafx.stage.Stage;
|
|
|
|
|
import org.jackhuang.hmcl.setting.Settings;
|
|
|
|
|
import org.jackhuang.hmcl.task.Schedulers;
|
2018-01-27 16:16:38 +08:00
|
|
|
import org.jackhuang.hmcl.task.Task;
|
2018-01-16 19:34:53 +08:00
|
|
|
import org.jackhuang.hmcl.ui.Controllers;
|
2018-02-20 18:03:34 +08:00
|
|
|
import org.jackhuang.hmcl.upgrade.AppDataUpgrader;
|
2018-01-27 16:16:38 +08:00
|
|
|
import org.jackhuang.hmcl.upgrade.IUpgrader;
|
|
|
|
|
import org.jackhuang.hmcl.upgrade.UpdateChecker;
|
2018-01-16 19:34:53 +08:00
|
|
|
import org.jackhuang.hmcl.util.*;
|
|
|
|
|
|
|
|
|
|
import java.io.File;
|
2018-01-27 16:16:38 +08:00
|
|
|
import java.util.Arrays;
|
2018-01-16 19:34:53 +08:00
|
|
|
import java.util.ResourceBundle;
|
2018-02-18 13:54:13 +08:00
|
|
|
import java.util.concurrent.TimeUnit;
|
2018-01-16 19:34:53 +08:00
|
|
|
import java.util.logging.Level;
|
|
|
|
|
|
|
|
|
|
public final class Main extends Application {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void start(Stage primaryStage) {
|
2018-02-02 17:45:29 +08:00
|
|
|
Thread.currentThread().setUncaughtExceptionHandler(CRASH_REPORTER);
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// When launcher visibility is set to "hide and reopen" without Platform.implicitExit = false,
|
|
|
|
|
// Stage.show() cannot work again because JavaFX Toolkit have already shut down.
|
|
|
|
|
Platform.setImplicitExit(false);
|
|
|
|
|
Controllers.initialize(primaryStage);
|
|
|
|
|
primaryStage.setResizable(false);
|
|
|
|
|
primaryStage.setScene(Controllers.getScene());
|
|
|
|
|
primaryStage.show();
|
|
|
|
|
} catch (Throwable e) {
|
|
|
|
|
CRASH_REPORTER.uncaughtException(Thread.currentThread(), e);
|
|
|
|
|
}
|
2018-01-16 19:34:53 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void main(String[] args) {
|
2018-02-02 17:45:29 +08:00
|
|
|
Thread.setDefaultUncaughtExceptionHandler(CRASH_REPORTER);
|
2018-01-27 16:16:38 +08:00
|
|
|
|
2018-02-02 17:45:29 +08:00
|
|
|
try {
|
|
|
|
|
// NetworkUtils.setUserAgentSupplier(() -> "Hello Minecraft! Launcher");
|
|
|
|
|
Constants.UI_THREAD_SCHEDULER = Constants.JAVAFX_UI_THREAD_SCHEDULER;
|
2018-02-20 18:03:34 +08:00
|
|
|
UPGRADER.parseArguments(VersionNumber.asVersion(VERSION), Arrays.asList(args));
|
2018-02-02 17:45:29 +08:00
|
|
|
|
|
|
|
|
Logging.LOG.info("*** " + TITLE + " ***");
|
|
|
|
|
|
|
|
|
|
UPDATE_CHECKER.process(false)
|
|
|
|
|
.then(Task.of(Schedulers.javafx(), () -> {
|
|
|
|
|
if (UPDATE_CHECKER.isOutOfDate())
|
|
|
|
|
Controllers.showUpdate();
|
|
|
|
|
}))
|
|
|
|
|
.start();
|
|
|
|
|
|
|
|
|
|
launch(args);
|
|
|
|
|
} catch (Throwable e) { // Fucking JavaFX will suppress the exception and will break our crash reporter.
|
|
|
|
|
CRASH_REPORTER.uncaughtException(Thread.currentThread(), e);
|
|
|
|
|
}
|
2018-01-16 19:34:53 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void stopApplication() {
|
|
|
|
|
JFXUtilities.runInFX(() -> {
|
|
|
|
|
stopWithoutPlatform();
|
|
|
|
|
Platform.exit();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void stopWithoutPlatform() {
|
|
|
|
|
JFXUtilities.runInFX(() -> {
|
2018-02-27 23:12:53 +08:00
|
|
|
if (Controllers.getStage() == null)
|
|
|
|
|
return;
|
2018-01-16 19:34:53 +08:00
|
|
|
Controllers.getStage().close();
|
2018-02-05 23:53:57 +08:00
|
|
|
|
|
|
|
|
Logging.LOG.info("Shutting down executor services.");
|
2018-01-16 19:34:53 +08:00
|
|
|
Schedulers.shutdown();
|
2018-02-18 13:54:13 +08:00
|
|
|
|
|
|
|
|
Controllers.shutdown();
|
|
|
|
|
|
|
|
|
|
Lang.executeDelayed(OperatingSystem::forceGC, TimeUnit.SECONDS, 5, true);
|
2018-01-16 19:34:53 +08:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static String i18n(String key) {
|
|
|
|
|
try {
|
|
|
|
|
return RESOURCE_BUNDLE.getString(key);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
Logging.LOG.log(Level.SEVERE, "Cannot find key " + key + " in resource bundle", e);
|
|
|
|
|
return key;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-01-20 11:18:59 +08:00
|
|
|
public static String i18n(String key, Object... formatArgs) {
|
|
|
|
|
return String.format(i18n(key), formatArgs);
|
|
|
|
|
}
|
|
|
|
|
|
2018-01-16 19:34:53 +08:00
|
|
|
public static File getWorkingDirectory(String folder) {
|
|
|
|
|
String home = System.getProperty("user.home", ".");
|
|
|
|
|
switch (OperatingSystem.CURRENT_OS) {
|
|
|
|
|
case LINUX:
|
|
|
|
|
return new File(home, "." + folder + "/");
|
|
|
|
|
case WINDOWS:
|
|
|
|
|
String appdata = System.getenv("APPDATA");
|
|
|
|
|
return new File(Lang.nonNull(appdata, home), "." + folder + "/");
|
|
|
|
|
case OSX:
|
|
|
|
|
return new File(home, "Library/Application Support/" + folder);
|
|
|
|
|
default:
|
|
|
|
|
return new File(home, folder + "/");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static final File MINECRAFT_DIRECTORY = getWorkingDirectory("minecraft");
|
2018-02-17 11:01:08 +08:00
|
|
|
public static final File HMCL_DIRECTORY = getWorkingDirectory("hmcl");
|
2018-01-16 19:34:53 +08:00
|
|
|
|
|
|
|
|
public static final String VERSION = "@HELLO_MINECRAFT_LAUNCHER_VERSION_FOR_GRADLE_REPLACING@";
|
|
|
|
|
public static final String NAME = "HMCL";
|
|
|
|
|
public static final String TITLE = NAME + " " + VERSION;
|
|
|
|
|
public static final ResourceBundle RESOURCE_BUNDLE = Settings.INSTANCE.getLocale().getResourceBundle();
|
2018-02-02 17:45:29 +08:00
|
|
|
public static final UpdateChecker UPDATE_CHECKER = new UpdateChecker(VersionNumber.asVersion(VERSION));
|
2018-02-20 18:03:34 +08:00
|
|
|
public static final IUpgrader UPGRADER = new AppDataUpgrader();
|
2018-02-02 17:45:29 +08:00
|
|
|
public static final CrashReporter CRASH_REPORTER = new CrashReporter();
|
2018-01-27 16:16:38 +08:00
|
|
|
|
|
|
|
|
public static final String CONTACT = "http://huangyuhui.duapp.com/hmcl.php";
|
|
|
|
|
public static final String PUBLISH = "http://www.mcbbs.net/thread-142335-1-1.html";
|
2018-01-16 19:34:53 +08:00
|
|
|
}
|