Compare commits

..

1 commit

Author SHA1 Message Date
0a3c79ec54 feat: port to v1.4.4 2025-11-07 21:21:59 +00:00
23 changed files with 136 additions and 174 deletions

View file

@ -7,29 +7,24 @@
Options Profiles is a Minecraft mod that lets you load and save your options as profiles from in-game. Options Profiles is a Minecraft mod that lets you load and save your options as profiles from in-game.
## Features ## Features
- Save and load profiles in-game - Save and load profiles in-game
- Load specific options (e.g. only load keybinds, resource packs, FOV, etc.) - Load specific options (like only load keybinds, resource packs or FOV and GUI scale)
- Load profiles when joining a certain server
- Edit profiles in-game (deleting, renaming, overwriting, pick options to only load) - Edit profiles in-game (deleting, renaming, overwriting, pick options to only load)
- Fabric, NeoForge support - Fabric, NeoForge, Forge support
- Third party mod support (see below) - Third party mod support (see below)
## Mod Support ## Mod Support
Options Profiles supports these mods which means you can create and load profiles with them and the mod will load their configuration. Options Profiles supports these mods which means you can create and load profiles with them and the mod will load their configuration.
- Sodium - Sodium
- Sodium Extra - Sodium Extra
- Iris - Iris
- Distant Horizons - Distant Horizons
- OptiFine
If you would like support for another mod, open an issue. If you would like support for another mod, open an issue.
## Frequently Asked Questions ## Frequently Asked Questions
- How to open profiles menu without going to options?
> You can open the profiles menu by using the command `/optionsprofiles` or by accessing it from Mod Menu
- Can you port [version]? - Can you port [version]?
> Open an issue in the GitHub repository. > Open an issue in the GitHub repository.
- Can I use this in my modpack? - Can I use this in my modpack?
@ -44,10 +39,10 @@ If you would like support for another mod, open an issue.
## Gallery ## Gallery
| Profiles Menu | Edit Profile Screen | Profiles Menu | Edit Profile Screen
| :--------------------------------------------------------: | :--------------------------------------------------------------------: | :-------------------------:|:-------------------------:
| <img src="gallery/profiles-menu.png" alt="profiles list"/> | <img src="gallery/edit-profile-screen.png" alt="edit profile screen"/> | <img src="gallery/profiles-menu.png" alt="profiles list"/> | <img src="gallery/edit-profile-screen.png" alt="edit profile screen"/>
| Options Toggle Menu | Options Screen | Options Toggle Menu | Options Screen
| :--------------------------------------------------------------------: | :----------------------------------------------------------: | :-------------------------:|:-------------------------:
| <img src="gallery/options-toggle-menu.png" alt="options toggle menu"/> | <img src="gallery/options-screen.png" alt="options screen"/> | <img src="gallery/options-toggle-menu.png" alt="options toggle menu"/> | <img src="gallery/options-screen.png" alt="options screen"/>

View file

