From 71a6b08b376be7d742107df982905cac0d7ecf70 Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Tue, 29 Aug 2023 20:25:01 +0200 Subject: Add default option selector #400 * Allow for update only options * Clean/Split up mass configuration options * Merge remote-tracking branch 'origin/beta' into feat/defaultoptions * Fix merge errors --- src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt | 2 + .../at/hannibal2/skyhanni/config/FeatureToggle.kt | 15 ++ .../java/at/hannibal2/skyhanni/config/Storage.java | 6 + .../hannibal2/skyhanni/config/commands/Commands.kt | 26 ++- .../skyhanni/config/commands/SimpleCommand.java | 4 +- .../skyhanni/config/features/AshfangConfig.java | 9 + .../skyhanni/config/features/BazaarConfig.java | 5 + .../skyhanni/config/features/BingoConfig.java | 6 + .../skyhanni/config/features/ChatConfig.java | 27 +++ .../skyhanni/config/features/CommandsConfig.java | 4 + .../config/features/DamageIndicatorConfig.java | 2 + .../skyhanni/config/features/DianaConfig.java | 5 + .../skyhanni/config/features/DungeonConfig.java | 20 +++ .../skyhanni/config/features/FishingConfig.java | 2 + .../massconfiguration/DefaultConfigFeatures.kt | 112 ++++++++++++ .../massconfiguration/DefaultConfigOptionGui.kt | 193 +++++++++++++++++++++ .../massconfiguration/FeatureToggleProcessor.kt | 70 ++++++++ 17 files changed, 504 insertions(+), 4 deletions(-) create mode 100644 src/main/java/at/hannibal2/skyhanni/config/FeatureToggle.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/misc/massconfiguration/DefaultConfigFeatures.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/misc/massconfiguration/DefaultConfigOptionGui.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/misc/massconfiguration/FeatureToggleProcessor.kt (limited to 'src/main/java/at/hannibal2/skyhanni') diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt index 2c58985e8..6d60ebca7 100644 --- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt +++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt @@ -7,6 +7,7 @@ import at.hannibal2.skyhanni.config.commands.Commands.init import at.hannibal2.skyhanni.data.* import at.hannibal2.skyhanni.data.repo.RepoManager import at.hannibal2.skyhanni.events.LorenzTickEvent +import at.hannibal2.skyhanni.features.misc.massconfiguration.DefaultConfigFeatures import at.hannibal2.skyhanni.features.anvil.AnvilCombineHelper import at.hannibal2.skyhanni.features.bazaar.BazaarApi import at.hannibal2.skyhanni.features.bazaar.BazaarBestSellMethod @@ -168,6 +169,7 @@ class SkyHanniMod { loadModule(ProfileStorageData) loadModule(TitleData()) loadModule(BlockData()) + loadModule(DefaultConfigFeatures) // APIs loadModule(BazaarApi()) diff --git a/src/main/java/at/hannibal2/skyhanni/config/FeatureToggle.kt b/src/main/java/at/hannibal2/skyhanni/config/FeatureToggle.kt new file mode 100644 index 000000000..bf9db0553 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/config/FeatureToggle.kt @@ -0,0 +1,15 @@ +package at.hannibal2.skyhanni.config + +import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean + +/** + * Annotate a [ConfigEditorBoolean] to indicate that it is a feature toggle. + */ +@Retention(AnnotationRetention.RUNTIME) +@Target(AnnotationTarget.FIELD) +annotation class FeatureToggle( + /** + * Indicate that this field being true means the corresponding feature is enabled. + */ + val trueIsEnabled: Boolean = true, +) diff --git a/src/main/java/at/hannibal2/skyhanni/config/Storage.java b/src/main/java/at/hannibal2/skyhanni/config/Storage.java index a2af0ed79..f32c66220 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/Storage.java +++ b/src/main/java/at/hannibal2/skyhanni/config/Storage.java @@ -20,6 +20,12 @@ import java.util.*; public class Storage { + @Expose + public boolean hasPlayedBefore = false; + + @Expose + public Map> knownFeatureToggles = new HashMap<>(); + @Expose public Map> gardenJacobFarmingContestTimes = new HashMap<>(); diff --git a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt index b87961a2c..73b6cb46d 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt @@ -27,6 +27,7 @@ import at.hannibal2.skyhanni.features.misc.CollectionTracker import at.hannibal2.skyhanni.features.misc.MarkedPlayerManager import at.hannibal2.skyhanni.features.misc.discordrpc.DiscordRPCManager import at.hannibal2.skyhanni.features.misc.ghostcounter.GhostUtil +import at.hannibal2.skyhanni.features.misc.massconfiguration.DefaultConfigFeatures import at.hannibal2.skyhanni.features.slayer.SlayerItemProfitTracker import at.hannibal2.skyhanni.test.PacketTest import at.hannibal2.skyhanni.test.SkyHanniConfigSearchResetCommand @@ -105,6 +106,11 @@ object Commands { registerCommand("skyhanni", "Opens the main SkyHanni config", openMainMenu) registerCommand("ff", "Opens the Farming Fortune Guide") { openFortuneGuide() } registerCommand("shcommands", "Shows this list") { commandHelp(it) } + registerCommand0("shdefaultoptions", "Select default options", { + DefaultConfigFeatures.onCommand( + it.getOrNull(0) ?: "null", it.getOrNull(1) ?: "null" + ) + }, DefaultConfigFeatures::onComplete) } private fun usersNormal() { @@ -308,8 +314,24 @@ object Commands { config.outdatedItems.clear() } - private fun registerCommand(name: String, description: String, function: (Array) -> Unit) { - ClientCommandHandler.instance.registerCommand(SimpleCommand(name, createCommand(function))) + private fun registerCommand( + name: String, + description: String, + function: (Array) -> Unit + ) = registerCommand0(name, description, function) + + private fun registerCommand0( + name: String, + description: String, + function: (Array) -> Unit, + autoComplete: ((Array) -> List) = { listOf() } + ) { + ClientCommandHandler.instance.registerCommand( + SimpleCommand( + name, + createCommand(function), + { a, b, c -> autoComplete(b) }) + ) commands.add(CommandInfo(name, description, currentCategory)) } diff --git a/src/main/java/at/hannibal2/skyhanni/config/commands/SimpleCommand.java b/src/main/java/at/hannibal2/skyhanni/config/commands/SimpleCommand.java index fa2c310de..9ff8ade64 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/commands/SimpleCommand.java +++ b/src/main/java/at/hannibal2/skyhanni/config/commands/SimpleCommand.java @@ -32,9 +32,9 @@ public class SimpleCommand extends CommandBase { public abstract void processCommand(ICommandSender sender, String[] args); } - public abstract static class TabCompleteRunnable { + public interface TabCompleteRunnable { - public abstract List tabComplete(ICommandSender sender, String[] args, BlockPos pos); + List tabComplete(ICommandSender sender, String[] args, BlockPos pos); } public boolean canCommandSenderUseCommand(ICommandSender sender) { diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/AshfangConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/AshfangConfig.java index 3515b9280..575a1987d 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/AshfangConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/AshfangConfig.java @@ -1,5 +1,6 @@ package at.hannibal2.skyhanni.config.features; +import at.hannibal2.skyhanni.config.FeatureToggle; import at.hannibal2.skyhanni.config.core.config.Position; import com.google.gson.annotations.Expose; import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean; @@ -11,6 +12,7 @@ public class AshfangConfig { @Expose @ConfigOption(name = "Freeze", desc = "Show the cooldown for how long Ashfang blocks your abilities.") @ConfigEditorBoolean + @FeatureToggle public boolean freezeCooldown = false; @Expose @@ -19,6 +21,7 @@ public class AshfangConfig { @Expose @ConfigOption(name = "Reset Time", desc = "Show the cooldown until Ashfang pulls his underlings back.") @ConfigEditorBoolean + @FeatureToggle public boolean nextResetCooldown = false; @Expose @@ -27,6 +30,7 @@ public class AshfangConfig { @Expose @ConfigOption(name = "Gravity Orbs", desc = "Shows the Gravity Orbs more clearly.") @ConfigEditorBoolean + @FeatureToggle public boolean gravityOrbs = false; @Expose @@ -37,6 +41,7 @@ public class AshfangConfig { @Expose @ConfigOption(name = "Blazing Souls", desc = "Shows the Blazing Souls more clearly.") @ConfigEditorBoolean + @FeatureToggle public boolean blazingSouls = false; @Expose @@ -47,20 +52,24 @@ public class AshfangConfig { @Expose @ConfigOption(name = "Highlight Blazes", desc = "Highlight the different blazes in their respective colors.") @ConfigEditorBoolean + @FeatureToggle public boolean highlightBlazes = false; @Expose @ConfigOption(name = "Hide Particles", desc = "Hide particles around the Ashfang boss.") @ConfigEditorBoolean + @FeatureToggle public boolean hideParticles = false; @Expose @ConfigOption(name = "Hide Names", desc = "Hide the names of full health blazes around Ashfang (only useful when highlight blazes is enabled)") @ConfigEditorBoolean + @FeatureToggle public boolean hideNames = false; @Expose @ConfigOption(name = "Hide Damage", desc = "Hide damage splashes around Ashfang.") @ConfigEditorBoolean + @FeatureToggle public boolean hideDamageSplash = false; } diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/BazaarConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/BazaarConfig.java index 8f12ba667..8d3565765 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/BazaarConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/BazaarConfig.java @@ -1,5 +1,6 @@ package at.hannibal2.skyhanni.config.features; +import at.hannibal2.skyhanni.config.FeatureToggle; import at.hannibal2.skyhanni.config.core.config.Position; import com.google.gson.annotations.Expose; import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean; @@ -10,16 +11,19 @@ public class BazaarConfig { @Expose @ConfigOption(name = "Purchase Helper", desc = "Highlights the item you are trying to buy in the Bazaar.") @ConfigEditorBoolean + @FeatureToggle public boolean purchaseHelper = true; @Expose @ConfigOption(name = "Order Helper", desc = "Show visual hints inside the Bazaar Manage Order view when items are ready to pickup or outbid.") @ConfigEditorBoolean + @FeatureToggle public boolean orderHelper = false; @Expose @ConfigOption(name = "Best Sell Method", desc = "Show the price difference between sell instantly and sell offer.") @ConfigEditorBoolean + @FeatureToggle public boolean bestSellMethod = false; @Expose @@ -28,5 +32,6 @@ public class BazaarConfig { @Expose @ConfigOption(name = "Cancelled Buy Order Clipboard", desc = "Saves missing items from cancelled buy orders to clipboard for faster re-entry.") @ConfigEditorBoolean + @FeatureToggle public boolean cancelledBuyOrderClipboard = false; } diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/BingoConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/BingoConfig.java index e083fbcbe..4be6eeb41 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/BingoConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/BingoConfig.java @@ -1,5 +1,6 @@ package at.hannibal2.skyhanni.config.features; +import at.hannibal2.skyhanni.config.FeatureToggle; import at.hannibal2.skyhanni.config.core.config.Position; import com.google.gson.annotations.Expose; import io.github.moulberry.moulconfig.annotations.Accordion; @@ -18,6 +19,7 @@ public class BingoConfig { @Expose @ConfigOption(name = "Enable", desc = "Displays the bingo card.") @ConfigEditorBoolean + @FeatureToggle public boolean enabled = true; @Expose @ConfigOption(name = "Quick Toggle", desc = "Quickly toggle the bingo card or the step helper by sneaking with SkyBlock menu in hand.") @@ -42,6 +44,7 @@ public class BingoConfig { "§eData from Bingo Splash Community§7, made by §cMayxo" ) @ConfigEditorBoolean + @FeatureToggle public boolean bingoSplashGuide = true; @Expose @@ -59,11 +62,13 @@ public class BingoConfig { @ConfigOption(name = "Enable", desc = "Shortens chat messages about skill level ups, collection gains, " + "new area discoveries and skyblock level up messages while on bingo.") @ConfigEditorBoolean + @FeatureToggle public boolean enabled = true; @Expose @ConfigOption(name = "Hide Border", desc = "Hide the border messages before and after the compact level up messages.") @ConfigEditorBoolean + @FeatureToggle public boolean hideBorder = true; @Expose @@ -75,6 +80,7 @@ public class BingoConfig { @Expose @ConfigOption(name = "Minion Craft Helper", desc = "Show how many more items you need to upgrade the minion in your inventory. Especially useful for bingo.") @ConfigEditorBoolean + @FeatureToggle public boolean minionCraftHelperEnabled = true; @Expose diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/ChatConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/ChatConfig.java index ee46054f6..425cd9d07 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/ChatConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/ChatConfig.java @@ -1,5 +1,6 @@ package at.hannibal2.skyhanni.config.features; +import at.hannibal2.skyhanni.config.FeatureToggle; import com.google.gson.annotations.Expose; import io.github.moulberry.moulconfig.annotations.*; import org.lwjgl.input.Keyboard; @@ -21,36 +22,49 @@ public class ChatConfig { @ConfigOption(name = "Hypixel Hub", desc = "Block messages outside SkyBlock in the Hypixel lobby: player joins, loot boxes, prototype lobby messages, radiating generosity and Hypixel tournaments.") @ConfigEditorBoolean @ConfigAccordionId(id = 0) + @FeatureToggle public boolean hypixelHub = true; @Expose @ConfigOption(name = "Empty", desc = "Hide all the empty messages from the chat.") @ConfigEditorBoolean @ConfigAccordionId(id = 0) + @FeatureToggle public boolean empty = true; @Expose @ConfigOption(name = "Warping", desc = "Block 'sending request to join...' and 'warping...' messages.") @ConfigEditorBoolean @ConfigAccordionId(id = 0) + @FeatureToggle public boolean warping = true; @Expose @ConfigOption(name = "Welcome", desc = "Hide the 'welcome to SkyBlock' message.") @ConfigEditorBoolean @ConfigAccordionId(id = 0) + @FeatureToggle public boolean welcome = true; @Expose @ConfigOption(name = "Guild Exp", desc = "Hide guild exp messages.") @ConfigEditorBoolean @ConfigAccordionId(id = 0) + @FeatureToggle public boolean guildExp = true; + @Expose + @ConfigOption(name = "Friend Join Left", desc = "Hide friend join/left messages.") + @ConfigEditorBoolean + @ConfigAccordionId(id = 0) + @FeatureToggle + public boolean friendJoinLeft = false; + @Expose @ConfigOption(name = "Winter Gifts", desc = "Hide useless winter gift messages.") @ConfigEditorBoolean @ConfigAccordionId(id = 0) + @FeatureToggle public boolean winterGift = false; @Expose @@ -58,24 +72,28 @@ public class ChatConfig { "(Except powder numbers over 1k, Prehistoric Egg and Automaton Parts)") @ConfigEditorBoolean @ConfigAccordionId(id = 0) + @FeatureToggle public boolean powderMining = true; @Expose @ConfigOption(name = "Kill Combo", desc = "Hide messages about the current kill combo from the Grandma Wolf Pet.") @ConfigEditorBoolean @ConfigAccordionId(id = 0) + @FeatureToggle public boolean killCombo = false; @Expose @ConfigOption(name = "Watchdog", desc = "Hide the message where Hypixel is flexing how many players they have banned over the last week.") @ConfigEditorBoolean @ConfigAccordionId(id = 0) + @FeatureToggle public boolean watchDog = true; @Expose @ConfigOption(name = "Profile Join", desc = "Hide 'You are playing on profile' and 'Profile ID' chat messages") @ConfigEditorBoolean @ConfigAccordionId(id = 0) + @FeatureToggle public boolean profileJoin = true; //TODO remove @@ -83,6 +101,7 @@ public class ChatConfig { @ConfigOption(name = "Others", desc = "Hide other annoying messages.") @ConfigEditorBoolean @ConfigAccordionId(id = 0) + @FeatureToggle public boolean others = false; @Expose @@ -94,44 +113,52 @@ public class ChatConfig { @ConfigOption(name = "Player Rank Hider", desc = "Hide player ranks in all chat messages.") @ConfigEditorBoolean @ConfigAccordionId(id = 1) + @FeatureToggle public boolean playerRankHider = false; @Expose @ConfigOption(name = "Chat Filter", desc = "Scan messages sent by players for blacklisted words and grey out the message if any are found.") @ConfigEditorBoolean @ConfigAccordionId(id = 1) + @FeatureToggle public boolean chatFilter = false; @Expose @ConfigOption(name = "Dungeon Filter", desc = "Hide annoying messages in dungeons.") @ConfigEditorBoolean + @FeatureToggle public boolean dungeonMessages = true; @Expose @ConfigOption(name = "Dungeon Boss Messages", desc = "Hide messages from the watcher and bosses in the dungeon.") @ConfigEditorBoolean + @FeatureToggle public boolean dungeonBossMessages = false; @Expose @ConfigOption(name = "Hide Far Deaths", desc = "Hide other players' death messages, " + "except for players who are nearby or during dungeons/a Kuudra fight.") @ConfigEditorBoolean + @FeatureToggle public boolean hideFarDeathMessages = false; //TODO jawbus + thunder @Expose @ConfigOption(name = "Compact Potion Message", desc = "Shorten chat messages about player potion effects.") @ConfigEditorBoolean + @FeatureToggle public boolean compactPotionMessage = true; @Expose @ConfigOption(name = "Compact Bestiary Message", desc = "Shorten the bestiary level up message, showing additional information when hovering.") @ConfigEditorBoolean + @FeatureToggle public boolean compactBestiaryMessage = true; @Expose @ConfigOption(name = "Arachne Hider", desc = "Hide chat messages about the Arachne Fight while outside of §eArachne's Sanctuary§7.") @ConfigEditorBoolean + @FeatureToggle public boolean hideArachneMessages = false; @Expose diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/CommandsConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/CommandsConfig.java index dd0668743..0c29f707e 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/CommandsConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/CommandsConfig.java @@ -1,5 +1,6 @@ package at.hannibal2.skyhanni.config.features; +import at.hannibal2.skyhanni.config.FeatureToggle; import com.google.gson.annotations.Expose; import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean; import io.github.moulberry.moulconfig.annotations.ConfigOption; @@ -9,16 +10,19 @@ public class CommandsConfig { @Expose @ConfigOption(name = "Fandom Wiki", desc = "Use Fandom wiki (§ehypixel-skyblock.fandom.com§7) instead of the Hypixel wiki (§ewiki.hypixel.net§7).") @ConfigEditorBoolean + @FeatureToggle public boolean useFandomWiki = false; @Expose @ConfigOption(name = "Party transfer", desc = "Allows §e/pt §7as alias for §e/party transfer§7.\n" + "§7SkyBlock command §e/pt §7to check the play time still works.") @ConfigEditorBoolean + @FeatureToggle public boolean usePartyTransferAlias = true; @Expose @ConfigOption(name = "Replace Warp Is", desc = "Replaces §e/warp is §7with §e/is§7. Idk why. Ask §cKaeso") @ConfigEditorBoolean + @FeatureToggle public boolean replaceWarpIs = false; } diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/DamageIndicatorConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/DamageIndicatorConfig.java index af72333b9..94ff6f497 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/DamageIndicatorConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/DamageIndicatorConfig.java @@ -1,5 +1,6 @@ package at.hannibal2.skyhanni.config.features; +import at.hannibal2.skyhanni.config.FeatureToggle; import com.google.gson.annotations.Expose; import io.github.moulberry.moulconfig.annotations.*; @@ -12,6 +13,7 @@ public class DamageIndicatorConfig { @Expose @ConfigOption(name = "Damage Indicator Enabled", desc = "Show the boss' remaining health.") @ConfigEditorBoolean + @FeatureToggle public boolean enabled = false; @Expose diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/DianaConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/DianaConfig.java index 99437bb83..d5d46a0b1 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/DianaConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/DianaConfig.java @@ -1,5 +1,6 @@ package at.hannibal2.skyhanni.config.features; +import at.hannibal2.skyhanni.config.FeatureToggle; import com.google.gson.annotations.Expose; import io.github.moulberry.moulconfig.annotations.*; import org.lwjgl.input.Keyboard; @@ -9,11 +10,13 @@ public class DianaConfig { @Expose @ConfigOption(name = "Soopy Guess", desc = "Uses §eSoopy's Guess Logic §7to find the next burrow. Does not require SoopyV2 or ChatTriggers to be installed.") @ConfigEditorBoolean + @FeatureToggle public boolean burrowsSoopyGuess = false; @Expose @ConfigOption(name = "Nearby Detection", desc = "Show burrows near you.") @ConfigEditorBoolean + @FeatureToggle public boolean burrowsNearbyDetection = false; @Expose @@ -42,6 +45,7 @@ public class DianaConfig { @Expose @ConfigOption(name = "Enabled", desc = "Shares your Inquisitor and receiving other Inquisitors via Party Chat.") @ConfigEditorBoolean + @FeatureToggle public boolean enabled = true; @Expose @@ -68,5 +72,6 @@ public class DianaConfig { @Expose @ConfigOption(name = "Griffin Pet Warning", desc = "Warn when holding an Ancestral Spade while no Griffin pet is selected.") @ConfigEditorBoolean + @FeatureToggle public boolean petWarning = true; } diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/DungeonConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/DungeonConfig.java index 3e086812e..b0677f462 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/DungeonConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/DungeonConfig.java @@ -1,5 +1,6 @@ package at.hannibal2.skyhanni.config.features; +import at.hannibal2.skyhanni.config.FeatureToggle; import at.hannibal2.skyhanni.config.core.config.Position; import com.google.gson.annotations.Expose; import io.github.moulberry.moulconfig.annotations.ConfigAccordionId; @@ -12,11 +13,13 @@ public class DungeonConfig { @Expose @ConfigOption(name = "Clicked Blocks", desc = "Highlight levers, chests, and wither essence when clicked in dungeons.") @ConfigEditorBoolean + @FeatureToggle public boolean highlightClickedBlocks = false; @Expose @ConfigOption(name = "Milestones Display", desc = "Show the current milestone in dungeons.") @ConfigEditorBoolean + @FeatureToggle public boolean showMilestonesDisplay = false; @Expose @@ -25,6 +28,7 @@ public class DungeonConfig { @Expose @ConfigOption(name = "Death Counter Display", desc = "Display the total amount of deaths in the current dungeon.") @ConfigEditorBoolean + @FeatureToggle public boolean deathCounterDisplay = false; @Expose @@ -39,6 +43,7 @@ public class DungeonConfig { "particles are no longer displayed and the music stops playing, but the loot chests are still displayed.") @ConfigEditorBoolean @ConfigAccordionId(id = 2) + @FeatureToggle public boolean cleanEndToggle = false; @Expose @@ -51,11 +56,13 @@ public class DungeonConfig { @Expose @ConfigOption(name = "Boss Damage Splash", desc = "Hides damage splashes while inside the boss room (fixes a Skytils feature).") @ConfigEditorBoolean + @FeatureToggle public boolean damageSplashBoss = false; @Expose @ConfigOption(name = "Highlight Deathmites", desc = "Highlight deathmites in dungeon in red color.") @ConfigEditorBoolean + @FeatureToggle public boolean highlightDeathmites = true; @ConfigOption(name = "Object Hider", desc = "Hide various things in dungeons.") @@ -66,48 +73,56 @@ public class DungeonConfig { @ConfigOption(name = "Hide Superboom TNT", desc = "Hide Superboom TNT laying around in dungeons.") @ConfigEditorBoolean @ConfigAccordionId(id = 3) + @FeatureToggle public boolean hideSuperboomTNT = false; @Expose @ConfigOption(name = "Hide Blessings", desc = "Hide Blessings laying around in dungeons.") @ConfigEditorBoolean @ConfigAccordionId(id = 3) + @FeatureToggle public boolean hideBlessing = false; @Expose @ConfigOption(name = "Hide Revive Stones", desc = "Hide Revive Stones laying around in dungeons.") @ConfigEditorBoolean @ConfigAccordionId(id = 3) + @FeatureToggle public boolean hideReviveStone = false; @Expose @ConfigOption(name = "Hide Premium Flesh", desc = "Hide Premium Flesh laying around in dungeons.") @ConfigEditorBoolean @ConfigAccordionId(id = 3) + @FeatureToggle public boolean hidePremiumFlesh = false; @Expose @ConfigOption(name = "Hide Journal Entry", desc = "Hide Journal Entry pages laying around in dungeons.") @ConfigEditorBoolean @ConfigAccordionId(id = 3) + @FeatureToggle public boolean hideJournalEntry = false; @Expose @ConfigOption(name = "Hide Skeleton Skull", desc = "Hide Skeleton Skulls laying around in dungeons.") @ConfigEditorBoolean @ConfigAccordionId(id = 3) + @FeatureToggle public boolean hideSkeletonSkull = true; @Expose @ConfigOption(name = "Hide Healer Orbs", desc = "Hides the damage, ability damage and defensive orbs that spawn when the healer kills mobs.") @ConfigEditorBoolean @ConfigAccordionId(id = 3) + @FeatureToggle public boolean hideHealerOrbs = false; @Expose @ConfigOption(name = "Hide Healer Fairy", desc = "Hide the golden fairy that follows the healer in dungeons.") @ConfigEditorBoolean @ConfigAccordionId(id = 3) + @FeatureToggle public boolean hideHealerFairy = false; @ConfigOption(name = "Message Filter", desc = "") @@ -118,6 +133,7 @@ public class DungeonConfig { @ConfigOption(name = "Keys and Doors", desc = "Hides the chat message when picking up keys or opening doors in dungeons.") @ConfigEditorBoolean @ConfigAccordionId(id = 4) + @FeatureToggle public boolean messageFilterKeysAndDoors = false; @ConfigOption(name = "Dungeon Copilot", desc = "") @@ -128,6 +144,7 @@ public class DungeonConfig { @ConfigOption(name = "Copilot Enabled", desc = "Suggests what to do next in dungeons.") @ConfigEditorBoolean @ConfigAccordionId(id = 5) + @FeatureToggle public boolean copilotEnabled = false; @Expose @@ -141,17 +158,20 @@ public class DungeonConfig { @ConfigOption(name = "Colored Class Level", desc = "Color class levels in party finder.") @ConfigAccordionId(id = 6) @ConfigEditorBoolean + @FeatureToggle public boolean partyFinderColoredClassLevel = true; @Expose @ConfigOption(name = "Moving Skeleton Skulls", desc = "Highlight Skeleton Skulls when combining into an " + "orange Skeletor (not useful when combined with feature Hide Skeleton Skull).") @ConfigEditorBoolean + @FeatureToggle public boolean highlightSkeletonSkull = true; @Expose @ConfigOption(name = "Croesus Chest", desc = "Adds a visual highlight to the Croesus inventory that " + "shows unopened chests.") @ConfigEditorBoolean + @FeatureToggle public boolean croesusUnopenedChestTracker = true; } diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/FishingConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/FishingConfig.java index 80c7e33cd..472a0a50d 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/FishingConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/FishingConfig.java @@ -1,5 +1,6 @@ package at.hannibal2.skyhanni.config.features; +import at.hannibal2.skyhanni.config.FeatureToggle; import at.hannibal2.skyhanni.config.core.config.Position; import com.google.gson.annotations.Expose; import io.github.moulberry.moulconfig.annotations.*; @@ -19,6 +20,7 @@ public class FishingConfig { ) @ConfigEditorBoolean @ConfigAccordionId(id = 0) + @FeatureToggle public boolean trophyCounter = false; @Expose diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/massconfiguration/DefaultConfigFeatures.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/massconfiguration/DefaultConfigFeatures.kt new file mode 100644 index 000000000..72f205b5e --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/massconfiguration/DefaultConfigFeatures.kt @@ -0,0 +1,112 @@ +package at.hannibal2.skyhanni.features.misc.massconfiguration + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.utils.LorenzUtils +import io.github.moulberry.moulconfig.processor.ConfigProcessorDriver +import net.minecraft.client.Minecraft +import net.minecraft.command.CommandBase +import net.minecraft.event.ClickEvent +import net.minecraft.util.ChatComponentText +import net.minecraft.util.ChatStyle +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import net.minecraftforge.fml.common.gameevent.TickEvent + +object DefaultConfigFeatures { + var didNotifyOnce = false + + @SubscribeEvent + fun onTick(event: TickEvent) { + if (didNotifyOnce) return + val player = Minecraft.getMinecraft().thePlayer ?: return + didNotifyOnce = true + val knownToggles = SkyHanniMod.feature.storage.knownFeatureToggles + val updated = SkyHanniMod.version !in knownToggles + val processor = FeatureToggleProcessor() + ConfigProcessorDriver.processConfig(SkyHanniMod.feature.javaClass, SkyHanniMod.feature, processor) + knownToggles[SkyHanniMod.version] = processor.allOptions.map { it.path } + SkyHanniMod.configManager.saveConfig("Updated known feature flags") + if (!SkyHanniMod.feature.storage.hasPlayedBefore) { + SkyHanniMod.feature.storage.hasPlayedBefore = true + player.addChatMessage( + ChatComponentText( + "§e[SkyHanni] Looks like this is the first time you are using SkyHanni." + + " Click here to configure default options, or run /shdefaultoptions." + ).setChatStyle( + ChatStyle().setChatClickEvent( + ClickEvent( + ClickEvent.Action.RUN_COMMAND, + "/shdefaultoptions" + ) + ) + ) + ) + + } else if (updated) { + val mostFeatureFulOldVersion = knownToggles.maxByOrNull { if (it.key != SkyHanniMod.version) it.value.size else -1 } + val command = "/shdefaultoptions ${mostFeatureFulOldVersion?.key} ${SkyHanniMod.version}" + player.addChatMessage( + ChatComponentText( + "§e[SkyHanni] Looks like you updated SkyHanni." + + " Click here to configure the newly introduced options, or run $command." + ).setChatStyle( + ChatStyle().setChatClickEvent( + ClickEvent( + ClickEvent.Action.RUN_COMMAND, + command + ) + ) + ) + ) + } + } + + fun onCommand(old: String, new: String) { + val processor = FeatureToggleProcessor() + ConfigProcessorDriver.processConfig(SkyHanniMod.feature.javaClass, SkyHanniMod.feature, processor) + var optionList = processor.orderedOptions + val knownToggles = SkyHanniMod.feature.storage.knownFeatureToggles + val togglesInNewVersion = knownToggles[new] + if (new != "null" && togglesInNewVersion == null) { + LorenzUtils.chat("§e[SkyHanni] Unknown version $new") + return + } + val togglesInOldVersion = knownToggles[old] + if (old != "null" && togglesInOldVersion == null) { + LorenzUtils.chat("§e[SkyHanni] Unknown version $old") + return + } + optionList = optionList.mapValues { it.value.filter { (togglesInNewVersion == null || it.path in togglesInNewVersion) && (togglesInOldVersion == null || it.path !in togglesInOldVersion) } } + .filter { it.value.isNotEmpty() } + SkyHanniMod.screenToOpen = DefaultConfigOptionGui(optionList, old, new) + } + + fun applyCategorySelections( + resetSuggestionState: MutableMap, + orderedOptions: Map> + ) { + orderedOptions.forEach { cat, options -> + for (option in options) { + val resetState = option.toggleOverride ?: resetSuggestionState[cat]!! + if (resetState == DefaultConfigOptionGui.ResetSuggestionState.LEAVE_DEFAULTS) continue + val onState = option.isTrueEnabled + val setTo = if (resetState == DefaultConfigOptionGui.ResetSuggestionState.TURN_ALL_ON) { + onState + } else { + !onState + } + option.setter(setTo) + } + } + } + + fun onComplete(strings: Array): List { + if (strings.size <= 2) + return CommandBase.getListOfStringsMatchingLastWord( + strings, + SkyHanniMod.feature.storage.knownFeatureToggles.keys + listOf("null") + ) + return listOf() + } + + +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/massconfiguration/DefaultConfigOptionGui.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/massconfiguration/DefaultConfigOptionGui.kt new file mode 100644 index 000000000..00fc88dd4 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/massconfiguration/DefaultConfigOptionGui.kt @@ -0,0 +1,193 @@ +package at.hannibal2.skyhanni.features.misc.massconfiguration + +import io.github.moulberry.moulconfig.internal.GlScissorStack +import io.github.moulberry.moulconfig.internal.RenderUtils +import io.github.moulberry.moulconfig.internal.TextRenderUtils +import io.github.moulberry.notenoughupdates.util.Utils +import net.minecraft.client.gui.GuiScreen +import net.minecraft.client.gui.ScaledResolution +import net.minecraft.client.renderer.GlStateManager +import org.lwjgl.input.Mouse + +class DefaultConfigOptionGui( + val orderedOptions: Map>, + old: String, + new: String +) : + GuiScreen() { + val title = if (old == "null") { + if (new == "null") + "§5SkyHanni Default Options" + else + "§5SkyHanni Options In Version $new" + } else { + if (new == "null") { + "§5SkyHanni Options since $old" + } else { + "§5SkyHanni Options $old → $new" + } + } + val xSize = 400 + val ySize = 300 + val barSize = 40 + val padding = 10 + var wasMouseDown = false + val cardHeight = 30 + + var currentScrollOffset = 0 + + enum class ResetSuggestionState(val label: String) { + TURN_ALL_OFF("§c§lTurn all off"), + TURN_ALL_ON("§a§lTurn all on"), + LEAVE_DEFAULTS("§b§lLeave unchanged"), ; + + val next get() = entries[(ordinal + 1) % entries.size] + } + + val resetSuggestionState = + orderedOptions.keys.associateWith { ResetSuggestionState.LEAVE_DEFAULTS }.toMutableMap() + + override fun drawScreen(mouseX: Int, mouseY: Int, partialTicks: Float) { + super.drawScreen(mouseX, mouseY, partialTicks) + drawDefaultBackground() + RenderUtils.drawFloatingRectDark((width - xSize) / 2, (height - ySize) / 2, xSize, ySize) + val sr = ScaledResolution(mc) + var hoveringTextToDraw: List? = null + var mx = mouseX - ((width - xSize) / 2) - padding + val isMouseDown = Mouse.isButtonDown(0) + val shouldClick = isMouseDown && !wasMouseDown + wasMouseDown = isMouseDown + val isMouseInScrollArea = + mx in 0..xSize && mouseY in ((height - ySize) / 2) + barSize..((height + ySize) / 2 - barSize) + var my = mouseY - ((height - ySize) / 2 + barSize) + currentScrollOffset + + GlStateManager.pushMatrix() + GlStateManager.translate(width / 2F, (height - ySize) / 2F, 0F) + GlStateManager.scale(2f, 2f, 1f) + TextRenderUtils.drawStringCenteredScaledMaxWidth( + title, + mc.fontRendererObj, + 0F, + mc.fontRendererObj.FONT_HEIGHT.toFloat(), + false, + xSize / 2 - padding, + -1 + ) + GlStateManager.popMatrix() + + GlStateManager.pushMatrix() + GlStateManager.translate( + (width - xSize) / 2F + padding, + (height + ySize) / 2F - mc.fontRendererObj.FONT_HEIGHT * 2, + 0F + ) + var i = 0 + fun bt(title: String, tooltip: List, func: () -> Unit) { + val lw = mc.fontRendererObj.getStringWidth(title) + var s = false + if (mouseX - ((width - xSize) / 2 + padding) in i..(i + lw) + && mouseY - (height + ySize) / 2 in -barSize..0 + ) { + s = true + hoveringTextToDraw = tooltip + if (shouldClick) { + func() + } + } + RenderUtils.drawFloatingRectDark(i - 1, -3, lw + 4, 14) + mc.fontRendererObj.drawString(title, 2 + i.toFloat(), 0F, if (s) 0xFF00FF00.toInt() else -1, s) + i += lw + 12 + } + bt("Apply choices", listOf()) { + DefaultConfigFeatures.applyCategorySelections(resetSuggestionState, orderedOptions) + mc.displayGuiScreen(null) + } + bt("Turn all on", listOf()) { + resetSuggestionState.entries.forEach { + it.setValue(ResetSuggestionState.TURN_ALL_ON); + orderedOptions[it.key]!!.forEach { it.toggleOverride = null } + } + } + bt("Turn all off", listOf()) { + resetSuggestionState.entries.forEach { + it.setValue(ResetSuggestionState.TURN_ALL_OFF) + orderedOptions[it.key]!!.forEach { it.toggleOverride = null } + } + } + bt("Leave all untouched", listOf()) { + resetSuggestionState.entries.forEach { + it.setValue(ResetSuggestionState.LEAVE_DEFAULTS) + orderedOptions[it.key]!!.forEach { it.toggleOverride = null } + } + } + bt("Cancel", listOf()) { + mc.displayGuiScreen(null) + } + GlStateManager.popMatrix() + + GlStateManager.pushMatrix() + GlScissorStack.push( + (width - xSize) / 2, + (height - ySize) / 2 + barSize, + (width + xSize) / 2, + (height + ySize) / 2 - barSize, + sr + ) + GlStateManager.translate( + (width - xSize) / 2F + padding, + (height - ySize) / 2F + barSize - currentScrollOffset, + 0F + ) + + for ((cat) in orderedOptions.entries) { + val suggestionState = resetSuggestionState[cat]!! + drawRect(0, 0, xSize - padding * 2, 1, 0xFF808080.toInt()) + drawRect(0, 30, xSize - padding * 2, cardHeight + 1, 0xFF808080.toInt()) + drawRect(0, 0, 1, cardHeight, 0xFF808080.toInt()) + drawRect(xSize - padding * 2 - 1, 0, xSize - padding * 2, cardHeight, 0xFF808080.toInt()) + mc.fontRendererObj.drawString("§e${cat.name} ${suggestionState.label}", 4, 4, -1) + mc.fontRendererObj.drawSplitString("§7${cat.description}", 4, 14, xSize - padding * 2 - 8, -1) + if (isMouseInScrollArea && my in 0..cardHeight) { + hoveringTextToDraw = + listOf( + "§e${cat.name}", + "§7${cat.description}", + "§7Current plan: ${suggestionState.label}", + "§aClick to toggle!", + "§7Hold shift to show all options" + ) + if (isShiftKeyDown()) { + hoveringTextToDraw = listOf( + "§e${cat.name}", + "§7${cat.description}", + ) + orderedOptions[cat]!!.map { "§7 - §a" + it.name } + } + if (shouldClick) { + resetSuggestionState[cat] = suggestionState.next + orderedOptions[cat]!!.forEach { it.toggleOverride = null } + } + } + my -= cardHeight + GlStateManager.translate(0F, cardHeight.toFloat(), 0F) + } + + + GlStateManager.popMatrix() + GlScissorStack.pop(sr) + if (hoveringTextToDraw != null) { + Utils.drawHoveringText(hoveringTextToDraw, mouseX, mouseY, width, height, 100, mc.fontRendererObj) + } + + } + + fun scroll(s: Int) { + currentScrollOffset = + Math.max(0, Math.min(s, (orderedOptions.size + 1) * cardHeight - ySize + barSize + padding * 2)) + } + + override fun handleMouseInput() { + super.handleMouseInput() + if (Mouse.getEventDWheel() != 0) + scroll(currentScrollOffset - Mouse.getEventDWheel()) + } +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/massconfiguration/FeatureToggleProcessor.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/massconfiguration/FeatureToggleProcessor.kt new file mode 100644 index 000000000..c6b1beea5 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/massconfiguration/FeatureToggleProcessor.kt @@ -0,0 +1,70 @@ +package at.hannibal2.skyhanni.features.misc.massconfiguration + +import at.hannibal2.skyhanni.config.FeatureToggle +import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean +import io.github.moulberry.moulconfig.annotations.ConfigOption +import io.github.moulberry.moulconfig.processor.ConfigStructureReader +import java.lang.reflect.Field +import java.util.* + +class FeatureToggleProcessor : ConfigStructureReader { + + var latestCategory: Category? = null + val pathStack = Stack() + + val allOptions = mutableListOf() + val orderedOptions by lazy { + allOptions.groupBy { it.category } + } + + data class FeatureToggleableOption( + val name: String, val description: String, val previouslyEnabled: Boolean, + val isTrueEnabled: Boolean, val category: Category, + val setter: (Boolean) -> Unit, + val path: String, + var toggleOverride: DefaultConfigOptionGui.ResetSuggestionState? = null + ) + + data class Category(val name: String, val description: String) + + override fun beginCategory(baseObject: Any?, field: Field?, name: String, description: String) { + latestCategory = Category(name, description) + } + + override fun endCategory() { + } + + override fun beginAccordion(baseObject: Any?, field: Field?, option: ConfigOption?, id: Int) { + } + + override fun endAccordion() { + } + + override fun pushPath(fieldPath: String) { + pathStack.push(fieldPath) + } + + override fun popPath() { + pathStack.pop() + } + + override fun emitOption(baseObject: Any, field: Field, option: ConfigOption) { + val featureToggle = field.getAnnotation(FeatureToggle::class.java) ?: return + field.getAnnotation(ConfigEditorBoolean::class.java) + ?: error("Feature toggle found without ConfigEditorBoolean: $field") + allOptions.add( + FeatureToggleableOption( + option.name, + option.desc, + field.getBoolean(baseObject), + featureToggle.trueIsEnabled, + latestCategory!!, + { field.setBoolean(baseObject, it) }, + pathStack.joinToString(".") + "." + field.name + ) + ) + } + + override fun emitGuiOverlay(baseObject: Any?, field: Field?, option: ConfigOption?) { + } +} \ No newline at end of file -- cgit