diff options
| author | Yasin <a.piri@hotmail.de> | 2023-10-09 12:58:02 +0200 |
|---|---|---|
| committer | Yasin <a.piri@hotmail.de> | 2023-10-09 12:58:02 +0200 |
| commit | bd3f0329d0e391bd84b5f9e3ff207d9dd9815853 (patch) | |
| tree | 2fd1d1ef625f57acc2e4916c967d8d2393844798 /src/main/java/de/hysky/skyblocker/config | |
| parent | 2315b90da8117f28f66348927afdb621ee4fc815 (diff) | |
| download | Skyblocker-bd3f0329d0e391bd84b5f9e3ff207d9dd9815853.tar.gz Skyblocker-bd3f0329d0e391bd84b5f9e3ff207d9dd9815853.tar.bz2 Skyblocker-bd3f0329d0e391bd84b5f9e3ff207d9dd9815853.zip | |
new pr because fixing merge conflict would take too long
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/config')
15 files changed, 2937 insertions, 0 deletions
diff --git a/src/main/java/de/hysky/skyblocker/config/ConfigUtils.java b/src/main/java/de/hysky/skyblocker/config/ConfigUtils.java new file mode 100644 index 00000000..9a7a41b5 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/config/ConfigUtils.java @@ -0,0 +1,25 @@ +package de.hysky.skyblocker.config; + +import dev.isxander.yacl3.api.Option; +import dev.isxander.yacl3.api.controller.BooleanControllerBuilder; +import dev.isxander.yacl3.api.controller.EnumControllerBuilder; +import dev.isxander.yacl3.api.controller.ValueFormatter; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import org.apache.commons.lang3.StringUtils; + +import java.util.function.Function; + +public class ConfigUtils { + public static final Function<Formatting, String> FORMATTING_TO_STRING = formatting -> StringUtils.capitalize(formatting.getName().replaceAll("_", " ")); + public static final ValueFormatter<Float> FLOAT_TWO_FORMATTER = value -> Text.literal(String.format("%,.2f", value).replaceAll("[\u00a0\u202F]", " ")); + + public static BooleanControllerBuilder createBooleanController(Option<Boolean> opt) { + return BooleanControllerBuilder.create(opt).yesNoFormatter().coloured(true); + } + + @SuppressWarnings("unchecked") + public static <E extends Enum<E>> EnumControllerBuilder<E> createEnumCyclingListController(Option<E> opt) { + return EnumControllerBuilder.create(opt).enumClass((Class<E>) opt.binding().defaultValue().getClass()); + } +} diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java new file mode 100644 index 00000000..cb51afdc --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java @@ -0,0 +1,787 @@ +package de.hysky.skyblocker.config; + +import dev.isxander.yacl3.config.v2.api.SerialEntry; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import de.hysky.skyblocker.skyblock.item.CustomArmorTrims; +import de.hysky.skyblocker.utils.chat.ChatFilterResult; +import net.minecraft.client.resource.language.I18n; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.ArrayList; +import java.util.List; + +public class SkyblockerConfig { + @SerialEntry + public int version = 1; + + @SerialEntry + public General general = new General(); + + @SerialEntry + public Locations locations = new Locations(); + + @SerialEntry + public Slayer slayer = new Slayer(); + + @SerialEntry + public QuickNav quickNav = new QuickNav(); + + @SerialEntry + public Messages messages = new Messages(); + + @SerialEntry + public RichPresence richPresence = new RichPresence(); + + public static class QuickNav { + @SerialEntry + public boolean enableQuickNav = true; + + @SerialEntry + public QuickNavItem button1 = new QuickNavItem(true, new ItemData("diamond_sword"), "Your Skills", "/skills"); + + @SerialEntry + 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)" + */ + @SerialEntry + public QuickNavItem button3 = new QuickNavItem(true, new ItemData("bone"), "Pets(:? \\(\\d+\\/\\d+\\))?", "/pets"); + + /* REGEX Explanation + * "Wardrobe" : simple match on letters + * " \\([12]\\/2\\)" : match on the page either " (1/2)" or " (2/2)" + */ + @SerialEntry + public QuickNavItem button4 = new QuickNavItem(true, + new ItemData("leather_chestplate", 1, "tag:{display:{color:8991416}}"), "Wardrobe \\([12]/2\\)", + "/wardrobe"); + + @SerialEntry + public QuickNavItem button5 = new QuickNavItem(true, new ItemData("player_head", 1, + "tag:{SkullOwner:{Id:[I;-2081424676,-57521078,-2073572414,158072763],Properties:{textures:[{Value:\"ewogICJ0aW1lc3RhbXAiIDogMTU5MTMxMDU4NTYwOSwKICAicHJvZmlsZUlkIiA6ICI0MWQzYWJjMmQ3NDk0MDBjOTA5MGQ1NDM0ZDAzODMxYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNZWdha2xvb24iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODBhMDc3ZTI0OGQxNDI3NzJlYTgwMDg2NGY4YzU3OGI5ZDM2ODg1YjI5ZGFmODM2YjY0YTcwNjg4MmI2ZWMxMCIKICAgIH0KICB9Cn0=\"}]}}}"), + "Sack of Sacks", "/sacks"); + + /* REGEX Explanation + * "(?:Rift )?" : optional match on the non-capturing group "Rift " + * "Storage" : simple match on letters + * "(?: \\([12]\\/2\\))?" : optional match on the non-capturing group " (1/2)" or " (2/2)" + */ + @SerialEntry + public QuickNavItem button6 = new QuickNavItem(true, new ItemData("ender_chest"), + "(?:Rift )?Storage(?: \\(1/2\\))?", "/storage"); + + @SerialEntry + public QuickNavItem button7 = new QuickNavItem(true, new ItemData("player_head", 1, + "tag:{SkullOwner:{Id:[I;-300151517,-631415889,-1193921967,-1821784279],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDdjYzY2ODc0MjNkMDU3MGQ1NTZhYzUzZTA2NzZjYjU2M2JiZGQ5NzE3Y2Q4MjY5YmRlYmVkNmY2ZDRlN2JmOCJ9fX0=\"}]}}}"), + "none", "/hub"); + + @SerialEntry + public QuickNavItem button8 = new QuickNavItem(true, new ItemData("player_head", 1, + "tag:{SkullOwner:{Id:[I;1605800870,415127827,-1236127084,15358548],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzg5MWQ1YjI3M2ZmMGJjNTBjOTYwYjJjZDg2ZWVmMWM0MGExYjk0MDMyYWU3MWU3NTQ3NWE1NjhhODI1NzQyMSJ9fX0=\"}]}}}"), + "none", "/warp dungeon_hub"); + + @SerialEntry + public QuickNavItem button9 = new QuickNavItem(true, new ItemData("player_head", 1, + "tag:{SkullOwner:{Id:[I;-562285948,532499670,-1705302742,775653035],Properties:{textures:[{Value:\"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjVkZjU1NTkyNjQzMGQ1ZDc1YWRlZDIxZGQ5NjE5Yjc2YzViN2NhMmM3ZjU0MDE0NDA1MjNkNTNhOGJjZmFhYiJ9fX0=\"}]}}}"), + "Visit prtl", "/visit prtl"); + + @SerialEntry + public QuickNavItem button10 = new QuickNavItem(true, new ItemData("enchanting_table"), "Enchant Item", + "/etable"); + + @SerialEntry + public QuickNavItem button11 = new QuickNavItem(true, new ItemData("anvil"), "Anvil", "/anvil"); + + @SerialEntry + public QuickNavItem button12 = new QuickNavItem(true, new ItemData("crafting_table"), "Craft Item", "/craft"); + } + + public static class QuickNavItem { + public QuickNavItem(Boolean render, ItemData itemData, String uiTitle, String clickEvent) { + this.render = render; + this.item = itemData; + this.clickEvent = clickEvent; + this.uiTitle = uiTitle; + } + + @SerialEntry + public Boolean render; + + @SerialEntry + public ItemData item; + + @SerialEntry + public String uiTitle; + + @SerialEntry + public String clickEvent; + } + + public static class ItemData { + public ItemData(String itemName, int count, String nbt) { + this.itemName = itemName; + this.count = count; + this.nbt = nbt; + } + + public ItemData(String itemName) { + this.itemName = itemName; + this.count = 1; + this.nbt = ""; + } + + @SerialEntry + public String itemName; + + @SerialEntry + public int count; + + @SerialEntry + public String nbt; + } + + public static class General { + @SerialEntry + public boolean acceptReparty = true; + + @SerialEntry + public boolean backpackPreviewWithoutShift = false; + + @SerialEntry + public boolean compactorDeletorPreview = true; + + @SerialEntry + public boolean hideEmptyTooltips = true; + + @SerialEntry + public boolean hideStatusEffectOverlay = false; + + @SerialEntry + public TabHudConf tabHud = new TabHudConf(); + + @SerialEntry + public Bars bars = new Bars(); + + @SerialEntry + public Experiments experiments = new Experiments(); + + @SerialEntry + public Fishing fishing = new Fishing(); + + @SerialEntry + public FairySouls fairySouls = new FairySouls(); + + @SerialEntry + public ItemCooldown itemCooldown = new ItemCooldown(); + + @SerialEntry + public Shortcuts shortcuts = new Shortcuts(); + + @SerialEntry + public QuiverWarning quiverWarning = new QuiverWarning(); + + @SerialEntry + public ItemList itemList = new ItemList(); + + @SerialEntry + public ItemTooltip itemTooltip = new ItemTooltip(); + + @SerialEntry + public ItemInfoDisplay itemInfoDisplay = new ItemInfoDisplay(); + + @SerialEntry + public SpecialEffects specialEffects = new SpecialEffects(); + + @SerialEntry + public Hitbox hitbox = new Hitbox(); + + @SerialEntry + public TitleContainer titleContainer = new TitleContainer(); + + @SerialEntry + public TeleportOverlay teleportOverlay = new TeleportOverlay(); + + @SerialEntry + public List<Integer> lockedSlots = new ArrayList<>(); + + @SerialEntry + public ObjectOpenHashSet<String> protectedItems = new ObjectOpenHashSet<>(); + + @SerialEntry + public Object2ObjectOpenHashMap<String, Text> customItemNames = new Object2ObjectOpenHashMap<>(); + + @SerialEntry + public Object2IntOpenHashMap<String> customDyeColors = new Object2IntOpenHashMap<>(); + + @SerialEntry + public Object2ObjectOpenHashMap<String, CustomArmorTrims.ArmorTrimId> customArmorTrims = new Object2ObjectOpenHashMap<>(); + } + + public static class TabHudConf { + @SerialEntry + public boolean tabHudEnabled = true; + + @SerialEntry + public int tabHudScale = 100; + + @SerialEntry + public boolean plainPlayerNames = false; + + @SerialEntry + public NameSorting nameSorting = NameSorting.DEFAULT; + } + + public enum NameSorting { + DEFAULT, ALPHABETICAL; + + @Override + public String toString() { + return switch (this) { + case DEFAULT -> "Default"; + case ALPHABETICAL -> "Alphabetical"; + }; + } + } + + public static class Bars { + @SerialEntry + public boolean enableBars = true; + + @SerialEntry + public BarPositions barPositions = new BarPositions(); + } + + public static class BarPositions { + @SerialEntry + public BarPosition healthBarPosition = BarPosition.LAYER1; + + @SerialEntry + public BarPosition manaBarPosition = BarPosition.LAYER1; + + @SerialEntry + public BarPosition defenceBarPosition = BarPosition.LAYER1; + + @SerialEntry + public BarPosition experienceBarPosition = BarPosition.LAYER1; + + } + + public enum BarPosition { + LAYER1, LAYER2, RIGHT, NONE; + + @Override + public String toString() { + return I18n.translate("text.autoconfig.skyblocker.option.general.bars.barpositions." + name()); + } + + public int toInt() { + return switch (this) { + case LAYER1 -> 0; + case LAYER2 -> 1; + case RIGHT -> 2; + case NONE -> -1; + }; + } + } + + public static class Experiments { + @SerialEntry + public boolean enableChronomatronSolver = true; + + @SerialEntry + public boolean enableSuperpairsSolver = true; + + @SerialEntry + public boolean enableUltrasequencerSolver = true; + } + + public static class Fishing { + @SerialEntry + public boolean enableFishingHelper = true; + } + + public static class FairySouls { + @SerialEntry + public boolean enableFairySoulsHelper = false; + + @SerialEntry + public boolean highlightFoundSouls = true; + + @SerialEntry + public boolean highlightOnlyNearbySouls = false; + } + + public static class ItemCooldown { + @SerialEntry + public boolean enableItemCooldowns = true; + } + + public static class Shortcuts { + @SerialEntry + public boolean enableShortcuts = true; + + @SerialEntry + public boolean enableCommandShortcuts = true; + + @SerialEntry + public boolean enableCommandArgShortcuts = true; + } + + public static class QuiverWarning { + @SerialEntry + public boolean enableQuiverWarning = true; + + @SerialEntry + public boolean enableQuiverWarningInDungeons = true; + + @SerialEntry + public boolean enableQuiverWarningAfterDungeon = true; + } + + public static class Hitbox { + @SerialEntry + public boolean oldFarmlandHitbox = true; + + @SerialEntry + public boolean oldLeverHitbox = false; + } + + public static class TitleContainer { + @SerialEntry + public float titleContainerScale = 100; + + @SerialEntry + public int x = 540; + + @SerialEntry + public int y = 10; + + @SerialEntry + public Direction direction = Direction.HORIZONTAL; + + @SerialEntry + public Alignment alignment = Alignment.MIDDLE; + } + + public static class TeleportOverlay { + @SerialEntry + public boolean enableTeleportOverlays = true; + + @SerialEntry + public boolean enableWeirdTransmission = true; + + @SerialEntry + public boolean enableInstantTransmission = true; + + @SerialEntry + public boolean enableEtherTransmission = true; + + @SerialEntry + public boolean enableSinrecallTransmission = true; + + @SerialEntry + public boolean enableWitherImpact = true; + } + + public enum Direction { + HORIZONTAL, VERTICAL; + + @Override + public String toString() { + return switch (this) { + case HORIZONTAL -> "Horizontal"; + case VERTICAL -> "Vertical"; + }; + } + } + + public enum Alignment { + LEFT, RIGHT, MIDDLE; + + @Override + public String toString() { + return switch (this) { + case LEFT -> "Left"; + case RIGHT -> "Right"; + case MIDDLE -> "Middle"; + }; + } + } + + public static class RichPresence { + @SerialEntry + public boolean enableRichPresence = false; + + @SerialEntry + public Info info = Info.LOCATION; + + @SerialEntry + public boolean cycleMode = false; + + @SerialEntry + public String customMessage = "Playing Skyblock"; + } + + public static class ItemList { + @SerialEntry + public boolean enableItemList = true; + } + + public enum Average { + ONE_DAY, THREE_DAY, BOTH; + + @Override + public String toString() { + return I18n.translate("text.autoconfig.skyblocker.option.general.itemTooltip.avg." + name()); + } + } + + public static class ItemTooltip { + @SerialEntry + public boolean enableNPCPrice = true; + + @SerialEntry + public boolean enableMotesPrice = true; + + @SerialEntry + public boolean enableAvgBIN = true; + + @SerialEntry + public Average avg = Average.THREE_DAY; + + @SerialEntry + public boolean enableLowestBIN = true; + + @SerialEntry + public boolean enableBazaarPrice = true; + + @SerialEntry + public boolean enableMuseumDate = true; + } + + public static class ItemInfoDisplay { + @SerialEntry + public boolean attributeShardInfo = true; + + @SerialEntry + public boolean itemRarityBackgrounds = false; + + @SerialEntry + public float itemRarityBackgroundsOpacity = 1f; + } + + public static class SpecialEffects { + @SerialEntry + public boolean rareDungeonDropEffects = true; + } + + public static class Locations { + @SerialEntry + public Barn barn = new Barn(); + + @SerialEntry + public Dungeons dungeons = new Dungeons(); + + @SerialEntry + public DwarvenMines dwarvenMines = new DwarvenMines(); + + @SerialEntry + public Rift rift = new Rift(); + + @SerialEntry + public SpidersDen spidersDen = new SpidersDen(); + } + + public static class Dungeons { + @SerialEntry + public SecretWaypoints secretWaypoints = new SecretWaypoints(); + + @SerialEntry + public DungeonChestProfit dungeonChestProfit = new DungeonChestProfit(); + + @SerialEntry + public boolean croesusHelper = true; + + @SerialEntry + public boolean enableMap = true; + + @SerialEntry + public float mapScaling = 1f; + + @SerialEntry + public int mapX = 2; + + @SerialEntry + public int mapY = 2; + + @SerialEntry + public boolean starredMobGlow = true; + + @SerialEntry + public boolean solveThreeWeirdos = true; + + @SerialEntry + public boolean blazesolver = true; + + @SerialEntry + public boolean solveTrivia = true; + + @SerialEntry + public boolean solveTicTacToe = true; + + @SerialEntry + public LividColor lividColor = new LividColor(); + + @SerialEntry + public Terminals terminals = new Terminals(); + } + + public static class SecretWaypoints { + @SerialEntry + public boolean enableSecretWaypoints = true; + + @SerialEntry + public boolean noInitSecretWaypoints = false; + + @SerialEntry + public boolean enableEntranceWaypoints = true; + + @SerialEntry + public boolean enableSuperboomWaypoints = true; + + @SerialEntry + public boolean enableChestWaypoints = true; + + @SerialEntry + public boolean enableItemWaypoints = true; + + @SerialEntry + public boolean enableBatWaypoints = true; + + @SerialEntry + public boolean enableWitherWaypoints = true; + + @SerialEntry + public boolean enableLeverWaypoints = true; + + @SerialEntry + public boolean enableFairySoulWaypoints = true; + + @SerialEntry + public boolean enableStonkWaypoints = true; + + @SerialEntry + public boolean enableDefaultWaypoints = true; + } + + public static class DungeonChestProfit { + @SerialEntry + public boolean enableProfitCalculator = true; + + @SerialEntry + public boolean includeKismet = false; + + @SerialEntry + public boolean includeEssence = true; + + @SerialEntry + public int neutralThreshold = 1000; + + @SerialEntry + public Formatting neutralColor = Formatting.DARK_GRAY; + + @SerialEntry + public Formatting profitColor = Formatting.DARK_GREEN; + + @SerialEntry + public Formatting lossColor = Formatting.RED; + + @SerialEntry + public Formatting incompleteColor = Formatting.BLUE; + + } + + public static class LividColor { + @SerialEntry + public boolean enableLividColor = true; + + @SerialEntry + public String lividColorText = "The livid color is [color]"; + } + + public static class Terminals { + @SerialEntry + public boolean solveColor = true; + + @SerialEntry + public boolean solveOrder = true; + + @SerialEntry + public boolean solveStartsWith = true; + } + + public static class DwarvenMines { + @SerialEntry + public boolean enableDrillFuel = true; + + @SerialEntry + public boolean solveFetchur = true; + + @SerialEntry + public boolean solvePuzzler = true; + + @SerialEntry + public DwarvenHud dwarvenHud = new DwarvenHud(); + } + + public static class DwarvenHud { + @SerialEntry + public boolean enabled = true; + + @SerialEntry + public DwarvenHudStyle style = DwarvenHudStyle.SIMPLE; + + @SerialEntry + public boolean enableBackground = true; + + @SerialEntry + public int x = 10; + + @SerialEntry + public int y = 10; + } + + public enum DwarvenHudStyle { + SIMPLE, FANCY, CLASSIC; + + @Override + public String toString() { + return switch (this) { + case SIMPLE -> "Simple"; + case FANCY -> "Fancy"; + case CLASSIC -> "Classic"; + }; + } + } + + public static class Barn { + @SerialEntry + public boolean solveHungryHiker = true; + + @SerialEntry + public boolean solveTreasureHunter = true; + } + + public static class Rift { + @SerialEntry + public boolean mirrorverseWaypoints = true; + + @SerialEntry + public int mcGrubberStacks = 0; + } + + public static class SpidersDen { + @SerialEntry + public Relics relics = new Relics(); + } + + public static class Relics { + @SerialEntry + public boolean enableRelicsHelper = false; + + @SerialEntry + public boolean highlightFoundRelics = true; + } + + public static class Slayer { + @SerialEntry + public VampireSlayer vampireSlayer = new VampireSlayer(); + } + + public static class VampireSlayer { + @SerialEntry + public boolean enableEffigyWaypoints = true; + + @SerialEntry + public boolean compactEffigyWaypoints; + + @SerialEntry + public int effigyUpdateFrequency = 5; + + @SerialEntry + public boolean enableHolyIceIndicator = true; + + @SerialEntry + public int holyIceIndicatorTickDelay = 10; + + @SerialEntry + public int holyIceUpdateFrequency = 5; + + @SerialEntry + public boolean enableHealingMelonIndicator = true; + + @SerialEntry + public float healingMelonHealthThreshold = 4f; + + @SerialEntry + public boolean enableSteakStakeIndicator = true; + + @SerialEntry + public int steakStakeUpdateFrequency = 5; + + @SerialEntry + public boolean enableManiaIndicator = true; + + @SerialEntry + public int maniaUpdateFrequency = 5; + } + + public static class Messages { + @SerialEntry + public ChatFilterResult hideAbility = ChatFilterResult.PASS; + + @SerialEntry + public ChatFilterResult hideHeal = ChatFilterResult.PASS; + + @SerialEntry + public ChatFilterResult hideAOTE = ChatFilterResult.PASS; + + @SerialEntry + public ChatFilterResult hideImplosion = ChatFilterResult.PASS; + + @SerialEntry + public ChatFilterResult hideMoltenWave = ChatFilterResult.PASS; + + @SerialEntry + public ChatFilterResult hideAds = ChatFilterResult.PASS; + + @SerialEntry + public ChatFilterResult hideTeleportPad = ChatFilterResult.PASS; + + @SerialEntry + public ChatFilterResult hideCombo = ChatFilterResult.PASS; + + @SerialEntry + public ChatFilterResult hideAutopet = ChatFilterResult.PASS; + + @SerialEntry + public ChatFilterResult hideShowOff = ChatFilterResult.PASS; + + @SerialEntry + public boolean hideMana = false; + } + + public enum Info { + PURSE, BITS, LOCATION; + + @Override + public String toString() { + return I18n.translate("text.autoconfig.skyblocker.option.richPresence.info." + name()); + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java new file mode 100644 index 00000000..98c83975 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java @@ -0,0 +1,86 @@ +package de.hysky.skyblocker.config; + +import java.lang.StackWalker.Option; +import java.nio.file.Path; + +import com.google.gson.FieldNamingPolicy; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; + +import de.hysky.skyblocker.SkyblockerMod; +import dev.isxander.yacl3.api.YetAnotherConfigLib; +import dev.isxander.yacl3.config.v2.api.ConfigClassHandler; +import dev.isxander.yacl3.config.v2.api.serializer.GsonConfigSerializerBuilder; +import de.hysky.skyblocker.config.categories.DiscordRPCCategory; +import de.hysky.skyblocker.config.categories.DungeonsCategory; +import de.hysky.skyblocker.config.categories.DwarvenMinesCategory; +import de.hysky.skyblocker.config.categories.GeneralCategory; +import de.hysky.skyblocker.config.categories.LocationsCategory; +import de.hysky.skyblocker.config.categories.MessageFilterCategory; +import de.hysky.skyblocker.config.categories.QuickNavigationCategory; +import de.hysky.skyblocker.config.categories.SlayersCategory; +import de.hysky.skyblocker.utils.scheduler.Scheduler; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +public class SkyblockerConfigManager { + private static final Path PATH = FabricLoader.getInstance().getConfigDir().resolve("skyblocker.json"); + private static final ConfigClassHandler<SkyblockerConfig> HANDLER = ConfigClassHandler.createBuilder(SkyblockerConfig.class) + .serializer(config -> GsonConfigSerializerBuilder.create(config) + .setPath(PATH) + .setJson5(false) + .appendGsonBuilder(builder -> builder + .setFieldNamingPolicy(FieldNamingPolicy.IDENTITY) + .registerTypeHierarchyAdapter(Identifier.class, new Identifier.Serializer())) + .build()) + .build(); + + public static SkyblockerConfig get() { + return HANDLER.instance(); + } + + /** + * This method is caller sensitive and can only be called by the mod initializer, + * this is enforced. + */ + public static void init() { + if (StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE).getCallerClass() != SkyblockerMod.class) { + throw new RuntimeException("Skyblocker: Called config init from an illegal place!"); + } + + HANDLER.load(); + ClientCommandRegistrationCallback.EVENT.register(((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal(SkyblockerMod.NAMESPACE).then(optionsLiteral("config")).then(optionsLiteral("options"))))); + } + + public static void save() { + HANDLER.save(); + } + + public static Screen createGUI(Screen parent) { + return YetAnotherConfigLib.create(HANDLER, (defaults, config, builder) -> builder + .title(Text.translatable("text.autoconfig.skyblocker.title")) + .category(GeneralCategory.create(defaults, config)) + .category(DungeonsCategory.create(defaults, config)) + .category(DwarvenMinesCategory.create(defaults, config)) + .category(LocationsCategory.create(defaults, config)) + .category(SlayersCategory.create(defaults, config)) + .category(QuickNavigationCategory.create(defaults, config)) + .category(MessageFilterCategory.create(defaults, config)) + .category(DiscordRPCCategory.create(defaults, config))).generateScreen(parent); + } + + /** + * Registers an options command with the given name. Used for registering both options and config as valid commands. + * + * @param name the name of the command node + * @return the command builder + */ + private static LiteralArgumentBuilder<FabricClientCommandSource> optionsLiteral(String name) { + // Don't immediately open the next screen as it will be closed by ChatScreen right after this command is executed + return ClientCommandManager.literal(name).executes(Scheduler.queueOpenScreenCommand(() -> createGUI(null))); + } +} diff --git a/src/main/java/de/hysky/skyblocker/config/categories/DiscordRPCCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/DiscordRPCCategory.java new file mode 100644 index 00000000..fcdc3d8d --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/config/categories/DiscordRPCCategory.java @@ -0,0 +1,49 @@ +package de.hysky.skyblocker.config.categories; + +import de.hysky.skyblocker.config.ConfigUtils; +import de.hysky.skyblocker.config.SkyblockerConfig; +import dev.isxander.yacl3.api.ConfigCategory; +import dev.isxander.yacl3.api.Option; +import dev.isxander.yacl3.api.OptionDescription; +import dev.isxander.yacl3.api.controller.StringControllerBuilder; +import net.minecraft.text.Text; + +public class DiscordRPCCategory { + + public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) { + return ConfigCategory.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.category.richPresence")) + + //Uncategorized Options + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.richPresence.enableRichPresence")) + .binding(defaults.richPresence.enableRichPresence, + () -> config.richPresence.enableRichPresence, + newValue -> config.richPresence.enableRichPresence = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<SkyblockerConfig.Info>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.richPresence.info")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.richPresence.info.@Tooltip"))) + .binding(defaults.richPresence.info, + () -> config.richPresence.info, + newValue -> config.richPresence.info = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.richPresence.cycleMode")) + .binding(defaults.richPresence.cycleMode, + () -> config.richPresence.cycleMode, + newValue -> config.richPresence.cycleMode = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<String>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.richPresence.customMessage")) + .bindi |
