From 8843ee8a53418ecfc0ad38182423c46abbfd5e1b Mon Sep 17 00:00:00 2001 From: axolotlmaid Date: Sat, 14 Sep 2024 21:55:30 +0100 Subject: [PATCH] work in progress --- common/build.gradle | 5 + .../optionsprofiles/OptionsProfilesMod.java | 41 +------- .../gui/EditProfileScreen.java | 7 +- .../optionsprofiles/gui/ProfilesList.java | 4 +- .../optionsprofiles/gui/ProfilesScreen.java | 5 +- .../optionsprofiles/profiles/Profiles.java | 99 ++++++++++++------- .../profiles/SharedResourcesProfiles.java | 21 ++++ .../assets/optionsprofiles/lang/en_us.json | 2 + fabric/src/main/resources/fabric.mod.json | 3 + 9 files changed, 106 insertions(+), 81 deletions(-) create mode 100644 common/src/main/java/com/axolotlmaid/optionsprofiles/profiles/SharedResourcesProfiles.java diff --git a/common/build.gradle b/common/build.gradle index 7c83808..55d4ae5 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -14,6 +14,10 @@ repositories { includeGroup "maven.modrinth" } } + + maven { + url "https://maven.enjarai.nl/releases" + } } dependencies { @@ -27,4 +31,5 @@ dependencies { modImplementation "maven.modrinth:sodium-extra:mc1.21-0.5.7" // Sodium Extra modImplementation "maven.modrinth:embeddium:1.0.2+mc1.21" // Embeddium modImplementation "maven.modrinth:distanthorizons:2.1.2-a-1.21" // Distant Horizons + modImplementation "nl.enjarai:shared-resources-api:1.8.3" // Shared Resources } diff --git a/common/src/main/java/com/axolotlmaid/optionsprofiles/OptionsProfilesMod.java b/common/src/main/java/com/axolotlmaid/optionsprofiles/OptionsProfilesMod.java index 674f07f..87f1472 100644 --- a/common/src/main/java/com/axolotlmaid/optionsprofiles/OptionsProfilesMod.java +++ b/common/src/main/java/com/axolotlmaid/optionsprofiles/OptionsProfilesMod.java @@ -1,51 +1,14 @@ package com.axolotlmaid.optionsprofiles; -import com.axolotlmaid.optionsprofiles.gui.ProfilesList; -import com.axolotlmaid.optionsprofiles.profiles.ProfileConfiguration; import com.axolotlmaid.optionsprofiles.profiles.Profiles; -import net.minecraft.network.chat.Component; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.io.IOException; -import java.nio.file.DirectoryStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; - public class OptionsProfilesMod { public static final String MOD_ID = "optionsprofiles"; public static final Logger LOGGER = LogManager.getLogger("Options Profiles"); - public static void init() { - Path profilesDirectory = Paths.get("options-profiles"); + public static final Profiles PROFILES_INSTANCE = new Profiles(); - if (Files.notExists(profilesDirectory)) { - try { - Files.createDirectory(profilesDirectory); - } catch (IOException e) { - LOGGER.error("An error occurred when creating the 'options-profiles' directory.", e); - } - } - - // Add configuration for existing profiles that were made before v1.3 - Profiles.updateProfiles(); - - // Loading profiles on startup - try (DirectoryStream directoryStream = Files.newDirectoryStream(Profiles.PROFILES_DIRECTORY)) { - for (Path profile : directoryStream) { - String profileName = profile.getFileName().toString(); - ProfileConfiguration profileConfiguration = ProfileConfiguration.get(profileName); - - if (profileConfiguration.isLoadOnStartup()) { - Profiles.loadProfile(profileName); - } - } - } catch (Exception e) { - OptionsProfilesMod.LOGGER.error("An error occurred when loading startup profiles", e); - } - } + public static void init() {} } diff --git a/common/src/main/java/com/axolotlmaid/optionsprofiles/gui/EditProfileScreen.java b/common/src/main/java/com/axolotlmaid/optionsprofiles/gui/EditProfileScreen.java index 509eda5..6f996af 100644 --- a/common/src/main/java/com/axolotlmaid/optionsprofiles/gui/EditProfileScreen.java +++ b/common/src/main/java/com/axolotlmaid/optionsprofiles/gui/EditProfileScreen.java @@ -1,5 +1,6 @@ package com.axolotlmaid.optionsprofiles.gui; +import com.axolotlmaid.optionsprofiles.OptionsProfilesMod; import com.axolotlmaid.optionsprofiles.profiles.ProfileConfiguration; import com.axolotlmaid.optionsprofiles.profiles.Profiles; import net.minecraft.ChatFormatting; @@ -47,7 +48,7 @@ public class EditProfileScreen extends Screen { Button.builder( Component.translatable("gui.optionsprofiles.overwrite-options"), (button) -> { - Profiles.writeProfile(profileName.getString(), true); + OptionsProfilesMod.PROFILES_INSTANCE.writeProfile(profileName.getString(), true); this.onClose(); }) .size(150, 20) @@ -59,7 +60,7 @@ public class EditProfileScreen extends Screen { Button.builder( Component.translatable("gui.optionsprofiles.rename-profile"), (button) -> { - Profiles.renameProfile(profileName.getString(), this.profileNameEdit.getValue()); + OptionsProfilesMod.PROFILES_INSTANCE.renameProfile(profileName.getString(), this.profileNameEdit.getValue()); this.minecraft.setScreen(new EditProfileScreen(profilesScreen, Component.literal(this.profileNameEdit.getValue()))); }) .size(150, 20) @@ -98,7 +99,7 @@ public class EditProfileScreen extends Screen { Component.translatable("gui.optionsprofiles.delete-profile") .withStyle(ChatFormatting.RED), (button) -> { - Profiles.deleteProfile(profileName.getString()); + OptionsProfilesMod.PROFILES_INSTANCE.deleteProfile(profileName.getString()); this.onClose(); }) .width(50) diff --git a/common/src/main/java/com/axolotlmaid/optionsprofiles/gui/ProfilesList.java b/common/src/main/java/com/axolotlmaid/optionsprofiles/gui/ProfilesList.java index 1b13e6c..5d33e0f 100644 --- a/common/src/main/java/com/axolotlmaid/optionsprofiles/gui/ProfilesList.java +++ b/common/src/main/java/com/axolotlmaid/optionsprofiles/gui/ProfilesList.java @@ -81,7 +81,7 @@ public class ProfilesList extends ContainerObjectSelectionList { - Profiles.loadProfile(profileName.getString()); + OptionsProfilesMod.PROFILES_INSTANCE.loadProfile(profileName.getString()); minecraft.options.load(); @@ -124,7 +124,7 @@ public class ProfilesList extends ContainerObjectSelectionList { - Profiles.createProfile(); + OptionsProfilesMod.PROFILES_INSTANCE.createProfile(); this.profilesList.refreshEntries(); })) .build() diff --git a/common/src/main/java/com/axolotlmaid/optionsprofiles/profiles/Profiles.java b/common/src/main/java/com/axolotlmaid/optionsprofiles/profiles/Profiles.java index 4510aaf..4ac86e3 100644 --- a/common/src/main/java/com/axolotlmaid/optionsprofiles/profiles/Profiles.java +++ b/common/src/main/java/com/axolotlmaid/optionsprofiles/profiles/Profiles.java @@ -5,28 +5,46 @@ import com.axolotlmaid.optionsprofiles.profiles.loaders.DistantHorizonsLoader; import com.axolotlmaid.optionsprofiles.profiles.loaders.EmbeddiumLoader; import com.axolotlmaid.optionsprofiles.profiles.loaders.SodiumExtraLoader; import com.axolotlmaid.optionsprofiles.profiles.loaders.SodiumLoader; +import nl.enjarai.shared_resources.api.GameResourceHelper; +import nl.enjarai.shared_resources.util.GameResourceConfig; import org.apache.commons.io.FileUtils; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; +import java.nio.file.*; import java.util.*; import java.util.function.Consumer; import java.util.stream.Stream; public class Profiles { - public static final Path PROFILES_DIRECTORY = Paths.get("options-profiles/"); - public static final Path OPTIONS_FILE = Paths.get("options.txt"); + public static Path PROFILES_DIRECTORY = Paths.get("options-profiles/"); + public static Path OPTIONS_FILE = Paths.get("options.txt"); public static final Path OPTIFINE_OPTIONS_FILE = Paths.get("optionsof.txt"); public static final Path SODIUM_OPTIONS_FILE = Paths.get("config/sodium-options.json"); public static final Path SODIUM_EXTRA_OPTIONS_FILE = Paths.get("config/sodium-extra-options.json"); public static final Path EMBEDDIUM_OPTIONS_FILE = Paths.get("config/embeddium-options.json"); public static final Path DISTANT_HORIZONS_OPTIONS_FILE = Paths.get("config/DistantHorizons.toml"); - // This function goes through every profile and updates / adds the configuration file if it doesn't exist - public static void updateProfiles() { + public Profiles() { + // Create profiles directory + PROFILES_DIRECTORY = Paths.get("options-profiles/"); + + if (Files.notExists(PROFILES_DIRECTORY)) { + try { + Files.createDirectory(PROFILES_DIRECTORY); + } catch (IOException e) { + OptionsProfilesMod.LOGGER.error("An error occurred when creating the 'options-profiles' directory.", e); + } + } + + // Set profiles directory if Shared Resources mod is installed + Path sharedResourcesPath = GameResourceHelper.getPathFor(SharedResourcesProfiles.SHARED_RESOURCES_PROFILES_DIRECTORY); + + if (sharedResourcesPath != null) { + PROFILES_DIRECTORY = sharedResourcesPath; + OPTIONS_FILE = sharedResourcesPath.getParent().resolve("options.txt"); + } + + // Goes through every profile and adds the configuration file if it doesn't exist try (Stream paths = Files.list(PROFILES_DIRECTORY)) { paths.filter(Files::isDirectory) .forEach(path -> { @@ -34,36 +52,47 @@ public class Profiles { // This gets the configuration but also creates the configuration file if it is not there ProfileConfiguration profileConfiguration = ProfileConfiguration.get(profileName); - List optionsToLoad = profileConfiguration.getOptionsToLoad(); + Path profile = PROFILES_DIRECTORY.resolve(profileName); + Path profileOptions = profile.resolve(OPTIONS_FILE.getFileName()); - // Checks for updates to the configuration - if (profileConfiguration.getVersion() != ProfileConfiguration.configurationVersion) { - Path configurationFile = path.resolve("configuration.json"); + // Add every option value to configuration + try (Stream lines = Files.lines(profileOptions)) { + List optionsToLoad = profileConfiguration.getOptionsToLoad(); - try { - Files.delete(configurationFile); - } catch (IOException e) { - OptionsProfilesMod.LOGGER.error("[Profile '{}']: Error deleting configuration file", profileName, e); - } + lines.forEach((line) -> { + String[] option = line.split(":"); + optionsToLoad.add(option[0]); + }); - // Create the configuration.json again thus updating it - profileConfiguration = ProfileConfiguration.get(profileName); - - // Add player's old configuration - profileConfiguration.setOptionsToLoad(optionsToLoad); - - // Save configuration profileConfiguration.save(); + } catch (IOException e) { + OptionsProfilesMod.LOGGER.error("[Profile '{}']: An error occurred when adding options to the configuration file", profileName, e); } - OptionsProfilesMod.LOGGER.warn("[Profile '{}']: Profile configuration updated / added", profileName); + OptionsProfilesMod.LOGGER.warn("[Profile '{}']: Profile configuration added", profileName); }); } catch (IOException e) { OptionsProfilesMod.LOGGER.error("An error occurred when updating profiles", e); } + + // Loading profiles on startup + try (DirectoryStream directoryStream = Files.newDirectoryStream(Profiles.PROFILES_DIRECTORY)) { + for (Path profile : directoryStream) { + String profileName = profile.getFileName().toString(); + ProfileConfiguration profileConfiguration = ProfileConfiguration.get(profileName); + + if (profileConfiguration.isLoadOnStartup()) { + OptionsProfilesMod.PROFILES_INSTANCE.loadProfile(profileName); + } + } + } catch (Exception e) { + OptionsProfilesMod.LOGGER.error("An error occurred when loading startup profiles", e); + } + + return; } - public static void createProfile() { + public void createProfile() { String profileName = "Profile 1"; Path profile = PROFILES_DIRECTORY.resolve(profileName); @@ -87,7 +116,7 @@ public class Profiles { } } - private static void copyOptionFile(Path profile, Path options) { + private void copyOptionFile(Path profile, Path options) { if (Files.exists(options)) { Path profileOptions = profile.resolve(options.getFileName()); @@ -100,7 +129,7 @@ public class Profiles { } } - public static void writeProfile(String profileName, boolean overwriting) { + public void writeProfile(String profileName, boolean overwriting) { Path profile = PROFILES_DIRECTORY.resolve(profileName); Path profileOptions = profile.resolve("options.txt"); @@ -146,13 +175,13 @@ public class Profiles { } } - public static boolean isProfileLoaded(String profileName) { + public boolean isProfileLoaded(String profileName) { Path profile = PROFILES_DIRECTORY.resolve(profileName); List optionFiles = new ArrayList<>(); optionFiles.add(OPTIONS_FILE); - // The next few lines check if the specified file exists. If so, it adds it to the optionFiles ArrayList. + // These lines check if the specified file exists. If so, it adds it to the optionFiles ArrayList. Optional.of(OPTIFINE_OPTIONS_FILE).filter(Files::exists).ifPresent(optionFiles::add); Optional.of(SODIUM_OPTIONS_FILE).filter(Files::exists).ifPresent(optionFiles::add); Optional.of(SODIUM_EXTRA_OPTIONS_FILE).filter(Files::exists).ifPresent(optionFiles::add); @@ -175,7 +204,7 @@ public class Profiles { return true; } - private static void loadOptionFile(String profileName, Path options) { + private void loadOptionFile(String profileName, Path options) { ProfileConfiguration profileConfiguration = ProfileConfiguration.get(profileName); Path profile = PROFILES_DIRECTORY.resolve(profileName); @@ -244,7 +273,7 @@ public class Profiles { } } - private static void loadOptionFile(String profileName, Path options, Consumer loader) { + private void loadOptionFile(String profileName, Path options, Consumer loader) { Path profile = PROFILES_DIRECTORY.resolve(profileName); Path profileOptions = profile.resolve(options.getFileName()); @@ -254,7 +283,7 @@ public class Profiles { } } - public static void loadProfile(String profileName) { + public void loadProfile(String profileName) { loadOptionFile(profileName, OPTIONS_FILE); loadOptionFile(profileName, OPTIFINE_OPTIONS_FILE); loadOptionFile(profileName, SODIUM_OPTIONS_FILE, SodiumLoader::load); @@ -265,7 +294,7 @@ public class Profiles { loadOptionFile(profileName, DISTANT_HORIZONS_OPTIONS_FILE, DistantHorizonsLoader::load); // Tell Distant Horizons mod to reload configuration } - public static void renameProfile(String profileName, String newProfileName) { + public void renameProfile(String profileName, String newProfileName) { Path profile = PROFILES_DIRECTORY.resolve(profileName); Path newProfile = PROFILES_DIRECTORY.resolve(newProfileName); @@ -282,7 +311,7 @@ public class Profiles { } } - public static void deleteProfile(String profileName) { + public void deleteProfile(String profileName) { Path profile = PROFILES_DIRECTORY.resolve(profileName); try { diff --git a/common/src/main/java/com/axolotlmaid/optionsprofiles/profiles/SharedResourcesProfiles.java b/common/src/main/java/com/axolotlmaid/optionsprofiles/profiles/SharedResourcesProfiles.java new file mode 100644 index 0000000..b57d394 --- /dev/null +++ b/common/src/main/java/com/axolotlmaid/optionsprofiles/profiles/SharedResourcesProfiles.java @@ -0,0 +1,21 @@ +package com.axolotlmaid.optionsprofiles.profiles; + +import net.minecraft.network.chat.Component; +import nl.enjarai.shared_resources.api.GameResourceRegistry; +import nl.enjarai.shared_resources.api.ResourceDirectory; +import nl.enjarai.shared_resources.api.ResourceDirectoryBuilder; +import nl.enjarai.shared_resources.api.SharedResourcesEntrypoint; +import net.minecraft.resources.ResourceLocation; + +public class SharedResourcesProfiles implements SharedResourcesEntrypoint { + public static final ResourceDirectory SHARED_RESOURCES_PROFILES_DIRECTORY = new ResourceDirectoryBuilder("options-profiles") + .setDisplayName(Component.translatable("gui.optionsprofiles")) + .defaultEnabled(true) + .isExperimental() + .build(); + + @Override + public void registerResources(GameResourceRegistry registry) { + registry.register(ResourceLocation.fromNamespaceAndPath("optionsprofiles", "profiles_directory"), SHARED_RESOURCES_PROFILES_DIRECTORY); + } +} diff --git a/common/src/main/resources/assets/optionsprofiles/lang/en_us.json b/common/src/main/resources/assets/optionsprofiles/lang/en_us.json index e3b4a31..4169c26 100644 --- a/common/src/main/resources/assets/optionsprofiles/lang/en_us.json +++ b/common/src/main/resources/assets/optionsprofiles/lang/en_us.json @@ -1,4 +1,6 @@ { + "gui.optionsprofiles": "Options Profiles", + "gui.optionsprofiles.profiles-menu": "Profiles", "gui.optionsprofiles.save-current-options": "Save Current Options", "gui.optionsprofiles.load-profile": "✔ (Load)", diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index dfa1327..f265cc3 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -18,6 +18,9 @@ "entrypoints": { "main": [ "com.axolotlmaid.optionsprofiles.fabric.OptionsProfilesModFabric" + ], + "shared-resources": [ + "com.axolotlmaid.optionsprofiles.profiles.SharedResourcesProfiles" ] }, "mixins": [