feat: load profiles on startup (#17)

This commit is contained in:
trafficlunar 2025-03-01 11:12:52 +00:00
parent 84b1eadf4a
commit 1b8e17e02b
6 changed files with 48 additions and 41 deletions

View file

@ -1,5 +1,6 @@
package net.trafficlunar.optionsprofiles; package net.trafficlunar.optionsprofiles;
import dev.architectury.event.events.client.ClientLifecycleEvent;
import dev.architectury.event.events.common.CommandRegistrationEvent; import dev.architectury.event.events.common.CommandRegistrationEvent;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.commands.Commands; import net.minecraft.commands.Commands;
@ -29,11 +30,9 @@ public class OptionsProfilesMod {
} }
} }
// Load mod config
CONFIG = OptionsProfilesModConfiguration.load(); CONFIG = OptionsProfilesModConfiguration.load();
// Update / add configuration for existing profiles
Profiles.updateProfiles();
// Add /optionsprofiles command // Add /optionsprofiles command
CommandRegistrationEvent.EVENT.register(((dispatcher, buildContext, selection) -> dispatcher.register( CommandRegistrationEvent.EVENT.register(((dispatcher, buildContext, selection) -> dispatcher.register(
Commands Commands
@ -43,6 +42,11 @@ public class OptionsProfilesMod {
return 1; return 1;
}) })
))); )));
// Init profiles
ClientLifecycleEvent.CLIENT_STARTED.register(client -> {
Profiles.init();
});
} }
public static OptionsProfilesModConfiguration config() { public static OptionsProfilesModConfiguration config() {

View file

@ -1,29 +1,29 @@
package net.trafficlunar.optionsprofiles.gui; package net.trafficlunar.optionsprofiles.gui;
import net.trafficlunar.optionsprofiles.profiles.Profiles;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.*;
import net.minecraft.client.gui.components.EditBox;
import net.minecraft.client.gui.components.StringWidget;
import net.minecraft.client.gui.components.Tooltip;
import net.minecraft.client.gui.layouts.HeaderAndFooterLayout; import net.minecraft.client.gui.layouts.HeaderAndFooterLayout;
import net.minecraft.client.gui.layouts.LayoutSettings; import net.minecraft.client.gui.layouts.LayoutSettings;
import net.minecraft.client.gui.layouts.LinearLayout; import net.minecraft.client.gui.layouts.LinearLayout;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.CommonComponents;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.trafficlunar.optionsprofiles.profiles.ProfileConfiguration;
import net.trafficlunar.optionsprofiles.profiles.Profiles;
public class EditProfileScreen extends Screen { public class EditProfileScreen extends Screen {
private final ProfilesScreen profilesScreen; private final ProfilesScreen profilesScreen;
private final HeaderAndFooterLayout layout = new HeaderAndFooterLayout(this, 24, 33); private final HeaderAndFooterLayout layout = new HeaderAndFooterLayout(this, 24, 33);
private final Component profileName; private final Component profileName;
private final ProfileConfiguration profileConfiguration;
private EditBox profileNameEdit; private EditBox profileNameEdit;
public EditProfileScreen(ProfilesScreen profilesScreen, Component profileName) { public EditProfileScreen(ProfilesScreen profilesScreen, Component profileName) {
super(Component.literal(Component.translatable("gui.optionsprofiles.editing-profile-title").getString() + profileName.getString())); super(Component.literal(Component.translatable("gui.optionsprofiles.editing-profile-title").getString() + profileName.getString()));
this.profilesScreen = profilesScreen; this.profilesScreen = profilesScreen;
this.profileName = profileName; this.profileName = profileName;
this.profileConfiguration = ProfileConfiguration.get(profileName.getString());
} }
protected void init() { protected void init() {
@ -77,6 +77,28 @@ public class EditProfileScreen extends Screen {
LayoutSettings::alignHorizontallyCenter LayoutSettings::alignHorizontallyCenter
); );
LinearLayout linearLayoutStartup = linearLayoutContent.addChild(LinearLayout.horizontal().spacing(12), LayoutSettings::alignHorizontallyCenter);
CycleButton<Boolean> loadOnStartupButton = CycleButton.onOffBuilder(this.profileConfiguration.shouldLoadOnStartup()).displayOnlyValue().create(0, 0, 44, 20, Component.empty(), (button, boolean_) -> {
// If toggled to true
if (boolean_) {
button.setMessage(button.getMessage().copy().withStyle(ChatFormatting.GREEN)); // Set the button's color to green
} else {
button.setMessage(button.getMessage().copy().withStyle(ChatFormatting.RED)); // Set the button's color to red
}
this.profileConfiguration.setLoadOnStartup(boolean_);
});
// Set color on first init
if (this.profileConfiguration.shouldLoadOnStartup()) {
loadOnStartupButton.setMessage(loadOnStartupButton.getMessage().copy().withStyle(ChatFormatting.GREEN)); // Set the button's color to green
} else {
loadOnStartupButton.setMessage(loadOnStartupButton.getMessage().copy().withStyle(ChatFormatting.RED)); // Set the button's color to red
}
linearLayoutStartup.addChild(new StringWidget(Component.translatable("gui.optionsprofiles.load-on-startup"), this.font), LayoutSettings::alignVerticallyMiddle);
linearLayoutStartup.addChild(loadOnStartupButton);
this.layout.addToFooter( this.layout.addToFooter(
Button.builder( Button.builder(
CommonComponents.GUI_DONE, CommonComponents.GUI_DONE,
@ -106,6 +128,7 @@ public class EditProfileScreen extends Screen {
} }
public void onClose() { public void onClose() {
this.profileConfiguration.save();
this.minecraft.setScreen(this.profilesScreen); this.minecraft.setScreen(this.profilesScreen);
this.profilesScreen.profilesList.refreshEntries(); this.profilesScreen.profilesList.refreshEntries();
} }

View file

@ -27,7 +27,7 @@ public class SettingsScreen extends Screen {
linearLayoutHeader.addChild(new StringWidget(this.title, this.font), LayoutSettings::alignHorizontallyCenter); linearLayoutHeader.addChild(new StringWidget(this.title, this.font), LayoutSettings::alignHorizontallyCenter);
LinearLayout linearLayoutContent = this.layout.addToContents(LinearLayout.horizontal().spacing(12), LayoutSettings::alignHorizontallyCenter); LinearLayout linearLayoutContent = this.layout.addToContents(LinearLayout.horizontal().spacing(12), LayoutSettings::alignHorizontallyCenter);
CycleButton<Boolean> showProfilesButtonButton = CycleButton.onOffBuilder(OptionsProfilesMod.config().shouldShowProfilesButton()).displayOnlyValue().create(this.width / 2 + 60, 100, 44, 20, Component.empty(), (button, boolean_) -> { CycleButton<Boolean> showProfilesButtonButton = CycleButton.onOffBuilder(OptionsProfilesMod.config().shouldShowProfilesButton()).displayOnlyValue().create(0, 0, 44, 20, Component.empty(), (button, boolean_) -> {
// If toggled to true // If toggled to true
if (boolean_) { if (boolean_) {
button.setMessage(button.getMessage().copy().withStyle(ChatFormatting.GREEN)); // Set the button's color to green button.setMessage(button.getMessage().copy().withStyle(ChatFormatting.GREEN)); // Set the button's color to green

View file

@ -1,8 +1,8 @@
package net.trafficlunar.optionsprofiles.profiles; package net.trafficlunar.optionsprofiles.profiles;
import net.trafficlunar.optionsprofiles.OptionsProfilesMod;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import net.trafficlunar.optionsprofiles.OptionsProfilesMod;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.BufferedWriter; import java.io.BufferedWriter;
@ -16,8 +16,7 @@ public class ProfileConfiguration {
private static Path configurationFile; private static Path configurationFile;
private static String profileName; private static String profileName;
public static int configurationVersion = 1; // Used to update configuration in later revisions private boolean loadOnStartup = false;
private int version = configurationVersion; // ^ same here - this variable is used to show it in the configuration.json file
private List<String> optionsToLoad = new ArrayList<>(); private List<String> optionsToLoad = new ArrayList<>();
public ProfileConfiguration save() { public ProfileConfiguration save() {
@ -56,12 +55,12 @@ public class ProfileConfiguration {
return configuration; return configuration;
} }
public int getVersion() { public boolean shouldLoadOnStartup() {
return version; return loadOnStartup;
} }
public void setVersion(int version) { public void setLoadOnStartup(boolean loadOnStartup) {
this.version = version; this.loadOnStartup = loadOnStartup;
} }
public List<String> getOptionsToLoad() { public List<String> getOptionsToLoad() {

View file

@ -27,8 +27,7 @@ public class Profiles {
public static final Path IRIS_OPTIONS_FILE = Paths.get("config/iris.properties"); public static final Path IRIS_OPTIONS_FILE = Paths.get("config/iris.properties");
public static final Path DISTANT_HORIZONS_OPTIONS_FILE = Paths.get("config/DistantHorizons.toml"); 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 init() {
public static void updateProfiles() {
try (Stream<Path> paths = Files.list(PROFILES_DIRECTORY)) { try (Stream<Path> paths = Files.list(PROFILES_DIRECTORY)) {
paths.filter(Files::isDirectory) paths.filter(Files::isDirectory)
.forEach(path -> { .forEach(path -> {
@ -36,32 +35,13 @@ public class Profiles {
// This gets the configuration but also creates the configuration file if it is not there // This gets the configuration but also creates the configuration file if it is not there
ProfileConfiguration profileConfiguration = ProfileConfiguration.get(profileName); ProfileConfiguration profileConfiguration = ProfileConfiguration.get(profileName);
List<String> optionsToLoad = profileConfiguration.getOptionsToLoad(); if (profileConfiguration.shouldLoadOnStartup()) {
loadProfile(profileName);
// Checks for updates to the configuration OptionsProfilesMod.LOGGER.warn("[Profile '{}']: Loaded on startup", profileName);
if (profileConfiguration.getVersion() != ProfileConfiguration.configurationVersion) {
Path configurationFile = path.resolve("configuration.json");
try {
Files.delete(configurationFile);
} catch (IOException e) {
OptionsProfilesMod.LOGGER.error("[Profile '{}']: Error deleting configuration file", profileName, e);
}
// Create the configuration.json again thus updating it
profileConfiguration = ProfileConfiguration.get(profileName);
// Add player's old configuration
profileConfiguration.setOptionsToLoad(optionsToLoad);
// Save configuration
profileConfiguration.save();
} }
OptionsProfilesMod.LOGGER.warn("[Profile '{}']: Profile configuration updated / added", profileName);
}); });
} catch (IOException e) { } catch (IOException e) {
OptionsProfilesMod.LOGGER.error("An error occurred when updating profiles", e); OptionsProfilesMod.LOGGER.error("An error occurred when initializing", e);
} }
} }

View file

@ -10,6 +10,7 @@
"gui.optionsprofiles.overwrite-options.tooltip": "Replaces the profile's options with your current options", "gui.optionsprofiles.overwrite-options.tooltip": "Replaces the profile's options with your current options",
"gui.optionsprofiles.rename-profile": "Rename", "gui.optionsprofiles.rename-profile": "Rename",
"gui.optionsprofiles.delete-profile": "Delete", "gui.optionsprofiles.delete-profile": "Delete",
"gui.optionsprofiles.load-on-startup": "Load on startup",
"gui.optionsprofiles.options-toggle": "Select options to toggle", "gui.optionsprofiles.options-toggle": "Select options to toggle",
"gui.optionsprofiles.options-toggle.tooltip": "Select the options you want to load in this profile", "gui.optionsprofiles.options-toggle.tooltip": "Select the options you want to load in this profile",