@ -1,7 +1,7 @@
plugins { plugins {
id 'dev.architectury.loom' version '1.11-SNAPSHOT' apply false id 'dev.architectury.loom' version '1.7-SNAPSHOT' apply false
id 'architectury-plugin' version '3.4-SNAPSHOT' id 'architectury-plugin' version '3.4-SNAPSHOT'
id 'com.gradleup.shadow' version '8.3.6' apply false id 'com.github.johnrengelman.shadow' version '8.1.1' apply false
} }
architectury { architectury {
@ -31,10 +31,6 @@ subprojects {
// for more information about repositories. // for more information about repositories.
} }
loom {
silentMojangMappingsLicense()
}
dependencies { dependencies {
minecraft "net.minecraft:minecraft:$rootProject.minecraft_version" minecraft "net.minecraft:minecraft:$rootProject.minecraft_version"
mappings loom.officialMojangMappings() mappings loom.officialMojangMappings()

View file

@ -26,9 +26,9 @@ dependencies {
modImplementation "dev.architectury:architectury:$rootProject.architectury_api_version" modImplementation "dev.architectury:architectury:$rootProject.architectury_api_version"
// Mod implementations // Mod implementations
modImplementation "maven.modrinth:sodium:mc1.21.10-0.7.2-fabric" // Sodium modImplementation "maven.modrinth:sodium:mc1.21.4-0.6.13-fabric" // Sodium
modImplementation "maven.modrinth:sodium-extra:mc1.21.9-0.7.0+fabric" // Sodium Extra modImplementation "maven.modrinth:sodium-extra:mc1.21.4-0.6.1+fabric" // Sodium Extra
modImplementation "maven.modrinth:iris:1.9.6+1.21.10-fabric" // Iris modImplementation "maven.modrinth:iris:1.8.8+1.21.4-fabric" // Iris
modImplementation "maven.modrinth:distanthorizons:2.3.6-b-1.21.10" // Distant Horizons modImplementation "maven.modrinth:distanthorizons:2.2.1-a-1.21.1" // Distant Horizons
modImplementation "maven.modrinth:controlify:2.4.2-fabric,1.21.9" // Controlify modImplementation "maven.modrinth:controlify:2.1.1-fabric,1.21.4" // Controlify
} }

View file

@ -5,7 +5,6 @@ import dev.architectury.event.events.client.ClientTickEvent;
import dev.architectury.registry.client.keymappings.KeyMappingRegistry; import dev.architectury.registry.client.keymappings.KeyMappingRegistry;
import net.minecraft.client.KeyMapping; import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.resources.ResourceLocation;
import net.trafficlunar.optionsprofiles.profiles.ProfileConfiguration; import net.trafficlunar.optionsprofiles.profiles.ProfileConfiguration;
import net.trafficlunar.optionsprofiles.profiles.Profiles; import net.trafficlunar.optionsprofiles.profiles.Profiles;
@ -18,14 +17,12 @@ public class Keybinds {
private static final KeyMapping[] PROFILE_KEYMAPPINGS = new KeyMapping[3]; private static final KeyMapping[] PROFILE_KEYMAPPINGS = new KeyMapping[3];
public static void init() { public static void init() {
KeyMapping.Category category = KeyMapping.Category.register(ResourceLocation.fromNamespaceAndPath(OptionsProfilesMod.MOD_ID, "keys"));
for (int i = 0; i < PROFILE_KEYMAPPINGS.length; i++) { for (int i = 0; i < PROFILE_KEYMAPPINGS.length; i++) {
PROFILE_KEYMAPPINGS[i] = new KeyMapping( PROFILE_KEYMAPPINGS[i] = new KeyMapping(
"key.optionsprofiles.profile_" + (i + 1), "key.optionsprofiles.profile_" + (i + 1),
InputConstants.Type.KEYSYM, InputConstants.Type.KEYSYM,
-1, -1,
category "category.optionsprofiles.keys"
); );
KeyMappingRegistry.register(PROFILE_KEYMAPPINGS[i]); KeyMappingRegistry.register(PROFILE_KEYMAPPINGS[i]);
} }
@ -47,7 +44,19 @@ public class Keybinds {
ProfileConfiguration profileConfiguration = ProfileConfiguration.get(profileName); ProfileConfiguration profileConfiguration = ProfileConfiguration.get(profileName);
if (profileConfiguration.getKeybindIndex() == keybindIndex) { if (profileConfiguration.getKeybindIndex() == keybindIndex) {
Minecraft minecraft = Minecraft.getInstance();
Profiles.loadProfile(profileName); Profiles.loadProfile(profileName);
minecraft.options.load();
if (ProfileConfiguration.get(profileName).getOptionsToLoad().contains("resourcePacks")) {
minecraft.options.loadSelectedResourcePacks(minecraft.getResourcePackRepository());
minecraft.reloadResourcePacks();
}
minecraft.options.save();
minecraft.levelRenderer.allChanged();
OptionsProfilesMod.LOGGER.warn("[Profile '{}']: Loaded through keybind", profileName); OptionsProfilesMod.LOGGER.warn("[Profile '{}']: Loaded through keybind", profileName);
} }
}); });

View file

@ -1,8 +1,5 @@
package net.trafficlunar.optionsprofiles.gui; package net.trafficlunar.optionsprofiles.gui;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.gui.screens.options.controls.KeyBindsList;
import net.trafficlunar.optionsprofiles.OptionsProfilesMod; import net.trafficlunar.optionsprofiles.OptionsProfilesMod;
import net.trafficlunar.optionsprofiles.profiles.ProfileConfiguration; import net.trafficlunar.optionsprofiles.profiles.ProfileConfiguration;
import net.trafficlunar.optionsprofiles.profiles.Profiles; import net.trafficlunar.optionsprofiles.profiles.Profiles;
@ -13,7 +10,6 @@ import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.ContainerObjectSelectionList; import net.minecraft.client.gui.components.ContainerObjectSelectionList;
import net.minecraft.client.gui.components.CycleButton; import net.minecraft.client.gui.components.CycleButton;
import net.minecraft.client.gui.components.EditBox;
import net.minecraft.client.gui.components.Tooltip; import net.minecraft.client.gui.components.Tooltip;
import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.client.gui.narration.NarratableEntry;
@ -26,40 +22,21 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Stream; import java.util.stream.Stream;
public class OptionsToggleList extends ContainerObjectSelectionList<OptionsToggleList.OptionEntry> { public class OptionsToggleList extends ContainerObjectSelectionList<OptionsToggleList.Entry> {
private final String profileName; private final String profileName;
private final ProfileConfiguration profileConfiguration; private final ProfileConfiguration profileConfiguration;
private final EditBox searchBox;
private final List<OptionEntry> allEntries = new ArrayList<>();
public OptionsToggleList(OptionsToggleScreen optionsToggleScreen, Minecraft minecraft, String profileName, ProfileConfiguration profileConfiguration, EditBox searchBox) { public OptionsToggleList(OptionsToggleScreen optionsToggleScreen, Minecraft minecraft, String profileName, ProfileConfiguration profileConfiguration) {
super(minecraft, optionsToggleScreen.width, optionsToggleScreen.layout.getContentHeight(), optionsToggleScreen.layout.getHeaderHeight(), 20); super(minecraft, optionsToggleScreen.width, optionsToggleScreen.layout.getContentHeight(), optionsToggleScreen.layout.getHeaderHeight(), 20);
this.profileConfiguration = profileConfiguration; this.profileConfiguration = profileConfiguration;
this.profileName = profileName; this.profileName = profileName;
this.searchBox = searchBox;
this.searchBox.setResponder(this::filterEntries);
refreshEntries(false, false); refreshEntries(false, false);
} }
private void filterEntries(String searchText) {
this.clearEntries();
if (searchText.isEmpty()) {
allEntries.forEach(this::addEntry);
return;
}
String filter = searchText.toLowerCase();
allEntries.stream()
.filter(entry -> entry.key.toLowerCase().contains(filter))
.forEach(this::addEntry);
}
// If overriding boolean is set to true then this function will set every option in the list to overrideToggle (false or true) // If overriding boolean is set to true then this function will set every option in the list to overrideToggle (false or true)
public void refreshEntries(boolean overriding, boolean overrideToggle) { public void refreshEntries(boolean overriding, boolean overrideToggle) {
allEntries.clear(); this.clearEntries();
Path profile = Profiles.PROFILES_DIRECTORY.resolve(profileName); Path profile = Profiles.PROFILES_DIRECTORY.resolve(profileName);
Path optionsFile = profile.resolve("options.txt"); Path optionsFile = profile.resolve("options.txt");
@ -83,16 +60,14 @@ public class OptionsToggleList extends ContainerObjectSelectionList<OptionsToggl
} }
// Add entry with option key and value and if the key is in the profile configuration // Add entry with option key and value and if the key is in the profile configuration
allEntries.add(new OptionEntry(option[0], option[1], profileConfiguration.getOptionsToLoad().contains(option[0]))); this.addEntry(new OptionEntry(option[0], option[1], profileConfiguration.getOptionsToLoad().contains(option[0])));
} else { } else {
allEntries.add(new OptionEntry(option[0], "", profileConfiguration.getOptionsToLoad().contains(option[0]))); this.addEntry(new OptionEntry(option[0], "", profileConfiguration.getOptionsToLoad().contains(option[0])));
} }
}); });
} catch (IOException e) { } catch (IOException e) {
OptionsProfilesMod.LOGGER.error("An error occurred when listing options", e); OptionsProfilesMod.LOGGER.error("An error occurred when listing options", e);
} }
filterEntries(searchBox.getValue());
} }
protected int scrollBarX() { protected int scrollBarX() {
@ -103,13 +78,11 @@ public class OptionsToggleList extends ContainerObjectSelectionList<OptionsToggl
return 340; return 340;
} }
public class OptionEntry extends ContainerObjectSelectionList.Entry<OptionEntry> { public class OptionEntry extends Entry {
private final String key;
private final Component optionKey; private final Component optionKey;
private final CycleButton<Boolean> toggleButton; private final CycleButton<Boolean> toggleButton;
OptionEntry(String optionKey, String optionValue, boolean toggled) { OptionEntry(String optionKey, String optionValue, boolean toggled) {
this.key = optionKey;
this.optionKey = Component.literal(optionKey); this.optionKey = Component.literal(optionKey);
this.toggleButton = CycleButton.onOffBuilder(toggled).displayOnlyValue().create(0, 0, 44, 20, Component.empty(), (button, boolean_) -> { this.toggleButton = CycleButton.onOffBuilder(toggled).displayOnlyValue().create(0, 0, 44, 20, Component.empty(), (button, boolean_) -> {
@ -137,14 +110,17 @@ public class OptionsToggleList extends ContainerObjectSelectionList<OptionsToggl
} }
} }
public void renderContent(GuiGraphics guiGraphics, int mouseX, int mouseY, boolean hovered, float tickDelta) { public void render(GuiGraphics guiGraphics, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) {
Font fontRenderer = OptionsToggleList.this.minecraft.font;
int posX = OptionsToggleList.this.scrollBarX() - this.toggleButton.getWidth() - 10; int posX = OptionsToggleList.this.scrollBarX() - this.toggleButton.getWidth() - 10;
int posY = this.getContentY() - 2; int posY = y - 2;
int textY = y + entryHeight / 2;
guiGraphics.drawString(fontRenderer, this.optionKey, x, textY - 9 / 2, 16777215, false);
this.toggleButton.setPosition(posX, posY); this.toggleButton.setPosition(posX, posY);
this.toggleButton.render(guiGraphics, mouseX, mouseY, tickDelta); this.toggleButton.render(guiGraphics, mouseX, mouseY, tickDelta);
guiGraphics.drawString(OptionsToggleList.this.minecraft.font, this.optionKey, this.getContentX(), this.getContentYMiddle() - 4, -1);
} }
public List<? extends GuiEventListener> children() { public List<? extends GuiEventListener> children() {
@ -155,4 +131,9 @@ public class OptionsToggleList extends ContainerObjectSelectionList<OptionsToggl
return ImmutableList.of(this.toggleButton); return ImmutableList.of(this.toggleButton);
} }
} }
public abstract static class Entry extends ContainerObjectSelectionList.Entry<OptionsToggleList.Entry> {
public Entry() {
}
}
} }

