diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/Launcher.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/Launcher.java index 54d9bcd..ee01251 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/Launcher.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/Launcher.java @@ -10,6 +10,7 @@ import me.earth.headlessmc.launcher.download.DownloadService; import me.earth.headlessmc.launcher.files.ConfigService; import me.earth.headlessmc.launcher.files.FileManager; +import me.earth.headlessmc.launcher.files.LauncherConfig; import me.earth.headlessmc.launcher.java.JavaService; import me.earth.headlessmc.launcher.launch.ProcessFactory; import me.earth.headlessmc.launcher.plugin.PluginManager; @@ -39,13 +40,9 @@ public class Launcher implements HeadlessMc { */ private VersionService versionService; /** - * The .minecraft directory in which we store assets, libraries and versions. - */ - private FileManager mcFiles; - /** - * The directory in which the game will run. + * The directories the HeadlessMc launcher will work in. */ - private FileManager gameDir; + private final LauncherConfig launcherConfig; /** * A service for checking SHA1 hashes. */ @@ -54,10 +51,6 @@ public class Launcher implements HeadlessMc { * A service for making GET requests. */ private DownloadService downloadService; - /** - * The directory for HeadlessMc files. - */ - private FileManager fileManager; /** * Actual Launching happens here. */ @@ -83,4 +76,50 @@ public class Launcher implements HeadlessMc { */ private PluginManager pluginManager; + /** + * The FileManager managing the HeadlessMc config, log and other files. + * This is a convenience method that calls {@link LauncherConfig} and by extension {@link ConfigService}. + * + * @return the FileManager managing the HeadlessMc config, log and other files. + * @see LauncherConfig + * @see ConfigService + */ + public FileManager getFileManager() { + return launcherConfig.getFileManager(); + } + + /** + * The .minecraft directory in which we store assets, libraries and versions. + * This is a convenience method that calls {@link LauncherConfig}. + * + * @return the .minecraft directory in which we store assets, libraries and versions. + * @see LauncherConfig + */ + public FileManager getMcFiles() { + return launcherConfig.getMcFiles(); + } + + /** + * Returns the default game directory. + * + * @return the default game directory. + * @deprecated call {@link #getGameDir(Version)} or {@link LauncherConfig#getGameDir(String)} instead. + */ + @Deprecated + public FileManager getGameDir() { + return launcherConfig.getGameDir(); + } + + /** + * Gets the directory to run the game in for a specific version. + * This is a convenience method that calls {@link LauncherConfig#getGameDir(Version)}. + * + * @param version the version to get a game directory for. + * @return a FileManager managing the game dir for this version. + * @see LauncherConfig#getGameDir(Version) + */ + public FileManager getGameDir(Version version) { + return launcherConfig.getGameDir(version); + } + } diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/LauncherBuilder.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/LauncherBuilder.java index 08a79d2..ebc73ca 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/LauncherBuilder.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/LauncherBuilder.java @@ -16,10 +16,7 @@ import me.earth.headlessmc.launcher.command.LaunchContext; import me.earth.headlessmc.launcher.download.ChecksumService; import me.earth.headlessmc.launcher.download.DownloadService; -import me.earth.headlessmc.launcher.files.AutoConfiguration; -import me.earth.headlessmc.launcher.files.ConfigService; -import me.earth.headlessmc.launcher.files.FileManager; -import me.earth.headlessmc.launcher.files.MinecraftFinder; +import me.earth.headlessmc.launcher.files.*; import me.earth.headlessmc.launcher.java.JavaService; import me.earth.headlessmc.launcher.launch.ProcessFactory; import me.earth.headlessmc.launcher.os.OS; @@ -55,9 +52,8 @@ public class LauncherBuilder { private CommandLine commandLine = new CommandLine(); private PluginManager pluginManager = new PluginManager(); + private LauncherConfig launcherConfig; private FileManager fileManager; - private FileManager mcFiles; - private FileManager gameDir; private HeadlessMc headlessMc; private VersionService versionService; @@ -88,7 +84,7 @@ public LauncherBuilder runAutoConfiguration() { public LauncherBuilder initConfigService() { return ifNull(LauncherBuilder::configService, LauncherBuilder::configService, - () -> Service.refresh(new ConfigService(requireNonNull(this.fileManager, "FileManager not initialized")))); + () -> Service.refresh(new ConfigService(requireNonNull(this.fileManager, "FileManager not initialized")))); } public LauncherBuilder initHmcInstance() { @@ -108,18 +104,19 @@ public LauncherBuilder configureDownloadService() { public LauncherBuilder initDefaultServices() { return ifNull(LauncherBuilder::os, LauncherBuilder::os, () -> OSFactory.detect(requireNonNull(configService, "ConfigHolder was null!").getConfig())) - .ifNull(LauncherBuilder::mcFiles, LauncherBuilder::mcFiles, () -> MinecraftFinder.find(configService.getConfig(), os)) - .ifNull(LauncherBuilder::gameDir, LauncherBuilder::gameDir, () -> FileManager.mkdir(configService.getConfig().get(LauncherProperties.GAME_DIR, mcFiles.getPath()))) - .ifNull(LauncherBuilder::versionService, LauncherBuilder::versionService, () -> new VersionService(mcFiles)) - .ifNull(LauncherBuilder::javaService, LauncherBuilder::javaService, () -> new JavaService(configService)); + .ifNull(LauncherBuilder::launcherConfig, LauncherBuilder::launcherConfig, () -> { + FileManager mcFiles = MinecraftFinder.find(configService.getConfig(), os); + FileManager gameDir = FileManager.mkdir(configService.getConfig().get(LauncherProperties.GAME_DIR, mcFiles.getPath())); + return new LauncherConfig(configService, mcFiles, gameDir); + }) + .ifNull(LauncherBuilder::versionService, LauncherBuilder::versionService, () -> new VersionService(requireNonNull(launcherConfig(), "LauncherConfig!"))) + .ifNull(LauncherBuilder::javaService, LauncherBuilder::javaService, () -> new JavaService(configService)); } public LauncherBuilder initAccountManager() throws AuthException { if (this.accountManager == null) { - FileManager fileManager = requireNonNull(this.fileManager, "FileManager was null!"); - ConfigService configService = requireNonNull(this.configService, "ConfigHolder was null!"); - AccountStore accountStore = new AccountStore(fileManager, configService); - this.accountManager = new AccountManager(new AccountValidator(), new OfflineChecker(configService), accountStore); + AccountStore accountStore = new AccountStore(requireNonNull(launcherConfig)); + this.accountManager = new AccountManager(new AccountValidator(), new OfflineChecker(requireNonNull(configService)), accountStore); accountManager.load(configService.getConfig()); } @@ -128,8 +125,9 @@ public LauncherBuilder initAccountManager() throws AuthException { public LauncherBuilder configureVersionSpecificModManager() { if (this.versionSpecificModManager == null) { - FileManager fileManager = requireNonNull(this.fileManager, "FileManager was null!"); - this.versionSpecificModManager = new VersionSpecificModManager(downloadService, fileManager.createRelative("specifics")); + requireNonNull(downloadService, "DownloadService was null!"); + requireNonNull(launcherConfig, "LauncherConfig was null!"); + this.versionSpecificModManager = new VersionSpecificModManager(downloadService, launcherConfig); versionSpecificModManager.addRepository(VersionSpecificMods.HMC_SPECIFICS); versionSpecificModManager.addRepository(VersionSpecificMods.MC_RUNTIME_TEST); } @@ -149,8 +147,7 @@ public LauncherBuilder configureProcessFactory() { if (this.processFactory == null) { this.processFactory = new ProcessFactory( requireNonNull(downloadService, "Download Service was null!"), - requireNonNull(mcFiles, "McFiles were null!"), - requireNonNull(configService, "ConfigHolder was null!"), + requireNonNull(launcherConfig, "LauncherConfig was null!"), requireNonNull(os, "OS was null!") ); } @@ -163,7 +160,7 @@ public LauncherBuilder deleteOldFiles() { return this; } - for (val file : requireNonNull(fileManager, "FileManager was null!").listFiles()) { + for (val file : requireNonNull(launcherConfig, "LauncherConfig was null!").getFileManager().listFiles()) { if (file.isDirectory() && UuidUtil.isUuid(file.getName())) { try { log.debug("Deleting " + file.getAbsolutePath()); @@ -214,11 +211,9 @@ public Launcher build() { return new Launcher( requireNonNull(headlessMc, "HeadlessMc was null!"), requireNonNull(versionService, "VersionService was null!"), - requireNonNull(mcFiles, "McFiles were null!"), - requireNonNull(gameDir, "GameDir was null!"), + requireNonNull(launcherConfig, "LauncherConfig was null!"), requireNonNull(sha1Service, "Sha1Service was null!"), requireNonNull(downloadService, "Download Service was null"), - requireNonNull(fileManager, "FileManager was null!"), requireNonNull(processFactory, "ProcessFactory was null!"), requireNonNull(configService, "ConfigService was null!"), requireNonNull(javaService, "JavaService was null!"), diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/LauncherProperties.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/LauncherProperties.java index 46f67db..a4f481b 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/LauncherProperties.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/LauncherProperties.java @@ -94,4 +94,6 @@ public interface LauncherProperties extends HmcProperties { Property HTTP_USER_AGENT_ENABLED = bool("hmc.http.user.agent.enabled"); Property HTTP_USER_AGENT = string("hmc.http.user.agent"); + Property GAME_DIR_FOR_EACH_VERSION = bool("hmc.game.dir.for.each.version"); + } diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/auth/AccountStore.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/auth/AccountStore.java index b44206c..d5651d1 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/auth/AccountStore.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/auth/AccountStore.java @@ -5,9 +5,8 @@ import com.google.gson.JsonObject; import lombok.CustomLog; import lombok.RequiredArgsConstructor; -import me.earth.headlessmc.api.config.HasConfig; import me.earth.headlessmc.launcher.LauncherProperties; -import me.earth.headlessmc.launcher.files.FileManager; +import me.earth.headlessmc.launcher.files.LauncherConfig; import me.earth.headlessmc.launcher.util.JsonUtil; import java.io.File; @@ -21,11 +20,10 @@ @CustomLog @RequiredArgsConstructor public class AccountStore { - private final FileManager fileManager; - private final HasConfig cfg; + private final LauncherConfig launcherConfig; public void save(List accounts) throws IOException { - if (!cfg.getConfig().get(LauncherProperties.STORE_ACCOUNTS, true)) { + if (!launcherConfig.getConfig().getConfig().get(LauncherProperties.STORE_ACCOUNTS, true)) { return; } @@ -41,7 +39,7 @@ public void save(List accounts) throws IOException { JsonObject object = new JsonObject(); object.add("accounts", array); - File file = fileManager.create("auth", ".accounts.json"); + File file = launcherConfig.getFileManager().create("auth", ".accounts.json"); String string = JsonUtil.PRETTY_PRINT.toJson(object); try (OutputStream os = Files.newOutputStream(file.toPath())) { os.write(string.getBytes(StandardCharsets.UTF_8)); @@ -49,7 +47,7 @@ public void save(List accounts) throws IOException { } public List load() throws IOException { - File file = fileManager.create("auth", ".accounts.json"); + File file = launcherConfig.getFileManager().create("auth", ".accounts.json"); JsonElement je = JsonUtil.fromFile(file); JsonArray array = JsonUtil.getArray(je, "accounts"); diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/SpecificsCommand.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/SpecificsCommand.java index acc6912..1914da6 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/SpecificsCommand.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/SpecificsCommand.java @@ -43,8 +43,8 @@ public void execute(Version version, String... args) throws CommandException { try { ctx.getVersionSpecificModManager().download(version, repository); - ctx.getVersionSpecificModManager().deleteSpecificsOfOtherVersions(version, repository, ctx.getGameDir().getDir("mods").toPath()); - ctx.getVersionSpecificModManager().install(version, repository, ctx.getGameDir().getDir("mods").toPath()); + ctx.getVersionSpecificModManager().deleteSpecificsOfOtherVersions(version, repository, ctx.getGameDir(version).getDir("mods").toPath()); + ctx.getVersionSpecificModManager().install(version, repository, ctx.getGameDir(version).getDir("mods").toPath()); } catch (IOException e) { log.debug("Failed to install " + repository.getName() + " for version " + version.getName(), e); throw new CommandException("Failed to install " + repository.getName() + " for version " + version.getName() + ": " + e.getMessage()); diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/files/ConfigService.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/files/ConfigService.java index 4fe4476..e638a16 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/files/ConfigService.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/files/ConfigService.java @@ -16,15 +16,18 @@ import java.util.Properties; // TODO: for convenience we could add a 'hmc.' to every property +@Setter +@Getter @CustomLog -@RequiredArgsConstructor public class ConfigService extends Service implements HasConfig { private static final String ENDING = ".properties"; - private final FileManager fileManager; - @Getter - @Setter + private FileManager fileManager; private Config config; + public ConfigService(FileManager fileManager) { + this.fileManager = fileManager; + } + @Override protected List update() { val result = new ArrayList(); diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/files/LauncherConfig.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/files/LauncherConfig.java new file mode 100644 index 0000000..88d4d57 --- /dev/null +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/files/LauncherConfig.java @@ -0,0 +1,82 @@ +package me.earth.headlessmc.launcher.files; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import me.earth.headlessmc.launcher.LauncherProperties; +import me.earth.headlessmc.launcher.version.Version; +import org.jetbrains.annotations.Nullable; + +/** + * Manages the directories the HeadlessMc Launcher will work in. + */ +@Getter +@Setter +@AllArgsConstructor +public class LauncherConfig { + /** + * Supplies the config to check the {@link LauncherProperties#GAME_DIR_FOR_EACH_VERSION} property from. + * Also supplies {@link #getFileManager()}. + */ + private ConfigService config; + /** + * The .minecraft directory in which we store assets, libraries and versions. + */ + private FileManager mcFiles; + /** + * The directory in which the game will run. + */ + private FileManager gameDir; + + /** + * The directory HeadlessMc configuration files, logs and others reside in. + * Usually the folder HeadlessMC where the launcher has been started. + * This FileManager is usually supplied from the {@link #config}. + * + * @return The directory for HeadlessMc files. + * @see #setFileManager(FileManager) + */ + public FileManager getFileManager() { + return config.getFileManager(); + } + + /** + * Sets the FileManager to use for HeadlessMc. + * + * @param fileManager the new file manager to use. + * @see #getFileManager() + */ + public void setFileManager(FileManager fileManager) { + config.setFileManager(fileManager); + } + + /** + * Gets the directory to run the game in for a specific version. + * Usually this is just {@link #gameDir}, but if {@link LauncherProperties#GAME_DIR_FOR_EACH_VERSION} is enabled, + * a game directory for each version will be created inside {@link #gameDir}. + * + * @param version the version to get a game directory for. + * @return a FileManager managing the game dir for this version. + */ + public FileManager getGameDir(Version version) { + return getGameDir(version.getName()); + } + + /** + * Gets the directory to run the game in for a specific name. + * Usually this is just {@link #gameDir}, but if {@link LauncherProperties#GAME_DIR_FOR_EACH_VERSION} is enabled, + * a relative directory for the given name will be created inside {@link #gameDir}. + * If name is {@code null} the default game directory will be used instead. + * + * @param name the name to get a game directory for. + * @return a FileManager managing the game dir for this version. + */ + public FileManager getGameDir(@Nullable String name) { + if (name != null && config.getConfig().get(LauncherProperties.GAME_DIR_FOR_EACH_VERSION, false)) { + return gameDir.createRelative(name); + } + + return gameDir; + } + +} diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/ArgumentAdapterHelper.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/ArgumentAdapterHelper.java index 8569748..4eee82d 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/ArgumentAdapterHelper.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/ArgumentAdapterHelper.java @@ -26,7 +26,7 @@ public static ArgumentAdapter create(Launcher launcher, Version version, String adapter.add("${version_name}", version.getName()); adapter.add("${version_type}", "release"); - val dir = new File(config.get(LauncherProperties.GAME_DIR, launcher.getGameDir().getPath())); + val dir = new File(config.get(LauncherProperties.GAME_DIR, launcher.getGameDir(version).getPath())); //noinspection ResultOfMethodCallIgnored dir.mkdirs(); diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/ProcessFactory.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/ProcessFactory.java index c25536c..215bb49 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/ProcessFactory.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/ProcessFactory.java @@ -4,13 +4,13 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.val; -import me.earth.headlessmc.api.config.HasConfig; import me.earth.headlessmc.launcher.LauncherProperties; import me.earth.headlessmc.launcher.auth.AuthException; import me.earth.headlessmc.launcher.download.AssetsDownloader; import me.earth.headlessmc.launcher.download.DownloadService; import me.earth.headlessmc.launcher.download.LibraryDownloader; import me.earth.headlessmc.launcher.files.FileManager; +import me.earth.headlessmc.launcher.files.LauncherConfig; import me.earth.headlessmc.launcher.instrumentation.Instrumentation; import me.earth.headlessmc.launcher.instrumentation.InstrumentationHelper; import me.earth.headlessmc.launcher.instrumentation.Target; @@ -34,8 +34,7 @@ @RequiredArgsConstructor public class ProcessFactory { private final DownloadService downloadService; - private final FileManager files; - private final HasConfig config; + private final LauncherConfig config; private final OS os; public @Nullable Process run(LaunchOptions options) throws LaunchException, AuthException, IOException { @@ -68,10 +67,10 @@ public class ProcessFactory { val commandBuilder = configureCommandBuilder(options, version, classpath, natives).build(); val command = commandBuilder.build(); - downloadAssets(files, version); + downloadAssets(config.getMcFiles(), version); debugCommand(command, commandBuilder); - val dir = new File(launcher.getConfig().get(LauncherProperties.GAME_DIR, launcher.getGameDir().getPath())); + val dir = new File(launcher.getConfig().get(LauncherProperties.GAME_DIR, launcher.getGameDir(version).getPath())); log.info("Game will run in " + dir); //noinspection ResultOfMethodCallIgnored dir.mkdirs(); @@ -143,7 +142,7 @@ protected void addGameJar(Version version, List targets) throws IOExcept File gameJar = new File(version.getFolder(), version.getName() + ".jar"); log.debug("GameJar: " + gameJar.getAbsolutePath()); if (!gameJar.exists() || !checkZipIntact(gameJar) && gameJar.delete()) { - LibraryDownloader downloader = new LibraryDownloader(downloadService, config, os); + LibraryDownloader downloader = new LibraryDownloader(downloadService, config.getConfig(), os); log.info("Downloading " + version.getName() + " from " + version.getClientDownload()); downloader.download(version.getClientDownload(), gameJar.toPath().toAbsolutePath(), version.getClientSha1(), version.getClientSize()); } @@ -158,7 +157,7 @@ protected List processLibraries(Version version, FileManager dlls) throw val features = Features.EMPTY; val targets = new ArrayList(version.getLibraries().size()); Set libPaths = new HashSet<>(); - LibraryDownloader libraryDownloader = new LibraryDownloader(downloadService, config, os); + LibraryDownloader libraryDownloader = new LibraryDownloader(downloadService, config.getConfig(), os); for (val library : version.getLibraries()) { if (library.getRule().apply(os, features) == Rule.Action.ALLOW) { log.debug("Checking: " + library); @@ -167,9 +166,9 @@ protected List processLibraries(Version version, FileManager dlls) throw continue; } - val path = files.getDir("libraries").toPath().resolve(libPath); + val path = config.getMcFiles().getDir("libraries").toPath().resolve(libPath); if ((library.getSha1() != null || library.getSize() != null) - && config.getConfig().get(LauncherProperties.LIBRARIES_CHECK_FILE_HASH, false) + && config.getConfig().getConfig().get(LauncherProperties.LIBRARIES_CHECK_FILE_HASH, false) && Files.exists(path) && !downloadService.getChecksumService().checkIntegrity(path, library.getSize(), library.getSha1())) { log.warn("Library " + libPath + " failed integrity check, deleting..."); @@ -216,7 +215,14 @@ protected Process run(ProcessBuilder builder) throws IOException { protected void downloadAssets(FileManager files, Version version) throws IOException { log.debug("Downloading Assets"); - new AssetsDownloader(downloadService, config, files, version.getAssetsUrl(), version.getAssets()).download(); + new AssetsDownloader(downloadService, config.getConfig(), files, version.getAssetsUrl(), version.getAssets()).download(); + } + + /** + * @return a FileManager representing the .minecraft directory. + */ + public FileManager getFiles() { + return config.getMcFiles(); } private void debugCommand(List command, JavaLaunchCommandBuilder commandBuilder) { diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/specifics/VersionSpecificModManager.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/specifics/VersionSpecificModManager.java index d0472f0..f8d0f6f 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/specifics/VersionSpecificModManager.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/specifics/VersionSpecificModManager.java @@ -6,6 +6,7 @@ import me.earth.headlessmc.api.HasName; import me.earth.headlessmc.launcher.download.DownloadService; import me.earth.headlessmc.launcher.files.FileManager; +import me.earth.headlessmc.launcher.files.LauncherConfig; import me.earth.headlessmc.launcher.util.IOUtil; import me.earth.headlessmc.launcher.version.Version; @@ -35,7 +36,7 @@ public class VersionSpecificModManager { private final List specificMods = new ArrayList<>(); private final DownloadService downloadService; - private final FileManager fileManager; + private final LauncherConfig directories; public VersionSpecificModRepository getRepository(String name) throws VersionSpecificException { VersionSpecificModRepository repository = HasName.getByName(name, specificMods); @@ -48,7 +49,7 @@ public VersionSpecificModRepository getRepository(String name) throws VersionSpe public void download(Version version, VersionSpecificModRepository repository) throws VersionSpecificException, IOException { VersionInfo info = VersionInfo.requireModLauncher(version); - File file = fileManager.createRelative(repository.getName()).get(false, false, repository.getFileName(info)); + File file = getFileManager().createRelative(repository.getName()).get(false, false, repository.getFileName(info)); if (file.exists()) { return; } @@ -60,7 +61,7 @@ public void download(Version version, VersionSpecificModRepository repository) t public void install(Version version, VersionSpecificModRepository repository, Path modsFolder) throws VersionSpecificException, IOException { VersionInfo info = VersionInfo.requireModLauncher(version); - File file = fileManager.createRelative(repository.getName()).get(false, false, repository.getFileName(info)); + File file = getFileManager().createRelative(repository.getName()).get(false, false, repository.getFileName(info)); if (!file.exists()) { throw new VersionSpecificException("Failed to find " + repository.getName() + " for version " + info.getDescription()); } @@ -118,4 +119,8 @@ public void removeRepository(VersionSpecificModRepository repository) { specificMods.remove(repository); } + public FileManager getFileManager() { + return directories.getFileManager().createRelative("specifics"); + } + } diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/version/VersionService.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/version/VersionService.java index b8b8b6f..b9eb327 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/version/VersionService.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/version/VersionService.java @@ -6,7 +6,7 @@ import lombok.Setter; import lombok.val; import me.earth.headlessmc.launcher.LazyService; -import me.earth.headlessmc.launcher.files.FileManager; +import me.earth.headlessmc.launcher.files.LauncherConfig; import me.earth.headlessmc.launcher.util.JsonUtil; import java.io.File; @@ -21,14 +21,14 @@ @RequiredArgsConstructor public final class VersionService extends LazyService { private final ParentVersionResolver resolver = new ParentVersionResolver(); - private final FileManager files; + private final LauncherConfig launcherConfig; private int retries = 0; @Override protected Collection update() { long nanos = System.nanoTime(); - val versionFolders = files.getDir("versions").listFiles(); + val versionFolders = launcherConfig.getMcFiles().getDir("versions").listFiles(); if (versionFolders == null) { log.warning("No Minecraft Version folder found!"); return Collections.emptyList(); diff --git a/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/LauncherMock.java b/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/LauncherMock.java index a34b4ec..ba29a8e 100644 --- a/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/LauncherMock.java +++ b/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/LauncherMock.java @@ -5,14 +5,17 @@ import me.earth.headlessmc.api.HeadlessMcImpl; import me.earth.headlessmc.api.command.line.CommandLine; import me.earth.headlessmc.api.config.ConfigImpl; -import me.earth.headlessmc.api.config.HasConfig; import me.earth.headlessmc.api.exit.ExitManager; -import me.earth.headlessmc.launcher.auth.*; +import me.earth.headlessmc.launcher.auth.AccountManager; +import me.earth.headlessmc.launcher.auth.AccountStore; +import me.earth.headlessmc.launcher.auth.AccountValidator; +import me.earth.headlessmc.launcher.auth.ValidatedAccount; import me.earth.headlessmc.launcher.download.ChecksumService; import me.earth.headlessmc.launcher.download.DownloadService; import me.earth.headlessmc.launcher.download.MockDownloadService; import me.earth.headlessmc.launcher.files.ConfigService; import me.earth.headlessmc.launcher.files.FileManager; +import me.earth.headlessmc.launcher.files.LauncherConfig; import me.earth.headlessmc.launcher.java.JavaService; import me.earth.headlessmc.launcher.launch.MockProcessFactory; import me.earth.headlessmc.launcher.os.OS; @@ -43,17 +46,18 @@ public static Launcher create() { val os = new OS("windows", OS.Type.WINDOWS, "11", true); val mcFiles = base.createRelative("mcFiles"); - val versions = new VersionService(mcFiles); + LauncherConfig launcherConfig = new LauncherConfig(configs, mcFiles, mcFiles); + val versions = new VersionService(launcherConfig); val javas = new JavaService(configs); - val store = new DummyAccountStore(fileManager, configs); + val store = new DummyAccountStore(launcherConfig); val accounts = new DummyAccountManager(store, new DummyAccountValidator()); DownloadService downloadService = new MockDownloadService(); - val versionSpecificModManager = new VersionSpecificModManager(downloadService, fileManager.createRelative("specifics")); - Launcher launcher = new Launcher(hmc, versions, mcFiles, mcFiles, + val versionSpecificModManager = new VersionSpecificModManager(downloadService, launcherConfig); + Launcher launcher = new Launcher(hmc, versions, launcherConfig, new ChecksumService(), new MockDownloadService(), - fileManager, new MockProcessFactory(downloadService, mcFiles, configs, os), configs, + new MockProcessFactory(downloadService, launcherConfig, os), configs, javas, accounts, versionSpecificModManager, new PluginManager()); launcher.getConfigService().setConfig(ConfigImpl.empty()); @@ -77,8 +81,8 @@ public ValidatedAccount validate(StepFullJavaSession.FullJavaSession session) { } public static final class DummyAccountStore extends AccountStore { - public DummyAccountStore(FileManager fileManager, HasConfig cfg) { - super(fileManager, cfg); + public DummyAccountStore(LauncherConfig launcherConfig) { + super(launcherConfig); } @Override diff --git a/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/command/LaunchCommandTest.java b/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/command/LaunchCommandTest.java index dbbea92..053b929 100644 --- a/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/command/LaunchCommandTest.java +++ b/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/command/LaunchCommandTest.java @@ -70,7 +70,7 @@ private static class MockProcessFactory extends ProcessFactory { private int runs = 0; public MockProcessFactory(Launcher launcher) { - super(launcher.getDownloadService(), launcher.getMcFiles(), launcher.getConfigService(), launcher.getProcessFactory().getOs()); + super(launcher.getDownloadService(), launcher.getLauncherConfig(), launcher.getProcessFactory().getOs()); } @Override diff --git a/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/MockProcessFactory.java b/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/MockProcessFactory.java index 4bef6ae..3ddfb5e 100644 --- a/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/MockProcessFactory.java +++ b/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/MockProcessFactory.java @@ -2,10 +2,10 @@ import lombok.Getter; import lombok.Setter; -import me.earth.headlessmc.api.config.HasConfig; import me.earth.headlessmc.launcher.auth.AuthException; import me.earth.headlessmc.launcher.download.DownloadService; import me.earth.headlessmc.launcher.files.FileManager; +import me.earth.headlessmc.launcher.files.LauncherConfig; import me.earth.headlessmc.launcher.instrumentation.Instrumentation; import me.earth.headlessmc.launcher.os.OS; import me.earth.headlessmc.launcher.version.Version; @@ -23,8 +23,8 @@ public class MockProcessFactory extends ProcessFactory { private ProcessBuilder builder; private LaunchOptions options; - public MockProcessFactory(DownloadService downloadService, FileManager files, HasConfig hasConfig, OS os) { - super(downloadService, files, hasConfig, os); + public MockProcessFactory(DownloadService downloadService, LauncherConfig launcherConfig, OS os) { + super(downloadService, launcherConfig, os); } @Override diff --git a/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/ProcessFactoryTest.java b/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/ProcessFactoryTest.java index a94a4b6..08e45a1 100644 --- a/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/ProcessFactoryTest.java +++ b/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/ProcessFactoryTest.java @@ -24,8 +24,7 @@ public void testCheckZipIntact() { val launcher = LauncherMock.INSTANCE; val processFactory = new ProcessFactory( new MockDownloadService(), - launcher.getFileManager(), - MockedHeadlessMc.INSTANCE, + launcher.getLauncherConfig(), new OS("win", OS.Type.WINDOWS, "10", true)); File invalid = new File("DOES_NOT_EXIST!!!!"); diff --git a/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/specifics/VersionSpecificModManagerTest.java b/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/specifics/VersionSpecificModManagerTest.java index bc0e894..232d590 100644 --- a/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/specifics/VersionSpecificModManagerTest.java +++ b/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/specifics/VersionSpecificModManagerTest.java @@ -1,5 +1,7 @@ package me.earth.headlessmc.launcher.specifics; +import me.earth.headlessmc.launcher.Launcher; +import me.earth.headlessmc.launcher.LauncherMock; import me.earth.headlessmc.launcher.download.DownloadService; import me.earth.headlessmc.launcher.files.FileManager; import me.earth.headlessmc.launcher.version.DummyVersion; @@ -12,7 +14,9 @@ public class VersionSpecificModManagerTest { @Test @Disabled("Downloads something from the internet") public void testVersionSpecificModManagerTest() throws VersionSpecificException, IOException { - VersionSpecificModManager modManager = new VersionSpecificModManager(new DownloadService(), FileManager.forPath("build/test")); + Launcher launcher = LauncherMock.create(); + launcher.getLauncherConfig().setFileManager(FileManager.forPath("build/test")); + VersionSpecificModManager modManager = new VersionSpecificModManager(new DownloadService(), launcher.getLauncherConfig()); modManager.addRepository(VersionSpecificMods.HMC_SPECIFICS); modManager.download(new DummyVersion("1.12.2-forge", new DummyVersion("1.12.2", null)), VersionSpecificMods.HMC_SPECIFICS); diff --git a/headlessmc-web/plugin/src/main/java/me/earth/headlessmc/web/cheerpj/plugin/CheerpJLauncher.java b/headlessmc-web/plugin/src/main/java/me/earth/headlessmc/web/cheerpj/plugin/CheerpJLauncher.java index 7daa36a..cbae2d2 100644 --- a/headlessmc-web/plugin/src/main/java/me/earth/headlessmc/web/cheerpj/plugin/CheerpJLauncher.java +++ b/headlessmc-web/plugin/src/main/java/me/earth/headlessmc/web/cheerpj/plugin/CheerpJLauncher.java @@ -27,6 +27,7 @@ import me.earth.headlessmc.launcher.download.DownloadService; import me.earth.headlessmc.launcher.files.ConfigService; import me.earth.headlessmc.launcher.files.FileManager; +import me.earth.headlessmc.launcher.files.LauncherConfig; import me.earth.headlessmc.launcher.files.MinecraftFinder; import me.earth.headlessmc.launcher.java.JavaService; import me.earth.headlessmc.launcher.os.OSFactory; @@ -139,25 +140,26 @@ private void initialize(HeadlessMc hmc, Logger logger, Path headlessMcRoot) { val os = OSFactory.detect(configs.getConfig()); val mcFiles = MinecraftFinder.find(configs.getConfig(), os); val gameDir = FileManager.mkdir(configs.getConfig().get(LauncherProperties.GAME_DIR, mcFiles.getPath())); - val versions = new VersionService(mcFiles); + LauncherConfig launcherConfig = new LauncherConfig(configs, mcFiles, gameDir); + val versions = new VersionService(launcherConfig); versions.setRetries(10); versions.refresh(); val javas = Service.refresh(new JavaService(configs)); - val accountStore = new AccountStore(files, configs); + val accountStore = new AccountStore(launcherConfig); val accounts = new AccountManager(new AccountValidator(), new OfflineChecker(configs), accountStore); // accounts.load(configs.getConfig()); // CheerpJ doesnt support logging in right now accounts.getOfflineChecker().setOffline(true); DownloadService downloadService = new DownloadService(); - val versionSpecificModManager = new VersionSpecificModManager(downloadService, files.createRelative("specifics")); + val versionSpecificModManager = new VersionSpecificModManager(downloadService, launcherConfig); versionSpecificModManager.addRepository(VersionSpecificMods.HMC_SPECIFICS); versionSpecificModManager.addRepository(VersionSpecificMods.MC_RUNTIME_TEST); - val launcher = new Launcher(hmc, versions, mcFiles, gameDir, + val launcher = new Launcher(hmc, versions, launcherConfig, new ChecksumService(), downloadService, - files, new CheerpJProcessFactory(downloadService, mcFiles, configs, os), configs, + new CheerpJProcessFactory(downloadService, launcherConfig, os), configs, javas, accounts, versionSpecificModManager, new PluginManager()); deleteOldFiles(launcher, logger); @@ -191,11 +193,11 @@ private void deleteOldFiles(Launcher launcher, Logger logger) { return; } - for (val file : launcher.getFileManager().listFiles()) { + for (val file : launcher.getLauncherConfig().getFileManager().listFiles()) { if (file.isDirectory() && !CACHE_UUID.toString().equals(file.getName()) && UuidUtil.isUuid(file.getName())) { try { logger.debug("Deleting " + file.getAbsolutePath()); - launcher.getFileManager().delete(file); + launcher.getLauncherConfig().getFileManager().delete(file); } catch (IOException ioe) { logger.error("Couldn't delete " + file.getName(), ioe); } diff --git a/headlessmc-web/plugin/src/main/java/me/earth/headlessmc/web/cheerpj/plugin/CheerpJProcessFactory.java b/headlessmc-web/plugin/src/main/java/me/earth/headlessmc/web/cheerpj/plugin/CheerpJProcessFactory.java index b26df05..7e6add0 100644 --- a/headlessmc-web/plugin/src/main/java/me/earth/headlessmc/web/cheerpj/plugin/CheerpJProcessFactory.java +++ b/headlessmc-web/plugin/src/main/java/me/earth/headlessmc/web/cheerpj/plugin/CheerpJProcessFactory.java @@ -1,9 +1,8 @@ package me.earth.headlessmc.web.cheerpj.plugin; -import me.earth.headlessmc.api.config.HasConfig; import me.earth.headlessmc.launcher.auth.AuthException; import me.earth.headlessmc.launcher.download.DownloadService; -import me.earth.headlessmc.launcher.files.FileManager; +import me.earth.headlessmc.launcher.files.LauncherConfig; import me.earth.headlessmc.launcher.instrumentation.InstrumentationClassloader; import me.earth.headlessmc.launcher.instrumentation.debug.DebugTransformer; import me.earth.headlessmc.launcher.launch.InMemoryLauncher; @@ -16,8 +15,8 @@ import java.util.ArrayList; public class CheerpJProcessFactory extends ProcessFactory { - public CheerpJProcessFactory(DownloadService downloadService, FileManager files, HasConfig config, OS os) { - super(downloadService, files, config, os); + public CheerpJProcessFactory(DownloadService downloadService, LauncherConfig launcherConfig, OS os) { + super(downloadService, launcherConfig, os); } @Override