187 lines
8.4 KiB
Java
187 lines
8.4 KiB
Java
// SPDX-FileCopyrightText: Copyright (C) 2021 The HMCL Authors
|
|
// SPDX-License-Identifier: GPL-3.0-or-later WITH AdditionRef-HMCL
|
|
package org.jackhuang.hmcl;
|
|
|
|
import org.jackhuang.hmcl.util.StringUtils;
|
|
import org.jackhuang.hmcl.util.io.JarUtils;
|
|
import org.jackhuang.hmcl.util.platform.Architecture;
|
|
import org.jackhuang.hmcl.util.platform.OperatingSystem;
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
import java.nio.file.Files;
|
|
import java.nio.file.Path;
|
|
import java.util.EnumSet;
|
|
|
|
/**
|
|
* Stores metadata about this application.
|
|
*/
|
|
public final class Metadata {
|
|
private Metadata() {
|
|
}
|
|
|
|
public static final String NAME = "HMCL";
|
|
public static final String FULL_NAME = "Hello Minecraft! Launcher";
|
|
public static final String VERSION = System.getProperty("hmcl.version.override", JarUtils.getAttribute("hmcl.version", "@develop@"));
|
|
|
|
/// Explicit Application User Model ID used for Windows taskbar grouping and pinning.
|
|
public static final String WINDOWS_APP_USER_MODEL_ID = "org.jackhuang.hmcl";
|
|
|
|
public static final String TITLE = NAME + " " + VERSION;
|
|
|
|
/// Whether the build metadata identifies this launcher as an official build.
|
|
public static final boolean OFFICIAL_BUILD = Boolean.parseBoolean(JarUtils.getAttribute("hmcl.official", "false"));
|
|
|
|
public static final int MINIMUM_REQUIRED_JAVA_VERSION = 17;
|
|
public static final int MINIMUM_SUPPORTED_JAVA_VERSION = 17;
|
|
public static final int RECOMMENDED_JAVA_VERSION = 25;
|
|
|
|
public static final String DOCS_URL = "https://docs.hmcl.net";
|
|
public static final String EULA_URL = DOCS_URL + "/eula/hmcl.html";
|
|
|
|
public static final String BUILD_CHANNEL = JarUtils.getAttribute("hmcl.version.type", "nightly");
|
|
public static final String GITHUB_SHA = JarUtils.getAttribute("hmcl.version.hash", null);
|
|
|
|
public static final Path CURRENT_DIRECTORY = Path.of(System.getProperty("user.dir")).toAbsolutePath().normalize();
|
|
public static final Path MINECRAFT_DIRECTORY = OperatingSystem.getWorkingDirectory("minecraft");
|
|
public static final Path HMCL_USER_HOME;
|
|
public static final Path HMCL_LOCAL_HOME;
|
|
public static final Path DEPENDENCIES_DIRECTORY;
|
|
|
|
static {
|
|
String hmclHome = System.getProperty("hmcl.home", System.getenv("HMCL_USER_HOME"));
|
|
if (StringUtils.isBlank(hmclHome)) {
|
|
if (OperatingSystem.CURRENT_OS.isLinuxOrBSD()) {
|
|
String xdgData = System.getenv("XDG_DATA_HOME");
|
|
if (StringUtils.isNotBlank(xdgData)) {
|
|
HMCL_USER_HOME = Path.of(xdgData, "hmcl").toAbsolutePath().normalize();
|
|
} else {
|
|
HMCL_USER_HOME = Path.of(System.getProperty("user.home"), ".local", "share", "hmcl").toAbsolutePath().normalize();
|
|
}
|
|
} else {
|
|
HMCL_USER_HOME = OperatingSystem.getWorkingDirectory("hmcl");
|
|
}
|
|
} else {
|
|
HMCL_USER_HOME = Path.of(hmclHome).toAbsolutePath().normalize();
|
|
}
|
|
|
|
String hmclCurrentDir = System.getProperty("hmcl.dir", System.getenv("HMCL_LOCAL_HOME"));
|
|
HMCL_LOCAL_HOME = StringUtils.isNotBlank(hmclCurrentDir)
|
|
? Path.of(hmclCurrentDir).toAbsolutePath().normalize()
|
|
: CURRENT_DIRECTORY.resolve(".hmcl");
|
|
|
|
String hmclDependencies = System.getProperty("hmcl.dependencies.dir", System.getenv("HMCL_DEPENDENCIES_DIR"));
|
|
DEPENDENCIES_DIRECTORY = StringUtils.isNotBlank(hmclDependencies)
|
|
? Path.of(hmclDependencies).toAbsolutePath().normalize()
|
|
: HMCL_LOCAL_HOME.resolve("dependencies");
|
|
}
|
|
|
|
public static boolean isStable() {
|
|
return "stable".equals(BUILD_CHANNEL);
|
|
}
|
|
|
|
public static boolean isDev() {
|
|
return "dev".equals(BUILD_CHANNEL);
|
|
}
|
|
|
|
public static boolean isNightly() {
|
|
return !isStable() && !isDev();
|
|
}
|
|
|
|
public static @Nullable String getSuggestedJavaDownloadLink() {
|
|
if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX && Architecture.SYSTEM_ARCH == Architecture.LOONGARCH64_OW)
|
|
return "https://www.loongnix.cn/zh/api/java/downloads-jdk25/index.html";
|
|
else {
|
|
EnumSet<Architecture> supportedArchitectures;
|
|
if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS)
|
|
supportedArchitectures = EnumSet.of(Architecture.X86_64, Architecture.X86, Architecture.ARM64);
|
|
else if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX)
|
|
supportedArchitectures = EnumSet.of(
|
|
Architecture.X86_64, Architecture.X86,
|
|
Architecture.ARM64, Architecture.ARM32,
|
|
Architecture.RISCV64, Architecture.LOONGARCH64
|
|
);
|
|
else if (OperatingSystem.CURRENT_OS == OperatingSystem.MACOS)
|
|
supportedArchitectures = EnumSet.of(Architecture.X86_64, Architecture.ARM64);
|
|
else
|
|
supportedArchitectures = EnumSet.noneOf(Architecture.class);
|
|
if (supportedArchitectures.contains(Architecture.SYSTEM_ARCH))
|
|
return String.format("https://docs.hmcl.net/downloads/%s/%s.html",
|
|
OperatingSystem.CURRENT_OS.getCheckedName(),
|
|
Architecture.SYSTEM_ARCH.getCheckedName()
|
|
);
|
|
else
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/// Directory under [HMCL_LOCAL_HOME] that holds a launcher-bundled modpack for automatic install.
|
|
public static final String BUNDLED_MODPACK_DIRECTORY_NAME = "modpack";
|
|
|
|
/// Returns the directory for a launcher-bundled modpack (`[HMCL_LOCAL_HOME]/modpack`).
|
|
public static Path getBundledModpackDirectory() {
|
|
return HMCL_LOCAL_HOME.resolve(BUNDLED_MODPACK_DIRECTORY_NAME);
|
|
}
|
|
|
|
/// Returns the bundled modpack package under [getBundledModpackDirectory], if present.
|
|
///
|
|
/// Prefers `modpack.zip` over `modpack.mrpack` when both exist. Presence of the package is the
|
|
/// signal to offer automatic install; the file is removed after a successful install.
|
|
///
|
|
/// @return the modpack path, or `null` when no package is present
|
|
public static @Nullable Path findBundledModpackFile() {
|
|
Path directory = getBundledModpackDirectory();
|
|
Path zipModpack = directory.resolve("modpack.zip");
|
|
if (Files.isRegularFile(zipModpack)) {
|
|
return zipModpack;
|
|
}
|
|
Path mrpackModpack = directory.resolve("modpack.mrpack");
|
|
if (Files.isRegularFile(mrpackModpack)) {
|
|
return mrpackModpack;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/// Default client Server Modpack fileApi: the Nexus raw repository `tdlm-client` read through the CDN host.
|
|
public static final String DEFAULT_CLIENT_FILE_API =
|
|
"https://maven.dandanton.com/repository/tdlm-client";
|
|
|
|
/// Stable client update root (`server-manifest.json` and `overrides/` live under this URL).
|
|
///
|
|
/// Override with system property `hmcl.client.fileApi` or jar attribute `hmcl.client.fileApi`.
|
|
public static String getClientFileApi() {
|
|
String fromProperty = System.getProperty("hmcl.client.fileApi", "").trim();
|
|
if (StringUtils.isNotBlank(fromProperty)) {
|
|
return StringUtils.removeSuffix(fromProperty, "/");
|
|
}
|
|
String fromJar = JarUtils.getAttribute("hmcl.client.fileApi", null);
|
|
if (StringUtils.isNotBlank(fromJar)) {
|
|
return StringUtils.removeSuffix(fromJar.trim(), "/");
|
|
}
|
|
return DEFAULT_CLIENT_FILE_API;
|
|
}
|
|
|
|
/// Absolute URL of the client `server-manifest.json` used for first install and differential updates.
|
|
public static String getClientManifestUrl() {
|
|
return getClientFileApi() + "/server-manifest.json";
|
|
}
|
|
|
|
/// Fallback join address when the installed modpack manifest has no `serverAddress` / routes.
|
|
public static final String DEFAULT_SERVER_ADDRESS = "mc.potatolab.uk";
|
|
|
|
/// Server address used when the installed modpack manifest does not provide one.
|
|
///
|
|
/// Override at build or run time with `-Dhmcl.server.address=…`; defaults to [#DEFAULT_SERVER_ADDRESS].
|
|
public static String getDefaultServerAddress() {
|
|
return System.getProperty("hmcl.server.address", DEFAULT_SERVER_ADDRESS).trim();
|
|
}
|
|
|
|
/// The server name shown in the title bar.
|
|
///
|
|
/// Can be set with the `hmcl.server.name` system property; defaults to `TDLM`.
|
|
public static String getServerName() {
|
|
String name = System.getProperty("hmcl.server.name", "TDLM").trim();
|
|
return name.isEmpty() ? "TDLM" : name;
|
|
}
|
|
|
|
}
|