View file

@ -1,22 +1,18 @@
package net.trafficlunar.optionsprofiles.gui; package net.trafficlunar.optionsprofiles.gui;
import net.trafficlunar.optionsprofiles.profiles.ProfileConfiguration;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.EditBox;
import net.minecraft.client.gui.components.StringWidget;
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.client.gui.screens.options.OptionsSubScreen; import net.minecraft.client.gui.screens.options.OptionsSubScreen;
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;
public class OptionsToggleScreen extends OptionsSubScreen { public class OptionsToggleScreen extends OptionsSubScreen {
private final Component profileName; private final Component profileName;
private final ProfileConfiguration profileConfiguration; private final ProfileConfiguration profileConfiguration;
private OptionsToggleList optionsToggleList; private OptionsToggleList optionsToggleList;
private EditBox searchBox;
protected OptionsToggleScreen(Screen lastScreen, Component profileName, ProfileConfiguration profileConfiguration) { protected OptionsToggleScreen(Screen lastScreen, Component profileName, ProfileConfiguration profileConfiguration) {
super(lastScreen, null, Component.literal(Component.translatable("gui.optionsprofiles.options-toggle").append(": ").getString() + profileName.getString())); super(lastScreen, null, Component.literal(Component.translatable("gui.optionsprofiles.options-toggle").append(": ").getString() + profileName.getString()));
@ -24,22 +20,11 @@ public class OptionsToggleScreen extends OptionsSubScreen {
this.profileConfiguration = profileConfiguration; this.profileConfiguration = profileConfiguration;
} }
protected void init() {
this.searchBox = new EditBox(this.minecraft.font, 0, 0, 200, 20, Component.empty());
this.searchBox.setHint(Component.translatable("gui.optionsprofiles.options-search-hint"));
super.init();
}
protected void addTitle() {
this.layout.addToHeader(new StringWidget(this.title, this.font), (settings) -> settings.alignVerticallyTop().paddingTop(6));
this.layout.addToHeader(this.searchBox, (settings) -> settings.alignVerticallyBottom().padding(4));
}
protected void addOptions() {} protected void addOptions() {}
protected void addContents() { protected void addContents() {
this.layout.setHeaderHeight(42); this.layout.setHeaderHeight(24);
this.optionsToggleList = this.layout.addToContents(new OptionsToggleList(this, this.minecraft, profileName.getString(), this.profileConfiguration, this.searchBox)); this.optionsToggleList = this.layout.addToContents(new OptionsToggleList(this, this.minecraft, profileName.getString(), this.profileConfiguration));
} }
protected void addFooter() { protected void addFooter() {

View file

@ -50,14 +50,8 @@ public class ProfilesList extends ContainerObjectSelectionList<ProfilesList.Prof
} catch (Exception e) { } catch (Exception e) {
OptionsProfilesMod.LOGGER.error("An error occurred when listing profiles", e); OptionsProfilesMod.LOGGER.error("An error occurred when listing profiles", e);
} }
// checkEntriesLoaded();
} }
// public void checkEntriesLoaded() {
// this.children().forEach(ProfileEntry::checkLoaded);
// }
protected int scrollBarX() { protected int scrollBarX() {
return super.scrollBarX() + 15; return super.scrollBarX() + 15;
} }
@ -84,26 +78,35 @@ public class ProfilesList extends ContainerObjectSelectionList<ProfilesList.Prof
Component.translatable("gui.optionsprofiles.load-profile"), Component.translatable("gui.optionsprofiles.load-profile"),
(button) -> { (button) -> {
Profiles.loadProfile(profileName.getString()); Profiles.loadProfile(profileName.getString());
OptionsProfilesMod.LOGGER.warn("[Profile '{}']: Loaded through button", profileName);
// ProfilesList.this.checkEntriesLoaded(); minecraft.options.load();
// button.active = false;
if (ProfileConfiguration.get(profileName.getString()).getOptionsToLoad().contains("resourcePacks")) {
minecraft.options.loadSelectedResourcePacks(minecraft.getResourcePackRepository());
minecraft.reloadResourcePacks();
}
minecraft.options.save();
minecraft.levelRenderer.allChanged();
}) })
.size(75, 20) .size(75, 20)
.build(); .build();
} }
public void renderContent(GuiGraphics guiGraphics, int mouseX, int mouseY, boolean hovered, float tickDelta) { public void render(GuiGraphics guiGraphics, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) {
Font fontRenderer = ProfilesList.this.minecraft.font;
int posX = ProfilesList.this.scrollBarX() - this.loadButton.getWidth() - 10; int posX = ProfilesList.this.scrollBarX() - this.loadButton.getWidth() - 10;
int posY = this.getContentY() - 2; int posY = y - 2;
int textY = y + entryHeight / 2;
guiGraphics.drawString(fontRenderer, this.profileName, x, textY - 9 / 2, 16777215, false);
this.editButton.setPosition(posX - this.editButton.getWidth(), posY); this.editButton.setPosition(posX - this.editButton.getWidth(), posY);
this.editButton.render(guiGraphics, mouseX, mouseY, tickDelta); this.editButton.render(guiGraphics, mouseX, mouseY, tickDelta);
this.loadButton.setPosition(posX, posY); this.loadButton.setPosition(posX, posY);
this.loadButton.render(guiGraphics, mouseX, mouseY, tickDelta); this.loadButton.render(guiGraphics, mouseX, mouseY, tickDelta);
guiGraphics.drawString(ProfilesList.this.minecraft.font, this.profileName, this.getContentX(), this.getContentYMiddle() - 4, -1);
} }
public List<? extends GuiEventListener> children() { public List<? extends GuiEventListener> children() {
@ -113,9 +116,5 @@ public class ProfilesList extends ContainerObjectSelectionList<ProfilesList.Prof
public List<? extends NarratableEntry> narratables() { public List<? extends NarratableEntry> narratables() {
return ImmutableList.of(this.editButton, this.loadButton); return ImmutableList.of(this.editButton, this.loadButton);
} }
// protected void checkLoaded() {
// this.loadButton.active = !Profiles.isProfileLoaded(profileName.getString());
// }
} }
} }

