diff options
author | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2023-09-03 16:36:08 -0400 |
---|---|---|
committer | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2023-09-23 23:00:52 -0400 |
commit | 776dadb050b4e7d76de9fa16161d2cda4dd66e5b (patch) | |
tree | 0abddad881fb5df86ef3adbe9b6630164bef320d | |
parent | dbdb0598086a4d31018294f87026da517ceb0ce2 (diff) | |
download | Skyblocker-776dadb050b4e7d76de9fa16161d2cda4dd66e5b.tar.gz Skyblocker-776dadb050b4e7d76de9fa16161d2cda4dd66e5b.tar.bz2 Skyblocker-776dadb050b4e7d76de9fa16161d2cda4dd66e5b.zip |
YACL Config
37 files changed, 2880 insertions, 793 deletions
diff --git a/build.gradle b/build.gradle index 5f0d1822..576d544c 100644 --- a/build.gradle +++ b/build.gradle @@ -20,6 +20,7 @@ repositories { } maven { url "https://maven.terraformersmc.com/releases" } maven { url "https://maven.shedaniel.me/" } + maven { url "https://maven.isxander.dev/releases" } maven { url 'https://repo.maven.apache.org/maven2' name 'Maven Central' @@ -30,7 +31,8 @@ repositories { } maven { url "https://repo.codemc.io/repository/maven-public/" } // For Occlusion Culling library maven { url "https://repo.nea.moe/releases" } // For neu repoparser - maven { url "https://jitpack.io" } + maven { url "https://oss.sonatype.org/content/repositories/snapshots" } + maven {url "https://jitpack.io"} } dependencies { @@ -44,11 +46,8 @@ dependencies { // Fabric API modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}" - // Cloth config - include modImplementation("me.shedaniel.cloth:cloth-config-fabric:${project.clothconfig_version}") { - exclude group: "net.fabricmc.fabric-api" - exclude module: "modmenu" - } + // YACL + include modImplementation("dev.isxander.yacl:yet-another-config-lib-fabric:${project.yacl_version}") // Mod Menu modImplementation "com.terraformersmc:modmenu:${project.mod_menu_version}" diff --git a/gradle.properties b/gradle.properties index d7913486..f15f8c90 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,8 +11,9 @@ loader_version=0.14.22 ## 1.20 fabric_api_version=0.89.1+1.20.2 -## Cloth Api (https://modrinth.com/mod/cloth-config/versions) -clothconfig_version=12.0.108 +# Dependencies +## YACL (https://github.com/isXander/YetAnotherConfigLib) +yacl_version=3.1.1+1.20 ## Mod Menu (https://modrinth.com/mod/modmenu/versions) mod_menu_version=8.0.0-beta.2 ## REI (https://modrinth.com/mod/rei/versions?l=fabric) diff --git a/src/main/java/me/xmrvizzy/skyblocker/compatibility/modmenu/ModMenuEntry.java b/src/main/java/me/xmrvizzy/skyblocker/compatibility/modmenu/ModMenuEntry.java index 0cba3d5e..7fd188bf 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/compatibility/modmenu/ModMenuEntry.java +++ b/src/main/java/me/xmrvizzy/skyblocker/compatibility/modmenu/ModMenuEntry.java @@ -1,6 +1,5 @@ package me.xmrvizzy.skyblocker.compatibility.modmenu; -import me.shedaniel.autoconfig.AutoConfig; import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; @@ -11,6 +10,6 @@ import net.fabricmc.api.Environment; public class ModMenuEntry implements ModMenuApi { @Override public ConfigScreenFactory<?> getModConfigScreenFactory() { - return screen -> AutoConfig.getConfigScreen(SkyblockerConfig.class, screen).get(); + return parent -> SkyblockerConfig.createGUI(parent); } }
\ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/ConfigModel.java b/src/main/java/me/xmrvizzy/skyblocker/config/ConfigModel.java new file mode 100644 index 00000000..748b731c --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/ConfigModel.java @@ -0,0 +1,805 @@ +package me.xmrvizzy.skyblocker.config; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; + +import dev.isxander.yacl3.config.ConfigEntry; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.skyblock.item.CustomArmorTrims; +import net.minecraft.client.resource.language.I18n; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +public class ConfigModel { + @ConfigEntry + public General general = new General(); + + @ConfigEntry + public Locations locations = new Locations(); + + @ConfigEntry + public Slayer slayer = new Slayer(); + + @ConfigEntry + public QuickNav quickNav = new QuickNav(); + + @ConfigEntry + public Messages messages = new Messages(); + + @ConfigEntry + public RichPresence richPresence = new RichPresence(); + + public static class QuickNav { + @ConfigEntry + public boolean enableQuickNav = true; + + @ConfigEntry + public QuickNavItem button1 = new QuickNavItem(true, new ItemData("diamond_sword"), "Your Skills", "/skills"); + + @ConfigEntry + public QuickNavItem button2 = new QuickNavItem(true, new ItemData("painting"), "Collections", "/collection"); + + /* 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 + 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)" + */ + @ConfigEntry + public QuickNavItem button4 = new QuickNavItem(true, + new ItemData("leather_chestplate", 1, "tag:{display:{color:8991416}}"), "Wardrobe \\([12]/2\\)", + "/wardrobe"); + + @ConfigEntry + 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)" + */ + @ConfigEntry + public QuickNavItem button6 = new QuickNavItem(true, new ItemData("ender_chest"), + "(?:Rift )?Storage(?: \\(1/2\\))?", "/storage"); + + @ConfigEntry + 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 + 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 + 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 + public QuickNavItem button10 = new QuickNavItem(true, new ItemData("enchanting_table"), "Enchant Item", + "/etable"); + + @ConfigEntry + public QuickNavItem button11 = new QuickNavItem(true, new ItemData("anvil"), "Anvil", "/anvil"); + + @ConfigEntry + 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; + } + + @ConfigEntry + public Boolean render; + + @ConfigEntry + public ItemData item; + + @ConfigEntry + public String uiTitle; + + @ConfigEntry + 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 = ""; + } + + @ConfigEntry + public String itemName; + + @ConfigEntry + public int count; + + @ConfigEntry + public String nbt; + } + + public static class General { + @ConfigEntry + public boolean acceptReparty = true; + + @ConfigEntry + public boolean backpackPreviewWithoutShift = false; + + @ConfigEntry + public boolean compactorDeletorPreview = true; + + @ConfigEntry + public boolean hideEmptyTooltips = true; + + @ConfigEntry + public boolean hideStatusEffectOverlay = false; + + @ConfigEntry + public TabHudConf tabHud = new TabHudConf(); + + @ConfigEntry + public Bars bars = new Bars(); + + @ConfigEntry + public Experiments experiments = new Experiments(); + + @ConfigEntry + public Fishing fishing = new Fishing(); + + @ConfigEntry + public FairySouls fairySouls = new FairySouls(); + + @ConfigEntry + public Shortcuts shortcuts = new Shortcuts(); + + @ConfigEntry + public QuiverWarning quiverWarning = new QuiverWarning(); + + @ConfigEntry + public ItemList itemList = new ItemList(); + + @ConfigEntry + public ItemTooltip itemTooltip = new ItemTooltip(); + + @ConfigEntry + public ItemInfoDisplay itemInfoDisplay = new ItemInfoDisplay(); + + @ConfigEntry + public SpecialEffects specialEffects = new SpecialEffects(); + + @ConfigEntry + public Hitbox hitbox = new Hitbox(); + + @ConfigEntry + public TitleContainer titleContainer = new TitleContainer(); + + @ConfigEntry + public TeleportOverlay teleportOverlay = new TeleportOverlay(); + + @ConfigEntry + public List<Integer> lockedSlots = new ArrayList<>(); + + @ConfigEntry + public Object2ObjectOpenHashMap<String, Text> customItemNames = new Object2ObjectOpenHashMap<>(); + + @ConfigEntry + public Object2IntOpenHashMap<String> customDyeColors = new Object2IntOpenHashMap<>(); + + @ConfigEntry + public Object2ObjectOpenHashMap<String, CustomArmorTrims.ArmorTrimId> customArmorTrims = new Object2ObjectOpenHashMap<>(); + } + + public static class TabHudConf { + @ConfigEntry + public boolean tabHudEnabled = true; + + @ConfigEntry + public int tabHudScale = 100; + + @ConfigEntry + public boolean plainPlayerNames = false; + + @ConfigEntry + 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 { + @ConfigEntry + public boolean enableBars = true; + + @ConfigEntry + public BarPositions barpositions = new BarPositions(); + } + + public static class BarPositions { + @ConfigEntry + public BarPosition healthBarPosition = BarPosition.LAYER1; + + @ConfigEntry + public BarPosition manaBarPosition = BarPosition.LAYER1; + + @ConfigEntry + public BarPosition defenceBarPosition = BarPosition.LAYER1; + + @ConfigEntry + 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 { + @ConfigEntry + public boolean enableChronomatronSolver = true; + + @ConfigEntry + public boolean enableSuperpairsSolver = true; + + @ConfigEntry + public boolean enableUltrasequencerSolver = true; + } + + public static class Fishing { + @ConfigEntry + public boolean enableFishingHelper = true; + } + + public static class FairySouls { + @ConfigEntry + public boolean enableFairySoulsHelper = false; + + @ConfigEntry + public boolean highlightFoundSouls = true; + + @ConfigEntry + public boolean highlightOnlyNearbySouls = false; + } + + public static class Shortcuts { + @ConfigEntry + public boolean enableShortcuts = true; + + @ConfigEntry + public boolean enableCommandShortcuts = true; + + @ConfigEntry + public boolean enableCommandArgShortcuts = true; + } + + public static class QuiverWarning { + @ConfigEntry + public boolean enableQuiverWarning = true; + + @ConfigEntry + public boolean enableQuiverWarningInDungeons = true; + + @ConfigEntry + public boolean enableQuiverWarningAfterDungeon = true; + } + + public static class Hitbox { + @ConfigEntry + public boolean oldFarmlandHitbox = true; + + @ConfigEntry + public boolean oldLeverHitbox = false; + } + + public static class TitleContainer { + @ConfigEntry + public float titleContainerScale = 100; + + @ConfigEntry + public int x = 540; + + @ConfigEntry + public int y = 10; + + @ConfigEntry + public Direction direction = Direction.HORIZONTAL; + + @ConfigEntry + public Alignment alignment = Alignment.MIDDLE; + } + + public static class TeleportOverlay { + @ConfigEntry + public boolean enableTeleportOverlays = true; + + @ConfigEntry + public boolean enableWeirdTransmission = true; + + @ConfigEntry + public boolean enableInstantTransmission = true; + + @ConfigEntry + public boolean enableEtherTransmission = true; + + @ConfigEntry + public boolean enableSinrecallTransmission = true; + + @ConfigEntry + 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 { + @ConfigEntry + public boolean enableRichPresence = false; + + @ConfigEntry + public Info info = Info.LOCATION; + + @ConfigEntry + public boolean cycleMode = false; + + @ConfigEntry + public String customMessage = "Playing Skyblock"; + } + + public static class ItemList { + @ConfigEntry + 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 { + @ConfigEntry + public boolean enableNPCPrice = true; + + @ConfigEntry + public boolean enableMotesPrice = true; + + @ConfigEntry + public boolean enableAvgBIN = true; + + @ConfigEntry + public Average avg = Average.THREE_DAY; + + @ConfigEntry + public boolean enableLowestBIN = true; + + @ConfigEntry + public boolean enableBazaarPrice = true; + + @ConfigEntry + public boolean enableMuseumDate = true; + } + + public static class ItemInfoDisplay { + @ConfigEntry + public boolean attributeShardInfo = true; + } + + public static class SpecialEffects { + @ConfigEntry + public boolean rareDungeonDropEffects = true; + } + + public static class Locations { + @ConfigEntry + public Barn barn = new Barn(); + + @ConfigEntry + public Dungeons dungeons = new Dungeons(); + + @ConfigEntry + public DwarvenMines dwarvenMines = new DwarvenMines(); + + @ConfigEntry + public Rift rift = new Rift(); + + @ConfigEntry + public SpidersDen spidersDen = new SpidersDen(); + } + + public static class Dungeons { + @ConfigEntry + public SecretWaypoints secretWaypoints = new SecretWaypoints(); + + @ConfigEntry + public DungeonChestProfit dungeonChestProfit = new DungeonChestProfit(); + + @ConfigEntry + public boolean croesusHelper = true; + + @ConfigEntry + public boolean enableMap = true; + + @ConfigEntry + public float mapScaling = 1f; + + @ConfigEntry + public int mapX = 2; + + @ConfigEntry + public int mapY = 2; + + @ConfigEntry + public boolean starredMobGlow = true; + + @ConfigEntry + public boolean solveThreeWeirdos = true; + + @ConfigEntry + public boolean blazesolver = true; + + @ConfigEntry + public boolean solveTrivia = true; + + @ConfigEntry + public boolean solveTicTacToe = true; + + @ConfigEntry + public LividColor lividColor = new LividColor(); + + @ConfigEntry + public Terminals terminals = new Terminals(); + } + + public static class SecretWaypoints { + @ConfigEntry + public boolean enableSecretWaypoints = true; + + @ConfigEntry + public boolean noInitSecretWaypoints = false; + + @ConfigEntry + public boolean enableEntranceWaypoints = true; + + @ConfigEntry + public boolean enableSuperboomWaypoints = true; + + @ConfigEntry + public boolean enableChestWaypoints = true; + + @ConfigEntry + public boolean enableItemWaypoints = true; + + @ConfigEntry + public boolean enableBatWaypoints = true; + + @ConfigEntry + public boolean enableWitherWaypoints = true; + + @ConfigEntry + public boolean enableLeverWaypoints = true; + + @ConfigEntry + public boolean enableFairySoulWaypoints = true; + + @ConfigEntry + public boolean enableStonkWaypoints = true; + + @ConfigEntry + public boolean enableDefaultWaypoints = true; + } + + public static class DungeonChestProfit { + @ConfigEntry + public boolean enableProfitCalculator = true; + + @ConfigEntry + public boolean includeKismet = false; + + @ConfigEntry + public boolean includeEssence = true; + + @ConfigEntry + public int neutralThreshold = 1000; + + @ConfigEntry + public FormattingOption neutralColor = FormattingOption.DARK_GRAY; + + @ConfigEntry + public FormattingOption profitColor = FormattingOption.DARK_GREEN; + + @ConfigEntry + public FormattingOption lossColor = FormattingOption.RED; + + @ConfigEntry + 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 + public boolean enableLividColor = true; + + @ConfigEntry + public String lividColorText = "The livid color is [color]"; + } + + public static class Terminals { + @ConfigEntry + public boolean solveColor = true; + + @ConfigEntry + public boolean solveOrder = true; + + @ConfigEntry + public boolean solveStartsWith = true; + } + + public static class DwarvenMines { + @ConfigEntry + public boolean enableDrillFuel = true; + + @ConfigEntry + public boolean solveFetchur = true; + + @ConfigEntry + public boolean solvePuzzler = true; + + @ConfigEntry + public DwarvenHud dwarvenHud = new DwarvenHud(); + } + + public static class DwarvenHud { + @ConfigEntry + public boolean enabled = true; + + @ConfigEntry + public DwarvenHudStyle style = DwarvenHudStyle.SIMPLE; + + @ConfigEntry + public boolean enableBackground = true; + + @ConfigEntry + public int x = 10; + + @ConfigEntry + 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 { + @ConfigEntry + public boolean solveHungryHiker = true; + + @ConfigEntry + public boolean solveTreasureHunter = true; + } + + public static class Rift { + @ConfigEntry + public boolean mirrorverseWaypoints = true; + + @ConfigEntry + public int mcGrubberStacks = 0; + } + + public static class SpidersDen { + @ConfigEntry + public Relics relics = new Relics(); + } + + public static class Relics { + @ConfigEntry + public boolean enableRelicsHelper = false; + + @ConfigEntry + public boolean highlightFoundRelics = true; + } + + public static class Slayer { + @ConfigEntry + public VampireSlayer vampireSlayer = new VampireSlayer(); + } + + public static class VampireSlayer { + @ConfigEntry + public boolean enableEffigyWaypoints = true; + + @ConfigEntry + public boolean compactEffigyWaypoints; + + @ConfigEntry + public int effigyUpdateFrequency = 5; + + @ConfigEntry + public boolean enableHolyIceIndicator = true; + + @ConfigEntry + public int holyIceIndicatorTickDelay = 10; + + @ConfigEntry + public int holyIceUpdateFrequency = 5; + + @ConfigEntry + public boolean enableHealingMelonIndicator = true; + + @ConfigEntry + public float healingMelonHealthThreshold = 4f; + + @ConfigEntry + public boolean enableSteakStakeIndicator = true; + + @ConfigEntry + public int steakStakeUpdateFrequency = 5; + + @ConfigEntry + public boolean enableManiaIndicator = true; + + @ConfigEntry + public int maniaUpdateFrequency = 5; + } + + public static class Messages { + @ConfigEntry + public ChatFilterResult hideAbility = ChatFilterResult.PASS; + + @ConfigEntry + public ChatFilterResult hideHeal = ChatFilterResult.PASS; + + @ConfigEntry + public ChatFilterResult hideAOTE = ChatFilterResult.PASS; + + @ConfigEntry + public ChatFilterResult hideImplosion = ChatFilterResult.PASS; + + @ConfigEntry + public ChatFilterResult hideMoltenWave = ChatFilterResult.PASS; + + @ConfigEntry + public ChatFilterResult hideAds = ChatFilterResult.PASS; + + @ConfigEntry + public ChatFilterResult hideTeleportPad = ChatFilterResult.PASS; + + @ConfigEntry + public ChatFilterResult hideCombo = ChatFilterResult.PASS; + + @ConfigEntry + public ChatFilterResult hideAutopet = ChatFilterResult.PASS; + + @ConfigEntry + public ChatFilterResult hideShowOff = ChatFilterResult.PASS; + + @ConfigEntry + 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/ConfigSerializer.java b/src/main/java/me/xmrvizzy/skyblocker/config/ConfigSerializer.java new file mode 100644 index 00000000..8aaa7d2d --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/ConfigSerializer.java @@ -0,0 +1,24 @@ +package me.xmrvizzy.skyblocker.config; + +import java.awt.Color; + +import com.google.gson.FieldNamingPolicy; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import dev.isxander.yacl3.config.GsonConfigInstance.ColorTypeAdapter; +import net.minecraft.text.Style; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +class ConfigSerializer { + static final Gson INSTANCE = new GsonBuilder() + .setFieldNamingPolicy(FieldNamingPolicy.IDENTITY) + .registerTypeHierarchyAdapter(Text.class, new Text.Serializer()) + .registerTypeHierarchyAdapter(Style.class, new Style.Serializer()) + .registerTypeHierarchyAdapter(Identifier.class, new Identifier.Serializer()) + .registerTypeHierarchyAdapter(Color.class, new ColorTypeAdapter()) + .serializeNulls() + .setPrettyPrinting() + .create(); +} 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..57ea5893 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/ConfigUtils.java @@ -0,0 +1,15 @@ +package me.xmrvizzy.skyblocker.config; + +import dev.isxander.yacl3.api.Option; +import dev.isxander.yacl3.api.controller.CyclingListControllerBuilder; +import net.minecraft.text.Text; + +public class ConfigUtils { + + @SuppressWarnings("unchecked") + public static <E extends Enum<?>> CyclingListControllerBuilder<E> createCyclingListController4Enum(Option<E> opt) { + E[] constants = (E[]) opt.binding().defaultValue().getClass().getEnumConstants(); + + return CyclingListControllerBuilder.create(opt).values(constants).valueFormatter(c -> Text.of(c.toString())); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 5848ed15..12007671 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -1,728 +1,80 @@ package me.xmrvizzy.skyblocker.config; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; +import java.lang.StackWalker.Option; +import java.nio.file.Path; import com.mojang.brigadier.builder.LiteralArgumentBuilder; -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 dev.isxander.yacl3.api.YetAnotherConfigLib; +import dev.isxander.yacl3.config.GsonConfigInstance; import me.xmrvizzy.skyblocker.SkyblockerMod; -import me.xmrvizzy.skyblocker.skyblock.item.CustomArmorTrims; -import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; +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.MessageFilterCategory; +import me.xmrvizzy.skyblocker.config.categories.LocationsCategory; +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.minecraft.client.resource.language.I18n; -import net.minecraft.text.Style; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.client.gui.screen.Screen; 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(); - - @ConfigEntry.Category("locations") - @ConfigEntry.Gui.TransitiveObject - public Locations locations = new Locations(); - - @ConfigEntry.Category("slayer") - @ConfigEntry.Gui.TransitiveObject - public Slayer slayer = new Slayer(); - - @ConfigEntry.Category("quickNav") - @ConfigEntry.Gui.TransitiveObject - public QuickNav quickNav = new QuickNav(); - - @ConfigEntry.Category("messages") - @ConfigEntry.Gui.TransitiveObject - public Messages messages = new Messages(); - - @ConfigEntry.Category("richPresence") - @ConfigEntry.Gui.TransitiveObject - public RichPresence richPresence = new RichPresence(); - - public static class QuickNav { - public boolean enableQuickNav = true; - - @ConfigEntry.Category("button1") - @ConfigEntry.Gui.CollapsibleObject() - 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"); - - @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 - * "(?: \\(\\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("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 Shortcuts { - @ConfigEntry.Gui.Tooltip() - public boolean enableShortcuts = true; - @ConfigEntry.Gui.Tooltip() - public boolean enableCommandShortcuts = true; - @ConfigEntry.Gui.Tooltip() - public boolean enableCommandArgShortcuts = true; - } - - public static class QuiverWarning { - public boolean enableQuiverWarning = true; - public boolean enableQuiverWarningInDungeons = true; - 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 class SkyblockerConfig { + private static final Path PATH = FabricLoader.getInstance().getConfigDir().resolve("skyblocker.json"); + private static final GsonConfigInstance<ConfigModel> INSTANCE = GsonConfigInstance.createBuilder(ConfigModel.class) + .setPath(PATH) + .overrideGsonBuilder(ConfigSerializer.INSTANCE) + .build(); + + public static ConfigModel get() { + return INSTANCE.getConfig(); + } + + /** + * 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!"); + } + + INSTANCE.load(); + ClientCommandRegistrationCallback.EVENT.register(((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal(SkyblockerMod.NAMESPACE).then(optionsLiteral("config")).then(optionsLiteral("options"))))); + } + + public static void save() { + INSTANCE.save(); + } + + public static Screen createGUI(Screen parent) { + return YetAnotherConfigLib.create(INSTANCE, (defaults, config, builder) -> { + return builder + .title(Text.literal("Skyblocker")) + .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..9f7d066b --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/DiscordRPCCategory.java @@ -0,0 +1,50 @@ +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.BooleanControllerBuilder; +import dev.isxander.yacl3.api.controller.StringControllerBuilder; +import me.xmrvizzy.skyblocker.config.ConfigModel; +import me.xmrvizzy.skyblocker.config.ConfigUtils; +import net.minecraft.text.Text; + +public class DiscordRPCCategory { + + public static ConfigCategory create(ConfigModel defaults, ConfigModel 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(BooleanControllerBuilder::create) + .build()) + .option(Option.<ConfigModel.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::createCyclingListController4Enum) + .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(BooleanControllerBuilder::create) + .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..e26bbae6 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/DungeonsCategory.java @@ -0,0 +1,316 @@ +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.BooleanControllerBuilder; +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.ConfigModel; +import me.xmrvizzy.skyblocker.config.ConfigModel.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(ConfigModel defaults, ConfigModel 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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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::createCyclingListController4Enum) + .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::createCyclingListController4Enum) + .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::createCyclingListController4Enum) + .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::createCyclingListController4Enum) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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..540a04e4 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/DwarvenMinesCategory.java @@ -0,0 +1,95 @@ +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.BooleanControllerBuilder; +import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder; +import me.xmrvizzy.skyblocker.config.ConfigModel; +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(ConfigModel defaults, ConfigModel 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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .build()) + .option(Option.<ConfigModel.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::createCyclingListController4Enum) + .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(BooleanControllerBuilder::create) + .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..aecf9374 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/GeneralCategory.java @@ -0,0 +1,478 @@ +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.BooleanControllerBuilder; +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.ConfigModel; +import me.xmrvizzy.skyblocker.config.ConfigUtils; +import me.xmrvizzy.skyblocker.skyblock.shortcut.ShortcutsConfigScreen; +import net.minecraft.client.MinecraftClient; +import net.minecraft.text.Text; + +public class GeneralCategory { + + public static ConfigCategory create(ConfigModel defaults, ConfigModel 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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .build()) + .option(Option.<ConfigModel.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::createCyclingListController4Enum) + .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(BooleanControllerBuilder::create) + .build()) + .option(Option.<ConfigModel.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::createCyclingListController4Enum) + .build()) + .option(Option.<ConfigModel.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::createCyclingListController4Enum) + .build()) + .option(Option.<ConfigModel.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::createCyclingListController4Enum) + .build()) + .option(Option.<ConfigModel.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::createCyclingListController4Enum) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .build()) + .option(Option.<ConfigModel.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::createCyclingListController4Enum) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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.<ConfigModel.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::createCyclingListController4Enum) + .build()) + .option(Option.<ConfigModel.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::createCyclingListController4Enum) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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..640bc5e6 --- /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.BooleanControllerBuilder; +import dev.isxander.yacl3.api.controller.IntegerSliderControllerBuilder; +import me.xmrvizzy.skyblocker.config.ConfigModel; +import net.minecraft.text.Text; + +public class LocationsCategory { + + public static ConfigCategory create(ConfigModel defaults, ConfigModel 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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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..d73a38ba --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/MessageFilterCategory.java @@ -0,0 +1,99 @@ +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.BooleanControllerBuilder; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.config.ConfigModel; +import me.xmrvizzy.skyblocker.config.ConfigUtils; +import net.minecraft.text.Text; + +public class MessageFilterCategory { + + public static ConfigCategory create(ConfigModel defaults, ConfigModel 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::createCyclingListController4Enum) + .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::createCyclingListController4Enum) + .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::createCyclingListController4Enum) + .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::createCyclingListController4Enum) + .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::createCyclingListController4Enum) + .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::createCyclingListController4Enum) + .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::createCyclingListController4Enum) + .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::createCyclingListController4Enum) + .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::createCyclingListController4Enum) + .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::createCyclingListController4Enum) + .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(BooleanControllerBuilder::create) + .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..831efa07 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/QuickNavigationCategory.java @@ -0,0 +1,596 @@ +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.BooleanControllerBuilder; +import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder; +import dev.isxander.yacl3.api.controller.StringControllerBuilder; +import me.xmrvizzy.skyblocker.config.ConfigModel; +import net.minecraft.text.Text; + +public class QuickNavigationCategory { + + public static ConfigCategory create(ConfigModel defaults, ConfigModel config) { + return ConfigCategory.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.category.quickNav")) + + //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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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..f7f1886b --- /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.BooleanControllerBuilder; +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.ConfigModel; +import net.minecraft.text.Text; + +public class SlayersCategory { + + public static ConfigCategory create(ConfigModel defaults, ConfigModel 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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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(BooleanControllerBuilder::create) + .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/skyblock/FairySouls.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java index fcd6be7a..1933184a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java @@ -7,6 +7,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.mojang.brigadier.CommandDispatcher; import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.config.ConfigModel; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.NEURepo; import me.xmrvizzy.skyblocker.utils.PosUtils; @@ -141,7 +142,7 @@ public class FairySouls { } private static void render(WorldRenderContext context) { - SkyblockerConfig.FairySouls fairySoulsConfig = SkyblockerConfig.get().general.fairySouls; + ConfigModel.FairySouls fairySoulsConfig = SkyblockerConfig.get().general.fairySouls; if (fairySoulsConfig.enableFairySoulsHelper && fairySoulsLoaded.isDone() && fairySouls.containsKey(Utils.getLocationRaw())) { for (BlockPos fairySoulPos : fairySouls.get(Utils.getLocationRaw())) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/HotbarSlotLock.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/HotbarSlotLock.java index e9b2bfa3..9f38fe35 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/HotbarSlotLock.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/HotbarSlotLock.java @@ -35,7 +35,7 @@ public class HotbarSlotLock { int selected = player.getInventory().selectedSlot; if (!isLocked(player.getInventory().selectedSlot)) lockedSlots.add(selected); else lockedSlots.remove(Integer.valueOf(selected)); - AutoConfig.getConfigHolder(SkyblockerConfig.class).save(); + SkyblockerConfig.save(); } } }
\ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfit.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfit.java index b223e1a2..f6fd5909 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfit.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfit.java @@ -2,6 +2,7 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; import com.google.gson.JsonObject; import it.unimi.dsi.fastutil.ints.IntBooleanPair; +import me.xmrvizzy.skyblocker.config.ConfigModel; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.mixin.accessor.ScreenAccessor; import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; @@ -158,7 +159,7 @@ public class DungeonChestProfit { } private static Text getProfitText(int profit, boolean hasIncompleteData) { - SkyblockerConfig.DungeonChestProfit config = SkyblockerConfig.get().locations.dungeons.dungeonChestProfit; + ConfigModel.DungeonChestProfit config = SkyblockerConfig.get().locations.dungeons.dungeonChestProfit; return getProfitText(profit, hasIncompleteData, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java index d4fe812b..9f4cc6b7 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java @@ -13,9 +13,15 @@ public class DungeonMapConfigScreen extends Screen { private int hudX = SkyblockerConfig.get().locations.dungeons.mapX; private int hudY = SkyblockerConfig.get().locations.dungeons.mapY; - + private final Screen parent; + protected DungeonMapConfigScreen() { + this(null); + } + + public DungeonMapConfigScreen(Screen parent) { super(Text.literal("Dungeon Map Config")); + this.parent = parent; } @Override @@ -51,7 +57,14 @@ public class DungeonMapConfigScreen extends Screen { public void close() { SkyblockerConfig.get().locations.dungeons.mapX = hudX; SkyblockerConfig.get().locations.dungeons.mapY = hudY; - AutoConfig.getConfigHolder(SkyblockerConfig.class).save(); + SkyblockerConfig.save(); + + if (parent != null) { + this.client.setScreen(parent); + + return; + } + super.close(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/SecretWaypoint.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/SecretWaypoint.java index 3fdd683c..13ea400a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/SecretWaypoint.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/SecretWaypoint.java @@ -1,6 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon.secrets; import com.google.gson.JsonObject; + +import me.xmrvizzy.skyblocker.config.ConfigModel; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.render.RenderHelper; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; @@ -91,10 +93,10 @@ public class SecretWaypoint { FAIRYSOUL(secretWaypoints -> secretWaypoints.enableFairySoulWaypoints, 255, 85, 255), STONK(secretWaypoints -> secretWaypoints.enableStonkWaypoints, 146, 52, 235), DEFAULT(secretWaypoints -> secretWaypoints.enableDefaultWaypoints, 190, 255, 252); - private final Predicate<SkyblockerConfig.SecretWaypoints> enabledPredicate; + private final Predicate<ConfigModel.SecretWaypoints> enabledPredicate; private final float[] colorComponents; - Category(Predicate<SkyblockerConfig.SecretWaypoints> enabledPredicate, int... intColorComponents) { + Category(Predicate<ConfigModel.SecretWaypoints> enabledPredicate, int... intColorComponents) { this.enabledPredicate = enabledPredicate; colorComponents = new float[intColorComponents.length]; for (int i = 0; i < intColorComponents.length; i++) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java index cde1b236..e8684540 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java @@ -19,9 +19,15 @@ public class DwarvenHudConfigScreen extends Screen { private int hudX = SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.x; private int hudY = SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.y; + private final Screen parent; protected DwarvenHudConfigScreen() { - super(Text.of("Dwarven HUD Config")); + this(null); + } + + public DwarvenHudConfigScreen(Screen parent) { + super(Text.of("Dwarven HUD Config")); + this.parent = parent; } @Override @@ -56,7 +62,14 @@ public class DwarvenHudConfigScreen extends Screen { public void close() { SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.x = hudX; SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.y = hudY; - AutoConfig.getConfigHolder(SkyblockerConfig.class).save(); + SkyblockerConfig.save(); + + if (parent != null) { + this.client.setScreen(parent); + + return; + } + super.close(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ChronomatronSolver.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ChronomatronSolver.java index d62383be..84ef5698 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ChronomatronSolver.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ChronomatronSolver.java @@ -1,6 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.experiment; import com.google.common.collect.ImmutableMap; + +import me.xmrvizzy.skyblocker.config.ConfigModel; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.render.gui.ColorHighlight; import net.minecraft.client.gui.screen.Screen; @@ -51,7 +53,7 @@ public class ChronomatronSolver extends ExperimentSolver { } @Override - protected boolean isEnabled(SkyblockerConfig.Experiments experimentsConfig) { + protected boolean isEnabled(ConfigModel.Experiments experimentsConfig) { return experimentsConfig.enableChronomatronSolver; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ExperimentSolver.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ExperimentSolver.java index d0e5522d..aaf25577 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ExperimentSolver.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ExperimentSolver.java @@ -1,5 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.experiment; +import me.xmrvizzy.skyblocker.config.ConfigModel; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.render.gui.ContainerSolver; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; @@ -39,7 +40,7 @@ public abstract class ExperimentSolver extends ContainerSolver { return isEnabled(SkyblockerConfig.get().general.experiments); } - protected abstract boolean isEnabled(SkyblockerConfig.Experiments experimentsConfig); + protected abstract boolean isEnabled(ConfigModel.Experiments experimentsConfig); @Override protected void start(GenericContainerScreen screen) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/SuperpairsSolver.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/SuperpairsSolver.java index f329a395..0ac15dfc 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/SuperpairsSolver.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/SuperpairsSolver.java @@ -1,5 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.experiment; +import me.xmrvizzy.skyblocker.config.ConfigModel; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.render.gui.ColorHighlight; import net.minecraft.client.gui.screen.Screen; @@ -27,7 +28,7 @@ public class SuperpairsSolver extends ExperimentSolver { } @Override - protected boolean isEnabled(SkyblockerConfig.Experiments experimentsConfig) { + protected boolean isEnabled(ConfigModel.Experiments experimentsConfig) { return experimentsConfig.enableSuperpairsSolver; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/UltrasequencerSolver.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/UltrasequencerSolver.java index d4d80ee6..6527231f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/UltrasequencerSolver.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/UltrasequencerSolver.java @@ -1,5 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.experiment; +import me.xmrvizzy.skyblocker.config.ConfigModel; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.render.gui.ColorHighlight; import net.minecraft.client.gui.screen.Screen; @@ -27,7 +28,7 @@ public class UltrasequencerSolver extends ExperimentSolver { } @Override - protected boolean isEnabled(SkyblockerConfig.Experiments experimentsConfig) { + protected boolean isEnabled(ConfigModel.Experiments experimentsConfig) { return experimentsConfig.enableUltrasequencerSolver; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomArmorTrims.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomArmorTrims.java index 6c648da9..97861e93 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomArmorTrims.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomArmorTrims.java @@ -3,6 +3,8 @@ package me.xmrvizzy.skyblocker.skyblock.item; import com.mojang.brigadier.Command; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.suggestion.SuggestionProvider; + +import dev.isxander.yacl3.config.ConfigEntry; import it.unimi.dsi.fastutil.Pair; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; @@ -138,7 +140,7 @@ public class CustomArmorTrims { return Command.SINGLE_SUCCESS; } - public record ArmorTrimId(Identifier material, Identifier pattern) implements Pair<Identifier, Identifier> { + public record ArmorTrimId(@ConfigEntry Identifier material, @ConfigEntry Identifier pattern) implements Pair<Identifier, Identifier> { @Override public Identifier left() { return material(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java index d20aa0e3..f04e7029 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java @@ -2,6 +2,8 @@ package me.xmrvizzy.skyblocker.skyblock.item; import com.google.gson.Gson; import com.google.gson.JsonObject; + +import me.xmrvizzy.skyblocker.config.ConfigModel; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.Http; import me.xmrvizzy.skyblocker.utils.Utils; @@ -146,10 +148,10 @@ public class PriceInfoTooltip { } if (!neuName.isEmpty() && lbinExist) { - SkyblockerConfig.Average type = SkyblockerConfig.get().general.itemTooltip.avg; + ConfigModel.Average type = SkyblockerConfig.get().general.itemTooltip.avg; // "No data" line because of API not keeping old data, it causes NullPointerException - if (type == SkyblockerConfig.Average.ONE_DAY || type == SkyblockerConfig.Average.BOTH) { + if (type == ConfigModel.Average.ONE_DAY || type == ConfigModel.Average.BOTH) { lines.add( Text.literal(String.format("%-19s", "1 Day Avg. Price:")) .formatted(Formatting.GOLD) @@ -159,7 +161,7 @@ public class PriceInfoTooltip { ) ); } - if (type == SkyblockerConfig.Average.THREE_DAY || type == SkyblockerConfig.Average.BOTH) { + if (type == ConfigModel.Average.THREE_DAY || type == ConfigModel.Average.BOTH) { lines.add( Text.literal(String.format("%-19s", "3 Day Avg. Price:")) .formatted(Formatting.GOLD) @@ -362,16 +364,16 @@ public class PriceInfoTooltip { List<CompletableFuture<Void>> futureList = new ArrayList<>(); if (SkyblockerConfig.get().general.itemTooltip.enableAvgBIN) { - SkyblockerConfig.Average type = SkyblockerConfig.get().general.itemTooltip.avg; + ConfigModel.Average type = SkyblockerConfig.get().general.itemTooltip.avg; - if (type == SkyblockerConfig.Average.BOTH || oneDayAvgPricesJson == null || threeDayAvgPricesJson == null || minute % 5 == 0) { + if (type == ConfigModel.Average.BOTH || oneDayAvgPricesJson == null || threeDayAvgPricesJson == null || minute % 5 == 0) { futureList.add(CompletableFuture.runAsync(() -> { oneDayAvgPricesJson = downloadPrices("1 day avg"); threeDayAvgPricesJson = downloadPrices("3 day avg"); })); - } else if (type == SkyblockerConfig.Average.ONE_DAY) { + } else if (type == ConfigModel.Average.ONE_DAY) { futureList.add(CompletableFuture.runAsync(() -> oneDayAvgPricesJson = downloadPrices("1 day avg"))); - } else if (type == SkyblockerConfig.Average.THREE_DAY) { + } else if (type == ConfigModel.Average.THREE_DAY) { futureList.add(CompletableFuture.runAsync(() -> threeDayAvgPricesJson = downloadPrices("3 day avg"))); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java index fb8f438b..833a6917 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java @@ -1,6 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.quicknav; import com.mojang.brigadier.exceptions.CommandSyntaxException; + +import me.xmrvizzy.skyblocker.config.ConfigModel; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; @@ -34,7 +36,7 @@ public class QuickNav { public static List<QuickNavButton> init(String screenTitle) { List<QuickNavButton> buttons = new ArrayList<>(); - SkyblockerConfig.QuickNav data = SkyblockerConfig.get().quickNav; + ConfigModel.QuickNav data = SkyblockerConfig.get().quickNav; try { if (data.button1.render) buttons.add(parseButton(data.button1, screenTitle, 0)); if (data.button2.render) buttons.add(parseButton(data.button2, screenTitle, 1)); @@ -54,8 +56,8 @@ public class QuickNav { return buttons; } - private static QuickNavButton parseButton(SkyblockerConfig.QuickNavItem buttonInfo, String screenTitle, int id) throws CommandSyntaxException { - SkyblockerConfig.ItemData itemData = buttonInfo.item; + private static QuickNavButton parseButton(ConfigModel.QuickNavItem buttonInfo, String screenTitle, int id) throws CommandSyntaxException { + ConfigModel.ItemData itemData = buttonInfo.item; String nbtString = "{id:\"minecraft:" + itemData.itemName.toLowerCase(Locale.ROOT) + "\",Count:1"; if (itemData.nbt.length() > 2) nbtString += "," + itemData.nbt; nbtString += "}"; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/ShortcutsConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/ShortcutsConfigScreen.java index dec23d36..043582c4 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/ShortcutsConfigScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/ShortcutsConfigScreen.java @@ -18,9 +18,15 @@ public class ShortcutsConfigScreen extends Screen { private ButtonWidget buttonDone; private boolean initialized; private double scrollAmount; - + private final Screen parent; + public ShortcutsConfigScreen() { + this(null); + } + + public ShortcutsConfigScreen(Screen parent) { super(Text.translatable("skyblocker.shortcuts.config")); + this.parent = parent; } @Override @@ -89,13 +95,15 @@ public class ShortcutsConfigScreen extends Screen { if (client != null && shortcutsConfigListWidget.hasChanges()) { client.setScreen(new ConfirmScreen(confirmedAction -> { if (confirmedAction) { - super.close(); + this.client.setScreen(parent); + if (parent == null) super.close(); } else { client.setScreen(this); } - }, Text.translatable("text.cloth-config.quit_config"), Text.translatable("text.cloth-config.quit_config_sure"), Text.translatable("text.cloth-config.quit_discard"), ScreenTexts.CANCEL)); + }, Text.translatable("text.skyblocker.quit_config"), Text.translatable("text.skyblocker.quit_config_sure"), Text.translatable("text.skyblocker.quit_discard"), ScreenTexts.CANCEL)); } else { - super.close(); + this.client.setScreen(parent); + if (parent == null) super.close(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/spidersden/Relics.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/spidersden/Relics.java index 12ce0715..dd420fcf 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/spidersden/Relics.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/spidersden/Relics.java @@ -6,6 +6,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.mojang.brigadier.CommandDispatcher; import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.config.ConfigModel; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.PosUtils; import me.xmrvizzy.skyblocker.utils.Utils; @@ -115,7 +116,7 @@ public class Relics { } private static void render(WorldRenderContext context) { - SkyblockerConfig.Relics config = SkyblockerConfig.get().locations.spidersDen.relics; + ConfigModel.Relics config = SkyblockerConfig.get().locations.spidersDen.relics; if (config.enableRelicsHelper && relicsLoaded.isDone() && Utils.getLocationRaw().equals("combat_1")) { for (BlockPos fairySoulPos : relics) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java index 31370dc6..068c9c5e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java @@ -1,5 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; +import me.xmrvizzy.skyblocker.config.ConfigModel; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; @@ -50,7 +51,7 @@ public class PlayerListWidget extends Widget { list.add(PlayerListMgr.getRaw(i)); } - if (SkyblockerConfig.get().general.tabHud.nameSorting == SkyblockerConfig.NameSorting.ALPHABETICAL) { + if (SkyblockerConfig.get().general.tabHud.nameSorting == ConfigModel.NameSorting.ALPHABETICAL) { list.sort(Comparator.comparing(o -> o.getProfile().getName().toLowerCase())); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/utils/discord/DiscordRPCManager.java index 58408944..5360741d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/discord/DiscordRPCManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/discord/DiscordRPCManager.java @@ -1,7 +1,6 @@ package me.xmrvizzy.skyblocker.utils.discord; -import me.shedaniel.autoconfig.AutoConfig; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.SkyblockEvents; import me.xmrvizzy.skyblocker.utils.Utils; @@ -41,7 +40,7 @@ public class DiscordRPCManager { // If the custom message is empty, discord will keep the last message, this is can serve as a default if the user doesn't want a custom message if (SkyblockerConfig.get().richPresence.customMessage.isEmpty()) { SkyblockerConfig.get().richPresence.customMessage = "Playing Skyblock"; - AutoConfig.getConfigHolder(SkyblockerConfig.class).save(); + SkyblockerConfig.save(); } if (SkyblockerConfig.get().richPresence.cycleMode) cycleCount = (cycleCount + 1) % 3; initAndUpdatePresence(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainer.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainer.java index 2555572c..5044b814 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainer.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainer.java @@ -1,5 +1,6 @@ package me.xmrvizzy.skyblocker.utils.render.title; +import me.xmrvizzy.skyblocker.config.ConfigModel; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler; import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; @@ -92,8 +93,8 @@ public class TitleContainer { float scale = 3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F); // Grab direction and alignment values - SkyblockerConfig.Direction direction = SkyblockerConfig.get().general.titleContainer.direction; - SkyblockerConfig.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment; + ConfigModel.Direction direction = SkyblockerConfig.get().general.titleContainer.direction; + ConfigModel.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment; // x/y refer to the starting position for the text // y always starts at yPos float x = 0; @@ -105,8 +106,8 @@ public class TitleContainer { width += textRenderer.getWidth(title.getText()) * scale + 10; } - if (alignment == SkyblockerConfig.Alignment.MIDDLE) { - if (direction == SkyblockerConfig.Direction.HORIZONTAL) { + if (alignment == ConfigModel.Alignment.MIDDLE) { + if (direction == ConfigModel.Direction.HORIZONTAL) { //If middle aligned horizontally, start the xPosition at half of the width to the left. x = xPos - (width / 2); } else { @@ -114,7 +115,7 @@ public class TitleContainer { x = xPos; } } - if (alignment == SkyblockerConfig.Alignment.LEFT || alignment == SkyblockerConfig.Alignment.RIGHT) { + if (alignment == ConfigModel.Alignment.LEFT || alignment == ConfigModel.Alignment.RIGHT) { //If left or right aligned, start at xPos, we will shift each text later x = xPos; } @@ -123,14 +124,14 @@ public class TitleContainer { //Calculate which x the text should use float xToUse; - if (direction == SkyblockerConfig.Direction.HORIZONTAL) { - xToUse = alignment == SkyblockerConfig.Alignment.RIGHT ? + if (direction == ConfigModel.Direction.HORIZONTAL) { + xToUse = alignment == ConfigModel.Alignment.RIGHT ? x - (textRenderer.getWidth(title.getText()) * scale) : //if right aligned we need the text position to be aligned on the right side. x; } else { - xToUse = alignment == SkyblockerConfig.Alignment.MIDDLE ? + xToUse = alignment == ConfigModel.Alignment.MIDDLE ? x - (textRenderer.getWidth(title.getText()) * scale) / 2 : //if middle aligned we need the text position to be aligned in the middle. - alignment == SkyblockerConfig.Alignment.RIGHT ? + alignment == ConfigModel.Alignment.RIGHT ? x - (textRenderer.getWidth(title.getText()) * scale) : //if right aligned we need the text position to be aligned on the right side. x; } @@ -155,13 +156,13 @@ public class TitleContainer { context.getMatrices().pop(); //Calculate the x and y positions for the next title - if (direction == SkyblockerConfig.Direction.HORIZONTAL) { - if (alignment == SkyblockerConfig.Alignment.MIDDLE || alignment == SkyblockerConfig.Alignment.LEFT) { + if (direction == ConfigModel.Direction.HORIZONTAL) { + if (alignment == ConfigModel.Alignment.MIDDLE || alignment == ConfigModel.Alignment.LEFT) { //Move to the right if middle or left aligned x += textRenderer.getWidth(title.getText()) * scale + 10; } - if (alignment == SkyblockerConfig.Alignment.RIGHT) { + if (alignment == ConfigModel.Alignment.RIGHT) { //Move to the left if right aligned x -= textRenderer.getWidth(title.getText()) * scale + 10; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java index 29f87961..bd5f19f2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java @@ -1,6 +1,7 @@ package me.xmrvizzy.skyblocker.utils.render.title; import me.shedaniel.autoconfig.AutoConfig; +import me.xmrvizzy.skyblocker.config.ConfigModel; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.render.RenderHelper; import net.minecraft.client.gui.DrawContext; @@ -30,8 +31,8 @@ public class TitleContainerConfigScreen extends Screen { super.render(context, mouseX, mouseY, delta); renderBackground(context, mouseX, mouseY, delta); TitleContainer.render(context, Set.of(example1, example2, example3), (int) hudX, (int) hudY, delta); - SkyblockerConfig.Direction direction = SkyblockerConfig.get().general.titleContainer.direction; - SkyblockerConfig.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment; + ConfigModel.Direction direction = SkyblockerConfig.get().general.titleContainer.direction; + ConfigModel.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment; context.drawCenteredTextWithShadow(textRenderer, "Press Q/E to change Alignment: " + alignment, width / 2, textRenderer.fontHeight * 2, Color.WHITE.getRGB()); context.drawCenteredTextWithShadow(textRenderer, "Press R to change Direction: " + direction, width / 2, textRenderer.fontHeight * 3 + 5, Color.WHITE.getRGB()); context.drawCenteredTextWithShadow(textRenderer, "Press +/- to change Scale", width / 2, textRenderer.fontHeight * 4 + 10, Color.WHITE.getRGB()); @@ -50,7 +51,7 @@ public class TitleContainerConfigScreen extends Screen { } private Pair<Vector2f, Vector2f> getSelectionBoundingBox() { - SkyblockerConfig.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment; + ConfigModel.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment; float midWidth = getSelectionWidth() / 2F; float x1 = 0; @@ -76,14 +77,14 @@ public class TitleContainerConfigScreen extends Screen { private float getSelectionHeight() { float scale = (3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F)); - return SkyblockerConfig.get().general.titleContainer.direction == SkyblockerConfig.Direction.HORIZONTAL ? + return SkyblockerConfig.get().general.titleContainer.direction == ConfigModel.Direction.HORIZONTAL ? (textRenderer.fontHeight * scale) : (textRenderer.fontHeight + 10F) * 3F * scale; } private float getSelectionWidth() { float scale = (3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F)); - return SkyblockerConfig.get().general.titleContainer.direction == SkyblockerConfig.Direction.HORIZONTAL ? + return SkyblockerConfig.get().general.titleContainer.direction == ConfigModel.Direction.HORIZONTAL ? (textRenderer.getWidth("Test1") + 10 + textRenderer.getWidth("Test23") + 10 + textRenderer.getWidth("Testing1234")) * scale : textRenderer.getWidth("Testing1234") * scale; } @@ -123,26 +124,26 @@ public class TitleContainerConfigScreen extends Screen { @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (keyCode == GLFW.GLFW_KEY_Q) { - SkyblockerConfig.Alignment current = SkyblockerConfig.get().general.titleContainer.alignment; + ConfigModel.Alignment current = SkyblockerConfig.get().general.titleContainer.alignment; SkyblockerConfig.get().general.titleContainer.alignment = switch (current) { - case LEFT -> SkyblockerConfig.Alignment.MIDDLE; - case MIDDLE -> SkyblockerConfig.Alignment.RIGHT; - case RIGHT -> SkyblockerConfig.Alignment.LEFT; + case LEFT -> ConfigModel.Alignment.MIDDLE; + case MIDDLE -> ConfigModel.Alignment.RIGHT; + case RIGHT -> ConfigModel.Alignment.LEFT; }; } if (keyCode == GLFW.GLFW_KEY_E) { - SkyblockerConfig.Alignment current = SkyblockerConfig.get().general.titleContainer.alignment; + ConfigModel.Alignment current = SkyblockerConfig.get().general.titleContainer.alignment; SkyblockerConfig.get().general.titleContainer.alignment = switch (current) { - case LEFT -> SkyblockerConfig.Alignment.RIGHT; - case MIDDLE -> SkyblockerConfig.Alignment.LEFT; - case RIGHT -> SkyblockerConfig.Alignment.MIDDLE; + case LEFT -> ConfigModel.Alignment.RIGHT; + case MIDDLE -> ConfigModel.Alignment.LEFT; + case RIGHT -> ConfigModel.Alignment.MIDDLE; }; } if (keyCode == GLFW.GLFW_KEY_R) { - SkyblockerConfig.Direction current = SkyblockerConfig.get().general.titleContainer.direction; + ConfigModel.Direction current = SkyblockerConfig.get().general.titleContainer.direction; SkyblockerConfig.get().general.titleContainer.direction = switch (current) { - case HORIZONTAL -> SkyblockerConfig.Direction.VERTICAL; - case VERTICAL -> SkyblockerConfig.Direction.HORIZONTAL; + case HORIZONTAL -> ConfigModel.Direction.VERTICAL; + case VERTICAL -> ConfigModel.Direction.HORIZONTAL; }; } if (keyCode == GLFW.GLFW_KEY_EQUAL) { @@ -158,7 +159,7 @@ public class TitleContainerConfigScreen extends Screen { public void close() { SkyblockerConfig.get().general.titleContainer.x = (int) hudX; SkyblockerConfig.get().general.titleContainer.y = (int) hudY; - AutoConfig.getConfigHolder(SkyblockerConfig.class).save(); + SkyblockerConfig.save(); super.close(); } } diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index e8ad7f59..7156bc62 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -5,6 +5,11 @@ "key.skyblocker.defaultTgl": "Switch tab HUD to default view", "key.skyblocker.toggleA": "Toggle tab HUD to screen A", "key.wikiLookup": "Wiki Lookup", + + "text.skyblocker.open": "Open", + "text.skyblocker.quit_config": "Changes Not Saved", + "text.skyblocker.quit_config_sure":"Are you sure you want to quit editing the config? Changes will not be saved!", + "text.skyblocker.quit_discard":"Quit & Discard Changes", "text.autoconfig.skyblocker.title": "Skyblocker Settings", @@ -40,10 +45,13 @@ "text.autoconfig.skyblocker.option.general.shortcuts.enableCommandShortcuts.@Tooltip": "Shortcuts for commands consisting of only one word. Edit shortcuts with \"/skyblocker shortcuts\". Shortcuts must be enabled for this to take effect.", "text.autoconfig.skyblocker.option.general.shortcuts.enableCommandArgShortcuts": "Enable Command Argument Shortcuts", "text.autoconfig.skyblocker.option.general.shortcuts.enableCommandArgShortcuts.@Tooltip": "Shortcuts that replace one or more word(s)/argument(s) of a command which has multiple words/arguments. Edit shortcuts with \"/skyblocker shortcuts\". Shortcuts must be enabled for this to take effect.", + "text.autoconfig.skyblocker.option.general.shortcuts.config": "Shortcuts Config...", "text.autoconfig.skyblocker.option.general.quiverWarning": "Quiver Warning", "text.autoconfig.skyblocker.option.general.quiverWarning.enableQuiverWarning": "Enable Quiver Warning", "text.autoconfig.skyblocker.option.general.quiverWarning.enableQuiverWarningInDungeons": "Enable Quiver Warning In Dungeons", "text.autoconfig.skyblocker.option.general.quiverWarning.enableQuiverWarningAfterDungeon": "Enable Quiver Warning After a Dungeon", + "text.autoconfig.skyblocker.option.general.quicknav": "Quicknav", + "text.autoconfig.skyblocker.option.general.quicknav.enableQuicknav": "Enable Quicknav", "text.autoconfig.skyblocker.option.general.backpackPreviewWithoutShift": "View backpack preview without holding Shift", "text.autoconfig.skyblocker.option.general.compactorDeletorPreview": "Enable Compactor/Deletor Preview", "text.autoconfig.skyblocker.option.general.tabHud": "Fancy tab HUD", @@ -246,6 +254,7 @@ "text.autoconfig.skyblocker.option.locations.dungeons.croesusHelper": "Croesus Helper", "text.autoconfig.skyblocker.option.locations.dungeons.croesusHelper.@Tooltip": "Gray out chests that have already been opened.", "text.autoconfig.skyblocker.option.locations.dungeons.enableMap": "Enable Map", + "text.autoconfig.skyblocker.option.locations.dungeons.mapScreen": "Dungeon Map Placement Config...", "text.autoconfig.skyblocker.option.locations.dungeons.mapScaling": "Map Scaling", "text.autoconfig.skyblocker.option.locations.dungeons.mapX": "Map X", "text.autoconfig.skyblocker.option.locations.dungeons.mapY": "Map Y", @@ -276,10 +285,11 @@ "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.style.@Tooltip[0]": "Simple: Shows name and percentage.", "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.style.@Tooltip[1]": "Fancy: Shows name, percentage, progress bar and an icon.", "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.style.@Tooltip[2]": "Classic: Shows name and percentage in a very simple box.", + "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.screen": "Dwarven HUD Config...", "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enableBackground": "Enable Background", "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.x": "X", "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.y": "Y", - + "text.autoconfig.skyblocker.option.locations.rift": "The Rift", "text.autoconfig.skyblocker.option.locations.rift.mirrorverseWaypoints": "Enable Mirrorverse Waypoints", "text.autoconfig.skyblocker.option.locations.rift.mcGrubberStacks": "McGrubber Stacks", diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 888e3374..5ccf35c3 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -38,7 +38,7 @@ "depends": { "fabricloader": ">=0.14.22", "fabric-api": ">=0.89.1+1.20.2", - "cloth-config2": "*", + "yet_another_config_lib_v3": ">=3.1.0+1.20", "minecraft": "~1.20.2" }, "conflicts": { diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfitTest.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfitTest.java index 7a130b5a..e375d3a0 100644 --- a/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfitTest.java +++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfitTest.java @@ -1,13 +1,13 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.config.ConfigModel; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; public class DungeonChestProfitTest { @Test void testProfitText() { - SkyblockerConfig.DungeonChestProfit config = new SkyblockerConfig.DungeonChestProfit(); + ConfigModel.DungeonChestProfit config = new ConfigModel.DungeonChestProfit(); Assertions.assertEquals("literal{ 0}[style={color=dark_gray}]", DungeonChestProfit.getProfitText(0, false, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting).toString()); Assertions.assertEquals("literal{ 0}[style={color=blue}]", DungeonChestProfit.getProfitText(0, true, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting).toString()); Assertions.assertEquals("literal{ +10}[style={color=dark_gray}]", DungeonChestProfit.getProfitText(10, false, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting).toString()); |