From 9b27b4cbd8899ada89fd0a47f33ef4b717db5637 Mon Sep 17 00:00:00 2001 From: Yasin Date: Wed, 8 May 2024 01:57:08 +0200 Subject: reorder configs --- .../hysky/skyblocker/config/SkyblockerConfig.java | 52 +- .../skyblocker/config/SkyblockerConfigManager.java | 121 +- .../config/categories/CrimsonIsleCategory.java | 138 +-- .../config/categories/DiscordRPCCategory.java | 50 - .../config/categories/DungeonsCategory.java | 1153 +++++++++---------- .../config/categories/DwarvenMinesCategory.java | 153 --- .../config/categories/FarmingCategory.java | 66 ++ .../config/categories/GeneralCategory.java | 484 +------- .../config/categories/HelperCategory.java | 142 +++ .../config/categories/LocationsCategory.java | 214 ---- .../config/categories/MessageFilterCategory.java | 287 ++--- .../config/categories/MiningCategory.java | 165 +++ .../skyblocker/config/categories/MiscCategory.java | 63 ++ .../config/categories/OtherLocationsCategory.java | 169 +++ .../config/categories/QuickNavigationCategory.java | 1178 ++++++++++---------- .../config/categories/SlayersCategory.java | 248 ++--- .../config/categories/UIAndVisualsCategory.java | 345 ++++++ .../skyblocker/config/configs/MessagesConfig.java | 61 - .../config/configs/MessagesFilterConfig.java | 61 + .../skyblocker/config/configs/QuickNavConfig.java | 181 --- .../config/configs/QuickNavigationConfig.java | 181 +++ .../skyblocker/config/configs/SlayerConfig.java | 60 - .../skyblocker/config/configs/SlayersConfig.java | 60 + .../config/configs/UIAndVisualsConfig.java | 244 ++++ .../config/configs/UiAndVisualsConfig.java | 244 ---- .../de/hysky/skyblocker/skyblock/ChestValue.java | 5 +- .../skyblock/dwarven/CrystalsWaypoint.java | 5 +- .../skyblock/fancybars/FancyStatusBars.java | 7 +- .../skyblocker/skyblock/quicknav/QuickNav.java | 8 +- .../skyblock/searchoverlay/SearchOverManager.java | 5 +- .../skyblock/tabhud/widget/PlayerListWidget.java | 5 +- .../utils/render/title/TitleContainer.java | 27 +- .../render/title/TitleContainerConfigScreen.java | 35 +- 33 files changed, 3156 insertions(+), 3061 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/config/categories/DiscordRPCCategory.java delete mode 100644 src/main/java/de/hysky/skyblocker/config/categories/DwarvenMinesCategory.java create mode 100644 src/main/java/de/hysky/skyblocker/config/categories/FarmingCategory.java create mode 100644 src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java delete mode 100644 src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java create mode 100644 src/main/java/de/hysky/skyblocker/config/categories/MiningCategory.java create mode 100644 src/main/java/de/hysky/skyblocker/config/categories/MiscCategory.java create mode 100644 src/main/java/de/hysky/skyblocker/config/categories/OtherLocationsCategory.java create mode 100644 src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java delete mode 100644 src/main/java/de/hysky/skyblocker/config/configs/MessagesConfig.java create mode 100644 src/main/java/de/hysky/skyblocker/config/configs/MessagesFilterConfig.java delete mode 100644 src/main/java/de/hysky/skyblocker/config/configs/QuickNavConfig.java create mode 100644 src/main/java/de/hysky/skyblocker/config/configs/QuickNavigationConfig.java delete mode 100644 src/main/java/de/hysky/skyblocker/config/configs/SlayerConfig.java create mode 100644 src/main/java/de/hysky/skyblocker/config/configs/SlayersConfig.java create mode 100644 src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java delete mode 100644 src/main/java/de/hysky/skyblocker/config/configs/UiAndVisualsConfig.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java index a45c9dd8..84c957ca 100644 --- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java @@ -4,42 +4,42 @@ import de.hysky.skyblocker.config.configs.*; import dev.isxander.yacl3.config.v2.api.SerialEntry; public class SkyblockerConfig { - @SerialEntry - public int version = 2; + @SerialEntry + public int version = 2; - @SerialEntry - public GeneralConfig general = new GeneralConfig(); + @SerialEntry + public GeneralConfig general = new GeneralConfig(); - @SerialEntry - public UiAndVisualsConfig uiAndVisuals = new UiAndVisualsConfig(); + @SerialEntry + public UIAndVisualsConfig uiAndVisuals = new UIAndVisualsConfig(); - @SerialEntry - public HelperConfig helper = new HelperConfig(); + @SerialEntry + public HelperConfig helper = new HelperConfig(); - @SerialEntry - public DungeonsConfig dungeons = new DungeonsConfig(); + @SerialEntry + public DungeonsConfig dungeons = new DungeonsConfig(); - @SerialEntry - public CrimsonIsleConfig crimsonIsle = new CrimsonIsleConfig(); + @SerialEntry + public CrimsonIsleConfig crimsonIsle = new CrimsonIsleConfig(); - @SerialEntry - public MiningConfig mining = new MiningConfig(); + @SerialEntry + public MiningConfig mining = new MiningConfig(); - @SerialEntry - public FarmingConfig farming = new FarmingConfig(); + @SerialEntry + public FarmingConfig farming = new FarmingConfig(); - @SerialEntry - public OtherLocationsConfig otherLocations = new OtherLocationsConfig(); + @SerialEntry + public OtherLocationsConfig otherLocations = new OtherLocationsConfig(); - @SerialEntry - public SlayerConfig slayer = new SlayerConfig(); + @SerialEntry + public SlayersConfig slayer = new SlayersConfig(); - @SerialEntry - public MessagesConfig messages = new MessagesConfig(); + @SerialEntry + public MessagesFilterConfig messages = new MessagesFilterConfig(); - @SerialEntry - public QuickNavConfig quickNav = new QuickNavConfig(); + @SerialEntry + public QuickNavigationConfig quickNav = new QuickNavigationConfig(); - @SerialEntry - public MiscConfig misc = new MiscConfig(); + @SerialEntry + public MiscConfig misc = new MiscConfig(); } diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java index 11a61cde..f01f463c 100644 --- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java +++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java @@ -26,69 +26,72 @@ import java.lang.StackWalker.Option; import java.nio.file.Path; public class SkyblockerConfigManager { - private static final Path PATH = FabricLoader.getInstance().getConfigDir().resolve("skyblocker-2.json"); - private static final ConfigClassHandler HANDLER = ConfigClassHandler.createBuilder(SkyblockerConfig.class) - .serializer(config -> GsonConfigSerializerBuilder.create(config) - .setPath(PATH) - .setJson5(false) - .appendGsonBuilder(builder -> builder - .setFieldNamingPolicy(FieldNamingPolicy.IDENTITY) - .registerTypeHierarchyAdapter(Identifier.class, new Identifier.Serializer())) - .build()) - .build(); + private static final Path PATH = FabricLoader.getInstance().getConfigDir().resolve("skyblocker-2.json"); + private static final ConfigClassHandler HANDLER = ConfigClassHandler.createBuilder(SkyblockerConfig.class) + .serializer(config -> GsonConfigSerializerBuilder.create(config) + .setPath(PATH) + .setJson5(false) + .appendGsonBuilder(builder -> builder + .setFieldNamingPolicy(FieldNamingPolicy.IDENTITY) + .registerTypeHierarchyAdapter(Identifier.class, new Identifier.Serializer())) + .build()) + .build(); - public static SkyblockerConfig get() { - return HANDLER.instance(); - } + public static SkyblockerConfig get() { + return HANDLER.instance(); + } - /** - * This method is caller sensitive and can only be called by the mod initializer, - * this is enforced. - */ - public static void init() { - if (StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE).getCallerClass() != SkyblockerMod.class) { - throw new RuntimeException("Skyblocker: Called config init from an illegal place!"); - } + /** + * This method is caller sensitive and can only be called by the mod initializer, + * this is enforced. + */ + public static void init() { + if (StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE).getCallerClass() != SkyblockerMod.class) { + throw new RuntimeException("Skyblocker: Called config init from an illegal place!"); + } - HANDLER.load(); - ClientCommandRegistrationCallback.EVENT.register(((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal(SkyblockerMod.NAMESPACE).then(optionsLiteral("config")).then(optionsLiteral("options"))))); - ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> { - if (screen instanceof GenericContainerScreen genericContainerScreen && screen.getTitle().getString().equals("SkyBlock Menu")) { - Screens.getButtons(screen).add(ButtonWidget - .builder(Text.literal("\uD83D\uDD27"), buttonWidget -> client.setScreen(createGUI(screen))) - .dimensions(((HandledScreenAccessor) genericContainerScreen).getX() + ((HandledScreenAccessor) genericContainerScreen).getBackgroundWidth() - 16, ((HandledScreenAccessor) genericContainerScreen).getY() + 4, 12, 12) - .tooltip(Tooltip.of(Text.translatable("skyblocker.title"))) - .build()); - } - }); - } + HANDLER.load(); + ClientCommandRegistrationCallback.EVENT.register(((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal(SkyblockerMod.NAMESPACE).then(optionsLiteral("config")).then(optionsLiteral("options"))))); + ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> { + if (screen instanceof GenericContainerScreen genericContainerScreen && screen.getTitle().getString().equals("SkyBlock Menu")) { + Screens.getButtons(screen).add(ButtonWidget + .builder(Text.literal("\uD83D\uDD27"), buttonWidget -> client.setScreen(createGUI(screen))) + .dimensions(((HandledScreenAccessor) genericContainerScreen).getX() + ((HandledScreenAccessor) genericContainerScreen).getBackgroundWidth() - 16, ((HandledScreenAccessor) genericContainerScreen).getY() + 4, 12, 12) + .tooltip(Tooltip.of(Text.translatable("skyblocker.title"))) + .build()); + } + }); + } - public static void save() { - HANDLER.save(); - } + public static void save() { + HANDLER.save(); + } - public static Screen createGUI(Screen parent) { - return YetAnotherConfigLib.create(HANDLER, (defaults, config, builder) -> builder - .title(Text.translatable("skyblocker.title")) - .category(GeneralCategory.create(defaults, config)) - .category(DungeonsCategory.create(defaults, config)) - .category(DwarvenMinesCategory.create(defaults, config)) - .category(CrimsonIsleCategory.create(defaults, config)) - .category(LocationsCategory.create(defaults, config)) - .category(SlayersCategory.create(defaults, config)) - .category(QuickNavigationCategory.create(defaults, config)) - .category(MessageFilterCategory.create(defaults, config)) - .category(DiscordRPCCategory.create(defaults, config))).generateScreen(parent); - } + public static Screen createGUI(Screen parent) { + return YetAnotherConfigLib.create(HANDLER, (defaults, config, builder) -> builder + .title(Text.translatable("skyblocker.title")) + .category(GeneralCategory.create(defaults, config)) + .category(UIAndVisualsCategory.create(defaults, config)) + .category(HelperCategory.create(defaults, config)) + .category(DungeonsCategory.create(defaults, config)) + .category(CrimsonIsleCategory.create(defaults, config)) + .category(MiningCategory.create(defaults, config)) + .category(FarmingCategory.create(defaults, config)) + .category(OtherLocationsCategory.create(defaults, config)) + .category(SlayersCategory.create(defaults, config)) + .category(MessageFilterCategory.create(defaults, config)) + .category(QuickNavigationCategory.create(defaults, config)) + .category(MiscCategory.create(defaults, config))).generateScreen(parent); + } - /** - * Registers an options command with the given name. Used for registering both options and config as valid commands. - * - * @param name the name of the command node - * @return the command builder - */ - private static LiteralArgumentBuilder optionsLiteral(String name) { - // Don't immediately open the next screen as it will be closed by ChatScreen right after this command is executed - return ClientCommandManager.literal(name).executes(Scheduler.queueOpenScreenCommand(() -> createGUI(null))); - } + /** + * Registers an options command with the given name. Used for registering both options and config as valid commands. + * + * @param name the name of the command node + * @return the command builder + */ + private static LiteralArgumentBuilder optionsLiteral(String name) { + // Don't immediately open the next screen as it will be closed by ChatScreen right after this command is executed + return ClientCommandManager.literal(name).executes(Scheduler.queueOpenScreenCommand(() -> createGUI(null))); + } } diff --git a/src/main/java/de/hysky/skyblocker/config/categories/CrimsonIsleCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/CrimsonIsleCategory.java index a573a622..dd9cb693 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/CrimsonIsleCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/CrimsonIsleCategory.java @@ -12,74 +12,74 @@ import net.minecraft.text.Text; public class CrimsonIsleCategory { - public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) { - return ConfigCategory.createBuilder() - .name(Text.translatable("skyblocker.category.crimsonIsle")) + public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) { + return ConfigCategory.createBuilder() + .name(Text.translatable("skyblocker.category.crimsonIsle")) - //Kuudra - .group(OptionGroup.createBuilder() - .name(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra")) - .collapsed(false) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.supplyWaypoints")) - .binding(defaults.crimsonIsle.kuudra.supplyWaypoints, - () -> config.crimsonIsle.kuudra.supplyWaypoints, - newValue -> config.crimsonIsle.kuudra.supplyWaypoints = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.fuelWaypoints")) - .binding(defaults.crimsonIsle.kuudra.fuelWaypoints, - () -> config.crimsonIsle.kuudra.fuelWaypoints, - newValue -> config.crimsonIsle.kuudra.fuelWaypoints = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.suppliesAndFuelWaypointType")) - .description(OptionDescription.of(Text.translatable("skyblocker.option.general.waypoints.waypointType.@Tooltip"))) - .binding(defaults.crimsonIsle.kuudra.suppliesAndFuelWaypointType, - () -> config.crimsonIsle.kuudra.suppliesAndFuelWaypointType, - newValue -> config.crimsonIsle.kuudra.suppliesAndFuelWaypointType = newValue) - .controller(ConfigUtils::createEnumCyclingListController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.ballistaBuildWaypoints")) - .binding(defaults.crimsonIsle.kuudra.ballistaBuildWaypoints, - () -> config.crimsonIsle.kuudra.ballistaBuildWaypoints, - newValue -> config.crimsonIsle.kuudra.ballistaBuildWaypoints = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.safeSpotWaypoints")) - .binding(defaults.crimsonIsle.kuudra.safeSpotWaypoints, - () -> config.crimsonIsle.kuudra.safeSpotWaypoints, - newValue -> config.crimsonIsle.kuudra.safeSpotWaypoints = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.pearlWaypoints")) - .binding(defaults.crimsonIsle.kuudra.pearlWaypoints, - () -> config.crimsonIsle.kuudra.pearlWaypoints, - newValue -> config.crimsonIsle.kuudra.pearlWaypoints = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.noArrowPoisonWarning")) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.noArrowPoisonWarning.@Tooltip"))) - .binding(defaults.crimsonIsle.kuudra.noArrowPoisonWarning, - () -> config.crimsonIsle.kuudra.noArrowPoisonWarning, - newValue -> config.crimsonIsle.kuudra.noArrowPoisonWarning = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.arrowPoisonThreshold")) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.arrowPoisonThreshold.@Tooltip"))) - .binding(defaults.crimsonIsle.kuudra.arrowPoisonThreshold, - () -> config.crimsonIsle.kuudra.arrowPoisonThreshold, - newValue -> config.crimsonIsle.kuudra.arrowPoisonThreshold = newValue) - .controller(IntegerFieldControllerBuilder::create) - .build()) - .build()) - .build(); - } + //Kuudra + .group(OptionGroup.createBuilder() + .name(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra")) + .collapsed(false) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.supplyWaypoints")) + .binding(defaults.crimsonIsle.kuudra.supplyWaypoints, + () -> config.crimsonIsle.kuudra.supplyWaypoints, + newValue -> config.crimsonIsle.kuudra.supplyWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.fuelWaypoints")) + .binding(defaults.crimsonIsle.kuudra.fuelWaypoints, + () -> config.crimsonIsle.kuudra.fuelWaypoints, + newValue -> config.crimsonIsle.kuudra.fuelWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.suppliesAndFuelWaypointType")) + .description(OptionDescription.of(Text.translatable("skyblocker.option.general.waypoints.waypointType.@Tooltip"))) + .binding(defaults.crimsonIsle.kuudra.suppliesAndFuelWaypointType, + () -> config.crimsonIsle.kuudra.suppliesAndFuelWaypointType, + newValue -> config.crimsonIsle.kuudra.suppliesAndFuelWaypointType = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.ballistaBuildWaypoints")) + .binding(defaults.crimsonIsle.kuudra.ballistaBuildWaypoints, + () -> config.crimsonIsle.kuudra.ballistaBuildWaypoints, + newValue -> config.crimsonIsle.kuudra.ballistaBuildWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.safeSpotWaypoints")) + .binding(defaults.crimsonIsle.kuudra.safeSpotWaypoints, + () -> config.crimsonIsle.kuudra.safeSpotWaypoints, + newValue -> config.crimsonIsle.kuudra.safeSpotWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.pearlWaypoints")) + .binding(defaults.crimsonIsle.kuudra.pearlWaypoints, + () -> config.crimsonIsle.kuudra.pearlWaypoints, + newValue -> config.crimsonIsle.kuudra.pearlWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.noArrowPoisonWarning")) + .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.noArrowPoisonWarning.@Tooltip"))) + .binding(defaults.crimsonIsle.kuudra.noArrowPoisonWarning, + () -> config.crimsonIsle.kuudra.noArrowPoisonWarning, + newValue -> config.crimsonIsle.kuudra.noArrowPoisonWarning = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.arrowPoisonThreshold")) + .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.crimsonIsle.kuudra.arrowPoisonThreshold.@Tooltip"))) + .binding(defaults.crimsonIsle.kuudra.arrowPoisonThreshold, + () -> config.crimsonIsle.kuudra.arrowPoisonThreshold, + newValue -> config.crimsonIsle.kuudra.arrowPoisonThreshold = newValue) + .controller(IntegerFieldControllerBuilder::create) + .build()) + .build()) + .build(); + } } diff --git a/src/main/java/de/hysky/skyblocker/config/categories/DiscordRPCCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/DiscordRPCCategory.java deleted file mode 100644 index f69d6343..00000000 --- a/src/main/java/de/hysky/skyblocker/config/categories/DiscordRPCCategory.java +++ /dev/null @@ -1,50 +0,0 @@ -package de.hysky.skyblocker.config.categories; - -import de.hysky.skyblocker.config.ConfigUtils; -import de.hysky.skyblocker.config.SkyblockerConfig; -import de.hysky.skyblocker.config.configs.MiscConfig; -import dev.isxander.yacl3.api.ConfigCategory; -import dev.isxander.yacl3.api.Option; -import dev.isxander.yacl3.api.OptionDescription; -import dev.isxander.yacl3.api.controller.StringControllerBuilder; -import net.minecraft.text.Text; - -public class DiscordRPCCategory { - - public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) { - return ConfigCategory.createBuilder() - .name(Text.translatable("skyblocker.category.richPresence")) - - //Uncategorized Options - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.richPresence.enableRichPresence")) - .binding(defaults.misc.richPresence.enableRichPresence, - () -> config.misc.richPresence.enableRichPresence, - newValue -> config.misc.richPresence.enableRichPresence = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.richPresence.info")) - .description(OptionDescription.of(Text.translatable("skyblocker.option.richPresence.info.@Tooltip"))) - .binding(defaults.misc.richPresence.info, - () -> config.misc.richPresence.info, - newValue -> config.misc.richPresence.info = newValue) - .controller(ConfigUtils::createEnumCyclingListController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.richPresence.cycleMode")) - .binding(defaults.misc.richPresence.cycleMode, - () -> config.misc.richPresence.cycleMode, - newValue -> config.misc.richPresence.cycleMode = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.richPresence.customMessage")) - .binding(defaults.misc.richPresence.customMessage, - () -> config.misc.richPresence.customMessage, - newValue -> config.misc.richPresence.customMessage = newValue) - .controller(StringControllerBuilder::create) - .build()) - .build(); - } -} diff --git a/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java index 2137f380..94cb01b7 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java @@ -15,573 +15,604 @@ import net.minecraft.util.Formatting; public class DungeonsCategory { - public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) { - return ConfigCategory.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons")) + public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) { + return ConfigCategory.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons")) - //Dungeon Secret Waypoints - .group(OptionGroup.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.secretWaypoints")) - .collapsed(true) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.secretWaypoints.enableRoomMatching")) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.secretWaypoints.enableRoomMatching.@Tooltip"))) - .binding(defaults.dungeons.secretWaypoints.enableRoomMatching, - () -> config.dungeons.secretWaypoints.enableRoomMatching, - newValue -> config.dungeons.secretWaypoints.enableRoomMatching = newValue) - .controller(ConfigUtils::createBooleanController) - .flag(OptionFlag.GAME_RESTART) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.secretWaypoints.enableSecretWaypoints")) - .binding(defaults.dungeons.secretWaypoints.enableSecretWaypoints, - () -> config.dungeons.secretWaypoints.enableSecretWaypoints, - newValue -> config.dungeons.secretWaypoints.enableSecretWaypoints = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.general.waypoints.waypointType")) - .description(OptionDescription.of(Text.translatable("skyblocker.option.general.waypoints.waypointType.@Tooltip"))) - .binding(defaults.dungeons.secretWaypoints.waypointType, - () -> config.dungeons.secretWaypoints.waypointType, - newValue -> config.dungeons.secretWaypoints.waypointType = newValue) - .controller(ConfigUtils::createEnumCyclingListController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.secretWaypoints.showSecretText")) - .binding(defaults.dungeons.secretWaypoints.showSecretText, - () -> config.dungeons.secretWaypoints.showSecretText, - newValue -> config.dungeons.secretWaypoints.showSecretText = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.secretWaypoints.enableEntranceWaypoints")) - .binding(defaults.dungeons.secretWaypoints.enableEntranceWaypoints, - () -> config.dungeons.secretWaypoints.enableEntranceWaypoints, - newValue -> config.dungeons.secretWaypoints.enableEntranceWaypoints = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.secretWaypoints.enableSuperboomWaypoints")) - .binding(defaults.dungeons.secretWaypoints.enableSuperboomWaypoints, - () -> config.dungeons.secretWaypoints.enableSuperboomWaypoints, - newValue -> config.dungeons.secretWaypoints.enableSuperboomWaypoints = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.secretWaypoints.enableChestWaypoints")) - .binding(defaults.dungeons.secretWaypoints.enableChestWaypoints, - () -> config.dungeons.secretWaypoints.enableChestWaypoints, - newValue -> config.dungeons.secretWaypoints.enableChestWaypoints = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.secretWaypoints.enableItemWaypoints")) - .binding(defaults.dungeons.secretWaypoints.enableItemWaypoints, - () -> config.dungeons.secretWaypoints.enableItemWaypoints, - newValue -> config.dungeons.secretWaypoints.enableItemWaypoints = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.secretWaypoints.enableBatWaypoints")) - .binding(defaults.dungeons.secretWaypoints.enableBatWaypoints, - () -> config.dungeons.secretWaypoints.enableBatWaypoints, - newValue -> config.dungeons.secretWaypoints.enableBatWaypoints = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.secretWaypoints.enableWitherWaypoints")) - .binding(defaults.dungeons.secretWaypoints.enableWitherWaypoints, - () -> config.dungeons.secretWaypoints.enableWitherWaypoints, - newValue -> config.dungeons.secretWaypoints.enableWitherWaypoints = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.secretWaypoints.enableLeverWaypoints")) - .binding(defaults.dungeons.secretWaypoints.enableLeverWaypoints, - () -> config.dungeons.secretWaypoints.enableLeverWaypoints, - newValue -> config.dungeons.secretWaypoints.enableLeverWaypoints = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.secretWaypoints.enableFairySoulWaypoints")) - .binding(defaults.dungeons.secretWaypoints.enableFairySoulWaypoints, - () -> config.dungeons.secretWaypoints.enableFairySoulWaypoints, - newValue -> config.dungeons.secretWaypoints.enableFairySoulWaypoints = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.secretWaypoints.enableStonkWaypoints")) - .binding(defaults.dungeons.secretWaypoints.enableStonkWaypoints, - () -> config.dungeons.secretWaypoints.enableStonkWaypoints, - newValue -> config.dungeons.secretWaypoints.enableStonkWaypoints = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.secretWaypoints.enableAotvWaypoints")) - .binding(defaults.dungeons.secretWaypoints.enableAotvWaypoints, - () -> config.dungeons.secretWaypoints.enableAotvWaypoints, - newValue -> config.dungeons.secretWaypoints.enableAotvWaypoints = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.secretWaypoints.enablePearlWaypoints")) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.secretWaypoints.enablePearlWaypoints.@Tooltip"))) - .binding(defaults.dungeons.secretWaypoints.enablePearlWaypoints, - () -> config.dungeons.secretWaypoints.enablePearlWaypoints, - newValue -> config.dungeons.secretWaypoints.enablePearlWaypoints = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.secretWaypoints.enableDefaultWaypoints")) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.secretWaypoints.enableDefaultWaypoints.@Tooltip"))) - .binding(defaults.dungeons.secretWaypoints.enableDefaultWaypoints, - () -> config.dungeons.secretWaypoints.enableDefaultWaypoints, - newValue -> config.dungeons.secretWaypoints.enableDefaultWaypoints = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .build()) + //Ungrouped Options + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.general.fancyPartyFinder")) + .binding(defaults.dungeons.fancyPartyFinder, + () -> config.dungeons.fancyPartyFinder, + newValue -> config.dungeons.fancyPartyFinder = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.croesusHelper")) + .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.croesusHelper.@Tooltip"))) + .binding(defaults.dungeons.croesusHelper, + () -> config.dungeons.croesusHelper, + newValue -> config.dungeons.croesusHelper = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.playerSecretsTracker")) + .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.playerSecretsTracker.@Tooltip"))) + .binding(defaults.dungeons.playerSecretsTracker, + () -> config.dungeons.playerSecretsTracker, + newValue -> config.dungeons.playerSecretsTracker = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.starredMobGlow")) + .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.starredMobGlow.@Tooltip"))) + .binding(defaults.dungeons.starredMobGlow, + () -> config.dungeons.starredMobGlow, + newValue -> config.dungeons.starredMobGlow = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.starredMobBoundingBoxes")) + .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.starredMobBoundingBoxes.@Tooltip"))) + .binding(defaults.dungeons.starredMobBoundingBoxes, + () -> config.dungeons.starredMobBoundingBoxes, + newValue -> config.dungeons.starredMobBoundingBoxes = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.allowDroppingProtectedItems")) + .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.allowDroppingProtectedItems.@Tooltip"))) + .binding(defaults.dungeons.allowDroppingProtectedItems, + () -> config.dungeons.allowDroppingProtectedItems, + newValue -> config.dungeons.allowDroppingProtectedItems = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.general.acceptReparty")) + .binding(defaults.dungeons.acceptReparty, + () -> config.dungeons.acceptReparty, + newValue -> config.dungeons.acceptReparty = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) - //Dungeon Door Highlight - .group(OptionGroup.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.doorHighlight")) - .collapsed(true) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.doorHighlight.enableDoorHighlight")) - .binding(defaults.dungeons.doorHighlight.enableDoorHighlight, - () -> config.dungeons.doorHighlight.enableDoorHighlight, - newValue -> config.dungeons.doorHighlight.enableDoorHighlight = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.doorHighlight.doorHighlightType")) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.doorHighlight.doorHighlightType.@Tooltip"), Text.translatable("skyblocker.option.locations.dungeons.doorHighlight.doorHighlightType.secretWaypointsNote"))) - .binding(defaults.dungeons.doorHighlight.doorHighlightType, - () -> config.dungeons.doorHighlight.doorHighlightType, - newValue -> config.dungeons.doorHighlight.doorHighlightType = newValue) - .controller(ConfigUtils::createEnumCyclingListController) - .build()) - .build()) + // Map + .group(OptionGroup.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.map")) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.enableMap")) + .binding(defaults.dungeons.dungeonMap.enableMap, + () -> config.dungeons.dungeonMap.enableMap, + newValue -> config.dungeons.dungeonMap.enableMap = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.mapScaling")) + .binding(defaults.dungeons.dungeonMap.mapScaling, + () -> config.dungeons.dungeonMap.mapScaling, + newValue -> config.dungeons.dungeonMap.mapScaling = newValue) + .controller(FloatFieldControllerBuilder::create) + .build()) + .option(ButtonOption.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.mapScreen")) + .text(Text.translatable("text.skyblocker.open")) + .action((screen, opt) -> MinecraftClient.getInstance().setScreen(new DungeonMapConfigScreen(screen))) + .build()) + .build()) - //Dungeon Score - .group(OptionGroup.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore")) - .collapsed(true) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScoreMessage", 270)) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScoreMessage.@Tooltip", 270))) - .binding(defaults.dungeons.dungeonScore.enableDungeonScore270Message, - () -> config.dungeons.dungeonScore.enableDungeonScore270Message, - newValue -> config.dungeons.dungeonScore.enableDungeonScore270Message = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScoreTitle", 270)) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScoreTitle.@Tooltip", 270))) - .binding(defaults.dungeons.dungeonScore.enableDungeonScore270Title, - () -> config.dungeons.dungeonScore.enableDungeonScore270Title, - newValue -> config.dungeons.dungeonScore.enableDungeonScore270Title = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScoreSound", 270)) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScoreSound.@Tooltip", 270))) - .binding(defaults.dungeons.dungeonScore.enableDungeonScore270Sound, - () -> config.dungeons.dungeonScore.enableDungeonScore270Sound, - newValue -> config.dungeons.dungeonScore.enableDungeonScore270Sound = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.dungeonScoreMessage", 270)) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.dungeonScoreMessage.@Tooltip", 270, 270))) - .binding(defaults.dungeons.dungeonScore.dungeonScore270Message, - () -> config.dungeons.dungeonScore.dungeonScore270Message, - newValue -> config.dungeons.dungeonScore.dungeonScore270Message = newValue) - .controller(StringControllerBuilder::create) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScoreMessage", 300)) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScoreMessage.@Tooltip", 300))) - .binding(defaults.dungeons.dungeonScore.enableDungeonScore300Message, - () -> config.dungeons.dungeonScore.enableDungeonScore300Message, - newValue -> config.dungeons.dungeonScore.enableDungeonScore300Message = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScoreTitle", 300)) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScoreTitle.@Tooltip", 300))) - .binding(defaults.dungeons.dungeonScore.enableDungeonScore300Title, - () -> config.dungeons.dungeonScore.enableDungeonScore300Title, - newValue -> config.dungeons.dungeonScore.enableDungeonScore300Title = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScoreSound", 300)) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScoreSound.@Tooltip", 300))) - .binding(defaults.dungeons.dungeonScore.enableDungeonScore300Sound, - () -> config.dungeons.dungeonScore.enableDungeonScore300Sound, - newValue -> config.dungeons.dungeonScore.enableDungeonScore300Sound = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.dungeonScoreMessage", 300)) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.dungeonScoreMessage.@Tooltip", 300, 300))) - .binding(defaults.dungeons.dungeonScore.dungeonScore300Message, - () -> config.dungeons.dungeonScore.dungeonScore300Message, - newValue -> config.dungeons.dungeonScore.dungeonScore300Message = newValue) - .controller(StringControllerBuilder::create) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.enableDungeonCryptsMessage")) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.enableDungeonCryptsMessage.@Tooltip"))) - .binding(defaults.dungeons.dungeonScore.enableDungeonCryptsMessage, - () -> config.dungeons.dungeonScore.enableDungeonCryptsMessage, - newValue -> config.dungeons.dungeonScore.enableDungeonCryptsMessage = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.dungeonCryptsMessageThreshold")) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.dungeonCryptsMessageThreshold.@Tooltip"))) - .binding(defaults.dungeons.dungeonScore.dungeonCryptsMessageThreshold, - () -> config.dungeons.dungeonScore.dungeonCryptsMessageThreshold, - newValue -> config.dungeons.dungeonScore.dungeonCryptsMessageThreshold = newValue) - .controller(IntegerFieldControllerBuilder::create) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.dungeonCryptsMessage")) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.dungeonCryptsMessage.@Tooltip"))) - .binding(defaults.dungeons.dungeonScore.dungeonCryptsMessage, - () -> config.dungeons.dungeonScore.dungeonCryptsMessage, - newValue -> config.dungeons.dungeonScore.dungeonCryptsMessage = newValue) - .controller(StringControllerBuilder::create) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.enableScoreHUD")) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.enableScoreHUD.@Tooltip"), Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.enableScoreHUD.deathMessagesNote"))) - .binding(defaults.dungeons.dungeonScore.enableScoreHUD, - () -> config.dungeons.dungeonScore.enableScoreHUD, - newValue -> config.dungeons.dungeonScore.enableScoreHUD = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonScore.scoreScaling")) - .binding(defaults.dungeons.dungeonScore.scoreScaling, - () -> config.dungeons.dungeonScore.scoreScaling, - newValue -> { - config.dungeons.dungeonScore.scoreX = config.dungeons.dungeonScore.scoreX + (int) ((config.dungeons.dungeonScore.scoreScaling - newValue) * 38.0); - config.dungeons.dungeonScore.scoreY = config.dungeons.dungeonScore.scoreY + (int) ((config.dungeons.dungeonScore.scoreScaling - newValue) * MinecraftClient.getInstance().textRenderer.fontHeight / 2.0); - config.dungeons.dungeonScore.scoreScaling = newValue; - }) - .controller(FloatFieldControllerBuilder::create) - .build()) - .build()) + // Puzzle Solver + .group(OptionGroup.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.puzzle")) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.solveTicTacToe")) + .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.solveTicTacToe.@Tooltip"))) + .binding(defaults.dungeons.puzzleSolver.solveTicTacToe, + () -> config.dungeons.puzzleSolver.solveTicTacToe, + newValue -> config.dungeons.puzzleSolver.solveTicTacToe = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.solveThreeWeirdos")) + .binding(defaults.dungeons.puzzleSolver.solveThreeWeirdos, + () -> config.dungeons.puzzleSolver.solveThreeWeirdos, + newValue -> config.dungeons.puzzleSolver.solveThreeWeirdos = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.creeperSolver")) + .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.creeperSolver.@Tooltip"))) + .binding(defaults.dungeons.puzzleSolver.creeperSolver, + () -> config.dungeons.puzzleSolver.creeperSolver, + newValue -> config.dungeons.puzzleSolver.creeperSolver = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.solveWaterboard")) + .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.solveWaterboard.@Tooltip"))) + .binding(defaults.dungeons.puzzleSolver.solveWaterboard, + () -> config.dungeons.puzzleSolver.solveWaterboard, + newValue -> config.dungeons.puzzleSolver.solveWaterboard = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.blazeSolver")) + .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.blazeSolver.@Tooltip"))) + .binding(defaults.dungeons.puzzleSolver.blazeSolver, + () -> config.dungeons.puzzleSolver.blazeSolver, + newValue -> config.dungeons.puzzleSolver.blazeSolver = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.solveBoulder")) + .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.solveBoulder.@Tooltip"))) + .binding(defaults.dungeons.puzzleSolver.solveBoulder, + () -> config.dungeons.puzzleSolver.solveBoulder, + newValue -> config.dungeons.puzzleSolver.solveBoulder = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.solveIceFill")) + .binding(defaults.dungeons.puzzleSolver.solveIceFill, + () -> config.dungeons.puzzleSolver.solveIceFill, + newValue -> config.dungeons.puzzleSolver.solveIceFill = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.solveSilverfish")) + .binding(defaults.dungeons.puzzleSolver.solveSilverfish, + () -> config.dungeons.puzzleSolver.solveSilverfish, + newValue -> config.dungeons.puzzleSolver.solveSilverfish = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.solveTrivia")) + .binding(defaults.dungeons.puzzleSolver.solveTrivia, + () -> config.dungeons.puzzleSolver.solveTrivia, + newValue -> config.dungeons.puzzleSolver.solveTrivia = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) - //Dungeon Chest Profit - .group(OptionGroup.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonChestProfit")) - .collapsed(true) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonChestProfit.enableProfitCalculator")) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.dungeonChestProfit.enableProfitCalculator.@Tooltip"))) - .binding(defaults.dungeons.dungeonChestProfit.enableProfitCalculator, - () -> config.dungeons.dungeonChestProfit.enableProfitCalculator, - newValue -> config.dungeons.dungeonChestProfit.enableProfitCalculator = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonChestProfit.includeKismet")) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.dungeonChestProfit.includeKismet.@Tooltip"))) - .binding(defaults.dungeons.dungeonChestProfit.includeKismet, - () -> config.dungeons.dungeonChestProfit.includeKismet, - newValue -> config.dungeons.dungeonChestProfit.includeKismet = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonChestProfit.includeEssence")) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.dungeonChestProfit.includeEssence.@Tooltip"))) - .binding(defaults.dungeons.dungeonChestProfit.includeEssence, - () -> config.dungeons.dungeonChestProfit.includeEssence, - newValue -> config.dungeons.dungeonChestProfit.includeEssence = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonChestProfit.croesusProfit")) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.dungeonChestProfit.croesusProfit.@Tooltip"))) - .binding(defaults.dungeons.dungeonChestProfit.croesusProfit, - () -> config.dungeons.dungeonChestProfit.croesusProfit, - newValue -> config.dungeons.dungeonChestProfit.croesusProfit = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonChestProfit.neutralThreshold")) - .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.dungeonChestProfit.neutralThreshold.@Tooltip"))) - .binding(defaults.dungeons.dungeonChestProfit.neutralThreshold, - () -> config.dungeons.dungeonChestProfit.neutralThreshold, - newValue -> config.dungeons.dungeonChestProfit.neutralThreshold = newValue) - .controller(IntegerFieldControllerBuilder::create) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonChestProfit.neutralColor")) - .binding(defaults.dungeons.dungeonChestProfit.neutralColor, - () -> config.dungeons.dungeonChestProfit.neutralColor, - newValue -> config.dungeons.dungeonChestProfit.neutralColor = newValue) - .controller(ConfigUtils.getEnumDropdownControllerFactory(ConfigUtils.FORMATTING_FORMATTER)) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonChestProfit.profitColor")) - .binding(defaults.dungeons.dungeonChestProfit.profitColor, - () -> config.dungeons.dungeonChestProfit.profitColor, - newValue -> config.dungeons.dungeonChestProfit.profitColor = newValue) - .controller(ConfigUtils.getEnumDropdownControllerFactory(ConfigUtils.FORMATTING_FORMATTER)) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.locations.dungeons.dungeonChestProfit.lossColor")) - .binding(defaults.dungeons.dungeonChestProfit.lossColor, - () -> config.dungeons.dungeonChestProfit.lossColor, - newValue -> config.dungeons.dungeonChestProfit.lossColor = newValue) - .controller(ConfigUtils.getEnumDropdownControllerFactory(ConfigUtils.FORMATTING_FORMATTER)) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.option.general.chestValue.incompleteColor")) - .description(OptionDescription.of(Text.translatable("skyblocker.option.general.chestValue.incompleteColor.@Tooltip"))) - .binding(defaults.dungeons.dungeonChestProfit.incompleteColor, - () -> config.dungeons.dungeonChestProfit.incompleteColor, - newValue -> config.dungeons.dungeonChestProfit.incompleteColor = newValue) - .controller(ConfigUtils.getEnumDropdownControllerFactory(ConfigUtils.FORMATTING_FORMATTER)) - .build()) - .build()) + // The Professor (F3/M3) + .group(OptionGroup.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.professor")) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.option.locations.dungeons.fireFreezeStaffTimer")) + .description(OptionDescription.of(Text.translatable("skyblocker.option.locations.dungeons.fireFreezeStaffTimer.@Tooltip"))) + .binding(defaults.dungeons.theProfessor.fireFreezeStaffTimer, + () -> config.dungeons.theProfessor.fireFreezeStaffTimer, +