View file

@ -1,11 +1,11 @@
package net.trafficlunar.optionsprofiles.profiles.loaders; package net.trafficlunar.optionsprofiles.profiles.loaders;
import com.seibel.distanthorizons.core.config.ConfigHandler; import com.seibel.distanthorizons.core.config.ConfigBase;
import java.nio.file.Path; import java.nio.file.Path;
public class DistantHorizonsLoader { public class DistantHorizonsLoader {
public static void load(Path file) { public static void load(Path file) {
ConfigHandler.INSTANCE.configFileHandler.loadFromFile(); ConfigBase.INSTANCE.configFileINSTANCE.loadFromFile();
} }
} }

View file

@ -1,25 +1,21 @@
package net.trafficlunar.optionsprofiles.profiles.loaders; package net.trafficlunar.optionsprofiles.profiles.loaders;
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 me.flashyreese.mods.sodiumextra.client.SodiumExtraClientMod; import me.flashyreese.mods.sodiumextra.client.SodiumExtraClientMod;
import me.flashyreese.mods.sodiumextra.client.gui.FogTypeConfig;
import me.flashyreese.mods.sodiumextra.client.gui.SodiumExtraGameOptions; import me.flashyreese.mods.sodiumextra.client.gui.SodiumExtraGameOptions;
import me.flashyreese.mods.sodiumextra.common.util.ResourceLocationSerializer;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.material.FogType;
import net.trafficlunar.optionsprofiles.OptionsProfilesMod;
import java.io.FileReader; import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.EnumMap;
import java.util.Map; import java.util.Map;
public class SodiumExtraLoader { public class SodiumExtraLoader {
public static void load(Path file) { public static void load(Path file) {
try (FileReader reader = new FileReader(file.toFile())) { try (FileReader reader = new FileReader(file.toFile())) {
Gson gson = new GsonBuilder().registerTypeAdapter(ResourceLocation.class, new ResourceLocationSerializer()).create(); Gson gson = new GsonBuilder().create();
Configuration configuration = gson.fromJson(reader, Configuration.class); Configuration configuration = gson.fromJson(reader, Configuration.class);
apply(configuration); apply(configuration);
@ -51,8 +47,10 @@ public class SodiumExtraLoader {
SodiumExtraClientMod.options().detailSettings.biomeColors = configuration.detail_settings.biome_colors; SodiumExtraClientMod.options().detailSettings.biomeColors = configuration.detail_settings.biome_colors;
SodiumExtraClientMod.options().detailSettings.skyColors = configuration.detail_settings.sky_colors; SodiumExtraClientMod.options().detailSettings.skyColors = configuration.detail_settings.sky_colors;
SodiumExtraClientMod.options().renderSettings.globalFog = configuration.render_settings.global_fog; SodiumExtraClientMod.options().renderSettings.fogDistance = configuration.render_settings.fog_distance;
SodiumExtraClientMod.options().renderSettings.fogTypeConfig = configuration.render_settings.fog_type_config; SodiumExtraClientMod.options().renderSettings.fogStart = configuration.render_settings.fog_start;
SodiumExtraClientMod.options().renderSettings.multiDimensionFogControl = configuration.render_settings.multi_dimension_fog_control;
SodiumExtraClientMod.options().renderSettings.dimensionFogDistanceMap = configuration.render_settings.dimensionFogDistance;
SodiumExtraClientMod.options().renderSettings.lightUpdates = configuration.render_settings.light_updates; SodiumExtraClientMod.options().renderSettings.lightUpdates = configuration.render_settings.light_updates;
SodiumExtraClientMod.options().renderSettings.itemFrame = configuration.render_settings.item_frame; SodiumExtraClientMod.options().renderSettings.itemFrame = configuration.render_settings.item_frame;
SodiumExtraClientMod.options().renderSettings.armorStand = configuration.render_settings.armor_stand; SodiumExtraClientMod.options().renderSettings.armorStand = configuration.render_settings.armor_stand;
@ -72,6 +70,7 @@ public class SodiumExtraLoader {
SodiumExtraClientMod.options().extraSettings.reduceResolutionOnMac = configuration.extra_settings.reduce_resolution_on_mac; SodiumExtraClientMod.options().extraSettings.reduceResolutionOnMac = configuration.extra_settings.reduce_resolution_on_mac;
SodiumExtraClientMod.options().extraSettings.useAdaptiveSync = configuration.extra_settings.use_adaptive_sync; SodiumExtraClientMod.options().extraSettings.useAdaptiveSync = configuration.extra_settings.use_adaptive_sync;
SodiumExtraClientMod.options().extraSettings.cloudHeight = configuration.extra_settings.cloud_height; SodiumExtraClientMod.options().extraSettings.cloudHeight = configuration.extra_settings.cloud_height;
SodiumExtraClientMod.options().extraSettings.cloudDistance = configuration.extra_settings.cloud_distance;
SodiumExtraClientMod.options().extraSettings.toasts = configuration.extra_settings.toasts; SodiumExtraClientMod.options().extraSettings.toasts = configuration.extra_settings.toasts;
SodiumExtraClientMod.options().extraSettings.advancementToast = configuration.extra_settings.advancement_toast; SodiumExtraClientMod.options().extraSettings.advancementToast = configuration.extra_settings.advancement_toast;
SodiumExtraClientMod.options().extraSettings.recipeToast = configuration.extra_settings.recipe_toast; SodiumExtraClientMod.options().extraSettings.recipeToast = configuration.extra_settings.recipe_toast;
@ -121,8 +120,10 @@ public class SodiumExtraLoader {
} }
public static class RenderSettings { public static class RenderSettings {
public boolean global_fog; public int fog_distance;
public EnumMap<FogType, FogTypeConfig> fog_type_config; public int fog_start;
public boolean multi_dimension_fog_control;
public Map<ResourceLocation, Integer> dimensionFogDistance;
public boolean light_updates; public boolean light_updates;
public boolean item_frame; public boolean item_frame;
public boolean armor_stand; public boolean armor_stand;
@ -144,6 +145,7 @@ public class SodiumExtraLoader {
public boolean reduce_resolution_on_mac; public boolean reduce_resolution_on_mac;
public boolean use_adaptive_sync; public boolean use_adaptive_sync;
public int cloud_height; public int cloud_height;
public int cloud_distance;
public boolean toasts; public boolean toasts;
public boolean advancement_toast; public boolean advancement_toast;
public boolean recipe_toast; public boolean recipe_toast;

View file

@ -1,7 +1,5 @@
package net.trafficlunar.optionsprofiles.profiles.loaders; package net.trafficlunar.optionsprofiles.profiles.loaders;
import net.caffeinemc.mods.sodium.client.render.chunk.DeferMode;
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.QuadSplittingMode;
import net.trafficlunar.optionsprofiles.OptionsProfilesMod; 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;
@ -25,8 +23,8 @@ public class SodiumLoader {
} }
private static void apply(Configuration configuration) { private static void apply(Configuration configuration) {
SodiumClientMod.options().quality.weatherQuality = SodiumGameOptions.WeatherQuality.valueOf(configuration.quality.weather_quality); SodiumClientMod.options().quality.weatherQuality = SodiumGameOptions.GraphicsQuality.valueOf(configuration.quality.weather_quality);
SodiumClientMod.options().quality.leavesQuality = SodiumGameOptions.LeavesQuality.valueOf(configuration.quality.leaves_quality); SodiumClientMod.options().quality.leavesQuality = SodiumGameOptions.GraphicsQuality.valueOf(configuration.quality.leaves_quality);
SodiumClientMod.options().quality.enableVignette = configuration.quality.enable_vignette; SodiumClientMod.options().quality.enableVignette = configuration.quality.enable_vignette;
SodiumClientMod.options().advanced.enableMemoryTracing = configuration.advanced.enable_memory_tracing; SodiumClientMod.options().advanced.enableMemoryTracing = configuration.advanced.enable_memory_tracing;
@ -34,19 +32,16 @@ public class SodiumLoader {
SodiumClientMod.options().advanced.cpuRenderAheadLimit = configuration.advanced.cpu_render_ahead_limit; SodiumClientMod.options().advanced.cpuRenderAheadLimit = configuration.advanced.cpu_render_ahead_limit;
SodiumClientMod.options().performance.chunkBuilderThreads = configuration.performance.chunk_builder_threads; SodiumClientMod.options().performance.chunkBuilderThreads = configuration.performance.chunk_builder_threads;
SodiumClientMod.options().performance.chunkBuildDeferMode = configuration.performance.chunk_build_defer_mode; SodiumClientMod.options().performance.alwaysDeferChunkUpdates = configuration.performance.always_defer_chunk_updates_v2;
SodiumClientMod.options().performance.animateOnlyVisibleTextures = configuration.performance.animate_only_visible_textures; SodiumClientMod.options().performance.animateOnlyVisibleTextures = configuration.performance.animate_only_visible_textures;
SodiumClientMod.options().performance.useEntityCulling = configuration.performance.use_entity_culling; SodiumClientMod.options().performance.useEntityCulling = configuration.performance.use_entity_culling;
SodiumClientMod.options().performance.useFogOcclusion = configuration.performance.use_fog_occlusion; SodiumClientMod.options().performance.useFogOcclusion = configuration.performance.use_fog_occlusion;
SodiumClientMod.options().performance.useBlockFaceCulling = configuration.performance.use_block_face_culling; SodiumClientMod.options().performance.useBlockFaceCulling = configuration.performance.use_block_face_culling;
SodiumClientMod.options().performance.useNoErrorGLContext = configuration.performance.use_no_error_g_l_context; SodiumClientMod.options().performance.useNoErrorGLContext = configuration.performance.use_no_error_g_l_context;
SodiumClientMod.options().performance.quadSplittingMode = configuration.performance.quad_splitting_mode;
SodiumClientMod.options().notifications.hasClearedDonationButton = configuration.notifications.has_cleared_donation_button; SodiumClientMod.options().notifications.hasClearedDonationButton = configuration.notifications.has_cleared_donation_button;
SodiumClientMod.options().notifications.hasSeenDonationPrompt = configuration.notifications.has_seen_donation_prompt; SodiumClientMod.options().notifications.hasSeenDonationPrompt = configuration.notifications.has_seen_donation_prompt;
SodiumClientMod.options().debug.terrainSortingEnabled = configuration.debug.terrain_sorting_enabled;
try { try {
SodiumGameOptions.writeToDisk(SodiumClientMod.options()); SodiumGameOptions.writeToDisk(SodiumClientMod.options());
} catch (IOException e) { } catch (IOException e) {
@ -59,7 +54,6 @@ public class SodiumLoader {
public Advanced advanced; public Advanced advanced;
public Performance performance; public Performance performance;
public Notifications notifications; public Notifications notifications;
public Debug debug;
public static class Quality { public static class Quality {
public String weather_quality; public String weather_quality;
@ -75,22 +69,17 @@ public class SodiumLoader {
public static class Performance { public static class Performance {
public int chunk_builder_threads; public int chunk_builder_threads;
public DeferMode chunk_build_defer_mode; public boolean always_defer_chunk_updates_v2;
public boolean animate_only_visible_textures; public boolean animate_only_visible_textures;
public boolean use_entity_culling; public boolean use_entity_culling;
public boolean use_fog_occlusion; public boolean use_fog_occlusion;
public boolean use_block_face_culling; public boolean use_block_face_culling;
public boolean use_no_error_g_l_context; public boolean use_no_error_g_l_context;
public QuadSplittingMode quad_splitting_mode;
} }
public static class Notifications { public static class Notifications {
public boolean has_cleared_donation_button; public boolean has_cleared_donation_button;
public boolean has_seen_donation_prompt; public boolean has_seen_donation_prompt;
} }
public static class Debug {
public boolean terrain_sorting_enabled;
}
} }
} }

View file

@ -1,5 +1,5 @@
plugins { plugins {
id 'com.gradleup.shadow' id 'com.github.johnrengelman.shadow'
} }
architectury { architectury {
@ -41,7 +41,7 @@ dependencies {
modImplementation "dev.architectury:architectury-fabric:$rootProject.architectury_api_version" modImplementation "dev.architectury:architectury-fabric:$rootProject.architectury_api_version"
// Mod Menu API // Mod Menu API
modImplementation("com.terraformersmc:modmenu:16.0.0-rc.1") modImplementation("com.terraformersmc:modmenu:13.0.2")
common(project(path: ':common', configuration: 'namedElements')) { transitive false } common(project(path: ':common', configuration: 'namedElements')) { transitive false }
shadowBundle project(path: ':common', configuration: 'transformProductionFabric') shadowBundle project(path: ':common', configuration: 'transformProductionFabric')

View file

@ -4,7 +4,9 @@
"version": "${version}", "version": "${version}",
"name": "Options Profiles", "name": "Options Profiles",
"description": "Load and save your options from in-game.", "description": "Load and save your options from in-game.",
"authors": ["trafficlunar"], "authors": [
"trafficlunar"
],
"contact": { "contact": {
"homepage": "https://github.com/trafficlunar/options-profiles", "homepage": "https://github.com/trafficlunar/options-profiles",
"sources": "https://github.com/trafficlunar/options-profiles", "sources": "https://github.com/trafficlunar/options-profiles",
@ -14,15 +16,19 @@
"icon": "assets/optionsprofiles/icon.png", "icon": "assets/optionsprofiles/icon.png",
"environment": "*", "environment": "*",
"entrypoints": { "entrypoints": {
"main": ["net.trafficlunar.optionsprofiles.fabric.OptionsProfilesModFabric"], "main": [
"modmenu": ["net.trafficlunar.optionsprofiles.fabric.ModMenuApiImpl"] "net.trafficlunar.optionsprofiles.fabric.OptionsProfilesModFabric"
],
"modmenu": [ "net.trafficlunar.optionsprofiles.fabric.ModMenuApiImpl" ]
}, },
"mixins": ["optionsprofiles.mixins.json"], "mixins": [
"optionsprofiles.mixins.json"
],
"depends": { "depends": {
"fabricloader": ">=0.17.2", "fabricloader": ">=0.15.11",
"minecraft": "~1.21", "minecraft": "~1.21",
"java": ">=21", "java": ">=21",
"architectury": ">=18.0.3", "architectury": ">=15.0.3",
"fabric-api": "*" "fabric-api": "*"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 835 KiB

After

Width:  |  Height:  |  Size: 729 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 733 KiB

After

Width:  |  Height:  |  Size: 570 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 748 KiB

After

Width:  |  Height:  |  Size: 578 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 710 KiB

After

Width:  |  Height:  |  Size: 554 KiB

View file

@ -11,10 +11,10 @@ archives_name=optionsprofiles
enabled_platforms=fabric,neoforge enabled_platforms=fabric,neoforge
# Minecraft properties # Minecraft properties
minecraft_version=1.21.9 minecraft_version=1.21.4
# Dependencies # Dependencies
architectury_api_version = 18.0.3 architectury_api_version = 15.0.3
fabric_loader_version=0.17.2 fabric_loader_version=0.16.9
fabric_api_version=0.134.0+1.21.9 fabric_api_version=0.111.0+1.21.4
neoforge_version=21.9.0-beta neoforge_version=21.4.9-beta

View file

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
networkTimeout=10000 networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

0
gradlew vendored Executable file → Normal file
View file

View file

@ -1,5 +1,5 @@
plugins { plugins {
id 'com.gradleup.shadow' id 'com.github.johnrengelman.shadow'
} }
architectury { architectury {

View file

@ -1,5 +1,5 @@
modLoader = "javafml" modLoader = "javafml"
loaderVersion = "[10,)" loaderVersion = "[6,)"
issueTrackerURL = "https://github.com/trafficlunar/options-profiles/issues" issueTrackerURL = "https://github.com/trafficlunar/options-profiles/issues"
license = "GNU GPL 3.0" license = "GNU GPL 3.0"
@ -16,7 +16,7 @@ logoFile = "icon.png"
[[dependencies.optionsprofiles]] [[dependencies.optionsprofiles]]
modId = "neoforge" modId = "neoforge"
type = "required" type = "required"
versionRange = "[21.9.0-beta,)" versionRange = "[21.0,)"
ordering = "NONE" ordering = "NONE"
side = "BOTH" side = "BOTH"
@ -30,7 +30,7 @@ side = "BOTH"
[[dependencies.optionsprofiles]] [[dependencies.optionsprofiles]]
modId = "architectury" modId = "architectury"
type = "required" type = "required"
versionRange = "[18.0.3,)" versionRange = "[15.0.3,)"
ordering = "AFTER" ordering = "AFTER"
side = "BOTH" side = "BOTH"

View file

@ -11,4 +11,4 @@ include("common")
include("fabric") include("fabric")
include("neoforge") include("neoforge")
rootProject.name = "optionsprofiles-v1.4.4-1.21.9" rootProject.name = "optionsprofiles-v1.4.4-1.21.4"