diff options
author | Grayray75 <69988482+Grayray75@users.noreply.github.com> | 2023-10-03 13:56:25 +0200 |
---|---|---|
committer | Grayray75 <69988482+Grayray75@users.noreply.github.com> | 2023-10-03 14:29:39 +0200 |
commit | ec2fe2475610e5c1c705d296a697e92803b8db7a (patch) | |
tree | 184b07890aeebad87e1d7f241133d79390e414f1 /src/main/java/me/xmrvizzy/skyblocker/config | |
parent | 3cc5f282d65d37c66a8c93035da38210c42fcb1d (diff) | |
parent | 88e208843710cb7a46f49c9d404cb10935b66b38 (diff) | |
download | Skyblocker-ec2fe2475610e5c1c705d296a697e92803b8db7a.tar.gz Skyblocker-ec2fe2475610e5c1c705d296a697e92803b8db7a.tar.bz2 Skyblocker-ec2fe2475610e5c1c705d296a697e92803b8db7a.zip |
Merge branch 'master' into item-cooldown
Diffstat (limited to 'src/main/java/me/xmrvizzy/skyblocker/config')
15 files changed, 2887 insertions, 708 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/ConfigUtils.java b/src/main/java/me/xmrvizzy/skyblocker/config/ConfigUtils.java new file mode 100644 index 00000000..28ed704b --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/ConfigUtils.java @@ -0,0 +1,21 @@ +package me.xmrvizzy.skyblocker.config; + +import dev.isxander.yacl3.api.Option; +import dev.isxander.yacl3.api.controller.BooleanControllerBuilder; +import dev.isxander.yacl3.api.controller.EnumControllerBuilder; +import me.xmrvizzy.skyblocker.config.controllers.EnumDropdownControllerBuilder; + +public class ConfigUtils { + public static BooleanControllerBuilder createBooleanController(Option<Boolean> opt) { + return BooleanControllerBuilder.create(opt).yesNoFormatter().coloured(true); + } + + @SuppressWarnings("unchecked") + public static <E extends Enum<E>> EnumControllerBuilder<E> createEnumCyclingListController(Option<E> opt) { + return EnumControllerBuilder.create(opt).enumClass((Class<E>) opt.binding().defaultValue().getClass()); + } + + public static <E extends Enum<E>> EnumDropdownControllerBuilder<E> createEnumDropdownController(Option<E> opt) { + return EnumDropdownControllerBuilder.create(opt); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 092bc587..7b801d89 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -1,736 +1,816 @@ package me.xmrvizzy.skyblocker.config; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; + +import dev.isxander.yacl3.config.v2.api.SerialEntry; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import me.shedaniel.autoconfig.AutoConfig; -import me.shedaniel.autoconfig.ConfigData; -import me.shedaniel.autoconfig.annotation.Config; -import me.shedaniel.autoconfig.annotation.ConfigEntry; -import me.shedaniel.autoconfig.serializer.ConfigSerializer; -import me.shedaniel.autoconfig.serializer.GsonConfigSerializer; -import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.skyblock.item.CustomArmorTrims; import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; -import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler; -import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; -import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.client.resource.language.I18n; -import net.minecraft.text.Style; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import net.minecraft.util.Identifier; -import org.eclipse.jgit.util.StringUtils; - -import java.util.ArrayList; -import java.util.List; - -import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; - -@Config(name = "skyblocker") -public class SkyblockerConfig implements ConfigData { - @ConfigEntry.Category("general") - @ConfigEntry.Gui.TransitiveObject - public General general = new General(); +public class SkyblockerConfig { + @SerialEntry + public int version = 1; + + @SerialEntry + public General general = new General(); - @ConfigEntry.Category("locations") - @ConfigEntry.Gui.TransitiveObject - public Locations locations = new Locations(); + @SerialEntry + public Locations locations = new Locations(); - @ConfigEntry.Category("slayer") - @ConfigEntry.Gui.TransitiveObject - public Slayer slayer = new Slayer(); + @SerialEntry + public Slayer slayer = new Slayer(); - @ConfigEntry.Category("quickNav") - @ConfigEntry.Gui.TransitiveObject - public QuickNav quickNav = new QuickNav(); + @SerialEntry + public QuickNav quickNav = new QuickNav(); - @ConfigEntry.Category("messages") - @ConfigEntry.Gui.TransitiveObject - public Messages messages = new Messages(); + @SerialEntry + public Messages messages = new Messages(); - @ConfigEntry.Category("richPresence") - @ConfigEntry.Gui.TransitiveObject - public RichPresence richPresence = new RichPresence(); + @SerialEntry + public RichPresence richPresence = new RichPresence(); - public static class QuickNav { - public boolean enableQuickNav = true; + public static class QuickNav { + @SerialEntry + public boolean enableQuickNav = true; - @ConfigEntry.Category("button1") - @ConfigEntry.Gui.CollapsibleObject() - public QuickNavItem button1 = new QuickNavItem(true, new ItemData("diamond_sword"), "Your Skills", "/skills"); + @SerialEntry + public QuickNavItem button1 = new QuickNavItem(true, new ItemData("diamond_sword"), "Your Skills", "/skills"); - @ConfigEntry.Category("button2") - @ConfigEntry.Gui.CollapsibleObject() - public QuickNavItem button2 = new QuickNavItem(true, new ItemData("painting"), "Collections", "/collection"); + @SerialEntry + public QuickNavItem button2 = new QuickNavItem(true, new ItemData("painting"), "Collections", "/collection"); - @ConfigEntry.Category("button3") - @ConfigEntry.Gui.CollapsibleObject() - public QuickNavItem button3 = new QuickNavItem(true, new ItemData("bone"), "Pets(:? \\(\\d+\\/\\d+\\))?", "/pets"); - /* REGEX Explanation - * "Pets" : simple match on letters + /* REGEX Explanation + * "Pets" : simple match on letters * "(?: \\(\\d+\\/\\d+\\))?" : optional match on the non-capturing group for the page in the format " ($number/$number)" */ - - @ConfigEntry.Category("button4") - @ConfigEntry.Gui.CollapsibleObject() - public QuickNavItem button4 = new QuickNavItem(true, new ItemData("leather_chestplate", 1, "tag:{display:{color:8991416}}"), "Wardrobe \\([12]\\/2\\)", "/wardrobe"); - /* REGEX Explanation - * "Wardrobe" : simple match on letters - * " \\([12]\\/2\\)" : match on the page either " (1/2)" or " (2/2)" - */ - - @ConfigEntry.Category("button5") - @ConfigEntry.Gui.CollapsibleObject() - public QuickNavItem button5 = new QuickNavItem(true, new ItemData("player_head", 1, "tag:{SkullOwner:{Id:[I;-2081424676,-57521078,-2073572414,158072763],Properties:{textures:[{Value:\"ewogICJ0aW1lc3RhbXAiIDogMTU5MTMxMDU4NTYwOSwKICAicHJvZmlsZUlkIiA6ICI0MWQzYWJjMmQ3NDk0MDBjOTA5MGQ1NDM0ZDAzODMxYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNZWdha2xvb24iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODBhMDc3ZTI0OGQxNDI3NzJlYTgwMDg2NGY4YzU3OGI5ZDM2ODg1YjI5ZGFmODM2YjY0YTcwNjg4MmI2ZWMxMCIKICAgIH0KICB9Cn0=\"}]}}}"), "Sack of Sacks", "/sacks"); - - @ConfigEntry.Category("button6") - @ConfigEntry.Gui.CollapsibleObject() - public QuickNavItem button6 = new QuickNavItem(true, new ItemData("ender_chest"), "(?:Rift )?Storage(?: \\([12]\\/2\\))?", "/storage"); - /* REGEX Explanation - * "(?:Rift )?" : optional match on the non-capturing group "Rift " - * "Storage" : simple match on letters - * "(?: \\([12]\\/2\\))?" : optional match on the non-capturing group " (1/2)" or " (2/2)" - */ - - @ConfigEntry.Category("button7") - @ConfigEntry.Gui.CollapsibleObject() - public QuickNavItem button7 = new QuickNavItem(true, new ItemData("player_head", 1, "tag:{SkullOwner:{Id:[I;-300151517,-631415889,-1193921967,-1821784279],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDdjYzY2ODc0MjNkMDU3MGQ1NTZhYzUzZTA2NzZjYjU2M2JiZGQ5NzE3Y2Q4MjY5YmRlYmVkNmY2ZDRlN2JmOCJ9fX0=\"}]}}}"), "none", "/hub"); - - @ConfigEntry.Category("button8") - @ConfigEntry.Gui.CollapsibleObject() - public QuickNavItem button8 = new QuickNavItem(true, new ItemData("player_head", 1, "tag:{SkullOwner:{Id:[I;1605800870,415127827,-1236127084,15358548],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzg5MWQ1YjI3M2ZmMGJjNTBjOTYwYjJjZDg2ZWVmMWM0MGExYjk0MDMyYWU3MWU3NTQ3NWE1NjhhODI1NzQyMSJ9fX0=\"}]}}}"), "none", "/warp dungeon_hub"); - - @ConfigEntry.Category("button9") - @ConfigEntry.Gui.CollapsibleObject() - public QuickNavItem button9 = new QuickNavItem(true, new ItemData("player_head", 1, "tag:{SkullOwner:{Id:[I;-562285948,532499670,-1705302742,775653035],Properties:{textures:[{Value:\"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjVkZjU1NTkyNjQzMGQ1ZDc1YWRlZDIxZGQ5NjE5Yjc2YzViN2NhMmM3ZjU0MDE0NDA1MjNkNTNhOGJjZmFhYiJ9fX0=\"}]}}}"), "Visit prtl", "/visit prtl"); - - @ConfigEntry.Category("button10") - @ConfigEntry.Gui.CollapsibleObject() - public QuickNavItem button10 = new QuickNavItem(true, new ItemData("enchanting_table"), "Enchant Item", "/etable"); - - @ConfigEntry.Category("button11") - @ConfigEntry.Gui.CollapsibleObject() - public QuickNavItem button11 = new QuickNavItem(true, new ItemData("anvil"), "Anvil", "/anvil"); - - @ConfigEntry.Category("button12") - @ConfigEntry.Gui.CollapsibleObject() - public QuickNavItem button12 = new QuickNavItem(true, new ItemData("crafting_table"), "Craft Item", "/craft"); - } - - public static class QuickNavItem { - public QuickNavItem(Boolean render, ItemData itemData, String uiTitle, String clickEvent) { - this.render = render; - this.item = itemData; - this.clickEvent = clickEvent; - this.uiTitle = uiTitle; - } - - public Boolean render; - - @ConfigEntry.Category("item") - @ConfigEntry.Gui.CollapsibleObject() - public ItemData item; - - public String uiTitle; - public String clickEvent; - } - - public static class ItemData { - public ItemData(String itemName, int count, String nbt) { - this.itemName = itemName; - this.count = count; - this.nbt = nbt; - } - - public ItemData(String itemName) { - this.itemName = itemName; - this.count = 1; - this.nbt = ""; - } - - public String itemName; - public int count; - public String nbt; - } - - public static class General { - public boolean acceptReparty = true; - public boolean backpackPreviewWithoutShift = false; - public boolean compactorDeletorPreview = true; - public boolean hideEmptyTooltips = true; - public boolean hideStatusEffectOverlay = false; - - @ConfigEntry.Category("tabHud") - @ConfigEntry.Gui.CollapsibleObject() - public TabHudConf tabHud = new TabHudConf(); - - @ConfigEntry.Gui.Excluded - public String apiKey; - - @ConfigEntry.Category("bars") - @ConfigEntry.Gui.CollapsibleObject() - public Bars bars = new Bars(); - - @ConfigEntry.Category("experiments") - @ConfigEntry.Gui.CollapsibleObject() - public Experiments experiments = new Experiments(); - - @ConfigEntry.Category("fishing") - @ConfigEntry.Gui.CollapsibleObject() - public Fishing fishing = new Fishing(); - - @ConfigEntry.Category("fairySouls") - @ConfigEntry.Gui.CollapsibleObject() - public FairySouls fairySouls = new FairySouls(); - - @ConfigEntry.Category("itemCooldown") - @ConfigEntry.Gui.CollapsibleObject() - public ItemCooldown itemCooldown = new ItemCooldown(); - - @ConfigEntry.Category("shortcuts") - @ConfigEntry.Gui.CollapsibleObject() - public Shortcuts shortcuts = new Shortcuts(); - - @ConfigEntry.Category("quiverWarning") - @ConfigEntry.Gui.CollapsibleObject() - public QuiverWarning quiverWarning = new QuiverWarning(); - - @ConfigEntry.Category("itemList") - @ConfigEntry.Gui.CollapsibleObject() - public ItemList itemList = new ItemList(); - - @ConfigEntry.Category("itemTooltip") - @ConfigEntry.Gui.CollapsibleObject() - public ItemTooltip itemTooltip = new ItemTooltip(); - - @ConfigEntry.Category("itemInfoDisplay") - @ConfigEntry.Gui.CollapsibleObject - public ItemInfoDisplay itemInfoDisplay = new ItemInfoDisplay(); - - @ConfigEntry.Category("specialEffects") - @ConfigEntry.Gui.CollapsibleObject - public SpecialEffects specialEffects = new SpecialEffects(); - - @ConfigEntry.Category("hitbox") - @ConfigEntry.Gui.CollapsibleObject() - public Hitbox hitbox = new Hitbox(); - - @ConfigEntry.Gui.Tooltip() - @ConfigEntry.Category("titleContainer") - @ConfigEntry.Gui.CollapsibleObject() - public TitleContainer titleContainer = new TitleContainer(); - - @ConfigEntry.Category("Teleport Overlay") - @ConfigEntry.Gui.CollapsibleObject() - public TeleportOverlay teleportOverlay = new TeleportOverlay(); - - @ConfigEntry.Gui.Excluded - public List<Integer> lockedSlots = new ArrayList<>(); - - @ConfigEntry.Gui.Excluded - public Object2ObjectOpenHashMap<String, Text> customItemNames = new Object2ObjectOpenHashMap<>(); - - @ConfigEntry.Gui.Excluded - public Object2IntOpenHashMap<String> customDyeColors = new Object2IntOpenHashMap<>(); - - @ConfigEntry.Gui.Excluded - public Object2ObjectOpenHashMap<String, CustomArmorTrims.ArmorTrimId> customArmorTrims = new Object2ObjectOpenHashMap<>(); - } - - public static class TabHudConf { - public boolean tabHudEnabled = true; - - @ConfigEntry.BoundedDiscrete(min = 10, max = 200) - @ConfigEntry.Gui.Tooltip() - public int tabHudScale = 100; - @ConfigEntry.Gui.Tooltip - public boolean plainPlayerNames = false; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) - @ConfigEntry.Gui.Tooltip - public NameSorting nameSorting = NameSorting.DEFAULT; - } - - public enum NameSorting { - DEFAULT, - ALPHABETICAL; - - @Override - public String toString() { - return switch (this) { - case DEFAULT -> "Default"; - case ALPHABETICAL -> "Alphabetical"; - }; - } - } - - public static class Bars { - public boolean enableBars = true; - - @ConfigEntry.Category("barpositions") - @ConfigEntry.Gui.CollapsibleObject() - public BarPositions barpositions = new BarPositions(); - } - - public static class BarPositions { - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) - public BarPosition healthBarPosition = BarPosition.LAYER1; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) - public BarPosition manaBarPosition = BarPosition.LAYER1; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) - public BarPosition defenceBarPosition = BarPosition.LAYER1; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) - public BarPosition experienceBarPosition = BarPosition.LAYER1; - } - - public enum BarPosition { - LAYER1, - LAYER2, - RIGHT, - NONE; - - @Override - public String toString() { - return I18n.translate("text.autoconfig.skyblocker.option.general.bars.barpositions." + name()); - } - - public int toInt() { - return switch (this) { - case LAYER1 -> 0; - case LAYER2 -> 1; - case RIGHT -> 2; - case NONE -> -1; - }; - } - } - - public static class Experiments { - public boolean enableChronomatronSolver = true; - public boolean enableSuperpairsSolver = true; - public boolean enableUltrasequencerSolver = true; - } - - public static class Fishing { - public boolean enableFishingHelper = true; - } - - public static class FairySouls { - public boolean enableFairySoulsHelper = false; - public boolean highlightFoundSouls = true; - @ConfigEntry.Gui.Tooltip() - public boolean highlightOnlyNearbySouls = false; - } - - public static class ItemCooldown { - public boolean enableItemCooldowns = true; - } - - public static class Shortcuts { - @ConfigEntry.Gui.Tooltip() - public boolean enableShortcuts = true; - @ConfigEntry.Gui.Tooltip() - public boolean enableCommandShortcuts = true; - @ConfigEntry.Gui.Tooltip() - public boolean enableCommandArgShortcuts = true; - } - + @SerialEntry + public QuickNavItem button3 = new QuickNavItem(true, new ItemData("bone"), "Pets(:? \\(\\d+\\/\\d+\\))?", "/pets"); + + /* REGEX Explanation + * "Wardrobe" : simple match on letters + * " \\([12]\\/2\\)" : match on the page either " (1/2)" or " (2/2)" + */ + @SerialEntry + public QuickNavItem button4 = new QuickNavItem(true, + new ItemData("leather_chestplate", 1, "tag:{display:{color:8991416}}"), "Wardrobe \\([12]/2\\)", + "/wardrobe"); + + @SerialEntry + public QuickNavItem button5 = new QuickNavItem(true, new ItemData("player_head", 1, + "tag:{SkullOwner:{Id:[I;-2081424676,-57521078,-2073572414,158072763],Properties:{textures:[{Value:\"ewogICJ0aW1lc3RhbXAiIDogMTU5MTMxMDU4NTYwOSwKICAicHJvZmlsZUlkIiA6ICI0MWQzYWJjMmQ3NDk0MDBjOTA5MGQ1NDM0ZDAzODMxYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNZWdha2xvb24iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODBhMDc3ZTI0OGQxNDI3NzJlYTgwMDg2NGY4YzU3OGI5ZDM2ODg1YjI5ZGFmODM2YjY0YTcwNjg4MmI2ZWMxMCIKICAgIH0KICB9Cn0=\"}]}}}"), + "Sack of Sacks", "/sacks"); + + /* REGEX Explanation + * "(?:Rift )?" : optional match on the non-capturing group "Rift " + * "Storage" : simple match on letters + * "(?: \\([12]\\/2\\))?" : optional match on the non-capturing group " (1/2)" or " (2/2)" + */ + @SerialEntry + public QuickNavItem button6 = new QuickNavItem(true, new ItemData("ender_chest"), + "(?:Rift )?Storage(?: \\(1/2\\))?", "/storage"); + + @SerialEntry + public QuickNavItem button7 = new QuickNavItem(true, new ItemData("player_head", 1, + "tag:{SkullOwner:{Id:[I;-300151517,-631415889,-1193921967,-1821784279],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDdjYzY2ODc0MjNkMDU3MGQ1NTZhYzUzZTA2NzZjYjU2M2JiZGQ5NzE3Y2Q4MjY5YmRlYmVkNmY2ZDRlN2JmOCJ9fX0=\"}]}}}"), + "none", "/hub"); + + @SerialEntry + public QuickNavItem button8 = new QuickNavItem(true, new ItemData("player_head", 1, + "tag:{SkullOwner:{Id:[I;1605800870,415127827,-1236127084,15358548],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzg5MWQ1YjI3M2ZmMGJjNTBjOTYwYjJjZDg2ZWVmMWM0MGExYjk0MDMyYWU3MWU3NTQ3NWE1NjhhODI1NzQyMSJ9fX0=\"}]}}}"), + "none", "/warp dungeon_hub"); + + @SerialEntry + public QuickNavItem button9 = new QuickNavItem(true, new ItemData("player_head", 1, + "tag:{SkullOwner:{Id:[I;-562285948,532499670,-1705302742,775653035],Properties:{textures:[{Value:\"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjVkZjU1NTkyNjQzMGQ1ZDc1YWRlZDIxZGQ5NjE5Yjc2YzViN2NhMmM3ZjU0MDE0NDA1MjNkNTNhOGJjZmFhYiJ9fX0=\"}]}}}"), + "Visit prtl", "/visit prtl"); + + @SerialEntry + public QuickNavItem button10 = new QuickNavItem(true, new ItemData("enchanting_table"), "Enchant Item", + "/etable"); + + @SerialEntry + public QuickNavItem button11 = new QuickNavItem(true, new ItemData("anvil"), "Anvil", "/anvil"); + + @SerialEntry + public QuickNavItem button12 = new QuickNavItem(true, new ItemData("crafting_table"), "Craft Item", "/craft"); + } + + public static class QuickNavItem { + public QuickNavItem(Boolean render, ItemData itemData, String uiTitle, String clickEvent) { + this.render = render; + this.item = itemData; + this.clickEvent = clickEvent; + this.uiTitle = uiTitle; + } + + @SerialEntry + public Boolean render; + + @SerialEntry + public ItemData item; + + @SerialEntry + public String uiTitle; + + @SerialEntry + public String clickEvent; + } + + public static class ItemData { + public ItemData(String itemName, int count, String nbt) { + this.itemName = itemName; + this.count = count; + this.nbt = nbt; + } + + public ItemData(String itemName) { + this.itemName = itemName; + this.count = 1; + this.nbt = ""; + } + + @SerialEntry + public String itemName; + + @SerialEntry + public int count; + + @SerialEntry + public String nbt; + } + + public static class General { + @SerialEntry + public boolean acceptReparty = true; + + @SerialEntry + public boolean backpackPreviewWithoutShift = false; + + @SerialEntry + public boolean compactorDeletorPreview = true; + + @SerialEntry + public boolean hideEmptyTooltips = true; + + @SerialEntry + public boolean hideStatusEffectOverlay = false; + + @SerialEntry + public TabHudConf tabHud = new TabHudConf(); + + @SerialEntry + public Bars bars = new Bars(); + + @SerialEntry + public Experiments experiments = new Experiments(); + + @SerialEntry + public Fishing fishing = new Fishing(); + + @SerialEntry + public FairySouls fairySouls = new FairySouls(); + + @SerialEntry + public ItemCooldown itemCooldown = new ItemCooldown(); + + @SerialEntry + public Shortcuts shortcuts = new Shortcuts(); + + @SerialEntry + public QuiverWarning quiverWarning = new QuiverWarning(); + + @SerialEntry + public ItemList itemList = new ItemList(); + + @SerialEntry + public ItemTooltip itemTooltip = new ItemTooltip(); + + @SerialEntry + public ItemInfoDisplay itemInfoDisplay = new ItemInfoDisplay(); + + @SerialEntry + public SpecialEffects specialEffects = new SpecialEffects(); + + @SerialEntry + public Hitbox hitbox = new Hitbox(); + + @SerialEntry + public TitleContainer titleContainer = new TitleContainer(); + + @SerialEntry + public TeleportOverlay teleportOverlay = new TeleportOverlay(); + + @SerialEntry + public List<Integer> lockedSlots = new ArrayList<>(); + + @SerialEntry + public Object2ObjectOpenHashMap<String, Text> customItemNames = new Object2ObjectOpenHashMap<>(); + + @SerialEntry + public Object2IntOpenHashMap<String> customDyeColors = new Object2IntOpenHashMap<>(); + + @SerialEntry + public Object2ObjectOpenHashMap<String, CustomArmorTrims.ArmorTrimId> customArmorTrims = new Object2ObjectOpenHashMap<>(); + } + + public static class TabHudConf { + @SerialEntry + public boolean tabHudEnabled = true; + + @SerialEntry + public int tabHudScale = 100; + + @SerialEntry + public boolean plainPlayerNames = false; + + @SerialEntry + public NameSorting nameSorting = NameSorting.DEFAULT; + } + + public enum NameSorting { + DEFAULT, ALPHABETICAL; + + @Override + public String toString() { + return switch (this) { + case DEFAULT -> "Default"; + case ALPHABETICAL -> "Alphabetical"; + }; + } + } + + public static class Bars { + @SerialEntry + public boolean enableBars = true; + + @SerialEntry + public BarPositions barPositions = new BarPositions(); + } + + public static class BarPositions { + @SerialEntry + public BarPosition healthBarPosition = BarPosition.LAYER1; + + @SerialEntry + public BarPosition manaBarPosition = BarPosition.LAYER1; + + @SerialEntry + public BarPosition defenceBarPosition = BarPosition.LAYER1; + + @SerialEntry + public BarPosition experienceBarPosition = BarPosition.LAYER1; + + } + + public enum BarPosition { + LAYER1, LAYER2, RIGHT, NONE; + + @Override + public String toString() { + return I18n.translate("text.autoconfig.skyblocker.option.general.bars.barpositions." + name()); + } + + public int toInt() { + return switch (this) { + case LAYER1 -> 0; + case LAYER2 -> 1; + case RIGHT -> 2; + case NONE -> -1; + }; + } + } + + public static class Experiments { + @SerialEntry + public boolean enableChronomatronSolver = true; + + @SerialEntry + public boolean enableSuperpairsSolver = true; + + @SerialEntry + public boolean enableUltrasequencerSolver = true; + } + + public static class Fishing { + @SerialEntry + public boolean enableFishingHelper = true; + } + + public static class FairySouls { + @SerialEntry + public boolean enableFairySoulsHelper = false; + + @SerialEntry + public boolean highlightFoundSouls = true; + + @SerialEntry + public boolean highlightOnlyNearbySouls = false; + } + + public static class ItemCooldown { + @SerialEntry + public boolean enableItemCooldowns = true; + } + + public static class Shortcuts { + @SerialEntry + public boolean enableShortcuts = true; + + @SerialEntry + public boolean enableCommandShortcuts = true; + + @SerialEntry + public boolean enableCommandArgShortcuts = true; + } + public static class QuiverWarning { + @SerialEntry public boolean enableQuiverWarning = true; + + @SerialEntry public boolean enableQuiverWarningInDungeons = true; + + @SerialEntry public boolean enableQuiverWarningAfterDungeon = true; } - public static class Hitbox { - public boolean oldFarmlandHitbox = true; - public boolean oldLeverHitbox = false; - } - - public static class TitleContainer { - @ConfigEntry.BoundedDiscrete(min = 30, max = 140) - public float titleContainerScale = 100; - public int x = 540; - public int y = 10; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) - public Direction direction = Direction.HORIZONTAL; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.DROPDOWN) - public Alignment alignment = Alignment.MIDDLE; - } - - public static class TeleportOverlay { - public boolean enableTeleportOverlays = true; - public boolean enableWeirdTransmission = true; - public boolean enableInstantTransmission = true; - public boolean enableEtherTransmission = true; - public boolean enableSinrecallTransmission = true; - public boolean enableWitherImpact = true; - } - - public enum Direction { - HORIZONTAL, - VERTICAL; - - @Override - public String toString() { - return switch (this) { - case HORIZONTAL -> "Horizontal"; - case VERTICAL -> "Vertical"; - }; - } - } - - public enum Alignment { - LEFT, - RIGHT, - MIDDLE; - - @Override - public String toString() { - return switch (this) { - case LEFT -> "Left"; - case RIGHT -> "Right"; - case MIDDLE -> "Middle"; - }; - } - } - - public static class RichPresence { - public boolean enableRichPresence = false; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) - @ConfigEntry.Gui.Tooltip() - public Info info = Info.LOCATION; - public boolean cycleMode = false; - public String customMessage = "Playing Skyblock"; - } - - public static class ItemList { - public boolean enableItemList = true; - } - - public enum Average { - ONE_DAY, - THREE_DAY, - BOTH; - - @Override - public String toString() { - return I18n.translate("text.autoconfig.skyblocker.option.general.itemTooltip.avg." + name()); - } - } - - public static class ItemTooltip { - public boolean enableNPCPrice = true; - @ConfigEntry.Gui.Tooltip - public boolean enableMotesPrice = true; - public boolean enableAvgBIN = true; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) - @ConfigEntry.Gui.Tooltip() - public Average avg = Average.THREE_DAY; - public boolean enableLowestBIN = true; - public boolean enableBazaarPrice = true; - public boolean enableMuseumDate = true; - } - - public static class ItemInfoDisplay { - @ConfigEntry.Gui.Tooltip - public boolean attributeShardInfo = true; - } - - public static class SpecialEffects { - @ConfigEntry.Gui.Tooltip - public boolean rareDungeonDropEffects = true; - } - - public static class Locations { - @ConfigEntry.Category("barn") - @ConfigEntry.Gui.CollapsibleObject() - public Barn barn = new Barn(); - - @ConfigEntry.Category("dungeons") - @ConfigEntry.Gui.CollapsibleObject() - public Dungeons dungeons = new Dungeons(); - - @ConfigEntry.Category("dwarvenmines") - @ConfigEntry.Gui.CollapsibleObject() - public DwarvenMines dwarvenMines = new DwarvenMines(); - - @ConfigEntry.Category("rift") - @ConfigEntry.Gui.CollapsibleObject() - public Rift rift = new Rift(); - - @ConfigEntry.Category("spidersden") - @ConfigEntry.Gui.CollapsibleObject() - public SpidersDen spidersDen = new SpidersDen(); - } - - public static class Dungeons { - @ConfigEntry.Gui.CollapsibleObject - public SecretWaypoints secretWaypoints = new SecretWaypoints(); - @ConfigEntry.Gui.CollapsibleObject - public DungeonChestProfit dungeonChestProfit = new DungeonChestProfit(); - @ConfigEntry.Gui.Tooltip() - public boolean croesusHelper = true; - public boolean enableMap = true; - public float mapScaling = 1f; - public int mapX = 2; - public int mapY = 2; - @ConfigEntry.Gui.Tooltip - public boolean starredMobGlow = true; - public boolean solveThreeWeirdos = true; - @ConfigEntry.Gui.Tooltip - public boolean blazesolver = true; - public boolean solveTrivia = true; - @ConfigEntry.Gui.Tooltip - public boolean solveTicTacToe = true; - @ConfigEntry.Gui.CollapsibleObject - public LividColor lividColor = new LividColor(); - @ConfigEntry.Gui.CollapsibleObject() - public Terminals terminals = new Terminals(); - } - - public static class SecretWaypoints { - - public boolean enableSecretWaypoints = true; - @ConfigEntry.Gui.Tooltip() - public boolean noInitSecretWaypoints = false; - public boolean enableEntranceWaypoints = true; - public boolean enableSuperboomWaypoints = true; - public boolean enableChestWaypoints = true; - public boolean enableItemWaypoints = true; - public boolean enableBatWaypoints = true; - public boolean enableWitherWaypoints = true; - public boolean enableLeverWaypoints = true; - public boolean enableFairySoulWaypoints = true; - public boolean enableStonkWaypoints = true; - @ConfigEntry.Gui.Tooltip() - public boolean enableDefaultWaypoints = true; - } - - public static class DungeonChestProfit { - @ConfigEntry.Gui.Tooltip - public boolean enableProfitCalculator = true; - @ConfigEntry.Gui.Tooltip - public boolean includeKismet = false; - @ConfigEntry.Gui.Tooltip - public boolean includeEssence = true; - @ConfigEntry.Gui.Tooltip - public int neutralThreshold = 1000; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.DROPDOWN) - public FormattingOption neutralColor = FormattingOption.DARK_GRAY; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.DROPDOWN) - public FormattingOption profitColor = FormattingOption.DARK_GREEN; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.DROPDOWN) - public FormattingOption lossColor = FormattingOption.RED; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.DROPDOWN) - @ConfigEntry.Gui.Tooltip - public FormattingOption incompleteColor = FormattingOption.BLUE; - } - - public enum FormattingOption { - BLACK(Formatting.BLACK), - DARK_BLUE(Formatting.DARK_BLUE), - DARK_GREEN(Formatting.DARK_GREEN), - DARK_AQUA(Formatting.DARK_AQUA), - DARK_RED(Formatting.DARK_RED), - DARK_PURPLE(Formatting.DARK_PURPLE), - GOLD(Formatting.GOLD), - GRAY(Formatting.GRAY), - DARK_GRAY(Formatting.DARK_GRAY), - BLUE(Formatting.BLUE), - GREEN(Formatting.GREEN), - AQUA(Formatting.AQUA), - RED(Formatting.RED), - LIGHT_PURPLE(Formatting.LIGHT_PURPLE), - YELLOW(Formatting.YELLOW), - WHITE(Formatting.WHITE), - OBFUSCATED(Formatting.OBFUSCATED), - BOLD(Formatting.BOLD), - STRIKETHROUGH(Formatting.STRIKETHROUGH), - UNDERLINE(Formatting.UNDERLINE), - ITALIC(Formatting.ITALIC), - RESET(Formatting.RESET); - public final Formatting formatting; - - FormattingOption(Formatting formatting) { - this.formatting = formatting; - } - - @Override - public String toString() { - return StringUtils.capitalize(formatting.getName().replaceAll("_", " ")); - } - } - - public static class LividColor { - @ConfigEntry.Gui.Tooltip() - public boolean enableLividColor = true; - @ConfigEntry.Gui.Tooltip() - public String lividColorText = "The livid color is [color]"; - } - - public static class Terminals { - public boolean solveColor = true; - public boolean solveOrder = true; - public boolean solveStartsWith = true; - } - - public static class DwarvenMines { - public boolean enableDrillFuel = true; - public boolean solveFetchur = true; - public boolean solvePuzzler = true; - @ConfigEntry.Gui.CollapsibleObject() - public DwarvenHud dwarvenHud = new DwarvenHud(); - } - - public static class DwarvenHud { - public boolean enabled = true; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) - @ConfigEntry.Gui.Tooltip(count = 3) - public DwarvenHudStyle style = DwarvenHudStyle.SIMPLE; - public boolean enableBackground = true; - public int x = 10; - public int y = 10; - } - - public enum DwarvenHudStyle { - SIMPLE, - FANCY, - CLASSIC; - - @Override - public String toString() { - return switch (this) { - case SIMPLE -> "Simple"; - case FANCY -> "Fancy"; - case CLASSIC -> "Classic"; - }; - } - } - - public static class Barn { - public boolean solveHungryHiker = true; - public boolean solveTreasureHunter = true; - } - - public static class Rift { - public boolean mirrorverseWaypoints = true; - @ConfigEntry.BoundedDiscrete(min = 0, max = 5) - @ConfigEntry.Gui.Tooltip - public int mcGrubberStacks = 0; - } - - public static class SpidersDen { - @ConfigEntry.Category("relics") - @ConfigEntry.Gui.CollapsibleObject() - public Relics relics = new Relics(); - } - - public static class Relics { - public boolean enableRelicsHelper = false; - public boolean highlightFoundRelics = true; - } - - public static class Slayer { - @ConfigEntry.Category("vampire") - @ConfigEntry.Gui.CollapsibleObject() - public VampireSlayer vampireSlayer = new VampireSlayer(); - } - - public static class VampireSlayer { - public boolean enableEffigyWaypoints = true; - public boolean compactEffigyWaypoints; - @ConfigEntry.BoundedDiscrete(min = 1, max = 10) - @ConfigEntry.Gui.Tooltip() - public int effigyUpdateFrequency = 5; - public boolean enableHolyIceIndicator = true; - public int holyIceIndicatorTickDelay = 10; - @ConfigEntry.BoundedDiscrete(min = 1, max = 10) - @ConfigEntry.Gui.Tooltip() - public int holyIceUpdateFrequency = 5; - public boolean enableHealingMelonIndicator = true; - public float healingMelonHealthThreshold = 4F; - public boolean enableSteakStakeIndicator = true; - @ConfigEntry.BoundedDiscrete(min = 1, max = 10) - @ConfigEntry.Gui.Tooltip() - public int steakStakeUpdateFrequency = 5; - public boolean enableManiaIndicator = true; - @ConfigEntry.BoundedDiscrete(min = 1, max = 10) - @ConfigEntry.Gui.Tooltip() - public int maniaUpdateFrequency = 5; - } - - public static class Messages { - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) - public ChatFilterResult hideAbility = ChatFilterResult.PASS; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) - public ChatFilterResult hideHeal = ChatFilterResult.PASS; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) - public ChatFilterResult hideAOTE = ChatFilterResult.PASS; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) - public ChatFilterResult hideImplosion = ChatFilterResult.PASS; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) - public ChatFilterResult hideMoltenWave = ChatFilterResult.PASS; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) - public ChatFilterResult hideAds = ChatFilterResult.PASS; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) - public ChatFilterResult hideTeleportPad = ChatFilterResult.PASS; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) - public ChatFilterResult hideCombo = ChatFilterResult.PASS; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) - public ChatFilterResult hideAutopet = ChatFilterResult.PASS; - @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) - @ConfigEntry.Gui.Tooltip - public ChatFilterResult hideShowOff = ChatFilterResult.PASS; - @ConfigEntry.Gui.Tooltip() - public boolean hideMana = false; - } - - public enum Info { - PURSE, - BITS, - LOCATION; - - @Override - public String toString() { - return I18n.translate("text.autoconfig.skyblocker.option.richPresence.info." + name()); - } - } - - /** - * Registers the config to AutoConfig and registers commands to open the config screen. - */ - public static void init() { - Gson gson = new GsonBuilder() - .setPrettyPrinting() - .registerTypeHierarchyAdapter(Text.class, new Text.Serializer()) - .registerTypeHierarchyAdapter(Style.class, new Style.Serializer()) - .registerTypeHierarchyAdapter(Identifier.class, new Identifier.Serializer()) - .create(); - - ConfigSerializer.Factory<SkyblockerConfig> serializer = (cfg, cfgClass) -> new GsonConfigSerializer<>(cfg, cfgClass, gson); - - AutoConfig.register(SkyblockerConfig.class, serializer); - ClientCommandRegistrationCallback.EVENT.register(((dispatcher, registryAccess) -> dispatcher.register(literal(SkyblockerMod.NAMESPACE).then(optionsLiteral("config")).then(optionsLiteral("options"))))); - } - - /** - * 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<FabricClientCommandSource> optionsLiteral(String name) { - // Don't immediately open the next screen as it will be closed by ChatScreen right after this command is executed - return literal(name).executes(Scheduler.queueOpenScreenCommand(AutoConfig.getConfigScreen(SkyblockerConfig.class, null))); - } - - public static SkyblockerConfig get() { - return AutoConfig.getConfigHolder(SkyblockerConfig.class).getConfig(); - } - - public static void save() { - AutoConfig.getConfigHolder(SkyblockerConfig.class).save(); - } + public static class Hitbox { + @SerialEntry + public boolean oldFarmlandHitbox = true; + + @SerialEntry + public boolean oldLeverHitbox = false; + } + + public static class TitleContainer { + @SerialEntry + public float titleContainerScale = 100; + + @SerialEntry + public int x = 540; + + @SerialEntry + public int y = 10; + + @SerialEntry + public Direction direction = Direction.HORIZONTAL; + + @SerialEntry + public Alignment alignment = Alignment.MIDDLE; + } + + public static class TeleportOverlay { + @SerialEntry + public boolean enableTeleportOverlays = true; + + @SerialEntry + public boolean enableWeirdTransmission = true; + + @SerialEntry + public boolean enableInstantTransmission = true; + + @SerialEntry + public boolean enableEtherTransmission = true; + + @SerialEntry + public boolean enableSinrecallTransmission = true; + + @SerialEntry + public boolean enableWitherImpact = true; + } + + public enum Direction { + HORIZONTAL, VERTICAL; + + @Override + public String toString() { + return switch (this) { + case HORIZONTAL -> "Horizontal"; + case VERTICAL -> "Vertical"; + }; + } + } + + public enum Alignment { + LEFT, RIGHT, MIDDLE; + + @Override + public String toString() { + return switch (this) { + case LEFT -> "Left"; + case RIGHT -> "Right"; + case MIDDLE -> "Middle"; + }; + } + } + + public static class RichPresence { + @SerialEntry + public boolean enableRichPresence = false; + + @SerialEntry + public Info info = Info.LOCATION; + + @SerialEntry + public boolean cycleMode = false; + + @SerialEntry + public String customMessage = "Playing Skyblock"; + } + + public static class ItemList { + @SerialEntry + public boolean enableItemList = true; + } + + public enum Average { + ONE_DAY, THREE_DAY, BOTH; + + @Override + public String toString() { + return I18n.translate("text.autoconfig.skyblocker.option.general.itemTooltip.avg." + name()); + } + } + + public static class ItemTooltip { + @SerialEntry + public boolean enableNPCPrice = true; + + @SerialEntry + public boolean enableMotesPrice = true; + + @SerialEntry + public boolean enableAvgBIN = true; + + @SerialEntry + public Average avg = Average.THREE_DAY; + + @SerialEntry + public boolean enableLowestBIN = true; + + @SerialEntry + public boolean enableBazaarPrice = true; + + @SerialEntry + public boolean enableMuseumDate = true; + } + + public static class ItemInfoDisplay { + @SerialEntry + public boolean attributeShardInfo = true; + } + + public static class SpecialEffects { + @SerialEntry + public boolean rareDungeonDropEffects = true; + } + + public static class Locations { + @SerialEntry + public Barn barn = new Barn(); + + @SerialEntry + public Dungeons dungeons = new Dungeons(); + + @SerialEntry + public DwarvenMines dwarvenMines = new DwarvenMines(); + + @SerialEntry + public Rift rift = new Rift(); + + @SerialEntry + public SpidersDen spidersDen = new SpidersDen(); + } + + public static class Dungeons { + @SerialEntry + public SecretWaypoints secretWaypoints = new SecretWaypoints(); + + @SerialEntry + public DungeonChestProfit dungeonChestProfit = new DungeonChestProfit(); + + @SerialEntry + public boolean croesusHelper = true; + + @SerialEntry + public boolean enableMap = true; + + @SerialEntry + public float mapScaling = 1f; + + @SerialEntry + public int mapX = 2; + + @SerialEntry + public int mapY = 2; + + @SerialEntry + public boolean starredMobGlow = true; + + @SerialEntry + public boolean solveThreeWeirdos = true; + + @SerialEntry + public boolean blazesolver = true; + + @SerialEntry + public boolean solveTrivia = true; + + @SerialEntry + public boolean solveTicTacToe = true; + + @SerialEntry + public LividColor lividColor = new LividColor(); + + @SerialEntry + public Terminals terminals = new Terminals(); + } + + public static class SecretWaypoints { + @SerialEntry + public boolean enableSecretWaypoints = true; + + @SerialEntry + public boolean noInitSecretWaypoints = false; + + @SerialEntry + public boolean enableEntranceWaypoints = true; + + @SerialEntry + public boolean enableSuperboomWaypoints = true; + + @SerialEntry + public boolean enableChestWaypoints = true; + + @SerialEntry + public boolean enableItemWaypoints = true; + + @SerialEntry + public boolean enableBatWaypoints = true; + + @SerialEntry + public boolean enableWitherWaypoints = true; + + @SerialEntry + public boolean enableLeverWaypoints = true; + + @SerialEntry + public boolean enableFairySoulWaypoints = true; + + @SerialEntry + public boolean enableStonkWaypoints = true; + + @SerialEntry + public boolean enableDefaultWaypoints = true; + } + + public static class DungeonChestProfit { + @SerialEntry + public boolean enableProfitCalculator = true; + + @SerialEntry + public boolean includeKismet = false; + + @SerialEntry + public boolean includeEssence = true; + + @SerialEntry + public int neutralThreshold = 1000; + + @SerialEntry + public FormattingOption neutralColor = FormattingOption.DARK_GRAY; + + @SerialEntry + public FormattingOption profitColor = FormattingOption.DARK_GREEN; + + @SerialEntry + public FormattingOption lossColor = FormattingOption.RED; + + @SerialEntry + public FormattingOption incompleteColor = FormattingOption.BLUE; + + } + + public enum FormattingOption { + BLACK(Formatting.BLACK), + DARK_BLUE(Formatting.DARK_BLUE), + DARK_GREEN(Formatting.DARK_GREEN), + DARK_AQUA(Formatting.DARK_AQUA), + DARK_RED(Formatting.DARK_RED), + DARK_PURPLE(Formatting.DARK_PURPLE), + GOLD(Formatting.GOLD), + GRAY(Formatting.GRAY), + DARK_GRAY(Formatting.DARK_GRAY), + BLUE(Formatting.BLUE), + GREEN(Formatting.GREEN), + AQUA(Formatting.AQUA), + RED(Formatting.RED), + LIGHT_PURPLE(Formatting.LIGHT_PURPLE), + YELLOW(Formatting.YELLOW), + WHITE(Formatting.WHITE), + OBFUSCATED(Formatting.OBFUSCATED), + BOLD(Formatting.BOLD), + STRIKETHROUGH(Formatting.STRIKETHROUGH), + UNDERLINE(Formatting.UNDERLINE), + ITALIC(Formatting.ITALIC), + RESET(Formatting.RESET); + + public final Formatting formatting; + + + FormattingOption(Formatting formatting) { + this.formatting = formatting; + } + + @Override + public String toString() { + return StringUtils.capitalize(formatting.getName().replaceAll("_", " ")); + } + } + + public static class LividColor { + @SerialEntry + public boolean enableLividColor = true; + + @SerialEntry + public String lividColorText = "The livid color is [color]"; + } + + public static class Terminals { + @SerialEntry + public boolean solveColor = true; + + @SerialEntry + public boolean solveOrder = true; + + @SerialEntry + public boolean solveStartsWith = true; + } + + public static class DwarvenMines { + @SerialEntry + public boolean enableDrillFuel = true; + + @SerialEntry + public boolean solveFetchur = true; + + @SerialEntry + public boolean solvePuzzler = true; + + @SerialEntry + public DwarvenHud dwarvenHud = new DwarvenHud(); + } + + public static class DwarvenHud { + @SerialEntry + public boolean enabled = true; + + @SerialEntry + public DwarvenHudStyle style = DwarvenHudStyle.SIMPLE; + + @SerialEntry + public boolean enableBackground = true; + + @SerialEntry + public int x = 10; + + @SerialEntry + public int y = 10; + } + + public enum DwarvenHudStyle { + SIMPLE, FANCY, CLASSIC; + + @Override + public String toString() { + return switch (this) { + case SIMPLE -> "Simple"; + case FANCY -> "Fancy"; + case CLASSIC -> "Classic"; + }; + } + } + + public static class Barn { + @SerialEntry + public boolean solveHungryHiker = true; + + @SerialEntry + public boolean solveTreasureHunter = true; + } + + public static class Rift { + @SerialEntry + public boolean mirrorverseWaypoints = true; + + @SerialEntry + public int mcGrubberStacks = 0; + } + + public static class SpidersDen { + @SerialEntry + public Relics relics = new Relics(); + } + + public static class Relics { + @SerialEntry + public boolean enableRelicsHelper = false; + + @SerialEntry + public boolean highlightFoundRelics = true; + } + + public static class Slayer { + @SerialEntry + public VampireSlayer vampireSlayer = new VampireSlayer(); + } + + public static class VampireSlayer { + @SerialEntry + public boolean enableEffigyWaypoints = true; + + @SerialEntry + public boolean compactEffigyWaypoints; + + @SerialEntry + public int effigyUpdateFrequency = 5; + + @SerialEntry + public boolean enableHolyIceIndicator = true; + + @SerialEntry + public int holyIceIndicatorTickDelay = 10; + + @SerialEntry + public int holyIceUpdateFrequency = 5; + + @SerialEntry + public boolean enableHealingMelonIndicator = true; + + @SerialEntry + public float healingMelonHealthThreshold = 4f; + + @SerialEntry + public boolean enableSteakStakeIndicator = true; + + @SerialEntry + public int steakStakeUpdateFrequency = 5; + + @SerialEntry + public boolean enableManiaIndicator = true; + + @SerialEntry + public int maniaUpdateFrequency = 5; + } + + public static class Messages { + @SerialEntry + public ChatFilterResult hideAbility = ChatFilterResult.PASS; + + @SerialEntry + public ChatFilterResult hideHeal = ChatFilterResult.PASS; + + @SerialEntry + public ChatFilterResult hideAOTE = ChatFilterResult.PASS; + + @SerialEntry + public ChatFilterResult hideImplosion = ChatFilterResult.PASS; + + @SerialEntry + public ChatFilterResult hideMoltenWave = ChatFilterResult.PASS; + + @SerialEntry + public ChatFilterResult hideAds = ChatFilterResult.PASS; + + @SerialEntry + public ChatFilterResult hideTeleportPad = ChatFilterResult.PASS; + + @SerialEntry + public ChatFilterResult hideCombo = ChatFilterResult.PASS; + + @SerialEntry + public ChatFilterResult hideAutopet = ChatFilterResult.PASS; + + @SerialEntry + public ChatFilterResult hideShowOff = ChatFilterResult.PASS; + + @SerialEntry + public boolean hideMana = false; + } + + public enum Info { + PURSE, BITS, LOCATION; + + @Override + public String toString() { + return I18n.translate("text.autoconfig.skyblocker.option.richPresence.info." + name()); + } + } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfigManager.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfigManager.java new file mode 100644 index 00000000..eb756641 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfigManager.java @@ -0,0 +1,86 @@ +package me.xmrvizzy.skyblocker.config; + +import java.lang.StackWalker.Option; +import java.nio.file.Path; + +import com.google.gson.FieldNamingPolicy; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; + +import dev.isxander.yacl3.api.YetAnotherConfigLib; +import dev.isxander.yacl3.config.v2.api.ConfigClassHandler; +import dev.isxander.yacl3.config.v2.api.serializer.GsonConfigSerializerBuilder; +import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.config.categories.DiscordRPCCategory; +import me.xmrvizzy.skyblocker.config.categories.DungeonsCategory; +import me.xmrvizzy.skyblocker.config.categories.DwarvenMinesCategory; +import me.xmrvizzy.skyblocker.config.categories.GeneralCategory; +import me.xmrvizzy.skyblocker.config.categories.LocationsCategory; +import me.xmrvizzy.skyblocker.config.categories.MessageFilterCategory; +import me.xmrvizzy.skyblocker.config.categories.QuickNavigationCategory; +import me.xmrvizzy.skyblocker.config.categories.SlayersCategory; +import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +public class SkyblockerConfigManager { + private static final Path PATH = FabricLoader.getInstance().getConfigDir().resolve("skyblocker.json"); + private static final ConfigClassHandler<SkyblockerConfig> 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(); + } + + /** + * 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"))))); + } + + public static void save() { + HANDLER.save(); + } + + public static Screen createGUI(Screen parent) { + return YetAnotherConfigLib.create(HANDLER, (defaults, config, builder) -> builder + .title(Text.translatable("text.autoconfig.skyblocker.title")) + .category(GeneralCategory.create(defaults, config)) + .category(DungeonsCategory.create(defaults, config)) + .category(DwarvenMinesCategory.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); + } + + /** + * 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<FabricClientCommandSource> 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/me/xmrvizzy/skyblocker/config/categories/DiscordRPCCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/DiscordRPCCategory.java new file mode 100644 index 00000000..1e35bc32 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/DiscordRPCCategory.java @@ -0,0 +1,49 @@ +package me.xmrvizzy.skyblocker.config.categories; + +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 me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.config.ConfigUtils; +import net.minecraft.text.Text; + +public class DiscordRPCCategory { + + public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) { + return ConfigCategory.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.category.richPresence")) + + //Uncategorized Options + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.richPresence.enableRichPresence")) + .binding(defaults.richPresence.enableRichPresence, + () -> config.richPresence.enableRichPresence, + newValue -> config.richPresence.enableRichPresence = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<SkyblockerConfig.Info>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.richPresence.info")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.richPresence.info.@Tooltip"))) + .binding(defaults.richPresence.info, + () -> config.richPresence.info, + newValue -> config.richPresence.info = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.richPresence.cycleMode")) + .binding(defaults.richPresence.cycleMode, + () -> config.richPresence.cycleMode, + newValue -> config.richPresence.cycleMode = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.richPresence.customMessage")) + .binding(defaults.richPresence.customMessage, + () -> config.richPresence.customMessage, + newValue -> config.richPresence.customMessage = newValue) + .controller(StringControllerBuilder::create) + .build()) + .build(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/categories/DungeonsCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/DungeonsCategory.java new file mode 100644 index 00000000..16439cb5 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/DungeonsCategory.java @@ -0,0 +1,315 @@ +package me.xmrvizzy.skyblocker.config.categories; + +import dev.isxander.yacl3.api.ButtonOption; +import dev.isxander.yacl3.api.ConfigCategory; +import dev.isxander.yacl3.api.Option; +import dev.isxander.yacl3.api.OptionDescription; +import dev.isxander.yacl3.api.OptionFlag; +import dev.isxander.yacl3.api.OptionGroup; +import dev.isxander.yacl3.api.controller.FloatFieldControllerBuilder; +import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder; +import dev.isxander.yacl3.api.controller.StringControllerBuilder; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig.FormattingOption; +import me.xmrvizzy.skyblocker.config.ConfigUtils; +import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonMapConfigScreen; +import net.minecraft.client.MinecraftClient; +import net.minecraft.text.Text; + +public class DungeonsCategory { + + public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) { + return ConfigCategory.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons")) + + //Dungeon Secret Waypoints + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableSecretWaypoints")) + .binding(defaults.locations.dungeons.secretWaypoints.enableSecretWaypoints, + () -> config.locations.dungeons.secretWaypoints.enableSecretWaypoints, + newValue -> config.locations.dungeons.secretWaypoints.enableSecretWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.noInitSecretWaypoints")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.noInitSecretWaypoints.@Tooltip"))) + .binding(defaults.locations.dungeons.secretWaypoints.noInitSecretWaypoints, + () -> config.locations.dungeons.secretWaypoints.noInitSecretWaypoints, + newValue -> config.locations.dungeons.secretWaypoints.noInitSecretWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .flag(OptionFlag.GAME_RESTART) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableEntranceWaypoints")) + .binding(defaults.locations.dungeons.secretWaypoints.enableEntranceWaypoints, + () -> config.locations.dungeons.secretWaypoints.enableEntranceWaypoints, + newValue -> config.locations.dungeons.secretWaypoints.enableEntranceWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableSuperboomWaypoints")) + .binding(defaults.locations.dungeons.secretWaypoints.enableSuperboomWaypoints, + () -> config.locations.dungeons.secretWaypoints.enableSuperboomWaypoints, + newValue -> config.locations.dungeons.secretWaypoints.enableSuperboomWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableChestWaypoints")) + .binding(defaults.locations.dungeons.secretWaypoints.enableChestWaypoints, + () -> config.locations.dungeons.secretWaypoints.enableChestWaypoints, + newValue -> config.locations.dungeons.secretWaypoints.enableChestWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableItemWaypoints")) + .binding(defaults.locations.dungeons.secretWaypoints.enableItemWaypoints, + () -> config.locations.dungeons.secretWaypoints.enableItemWaypoints, + newValue -> config.locations.dungeons.secretWaypoints.enableItemWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableBatWaypoints")) + .binding(defaults.locations.dungeons.secretWaypoints.enableBatWaypoints, + () -> config.locations.dungeons.secretWaypoints.enableBatWaypoints, + newValue -> config.locations.dungeons.secretWaypoints.enableBatWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableWitherWaypoints")) + .binding(defaults.locations.dungeons.secretWaypoints.enableWitherWaypoints, + () -> config.locations.dungeons.secretWaypoints.enableWitherWaypoints, + newValue -> config.locations.dungeons.secretWaypoints.enableWitherWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableLeverWaypoints")) + .binding(defaults.locations.dungeons.secretWaypoints.enableLeverWaypoints, + () -> config.locations.dungeons.secretWaypoints.enableLeverWaypoints, + newValue -> config.locations.dungeons.secretWaypoints.enableLeverWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableFairySoulWaypoints")) + .binding(defaults.locations.dungeons.secretWaypoints.enableFairySoulWaypoints, + () -> config.locations.dungeons.secretWaypoints.enableFairySoulWaypoints, + newValue -> config.locations.dungeons.secretWaypoints.enableFairySoulWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableStonkWaypoints")) + .binding(defaults.locations.dungeons.secretWaypoints.enableStonkWaypoints, + () -> config.locations.dungeons.secretWaypoints.enableStonkWaypoints, + newValue -> config.locations.dungeons.secretWaypoints.enableStonkWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableDefaultWaypoints")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableDefaultWaypoints.@Tooltip"))) + .binding(defaults.locations.dungeons.secretWaypoints.enableDefaultWaypoints, + () -> config.locations.dungeons.secretWaypoints.enableDefaultWaypoints, + newValue -> config.locations.dungeons.secretWaypoints.enableDefaultWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) + + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.enableProfitCalculator")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.enableProfitCalculator.@Tooltip"))) + .binding(defaults.locations.dungeons.dungeonChestProfit.enableProfitCalculator, + () -> config.locations.dungeons.dungeonChestProfit.enableProfitCalculator, + newValue -> config.locations.dungeons.dungeonChestProfit.enableProfitCalculator = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.includeKismet")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.includeKismet.@Tooltip"))) + .binding(defaults.locations.dungeons.dungeonChestProfit.includeKismet, + () -> config.locations.dungeons.dungeonChestProfit.includeKismet, + newValue -> config.locations.dungeons.dungeonChestProfit.includeKismet = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.includeEssence")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.includeEssence.@Tooltip"))) + .binding(defaults.locations.dungeons.dungeonChestProfit.includeEssence, + () -> config.locations.dungeons.dungeonChestProfit.includeEssence, + newValue -> config.locations.dungeons.dungeonChestProfit.includeEssence = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.neutralThreshold")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.neutralThreshold.@Tooltip"))) + .binding(defaults.locations.dungeons.dungeonChestProfit.neutralThreshold, + () -> config.locations.dungeons.dungeonChestProfit.neutralThreshold, + newValue -> config.locations.dungeons.dungeonChestProfit.neutralThreshold = newValue) + .controller(IntegerFieldControllerBuilder::create) + .build()) + .option(Option.<FormattingOption>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.neutralColor")) + .binding(defaults.locations.dungeons.dungeonChestProfit.neutralColor, + () -> config.locations.dungeons.dungeonChestProfit.neutralColor, + newValue -> config.locations.dungeons.dungeonChestProfit.neutralColor = newValue) + .controller(ConfigUtils::createEnumDropdownController) + .build()) + .option(Option.<FormattingOption>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.profitColor")) + .binding(defaults.locations.dungeons.dungeonChestProfit.profitColor, + () -> config.locations.dungeons.dungeonChestProfit.profitColor, + newValue -> config.locations.dungeons.dungeonChestProfit.profitColor = newValue) + .controller(ConfigUtils::createEnumDropdownController) + .build()) + .option(Option.<FormattingOption>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.lossColor")) + .binding(defaults.locations.dungeons.dungeonChestProfit.lossColor, + () -> config.locations.dungeons.dungeonChestProfit.lossColor, + newValue -> config.locations.dungeons.dungeonChestProfit.lossColor = newValue) + .controller(ConfigUtils::createEnumDropdownController) + .build()) + .option(Option.<FormattingOption>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.incompleteColor")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.incompleteColor.@Tooltip"))) + .binding(defaults.locations.dungeons.dungeonChestProfit.incompleteColor, + () -> config.locations.dungeons.dungeonChestProfit.incompleteColor, + newValue -> config.locations.dungeons.dungeonChestProfit.incompleteColor = newValue) + .controller(ConfigUtils::createEnumDropdownController) + .build()) + .build()) + + //Others + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.croesusHelper")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.croesusHelper.@Tooltip"))) + .binding(defaults.locations.dungeons.croesusHelper, + () -> config.locations.dungeons.croesusHelper, + newValue -> config.locations.dungeons.croesusHelper = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.enableMap")) + .binding(defaults.locations.dungeons.enableMap, + () -> config.locations.dungeons.enableMap, + newValue -> config.locations.dungeons.enableMap = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(ButtonOption.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.mapScreen")) + .text(Text.translatable("text.skyblocker.open")) + .action((screen, opt) -> MinecraftClient.getInstance().setScreen(new DungeonMapConfigScreen(screen))) + .build()) + .option(Option.<Float>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.mapScaling")) + .binding(defaults.locations.dungeons.mapScaling, + () -> config.locations.dungeons.mapScaling, + newValue -> config.locations.dungeons.mapScaling = newValue) + .controller(FloatFieldControllerBuilder::create) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.mapX")) + .binding(defaults.locations.dungeons.mapX, + () -> config.locations.dungeons.mapX, + newValue -> config.locations.dungeons.mapX = newValue) + .controller(IntegerFieldControllerBuilder::create) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.mapY")) + .binding(defaults.locations.dungeons.mapY, + () -> config.locations.dungeons.mapY, + newValue -> config.locations.dungeons.mapY = newValue) + .controller(IntegerFieldControllerBuilder::create) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.starredMobGlow")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.starredMobGlow.@Tooltip"))) + .binding(defaults.locations.dungeons.starredMobGlow, + () -> config.locations.dungeons.starredMobGlow, + newValue -> config.locations.dungeons.starredMobGlow = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.solveThreeWeirdos")) + .binding(defaults.locations.dungeons.solveThreeWeirdos, + () -> config.locations.dungeons.solveThreeWeirdos, + newValue -> config.locations.dungeons.solveThreeWeirdos = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.blazesolver")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.blazesolver.@Tooltip"))) + .binding(defaults.locations.dungeons.blazesolver, + () -> config.locations.dungeons.blazesolver, + newValue -> config.locations.dungeons.blazesolver = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.solveTrivia")) + .binding(defaults.locations.dungeons.solveTrivia, + () -> config.locations.dungeons.solveTrivia, + newValue -> config.locations.dungeons.solveTrivia = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.solveTicTacToe")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.solveTicTacToe.@Tooltip"))) + .binding(defaults.locations.dungeons.solveTicTacToe, + () -> config.locations.dungeons.solveTicTacToe, + newValue -> config.locations.dungeons.solveTicTacToe = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + + //Livid Color + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.lividColor")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.lividColor.enableLividColor")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.lividColor.enableLividColor.@Tooltip"))) + .binding(defaults.locations.dungeons.lividColor.enableLividColor, + () -> config.locations.dungeons.lividColor.enableLividColor, + newValue -> config.locations.dungeons.lividColor.enableLividColor = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.lividColor.lividColorText")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.lividColor.lividColorText.@Tooltip"))) + .binding(defaults.locations.dungeons.lividColor.lividColorText, + () -> config.locations.dungeons.lividColor.lividColorText, + newValue -> config.locations.dungeons.lividColor.lividColorText = newValue) + .controller(StringControllerBuilder::create) + .build()) + .build()) + + //Terminal Solvers + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.terminals")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.terminals.solveColor")) + .binding(defaults.locations.dungeons.terminals.solveColor, + () -> config.locations.dungeons.terminals.solveColor, + newValue -> config.locations.dungeons.terminals.solveColor = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.terminals.solveOrder")) + .binding(defaults.locations.dungeons.terminals.solveOrder, + () -> config.locations.dungeons.terminals.solveOrder, + newValue -> config.locations.dungeons.terminals.solveOrder = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.terminals.solveStartsWith")) + .binding(defaults.locations.dungeons.terminals.solveStartsWith, + () -> config.locations.dungeons.terminals.solveStartsWith, + newValue -> config.locations.dungeons.terminals.solveStartsWith = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) + .build(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/categories/DwarvenMinesCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/DwarvenMinesCategory.java new file mode 100644 index 00000000..8330ba2a --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/DwarvenMinesCategory.java @@ -0,0 +1,94 @@ +package me.xmrvizzy.skyblocker.config.categories; + +import dev.isxander.yacl3.api.ButtonOption; +import dev.isxander.yacl3.api.ConfigCategory; +import dev.isxander.yacl3.api.Option; +import dev.isxander.yacl3.api.OptionDescription; +import dev.isxander.yacl3.api.OptionGroup; +import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.config.ConfigUtils; +import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHudConfigScreen; +import net.minecraft.client.MinecraftClient; +import net.minecraft.text.Text; + +public class DwarvenMinesCategory { + + public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) { + return ConfigCategory.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines")) + + //Uncategorized Options + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.enableDrillFuel")) + .binding(defaults.locations.dwarvenMines.enableDrillFuel, + () -> config.locations.dwarvenMines.enableDrillFuel, + newValue -> config.locations.dwarvenMines.enableDrillFuel = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.solveFetchur")) + .binding(defaults.locations.dwarvenMines.solveFetchur, + () -> config.locations.dwarvenMines.solveFetchur, + newValue -> config.locations.dwarvenMines.solveFetchur = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.solvePuzzler")) + .binding(defaults.locations.dwarvenMines.solvePuzzler, + () -> config.locations.dwarvenMines.solvePuzzler, + newValue -> config.locations.dwarvenMines.solvePuzzler = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + + //Dwarven HUD + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud")) + .collapsed(false) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enabled")) + .binding(defaults.locations.dwarvenMines.dwarvenHud.enabled, + () -> config.locations.dwarvenMines.dwarvenHud.enabled, + newValue -> config.locations.dwarvenMines.dwarvenHud.enabled = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<SkyblockerConfig.DwarvenHudStyle>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.style")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.style.@Tooltip[0]"), + Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.style.@Tooltip[1]"), + Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.style.@Tooltip[2]"))) + .binding(defaults.locations.dwarvenMines.dwarvenHud.style, + () -> config.locations.dwarvenMines.dwarvenHud.style, + newValue -> config.locations.dwarvenMines.dwarvenHud.style = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(ButtonOption.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.screen")) + .text(Text.translatable("text.skyblocker.open")) + .action((screen, opt) -> MinecraftClient.getInstance().setScreen(new DwarvenHudConfigScreen(screen))) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enableBackground")) + .binding(defaults.locations.dwarvenMines.dwarvenHud.enableBackground, + () -> config.locations.dwarvenMines.dwarvenHud.enableBackground, + newValue -> config.locations.dwarvenMines.dwarvenHud.enableBackground = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.x")) + .binding(defaults.locations.dwarvenMines.dwarvenHud.x, + () -> config.locations.dwarvenMines.dwarvenHud.x, + newValue -> config.locations.dwarvenMines.dwarvenHud.x = newValue) + .controller(IntegerFieldControllerBuilder::create) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.y")) + .binding(defaults.locations.dwarvenMines.dwarvenHud.y, + () -> config.locations.dwarvenMines.dwarvenHud.y, + newValue -> config.locations.dwarvenMines.dwarvenHud.y = newValue) + .controller(IntegerFieldControllerBuilder::create) + .build()) + .build()) + .build(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/categories/GeneralCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/GeneralCategory.java new file mode 100644 index 00000000..1a483ef5 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/GeneralCategory.java @@ -0,0 +1,496 @@ +package me.xmrvizzy.skyblocker.config.categories; + +import dev.isxander.yacl3.api.ButtonOption; +import dev.isxander.yacl3.api.ConfigCategory; +import dev.isxander.yacl3.api.Option; +import dev.isxander.yacl3.api.OptionDescription; +import dev.isxander.yacl3.api.OptionGroup; +import dev.isxander.yacl3.api.controller.FloatFieldControllerBuilder; +import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder; +import dev.isxander.yacl3.api.controller.IntegerSliderControllerBuilder; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.config.ConfigUtils; +import me.xmrvizzy.skyblocker.skyblock.shortcut.ShortcutsConfigScreen; +import me.xmrvizzy.skyblocker.utils.render.title.TitleContainerConfigScreen; +import net.minecraft.client.MinecraftClient; +import net.minecraft.text.Text; + +public class GeneralCategory { + + public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) { + return ConfigCategory.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.category.general")) + + //Ungrouped Options + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.acceptReparty")) + .binding(defaults.general.acceptReparty, + () -> config.general.acceptReparty, + newValue -> config.general.acceptReparty = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.backpackPreviewWithoutShift")) + .binding(defaults.general.backpackPreviewWithoutShift, + () -> config.general.backpackPreviewWithoutShift, + newValue -> config.general.backpackPreviewWithoutShift = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.compactorDeletorPreview")) + .binding(defaults.general.compactorDeletorPreview, + () -> config.general.compactorDeletorPreview, + newValue -> config.general.compactorDeletorPreview = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.hideEmptyTooltips")) + .binding(defaults.general.hideEmptyTooltips, + () -> config.general.hideEmptyTooltips, + newValue -> config.general.hideEmptyTooltips = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.hideStatusEffectOverlay")) + .binding(defaults.general.hideStatusEffectOverlay, + () -> config.general.hideStatusEffectOverlay, + newValue -> config.general.hideStatusEffectOverlay = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + + //Tab Hud + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.tabHud")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.tabHud.tabHudEnabled")) + .binding(defaults.general.tabHud.tabHudEnabled, + () -> config.general.tabHud.tabHudEnabled, + newValue -> config.general.tabHud.tabHudEnabled = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.tabHud.tabHudScale")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.tabHud.tabHudScale.@Tooltip"))) + .binding(defaults.general.tabHud.tabHudScale, + () -> config.general.tabHud.tabHudScale, + newValue -> config.general.tabHud.tabHudScale = newValue) + .controller(opt -> IntegerSliderControllerBuilder.create(opt).range(10, 200).step(1)) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.tabHud.plainPlayerNames")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.tabHud.plainPlayerNames.@Tooltip"))) + .binding(defaults.general.tabHud.plainPlayerNames, + () -> config.general.tabHud.plainPlayerNames, + newValue -> config.general.tabHud.plainPlayerNames = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<SkyblockerConfig.NameSorting>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.tabHud.nameSorting")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.tabHud.nameSorting.@Tooltip"))) + .binding(defaults.general.tabHud.nameSorting, + () -> config.general.tabHud.nameSorting, + newValue -> config.general.tabHud.nameSorting = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .build()) + + //Fancy Bars + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.bars")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.bars.enableBars")) + .binding(defaults.general.bars.enableBars, + () -> config.general.bars.enableBars, + newValue -> config.general.bars.enableBars = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<SkyblockerConfig.BarPosition>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.bars.barpositions.healthBarPosition")) + .binding(defaults.general.bars.barPositions.healthBarPosition, + () -> config.general.bars.barPositions.healthBarPosition, + newValue -> config.general.bars.barPositions.healthBarPosition = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(Option.<SkyblockerConfig.BarPosition>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.bars.barpositions.manaBarPosition")) + .binding(defaults.general.bars.barPositions.manaBarPosition, + () -> config.general.bars.barPositions.manaBarPosition, + newValue -> config.general.bars.barPositions.manaBarPosition = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(Option.<SkyblockerConfig.BarPosition>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.bars.barpositions.defenceBarPosition")) + .binding(defaults.general.bars.barPositions.defenceBarPosition, + () -> config.general.bars.barPositions.defenceBarPosition, + newValue -> config.general.bars.barPositions.defenceBarPosition = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(Option.<SkyblockerConfig.BarPosition>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.bars.barpositions.experienceBarPosition")) + .binding(defaults.general.bars.barPositions.experienceBarPosition, + () -> config.general.bars.barPositions.experienceBarPosition, + newValue -> config.general.bars.barPositions.experienceBarPosition = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .build()) + + //Experiments Solver + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.experiments")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.experiments.enableChronomatronSolver")) + .binding(defaults.general.experiments.enableChronomatronSolver, + () -> config.general.experiments.enableChronomatronSolver, + newValue -> config.general.experiments.enableChronomatronSolver = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.experiments.enableSuperpairsSolver")) + .binding(defaults.general.experiments.enableSuperpairsSolver, + () -> config.general.experiments.enableSuperpairsSolver, + newValue -> config.general.experiments.enableSuperpairsSolver = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.experiments.enableUltrasequencerSolver")) + .binding(defaults.general.experiments.enableUltrasequencerSolver, + () -> config.general.experiments.enableUltrasequencerSolver, + newValue -> config.general.experiments.enableUltrasequencerSolver = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) + + //Fishing Helper + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.fishing")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.fishing.enableFishingHelper")) + .binding(defaults.general.fishing.enableFishingHelper, + () -> config.general.fishing.enableFishingHelper, + newValue -> config.general.fishing.enableFishingHelper = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) + + //Fairy Souls Helper + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.fairySouls")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.fairySouls.enableFairySoulsHelper")) + .binding(defaults.general.fairySouls.enableFairySoulsHelper, + () -> config.general.fairySouls.enableFairySoulsHelper, + newValue -> config.general.fairySouls.enableFairySoulsHelper = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.fairySouls.highlightFoundSouls")) + .binding(defaults.general.fairySouls.highlightFoundSouls, + () -> config.general.fairySouls.highlightFoundSouls, + newValue -> config.general.fairySouls.highlightFoundSouls = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.fairySouls.highlightOnlyNearbySouls")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.fairySouls.highlightOnlyNearbySouls.@Tooltip"))) + .binding(defaults.general.fairySouls.highlightOnlyNearbySouls, + () -> config.general.fairySouls.highlightOnlyNearbySouls, + newValue -> config.general.fairySouls.highlightOnlyNearbySouls = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) + + //Item Cooldown + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.itemCooldown")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.itemCooldown.enableItemCooldowns")) + .binding(defaults.general.itemCooldown.enableItemCooldowns, + () -> config.general.itemCooldown.enableItemCooldowns, + newValue -> config.general.itemCooldown.enableItemCooldowns = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) + + //Shortcuts + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.shortcuts")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.shortcuts.enableShortcuts")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.shortcuts.enableShortcuts.@Tooltip"))) + .binding(defaults.general.shortcuts.enableShortcuts, + () -> config.general.shortcuts.enableShortcuts, + newValue -> config.general.shortcuts.enableShortcuts = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.shortcuts.enableCommandShortcuts")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.shortcuts.enableCommandShortcuts.@Tooltip"))) + .binding(defaults.general.shortcuts.enableCommandShortcuts, + () -> config.general.shortcuts.enableCommandShortcuts, + newValue -> config.general.shortcuts.enableCommandShortcuts = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.shortcuts.enableCommandArgShortcuts")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.shortcuts.enableCommandArgShortcuts.@Tooltip"))) + .binding(defaults.general.shortcuts.enableCommandArgShortcuts, + () -> config.general.shortcuts.enableCommandArgShortcuts, + newValue -> config.general.shortcuts.enableCommandArgShortcuts = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(ButtonOption.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.shortcuts.config")) + .text(Text.translatable("text.skyblocker.open")) + .action((screen, opt) -> MinecraftClient.getInstance().setScreen(new ShortcutsConfigScreen(screen))) + .build()) + .build()) + + //Quiver Warning + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.quiverWarning")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.quiverWarning.enableQuiverWarning")) + .binding(defaults.general.quiverWarning.enableQuiverWarning, + () -> config.general.quiverWarning.enableQuiverWarning, + newValue -> config.general.quiverWarning.enableQuiverWarning = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.quiverWarning.enableQuiverWarningInDungeons")) + .binding(defaults.general.quiverWarning.enableQuiverWarningInDungeons, + () -> config.general.quiverWarning.enableQuiverWarningInDungeons, + newValue -> config.general.quiverWarning.enableQuiverWarningInDungeons = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.quiverWarning.enableQuiverWarningAfterDungeon")) + .binding(defaults.general.quiverWarning.enableQuiverWarningAfterDungeon, + () -> config.general.quiverWarning.enableQuiverWarningAfterDungeon, + newValue -> config.general.quiverWarning.enableQuiverWarningAfterDungeon = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) + + //Item List + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.itemList")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.itemList.enableItemList")) + .binding(defaults.general.itemList.enableItemList, + () -> config.general.itemList.enableItemList, + newValue -> config.general.itemList.enableItemList = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) + + //Item Tooltip + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.itemTooltip")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.itemTooltip.enableNPCPrice")) + .binding(defaults.general.itemTooltip.enableNPCPrice, + () -> config.general.itemTooltip.enableNPCPrice, + newValue -> config.general.itemTooltip.enableNPCPrice = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.itemTooltip.enableMotesPrice")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.itemTooltip.enableMotesPrice.@Tooltip"))) + .binding(defaults.general.itemTooltip.enableMotesPrice, + () -> config.general.itemTooltip.enableMotesPrice, + newValue -> config.general.itemTooltip.enableMotesPrice = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.itemTooltip.enableAvgBIN")) + .binding(defaults.general.itemTooltip.enableAvgBIN, + () -> config.general.itemTooltip.enableAvgBIN, + newValue -> config.general.itemTooltip.enableAvgBIN = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<SkyblockerConfig.Average>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.itemTooltip.avg")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.itemTooltip.avg.@Tooltip"))) + .binding(defaults.general.itemTooltip.avg, + () -> config.general.itemTooltip.avg, + newValue -> config.general.itemTooltip.avg = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.itemTooltip.enableLowestBIN")) + .binding(defaults.general.itemTooltip.enableLowestBIN, + () -> config.general.itemTooltip.enableLowestBIN, + newValue -> config.general.itemTooltip.enableLowestBIN = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.itemTooltip.enableBazaarPrice")) + .binding(defaults.general.itemTooltip.enableBazaarPrice, + () -> config.general.itemTooltip.enableBazaarPrice, + newValue -> config.general.itemTooltip.enableBazaarPrice = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.itemTooltip.enableMuseumDate")) + .binding(defaults.general.itemTooltip.enableMuseumDate, + () -> config.general.itemTooltip.enableMuseumDate, + newValue -> config.general.itemTooltip.enableMuseumDate = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) + + //Item Info Display + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.itemInfoDisplay")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.itemInfoDisplay.attributeShardInfo")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.itemInfoDisplay.attributeShardInfo.@Tooltip"))) + .binding(defaults.general.itemInfoDisplay.attributeShardInfo, + () -> config.general.itemInfoDisplay.attributeShardInfo, + newValue -> config.general.itemInfoDisplay.attributeShardInfo = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) + + //Special Effects + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.specialEffects")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.specialEffects.rareDungeonDropEffects")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.specialEffects.rareDungeonDropEffects.@Tooltip"))) + .binding(defaults.general.specialEffects.rareDungeonDropEffects, + () -> config.general.specialEffects.rareDungeonDropEffects, + newValue -> config.general.specialEffects.rareDungeonDropEffects = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) + + //Hitboxes + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.hitbox")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.hitbox.oldFarmlandHitbox")) + .binding(defaults.general.hitbox.oldFarmlandHitbox, + () -> config.general.hitbox.oldFarmlandHitbox, + newValue -> config.general.hitbox.oldFarmlandHitbox = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.hitbox.oldLeverHitbox")) + .binding(defaults.general.hitbox.oldLeverHitbox, + () -> config.general.hitbox.oldLeverHitbox, + newValue -> config.general.hitbox.oldLeverHitbox = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) + + //Title Container + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.titleContainer")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.titleContainer.@Tooltip"))) + .collapsed(true) + .option(Option.<Float>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.titleContainer.titleContainerScale")) + .binding(defaults.general.titleContainer.titleContainerScale, + () -> config.general.titleContainer.titleContainerScale, + newValue -> config.general.titleContainer.titleContainerScale = newValue) + .controller(opt -> FloatFieldControllerBuilder.create(opt).range(30f, 140f)) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.titleContainer.x")) + .binding(defaults.general.titleContainer.x, + () -> config.general.titleContainer.x, + newValue -> config.general.titleContainer.x = newValue) + .controller(IntegerFieldControllerBuilder::create) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.titleContainer.y")) + .binding(defaults.general.titleContainer.y, + () -> config.general.titleContainer.y, + newValue -> config.general.titleContainer.y = newValue) + .controller(IntegerFieldControllerBuilder::create) + .build()) + .option(Option.<SkyblockerConfig.Direction>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.titleContainer.direction")) + .binding(defaults.general.titleContainer.direction, + () -> config.general.titleContainer.direction, + newValue -> config.general.titleContainer.direction = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(Option.<SkyblockerConfig.Alignment>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.titleContainer.alignment")) + .binding(defaults.general.titleContainer.alignment, + () -> config.general.titleContainer.alignment, + newValue -> config.general.titleContainer.alignment = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(ButtonOption.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.titleContainer.config")) + .text(Text.translatable("text.skyblocker.open")) + .action((screen, opt) -> MinecraftClient.getInstance().setScreen(new TitleContainerConfigScreen(screen))) + .build()) + .build()) + + //Teleport Overlays + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.teleportOverlay")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.teleportOverlay.enableTeleportOverlays")) + .binding(defaults.general.teleportOverlay.enableTeleportOverlays, + () -> config.general.teleportOverlay.enableTeleportOverlays, + newValue -> config.general.teleportOverlay.enableTeleportOverlays = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.teleportOverlay.enableWeirdTransmission")) + .binding(defaults.general.teleportOverlay.enableWeirdTransmission, + () -> config.general.teleportOverlay.enableWeirdTransmission, + newValue -> config.general.teleportOverlay.enableWeirdTransmission = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.teleportOverlay.enableInstantTransmission")) + .binding(defaults.general.teleportOverlay.enableInstantTransmission, + () -> config.general.teleportOverlay.enableInstantTransmission, + newValue -> config.general.teleportOverlay.enableInstantTransmission = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.teleportOverlay.enableEtherTransmission")) + .binding(defaults.general.teleportOverlay.enableEtherTransmission, + () -> config.general.teleportOverlay.enableEtherTransmission, + newValue -> config.general.teleportOverlay.enableEtherTransmission = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.teleportOverlay.enableSinrecallTransmission")) + .binding(defaults.general.teleportOverlay.enableSinrecallTransmission, + () -> config.general.teleportOverlay.enableSinrecallTransmission, + newValue -> config.general.teleportOverlay.enableSinrecallTransmission = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.teleportOverlay.enableWitherImpact")) + .binding(defaults.general.teleportOverlay.enableWitherImpact, + () -> config.general.teleportOverlay.enableWitherImpact, + newValue -> config.general.teleportOverlay.enableWitherImpact = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) + .build(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/categories/LocationsCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/LocationsCategory.java new file mode 100644 index 00000000..099c917c --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/LocationsCategory.java @@ -0,0 +1,80 @@ +package me.xmrvizzy.skyblocker.config.categories; + +import dev.isxander.yacl3.api.ConfigCategory; +import dev.isxander.yacl3.api.Option; +import dev.isxander.yacl3.api.OptionDescription; +import dev.isxander.yacl3.api.OptionGroup; +import dev.isxander.yacl3.api.controller.IntegerSliderControllerBuilder; +import me.xmrvizzy.skyblocker.config.ConfigUtils; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import net.minecraft.text.Text; + +public class LocationsCategory { + + public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) { + return ConfigCategory.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.category.locations")) + + //Barn + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.barn")) + .collapsed(false) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.barn.solveHungryHiker")) + .binding(defaults.locations.barn.solveHungryHiker, + () -> config.locations.barn.solveHungryHiker, + newValue -> config.locations.barn.solveHungryHiker = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.barn.solveTreasureHunter")) + .binding(defaults.locations.barn.solveTreasureHunter, + () -> config.locations.barn.solveTreasureHunter, + newValue -> config.locations.barn.solveTreasureHunter = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) + + //The Rift + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.rift")) + .collapsed(false) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.rift.mirrorverseWaypoints")) + .binding(defaults.locations.rift.mirrorverseWaypoints, + () -> config.locations.rift.mirrorverseWaypoints, + newValue -> config.locations.rift.mirrorverseWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.rift.mcGrubberStacks")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.rift.mcGrubberStacks.@Tooltip"))) + .binding(defaults.locations.rift.mcGrubberStacks, + () -> config.locations.rift.mcGrubberStacks, + newValue -> config.locations.rift.mcGrubberStacks = newValue) + .controller(opt -> IntegerSliderControllerBuilder.create(opt).range(0, 5).step(1)) + .build()) + .build()) + + //Spider's Den + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.spidersDen")) + .collapsed(false) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.spidersDen.relics.enableRelicsHelper")) + .binding(defaults.locations.spidersDen.relics.enableRelicsHelper, + () -> config.locations.spidersDen.relics.enableRelicsHelper, + newValue -> config.locations.spidersDen.relics.enableRelicsHelper = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.spidersDen.relics.highlightFoundRelics")) + .binding(defaults.locations.spidersDen.relics.highlightFoundRelics, + () -> config.locations.spidersDen.relics.highlightFoundRelics, + newValue -> config.locations.spidersDen.relics.highlightFoundRelics = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) + .build(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/categories/MessageFilterCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/MessageFilterCategory.java new file mode 100644 index 00000000..268dc9b9 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/MessageFilterCategory.java @@ -0,0 +1,98 @@ +package me.xmrvizzy.skyblocker.config.categories; + +import dev.isxander.yacl3.api.ConfigCategory; +import dev.isxander.yacl3.api.Option; +import dev.isxander.yacl3.api.OptionDescription; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.config.ConfigUtils; +import net.minecraft.text.Text; + +public class MessageFilterCategory { + + public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) { + return ConfigCategory.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.category.messages")) + + //Uncategorized Options + .option(Option.<ChatFilterResult>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.messages.hideAbility")) + .binding(defaults.messages.hideAbility, + () -> config.messages.hideAbility, + newValue -> config.messages.hideAbility = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(Option.<ChatFilterResult>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.messages.hideHeal")) + .binding(defaults.messages.hideHeal, + () -> config.messages.hideHeal, + newValue -> config.messages.hideHeal = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(Option.<ChatFilterResult>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.messages.hideAOTE")) + .binding(defaults.messages.hideAOTE, + () -> config.messages.hideAOTE, + newValue -> config.messages.hideAOTE = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(Option.<ChatFilterResult>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.messages.hideImplosion")) + .binding(defaults.messages.hideImplosion, + () -> config.messages.hideImplosion, + newValue -> config.messages.hideImplosion = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(Option.<ChatFilterResult>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.messages.hideMoltenWave")) + .binding(defaults.messages.hideMoltenWave, + () -> config.messages.hideMoltenWave, + newValue -> config.messages.hideMoltenWave = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(Option.<ChatFilterResult>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.messages.hideAds")) + .binding(defaults.messages.hideAds, + () -> config.messages.hideAds, + newValue -> config.messages.hideAds = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(Option.<ChatFilterResult>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.messages.hideTeleportPad")) + .binding(defaults.messages.hideTeleportPad, + () -> config.messages.hideTeleportPad, + newValue -> config.messages.hideTeleportPad = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(Option.<ChatFilterResult>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.messages.hideCombo")) + .binding(defaults.messages.hideCombo, + () -> config.messages.hideCombo, + newValue -> config.messages.hideCombo = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(Option.<ChatFilterResult>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.messages.hideAutopet")) + .binding(defaults.messages.hideAutopet, + () -> config.messages.hideAutopet, + newValue -> config.messages.hideAutopet = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(Option.<ChatFilterResult>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.messages.hideShowOff")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.messages.hideShowOff.@Tooltip"))) + .binding(defaults.messages.hideShowOff, + () -> config.messages.hideShowOff, + newValue -> config.messages.hideShowOff = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.messages.hideMana")) + .binding(defaults.messages.hideMana, + () -> config.messages.hideMana, + newValue -> config.messages.hideMana = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/categories/QuickNavigationCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/QuickNavigationCategory.java new file mode 100644 index 00000000..3189a1f3 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/QuickNavigationCategory.java @@ -0,0 +1,605 @@ +package me.xmrvizzy.skyblocker.config.categories; + +import dev.isxander.yacl3.api.ConfigCategory; +import dev.isxander.yacl3.api.Option; +import dev.isxander.yacl3.api.OptionGroup; +import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder; +import dev.isxander.yacl3.api.controller.StringControllerBuilder; +import me.xmrvizzy.skyblocker.config.ConfigUtils; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import net.minecraft.text.Text; + +public class QuickNavigationCategory { + + public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) { + return ConfigCategory.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.category.quickNav")) + + //Toggle + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.enableQuickNav")) + .binding(defaults.quickNav.enableQuickNav, + () -> config.quickNav.enableQuickNav, + newValue -> config.quickNav.enableQuickNav = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + + //Button 1 + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.render")) + .binding(defaults.quickNav.button1.render, + () -> config.quickNav.button1.render, + newValue -> config.quickNav.button1.render = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.itemName")) + .binding(defaults.quickNav.button1.item.itemName, + () -> config.quickNav.button1.item.itemName, + newValue -> config.quickNav.button1.item.itemName = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.count")) + .binding(defaults.quickNav.button1.item.count, + () -> config.quickNav.button1.item.count, + newValue -> config.quickNav.button1.item.count = newValue) + .controller(opt -> IntegerFieldControllerBuilder.create(opt).range(1, 64)) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.nbt")) + .binding(defaults.quickNav.button1.item.nbt, + () -> config.quickNav.button1.item.nbt, + newValue -> config.quickNav.button1.item.nbt = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.uiTitle")) + .binding(defaults.quickNav.button1.uiTitle, + () -> config.quickNav.button1.uiTitle, + newValue -> config.quickNav.button1.uiTitle = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.clickEvent")) + .binding(defaults.quickNav.button1.clickEvent, + () -> config.quickNav.button1.clickEvent, + newValue -> config.quickNav.button1.clickEvent = newValue) + .controller(StringControllerBuilder::create) + .build()) + .build()) + + //Button 2 + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button2")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.render")) + .binding(defaults.quickNav.button2.render, + () -> config.quickNav.button2.render, + newValue -> config.quickNav.button2.render = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.itemName")) + .binding(defaults.quickNav.button2.item.itemName, + () -> config.quickNav.button2.item.itemName, + newValue -> config.quickNav.button2.item.itemName = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.count")) + .binding(defaults.quickNav.button2.item.count, + () -> config.quickNav.button2.item.count, + newValue -> config.quickNav.button2.item.count = newValue) + .controller(opt -> IntegerFieldControllerBuilder.create(opt).range(1, 64)) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.nbt")) + .binding(defaults.quickNav.button2.item.nbt, + () -> config.quickNav.button2.item.nbt, + newValue -> config.quickNav.button2.item.nbt = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.uiTitle")) + .binding(defaults.quickNav.button2.uiTitle, + () -> config.quickNav.button2.uiTitle, + newValue -> config.quickNav.button2.uiTitle = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.clickEvent")) + .binding(defaults.quickNav.button2.clickEvent, + () -> config.quickNav.button2.clickEvent, + newValue -> config.quickNav.button2.clickEvent = newValue) + .controller(StringControllerBuilder::create) + .build()) + .build()) + + //Button 3 + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button3")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.render")) + .binding(defaults.quickNav.button3.render, + () -> config.quickNav.button3.render, + newValue -> config.quickNav.button3.render = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.itemName")) + .binding(defaults.quickNav.button3.item.itemName, + () -> config.quickNav.button3.item.itemName, + newValue -> config.quickNav.button3.item.itemName = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.count")) + .binding(defaults.quickNav.button3.item.count, + () -> config.quickNav.button3.item.count, + newValue -> config.quickNav.button3.item.count = newValue) + .controller(opt -> IntegerFieldControllerBuilder.create(opt).range(1, 64)) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.nbt")) + .binding(defaults.quickNav.button3.item.nbt, + () -> config.quickNav.button3.item.nbt, + newValue -> config.quickNav.button3.item.nbt = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.uiTitle")) + .binding(defaults.quickNav.button3.uiTitle, + () -> config.quickNav.button3.uiTitle, + newValue -> config.quickNav.button3.uiTitle = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.clickEvent")) + .binding(defaults.quickNav.button3.clickEvent, + () -> config.quickNav.button3.clickEvent, + newValue -> config.quickNav.button3.clickEvent = newValue) + .controller(StringControllerBuilder::create) + .build()) + .build()) + + //Button 4 + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button4")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.render")) + .binding(defaults.quickNav.button4.render, + () -> config.quickNav.button4.render, + newValue -> config.quickNav.button4.render = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.itemName")) + .binding(defaults.quickNav.button4.item.itemName, + () -> config.quickNav.button4.item.itemName, + newValue -> config.quickNav.button4.item.itemName = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.count")) + .binding(defaults.quickNav.button4.item.count, + () -> config.quickNav.button4.item.count, + newValue -> config.quickNav.button4.item.count = newValue) + .controller(opt -> IntegerFieldControllerBuilder.create(opt).range(1, 64)) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.nbt")) + .binding(defaults.quickNav.button4.item.nbt, + () -> config.quickNav.button4.item.nbt, + newValue -> config.quickNav.button4.item.nbt = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.uiTitle")) + .binding(defaults.quickNav.button4.uiTitle, + () -> config.quickNav.button4.uiTitle, + newValue -> config.quickNav.button4.uiTitle = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.clickEvent")) + .binding(defaults.quickNav.button4.clickEvent, + () -> config.quickNav.button4.clickEvent, + newValue -> config.quickNav.button4.clickEvent = newValue) + .controller(StringControllerBuilder::create) + .build()) + .build()) + + //Button 5 + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button5")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.render")) + .binding(defaults.quickNav.button5.render, + () -> config.quickNav.button5.render, + newValue -> config.quickNav.button5.render = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.itemName")) + .binding(defaults.quickNav.button5.item.itemName, + () -> config.quickNav.button5.item.itemName, + newValue -> config.quickNav.button5.item.itemName = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.count")) + .binding(defaults.quickNav.button5.item.count, + () -> config.quickNav.button5.item.count, + newValue -> config.quickNav.button5.item.count = newValue) + .controller(opt -> IntegerFieldControllerBuilder.create(opt).range(1, 64)) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.nbt")) + .binding(defaults.quickNav.button5.item.nbt, + () -> config.quickNav.button5.item.nbt, + newValue -> config.quickNav.button5.item.nbt = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.uiTitle")) + .binding(defaults.quickNav.button5.uiTitle, + () -> config.quickNav.button5.uiTitle, + newValue -> config.quickNav.button5.uiTitle = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.clickEvent")) + .binding(defaults.quickNav.button5.clickEvent, + () -> config.quickNav.button5.clickEvent, + newValue -> config.quickNav.button5.clickEvent = newValue) + .controller(StringControllerBuilder::create) + .build()) + .build()) + + //Button 6 + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button6")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.render")) + .binding(defaults.quickNav.button6.render, + () -> config.quickNav.button6.render, + newValue -> config.quickNav.button6.render = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.itemName")) + .binding(defaults.quickNav.button6.item.itemName, + () -> config.quickNav.button6.item.itemName, + newValue -> config.quickNav.button6.item.itemName = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.count")) + .binding(defaults.quickNav.button6.item.count, + () -> config.quickNav.button6.item.count, + newValue -> config.quickNav.button6.item.count = newValue) + .controller(opt -> IntegerFieldControllerBuilder.create(opt).range(1, 64)) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.nbt")) + .binding(defaults.quickNav.button6.item.nbt, + () -> config.quickNav.button6.item.nbt, + newValue -> config.quickNav.button6.item.nbt = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.uiTitle")) + .binding(defaults.quickNav.button6.uiTitle, + () -> config.quickNav.button6.uiTitle, + newValue -> config.quickNav.button6.uiTitle = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.clickEvent")) + .binding(defaults.quickNav.button6.clickEvent, + () -> config.quickNav.button6.clickEvent, + newValue -> config.quickNav.button6.clickEvent = newValue) + .controller(StringControllerBuilder::create) + .build()) + .build()) + + //Button 7 + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button7")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.render")) + .binding(defaults.quickNav.button7.render, + () -> config.quickNav.button7.render, + newValue -> config.quickNav.button7.render = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.itemName")) + .binding(defaults.quickNav.button7.item.itemName, + () -> config.quickNav.button7.item.itemName, + newValue -> config.quickNav.button7.item.itemName = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.count")) + .binding(defaults.quickNav.button7.item.count, + () -> config.quickNav.button7.item.count, + newValue -> config.quickNav.button7.item.count = newValue) + .controller(opt -> IntegerFieldControllerBuilder.create(opt).range(1, 64)) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.nbt")) + .binding(defaults.quickNav.button7.item.nbt, + () -> config.quickNav.button7.item.nbt, + newValue -> config.quickNav.button7.item.nbt = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.uiTitle")) + .binding(defaults.quickNav.button7.uiTitle, + () -> config.quickNav.button7.uiTitle, + newValue -> config.quickNav.button7.uiTitle = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.clickEvent")) + .binding(defaults.quickNav.button7.clickEvent, + () -> config.quickNav.button7.clickEvent, + newValue -> config.quickNav.button7.clickEvent = newValue) + .controller(StringControllerBuilder::create) + .build()) + .build()) + + //Button 8 + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button8")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.render")) + .binding(defaults.quickNav.button8.render, + () -> config.quickNav.button8.render, + newValue -> config.quickNav.button8.render = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.itemName")) + .binding(defaults.quickNav.button8.item.itemName, + () -> config.quickNav.button8.item.itemName, + newValue -> config.quickNav.button8.item.itemName = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.count")) + .binding(defaults.quickNav.button8.item.count, + () -> config.quickNav.button8.item.count, + newValue -> config.quickNav.button8.item.count = newValue) + .controller(opt -> IntegerFieldControllerBuilder.create(opt).range(1, 64)) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.nbt")) + .binding(defaults.quickNav.button8.item.nbt, + () -> config.quickNav.button8.item.nbt, + newValue -> config.quickNav.button8.item.nbt = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.uiTitle")) + .binding(defaults.quickNav.button8.uiTitle, + () -> config.quickNav.button8.uiTitle, + newValue -> config.quickNav.button8.uiTitle = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.clickEvent")) + .binding(defaults.quickNav.button8.clickEvent, + () -> config.quickNav.button8.clickEvent, + newValue -> config.quickNav.button8.clickEvent = newValue) + .controller(StringControllerBuilder::create) + .build()) + .build()) + + //Button 9 + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button9")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.render")) + .binding(defaults.quickNav.button9.render, + () -> config.quickNav.button9.render, + newValue -> config.quickNav.button9.render = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.itemName")) + .binding(defaults.quickNav.button9.item.itemName, + () -> config.quickNav.button9.item.itemName, + newValue -> config.quickNav.button9.item.itemName = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.count")) + .binding(defaults.quickNav.button9.item.count, + () -> config.quickNav.button9.item.count, + newValue -> config.quickNav.button9.item.count = newValue) + .controller(opt -> IntegerFieldControllerBuilder.create(opt).range(1, 64)) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.nbt")) + .binding(defaults.quickNav.button9.item.nbt, + () -> config.quickNav.button9.item.nbt, + newValue -> config.quickNav.button9.item.nbt = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.uiTitle")) + .binding(defaults.quickNav.button9.uiTitle, + () -> config.quickNav.button9.uiTitle, + newValue -> config.quickNav.button9.uiTitle = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.clickEvent")) + .binding(defaults.quickNav.button9.clickEvent, + () -> config.quickNav.button9.clickEvent, + newValue -> config.quickNav.button9.clickEvent = newValue) + .controller(StringControllerBuilder::create) + .build()) + .build()) + + //Button 10 + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button10")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.render")) + .binding(defaults.quickNav.button10.render, + () -> config.quickNav.button10.render, + newValue -> config.quickNav.button10.render = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.itemName")) + .binding(defaults.quickNav.button10.item.itemName, + () -> config.quickNav.button10.item.itemName, + newValue -> config.quickNav.button10.item.itemName = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.count")) + .binding(defaults.quickNav.button10.item.count, + () -> config.quickNav.button10.item.count, + newValue -> config.quickNav.button10.item.count = newValue) + .controller(opt -> IntegerFieldControllerBuilder.create(opt).range(1, 64)) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.nbt")) + .binding(defaults.quickNav.button10.item.nbt, + () -> config.quickNav.button10.item.nbt, + newValue -> config.quickNav.button10.item.nbt = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.uiTitle")) + .binding(defaults.quickNav.button10.uiTitle, + () -> config.quickNav.button10.uiTitle, + newValue -> config.quickNav.button10.uiTitle = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.clickEvent")) + .binding(defaults.quickNav.button10.clickEvent, + () -> config.quickNav.button10.clickEvent, + newValue -> config.quickNav.button10.clickEvent = newValue) + .controller(StringControllerBuilder::create) + .build()) + .build()) + + //Button 11 + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button11")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.render")) + .binding(defaults.quickNav.button11.render, + () -> config.quickNav.button11.render, + newValue -> config.quickNav.button11.render = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.itemName")) + .binding(defaults.quickNav.button11.item.itemName, + () -> config.quickNav.button11.item.itemName, + newValue -> config.quickNav.button11.item.itemName = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.count")) + .binding(defaults.quickNav.button11.item.count, + () -> config.quickNav.button11.item.count, + newValue -> config.quickNav.button11.item.count = newValue) + .controller(opt -> IntegerFieldControllerBuilder.create(opt).range(1, 64)) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.nbt")) + .binding(defaults.quickNav.button11.item.nbt, + () -> config.quickNav.button11.item.nbt, + newValue -> config.quickNav.button11.item.nbt = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.uiTitle")) + .binding(defaults.quickNav.button11.uiTitle, + () -> config.quickNav.button11.uiTitle, + newValue -> config.quickNav.button11.uiTitle = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.clickEvent")) + .binding(defaults.quickNav.button11.clickEvent, + () -> config.quickNav.button11.clickEvent, + newValue -> config.quickNav.button11.clickEvent = newValue) + .controller(StringControllerBuilder::create) + .build()) + .build()) + + //Button 12 + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button12")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.render")) + .binding(defaults.quickNav.button12.render, + () -> config.quickNav.button12.render, + newValue -> config.quickNav.button12.render = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.itemName")) + .binding(defaults.quickNav.button12.item.itemName, + () -> config.quickNav.button12.item.itemName, + newValue -> config.quickNav.button12.item.itemName = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.count")) + .binding(defaults.quickNav.button12.item.count, + () -> config.quickNav.button12.item.count, + newValue -> config.quickNav.button12.item.count = newValue) + .controller(opt -> IntegerFieldControllerBuilder.create(opt).range(1, 64)) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.item.nbt")) + .binding(defaults.quickNav.button12.item.nbt, + () -> config.quickNav.button12.item.nbt, + newValue -> config.quickNav.button12.item.nbt = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.uiTitle")) + .binding(defaults.quickNav.button12.uiTitle, + () -> config.quickNav.button12.uiTitle, + newValue -> config.quickNav.button12.uiTitle = newValue) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button1.clickEvent")) + .binding(defaults.quickNav.button12.clickEvent, + () -> config.quickNav.button12.clickEvent, + newValue -> config.quickNav.button12.clickEvent = newValue) + .controller(StringControllerBuilder::create) + .build()) + .build()) + + .build(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/categories/SlayersCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/SlayersCategory.java new file mode 100644 index 00000000..febca720 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/SlayersCategory.java @@ -0,0 +1,116 @@ +package me.xmrvizzy.skyblocker.config.categories; + +import dev.isxander.yacl3.api.ConfigCategory; +import dev.isxander.yacl3.api.Option; +import dev.isxander.yacl3.api.OptionDescription; +import dev.isxander.yacl3.api.OptionGroup; +import dev.isxander.yacl3.api.controller.FloatFieldControllerBuilder; +import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder; +import dev.isxander.yacl3.api.controller.IntegerSliderControllerBuilder; +import me.xmrvizzy.skyblocker.config.ConfigUtils; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import net.minecraft.text.Text; + +public class SlayersCategory { + + public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) { + return ConfigCategory.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.category.slayer")) + + //Vampire Slayer + .group(OptionGroup.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.slayer.vampireSlayer")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.slayer.vampireSlayer.enableEffigyWaypoints")) + .binding(defaults.slayer.vampireSlayer.enableEffigyWaypoints, + () -> config.slayer.vampireSlayer.enableEffigyWaypoints, + newValue -> config.slayer.vampireSlayer.enableEffigyWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.slayer.vampireSlayer.compactEffigyWaypoints")) + .binding(defaults.slayer.vampireSlayer.compactEffigyWaypoints, + () -> config.slayer.vampireSlayer.compactEffigyWaypoints, + newValue -> config.slayer.vampireSlayer.compactEffigyWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.slayer.vampireSlayer.effigyUpdateFrequency")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.slayer.vampireSlayer.effigyUpdateFrequency.@Tooltip"))) + .binding(defaults.slayer.vampireSlayer.effigyUpdateFrequency, + () -> config.slayer.vampireSlayer.effigyUpdateFrequency, + newValue -> config.slayer.vampireSlayer.effigyUpdateFrequency = newValue) + .controller(opt -> IntegerSliderControllerBuilder.create(opt).range(1, 10).step(1)) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.slayer.vampireSlayer.enableHolyIceIndicator")) + .binding(defaults.slayer.vampireSlayer.enableHolyIceIndicator, + () -> config.slayer.vampireSlayer.enableHolyIceIndicator, + newValue -> config.slayer.vampireSlayer.enableHolyIceIndicator = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.slayer.vampireSlayer.holyIceIndicatorTickDelay")) + .binding(defaults.slayer.vampireSlayer.holyIceIndicatorTickDelay, + () -> config.slayer.vampireSlayer.holyIceIndicatorTickDelay, + newValue -> config.slayer.vampireSlayer.holyIceIndicatorTickDelay = newValue) + .controller(IntegerFieldControllerBuilder::create) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.slayer.vampireSlayer.holyIceUpdateFrequency")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.slayer.vampireSlayer.holyIceUpdateFrequency.@Tooltip"))) + .binding(defaults.slayer.vampireSlayer.holyIceUpdateFrequency, + () -> config.slayer.vampireSlayer.holyIceUpdateFrequency, + newValue -> config.slayer.vampireSlayer.holyIceUpdateFrequency = newValue) + .controller(opt -> IntegerSliderControllerBuilder.create(opt).range(1, 10).step(1)) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.slayer.vampireSlayer.enableHealingMelonIndicator")) + .binding(defaults.slayer.vampireSlayer.enableHealingMelonIndicator, + () -> config.slayer.vampireSlayer.enableHealingMelonIndicator, + newValue -> config.slayer.vampireSlayer.enableHealingMelonIndicator = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Float>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.slayer.vampireSlayer.healingMelonHealthThreshold")) + .binding(defaults.slayer.vampireSlayer.healingMelonHealthThreshold, + () -> config.slayer.vampireSlayer.healingMelonHealthThreshold, + newValue -> config.slayer.vampireSlayer.healingMelonHealthThreshold = newValue) + .controller(FloatFieldControllerBuilder::create) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.slayer.vampireSlayer.enableSteakStakeIndicator")) + .binding(defaults.slayer.vampireSlayer.enableSteakStakeIndicator, + () -> config.slayer.vampireSlayer.enableSteakStakeIndicator, + newValue -> config.slayer.vampireSlayer.enableSteakStakeIndicator = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.slayer.vampireSlayer.steakStakeUpdateFrequency")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.slayer.vampireSlayer.steakStakeUpdateFrequency.@Tooltip"))) + .binding(defaults.slayer.vampireSlayer.steakStakeUpdateFrequency, + () -> config.slayer.vampireSlayer.steakStakeUpdateFrequency, + newValue -> config.slayer.vampireSlayer.steakStakeUpdateFrequency = newValue) + .controller(opt -> IntegerSliderControllerBuilder.create(opt).range(1, 10).step(1)) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.slayer.vampireSlayer.enableManiaIndicator")) + .binding(defaults.slayer.vampireSlayer.enableManiaIndicator, + () -> config.slayer.vampireSlayer.enableManiaIndicator, + newValue -> config.slayer.vampireSlayer.enableManiaIndicator = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Integer>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.slayer.vampireSlayer.maniaUpdateFrequency")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.slayer.vampireSlayer.maniaUpdateFrequency.@Tooltip"))) + .binding(defaults.slayer.vampireSlayer.maniaUpdateFrequency, + () -> config.slayer.vampireSlayer.maniaUpdateFrequency, + newValue -> config.slayer.vampireSlayer.maniaUpdateFrequency = newValue) + .controller(opt -> IntegerSliderControllerBuilder.create(opt).range(1, 10).step(1)) + .build()) + .build()) + + .build(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownController.java b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownController.java new file mode 100644 index 00000000..cf40c7d5 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownController.java @@ -0,0 +1,86 @@ +package me.xmrvizzy.skyblocker.config.controllers; + +import dev.isxander.yacl3.api.Option; +import dev.isxander.yacl3.api.utils.Dimension; +import dev.isxander.yacl3.gui.AbstractWidget; +import dev.isxander.yacl3.gui.YACLScreen; +import dev.isxander.yacl3.gui.controllers.dropdown.AbstractDropdownController; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.stream.Stream; + +public class EnumDropdownController<E extends Enum<E>> extends AbstractDropdownController<E> { + protected EnumDropdownController(Option<E> option) { + super(option); + } + + @Override + public String getString() { + return option().pendingValue().toString(); + } + + @Override + public void setFromString(String value) { + option().requestSet(getEnumFromString(value)); + } + + /** + * Searches through enum constants for one whose {@link Enum#toString()} result equals {@code value} + * + * @return The enum constant associated with the {@code value} or the pending value if none are found + * @implNote The return value of {@link Enum#toString()} on each enum constant should be unique in order to ensure accuracy + */ + private E getEnumFromString(String value) { + value = value.toLowerCase(); + for (E constant : option().pendingValue().getDeclaringClass().getEnumConstants()) { + if (constant.toString().toLowerCase().equals(value)) return constant; + } + + return option().pendingValue(); + } + + @Override + public boolean isValueValid(String value) { + value = value.toLowerCase(); + for (E constant : option().pendingValue().getDeclaringClass().getEnumConstants()) { + if (constant.toString().equals(value)) return true; + } + + return false; + } + + @Override + protected String getValidValue(String value, int offset) { + return getValidEnumConstants(value) + .skip(offset) + .findFirst() + .orElseGet(this::getString); + } + + /** + * Filters and sorts through enum constants for those whose {@link Enum#toString()} result equals {@code value} + * + * @return a sorted stream containing enum constants associated with the {@code value} + * @implNote The return value of {@link Enum#toString()} on each enum constant should be unique in order to ensure accuracy + */ + @NotNull + protected Stream<String> getValidEnumConstants(String value) { + String valueLowerCase = value.toLowerCase(); + return Arrays.stream(option().pendingValue().getDeclaringClass().getEnumConstants()) + .map(Enum::toString) + .filter(constant -> constant.toLowerCase().contains(valueLowerCase)) + .sorted((s1, s2) -> { + String s1LowerCase = s1.toLowerCase(); + String s2LowerCase = s2.toLowerCase(); + if (s1LowerCase.startsWith(valueLowerCase) && !s2LowerCase.startsWith(valueLowerCase)) return -1; + if (!s1LowerCase.startsWith(valueLowerCase) && s2LowerCase.startsWith(valueLowerCase)) return 1; + return s1.compareTo(s2); + }); + } + + @Override + public AbstractWidget provideWidget(YACLScreen screen, Dimension<Integer> widgetDimension) { + return new EnumDropdownControllerElement<>(this, screen, widgetDimension); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilder.java b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilder.java new file mode 100644 index 00000000..baadb8b3 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilder.java @@ -0,0 +1,10 @@ +package me.xmrvizzy.skyblocker.config.controllers; + +import dev.isxander.yacl3.api.Option; +import dev.isxander.yacl3.api.controller.ControllerBuilder; + +public interface EnumDropdownControllerBuilder<E extends Enum<E>> extends ControllerBuilder<E> { + static <E extends Enum<E>> EnumDropdownControllerBuilder<E> create(Option<E> option) { + return new EnumDropdownControllerBuilderImpl<>(option); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilderImpl.java b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilderImpl.java new file mode 100644 index 00000000..ea30d1da --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilderImpl.java @@ -0,0 +1,17 @@ +package me.xmrvizzy.skyblocker.config.controllers; + +import dev.isxander.yacl3.api.Controller; +import dev.isxander.yacl3.api.Option; +import dev.isxander.yacl3.impl.controller.AbstractControllerBuilderImpl; + +public class EnumDropdownControllerBuilderImpl<E extends Enum<E>> extends AbstractControllerBuilderImpl<E> implements EnumDropdownControllerBuilder<E> { + public EnumDropdownControllerBuilderImpl(Option<E> option) { + super(option); + } + + @SuppressWarnings("UnstableApiUsage") + @Override + public Controller<E> build() { + return new EnumDropdownController<>(option); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerElement.java b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerElement.java new file mode 100644 index 00000000..6c5a0097 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerElement.java @@ -0,0 +1,26 @@ +package me.xmrvizzy.skyblocker.config.controllers; + +import dev.isxander.yacl3.api.utils.Dimension; +import dev.isxander.yacl3.gui.YACLScreen; +import dev.isxander.yacl3.gui.controllers.dropdown.AbstractDropdownControllerElement; + +import java.util.List; + +public class EnumDropdownControllerElement<E extends Enum<E>> extends AbstractDropdownControllerElement<E, String> { + private final EnumDropdownController<E> controller; + + public EnumDropdownControllerElement(EnumDropdownController<E> control, YACLScreen screen, Dimension<Integer> dim) { + super(control, screen, dim); + this.controller = control; + } + + @Override + public List<String> computeMatchingValues() { + return controller.getValidEnumConstants(inputField).toList(); + } + + @Override + public String getString(String object) { + return object; + } +} |