Inceptum/src/main/java/io/gitlab/jfronny/inceptum/windows/MainWindow.java

202 lines
9.9 KiB
Java
Raw Normal View History

2021-10-29 22:50:42 +02:00
package io.gitlab.jfronny.inceptum.windows;
2021-10-27 22:00:08 +02:00
import imgui.ImGui;
2021-10-28 23:27:47 +02:00
import imgui.flag.ImGuiTableFlags;
2021-10-28 21:31:51 +02:00
import imgui.flag.ImGuiWindowFlags;
import imgui.type.ImBoolean;
2021-10-29 22:50:42 +02:00
import imgui.type.ImInt;
import io.gitlab.jfronny.inceptum.Inceptum;
import io.gitlab.jfronny.inceptum.model.inceptum.InstanceMeta;
2021-10-29 22:50:42 +02:00
import io.gitlab.jfronny.inceptum.model.mojang.MinecraftArgument;
import io.gitlab.jfronny.inceptum.model.mojang.VersionInfo;
import io.gitlab.jfronny.inceptum.model.mojang.VersionsListInfo;
import io.gitlab.jfronny.inceptum.util.MapAppender;
import io.gitlab.jfronny.inceptum.util.ProcessUtils;
2021-10-29 22:50:42 +02:00
import io.gitlab.jfronny.inceptum.util.Utils;
import io.gitlab.jfronny.inceptum.util.VersionInfoLibraryResolver;
import io.gitlab.jfronny.inceptum.util.api.FabricMetaApi;
import io.gitlab.jfronny.inceptum.util.api.McApi;
import io.gitlab.jfronny.inceptum.util.api.account.AccountManager;
import io.gitlab.jfronny.inceptum.util.api.account.AuthInfo;
import io.gitlab.jfronny.inceptum.util.api.account.MicrosoftAccount;
2021-10-28 23:27:47 +02:00
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
2021-10-27 22:00:08 +02:00
public class MainWindow extends Window {
2021-10-29 22:50:42 +02:00
private final ImBoolean darkTheme = new ImBoolean(Inceptum.CONFIG.darkTheme);
2021-10-28 21:31:51 +02:00
private final ImBoolean debugTools = new ImBoolean(false);
2021-10-29 22:50:42 +02:00
private final ImInt accountIndex = new ImInt(0);
2021-10-27 22:00:08 +02:00
public MainWindow() {
2021-10-29 22:50:42 +02:00
super("Inceptum");
2021-10-27 22:00:08 +02:00
}
2021-10-28 21:31:51 +02:00
@Override
public int getFlags() {
return ImGuiWindowFlags.MenuBar | ImGuiWindowFlags.AlwaysAutoResize;
}
2021-10-27 22:00:08 +02:00
@Override
public void draw() {
2021-10-28 21:31:51 +02:00
ImGui.beginMenuBar();
if (ImGui.beginMenu("File")) {
2021-10-29 22:50:42 +02:00
if (ImGui.menuItem("New Instance")) Inceptum.open(new NewInstanceWindow());
if (ImGui.menuItem("Exit Inceptum")) Inceptum.exit();
ImGui.endMenu();
}
if (ImGui.beginMenu("Account")) {
if (ImGui.menuItem("New")) Inceptum.open(new MicrosoftLoginWindow());
AuthInfo selected = AccountManager.getSelectedAccount();
List<MicrosoftAccount> accounts = AccountManager.getAccounts();
for (int i = 0, accountsSize = accounts.size(); i < accountsSize; i++) {
MicrosoftAccount account = accounts.get(i);
if (selected.equals(account)) accountIndex.set(i);
if (ImGui.radioButton(account.minecraftUsername, accountIndex, i)) {
AccountManager.switchAccount(account);
}
ImGui.sameLine();
if (ImGui.button("X")) AccountManager.removeAccount(account);
}
2021-10-28 21:31:51 +02:00
ImGui.endMenu();
}
if (ImGui.beginMenu("Settings")) {
if (ImGui.checkbox("Dark Theme", darkTheme)) {
2021-10-29 22:50:42 +02:00
Inceptum.CONFIG.darkTheme = darkTheme.get();
Inceptum.saveConfig();
Inceptum.applyTheme();
2021-10-28 21:31:51 +02:00
}
ImGui.endMenu();
}
if (ImGui.beginMenu("Help")) {
2021-10-29 22:50:42 +02:00
if (ImGui.menuItem("About")) Inceptum.open(new AboutWindow());
if (ImGui.menuItem("Log")) Inceptum.open(new LogWindow(MapAppender.LOG));
2021-10-28 21:31:51 +02:00
ImGui.checkbox("Debug Tools", debugTools);
ImGui.endMenu();
}
ImGui.endMenuBar();
if (debugTools.get()) {
ImGui.showDemoWindow();
}
List<Path> paths;
try {
paths = Files.list(Inceptum.INSTANCE_DIR).filter(Files::isDirectory).toList();
} catch (IOException e) {
Inceptum.LOGGER.error("Could not list instances");
return;
}
if (paths.isEmpty()) {
2021-10-28 23:27:47 +02:00
ImGui.text("You have not yet created an instance");
ImGui.text("Use File->New Instance to do so");
}
else if (ImGui.beginTable("Instances", 2, ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.Borders)) {
for (Path path : paths) {
if (Files.exists(path.resolve("inceptum.setup.lock"))) {
2021-10-28 23:27:47 +02:00
ImGui.tableNextColumn();
ImGui.text("Setting up");
ImGui.tableNextColumn();
ImGui.text("This instance is currently being set up");
continue;
}
if (!Files.exists(path.resolve("instance.json"))) {
Inceptum.LOGGER.error("Invalid instance (doesn't contain instance.json): " + path);
continue;
}
InstanceMeta instance;
try {
instance = Utils.loadObject(path.resolve("instance.json"), InstanceMeta.class);
} catch (IOException e) {
Inceptum.LOGGER.error("Could not load instance.json", e);
continue;
}
ImGui.tableNextColumn();
boolean disabled = false;
if (Files.exists(path.resolve("inceptum.lock"))) {
try {
if (ProcessUtils.isProcessAlive(Files.readString(path.resolve("inceptum.lock"))))
disabled = true;
else Files.delete(path.resolve("inceptum.lock"));
}
catch (IOException e) {
continue;
}
}
if (disabled) ImGui.beginDisabled();
if (ImGui.button(path.getFileName().toString())) {
//TODO extract launch logic to separate class
for (VersionsListInfo version : McApi.getVersions().versions) {
if (version.id.equals(instance.getMinecraftVersion())) {
try {
List<String> args = new ArrayList<>();
args.add("/lib/jvm/java-17-openjdk/bin/java"); //TODO allow selecting vm, detect with System.getProperty("java.home")
VersionInfo info = McApi.getVersionInfo(version);
if (instance.isFabric()) {
FabricMetaApi.addFabric(info, instance.getLoaderVersion());
}
StringBuilder classPath = new StringBuilder();
for (VersionInfo.Library.Downloads.Artifact artifact : VersionInfoLibraryResolver.getRelevant(info)) {
classPath.append(Inceptum.LIBRARIES_DIR.resolve(artifact.path).toAbsolutePath());
classPath.append(':');
2021-10-28 23:27:47 +02:00
}
classPath.append(Inceptum.LIBRARIES_DIR.resolve("net/minecraft/minecraft").resolve(version.id + ".jar").toAbsolutePath());
//TODO -Xms{lowMem} -Xmx{maxMem}
args.addAll(parse(info.arguments.jvm, info, instance, classPath.toString(), path.toAbsolutePath().toString()));
args.add(info.mainClass);
args.addAll(parse(info.arguments.game, info, instance, classPath.toString(), path.toAbsolutePath().toString()));
Inceptum.LOGGER.info(String.join(" ", args));
ProcessBuilder pb = new ProcessBuilder(args.toArray(new String[0]));
pb.directory(path.toFile());
pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
pb.redirectError(ProcessBuilder.Redirect.INHERIT);
Files.writeString(path.resolve("inceptum.lock"), Long.toString(pb.start().pid()));
} catch (IOException e) {
e.printStackTrace();
2021-10-28 23:27:47 +02:00
}
}
}
}
ImGui.tableNextColumn();
if (ImGui.button("Edit")) {
Inceptum.LOGGER.error("Editing not yet implemented"); //TODO allow changing name (moving), changing version, managing mods etc
}
if (disabled) ImGui.endDisabled();
2021-10-28 23:27:47 +02:00
}
ImGui.endTable();
2021-10-28 23:27:47 +02:00
}
}
private List<String> parse(List<MinecraftArgument> arguments, VersionInfo info, InstanceMeta instance, String classPath, String gameDirectory) {
2021-10-28 23:27:47 +02:00
List<String> res = new ArrayList<>();
for (MinecraftArgument argument : arguments) {
for (String s : argument.arg()) {
//TODO support old versions
2021-10-29 22:50:42 +02:00
AuthInfo authInfo = AccountManager.getSelectedAccount();
2021-10-28 23:27:47 +02:00
res.add(s
// game args
2021-10-29 22:50:42 +02:00
.replace("${auth_player_name}", authInfo.name())
.replace("${version_name}", instance.getMinecraftVersion())
.replace("${game_directory}", gameDirectory)
2021-10-29 22:50:42 +02:00
.replace("${assets_root}", Inceptum.ASSETS_DIR.toAbsolutePath().toString())
2021-10-28 23:27:47 +02:00
.replace("${assets_index_name}", info.assets)
2021-10-29 22:50:42 +02:00
.replace("${auth_uuid}", authInfo.uuid())
.replace("${auth_access_token}", authInfo.accessToken())
.replace("${user_type}", authInfo.userType())
2021-10-28 23:27:47 +02:00
.replace("${version_type}", info.type)
.replace("${resolution_width}", "1920") //TODO has_custom_resolution
.replace("${resolution_height}", "1080") //TODO has_custom_resolution
// jvm args
2021-10-29 22:50:42 +02:00
.replace("${natives_directory}", Inceptum.INSTANCE_DIR.toAbsolutePath().toString())
.replace("${launcher_name}", "Inceptum")
.replace("${launcher_version}", Inceptum.VERSION.version) //TODO automatically fill in
2021-10-28 23:27:47 +02:00
.replace("${classpath}", classPath)
);
}
}
return res;
2021-10-27 22:00:08 +02:00
}
}