diff options
| author | Cow <cow@volloeko.de> | 2020-09-24 17:58:17 +0200 |
|---|---|---|
| committer | Cow <cow@volloeko.de> | 2020-09-24 17:58:17 +0200 |
| commit | 7d4f2b900254d961b847f573237e3e6f40bff8e9 (patch) | |
| tree | 8fa85fc9212ffc9b8a16796c682d87667ec294a5 | |
| parent | 705299e37d27d421156a09213e0654d0ab4fb01c (diff) | |
| download | Cowlection-7d4f2b900254d961b847f573237e3e6f40bff8e9.tar.gz Cowlection-7d4f2b900254d961b847f573237e3e6f40bff8e9.tar.bz2 Cowlection-7d4f2b900254d961b847f573237e3e6f40bff8e9.zip | |
Config (gui) rework
- Completely re-done the config gui (`/moo config`)
- Improved SkyBlock dungeon party finder
- Improved SkyBlock dungeon performance overlay
- Improved handling of invalid/missing Hypixel API key
- minor text fixes
25 files changed, 2110 insertions, 558 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index d7e47d0..7c65f95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,20 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## [1.8.9-0.11.0] - unreleased +### Changed +- Completely re-done the config gui (`/moo config`) + - now separated into sections and sub-sections + - added moar configurable things + - some config settings have a live-preview next to them +- Improved SkyBlock dungeon party finder + - more config options + - marks (non-)joinable parties even better than before +- Improved SkyBlock dungeon performance overlay + - Overlay can be moved more precisely + - Dungeons can be "joined" and "left" manually (if the automatic detection fails): `/moo dungeon <enter/leave>` +- Improved handling of invalid/missing Hypixel API key + ## [1.8.9-0.10.2] - 15.09.2020 ### Added - Added keybinding (default `M`) to open chat with `/moo ` pre-typed @@ -195,6 +209,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). *Note:* The 'best friends' list is currently available via <kbd>ESC</kbd> > Mod Options > Cowlection > Config > bestFriends. +[1.8.9-0.11.0]: https://github.com/cow-mc/Cowlection/compare/v1.8.9-0.10.2...master [1.8.9-0.10.2]: https://github.com/cow-mc/Cowlection/compare/v1.8.9-0.10.1...v1.8.9-0.10.2 [1.8.9-0.10.1]: https://github.com/cow-mc/Cowlection/compare/v1.8.9-0.10.0...v1.8.9-0.10.1 [1.8.9-0.10.0]: https://github.com/cow-mc/Cowlection/compare/v1.8.9-0.9.0...v1.8.9-0.10.0 @@ -6,13 +6,14 @@ It is a collection of different features mainly focused on Hypixel SkyBlock. ## Current features ➜ Use `/moo help` to see all available commands. +➜ Use `/moo config` to adjust the features to your needs. | Feature | Command/Usage | |-------------------------------------------------------------------------|-----------------------------------------| | 'Best friends' list to limit the amount of join and leave notifications (always up-to-date names even after player name changes). Also checks best friends' online status automatically | `/moo add/remove/list/online` | | Search through your Minecraft log files (click the `?` for more info) | `/moo search` | | Stalk a player (check online status, current game, ...) | `/moo stalk` | -| Toggle join/leave notifications for friends, guild members or best friends separately | `/moo toggle` | +| Toggle join/leave notifications for friends, guild members or best friends separately | `/moo config` → Notifications | | Copy chat component | <kbd>ALT</kbd> + <kbd>right click</kbd><br>Hold <kbd>shift</kbd> to copy full component | | Copy inventories to clipboard as JSON | <kbd>CTRL</kbd> + <kbd>C</kbd> | | Tab-completable usernames for several commands (e.g. `/party`, `/invite`, ...) | `/moo config` → `Commands with Tab-completable usernames` for full list of commands | @@ -25,8 +26,8 @@ It is a collection of different features mainly focused on Hypixel SkyBlock. |-------------------------------------------------------------------------|-----------------------------------------| | Stalk SkyBlock stats of a player | `/moo stalkskyblock` | | Analyze minions on a private island | `/moo analyzeIsland` | -| Dungeon interfaces enhancements (normalize dungeon item stats, improved party finder) | Hold <kbd>shift</kbd> while viewing a dungeon item tooltip | -| Dungeon performance tracker: Skill score calculation, class milestone tracker, destroyed crypts tracker, and elapsed time indicator | automatically; or with `/moo dungeon`; Overlay can be edited with `/moo dungeonGui` | +| Dungeon interfaces enhancements (normalize dungeon item stats, improved party finder) | Hold <kbd>shift</kbd> (configurable) while viewing a dungeon item tooltip | +| Dungeon performance tracker and overlay: Skill score calculation, class milestone tracker, destroyed crypts tracker, and elapsed time indicator | automatically; or with `/moo dungeon` | ## Download You can download the compiled .jar files from the [release section](https://github.com/cow-mc/Cowlection/releases). diff --git a/src/main/java/de/cowtipper/cowlection/Cowlection.java b/src/main/java/de/cowtipper/cowlection/Cowlection.java index 50df539..4aefd5b 100644 --- a/src/main/java/de/cowtipper/cowlection/Cowlection.java +++ b/src/main/java/de/cowtipper/cowlection/Cowlection.java @@ -29,7 +29,6 @@ import java.io.File; @Mod(modid = Cowlection.MODID, name = Cowlection.MODNAME, version = Cowlection.VERSION, clientSideOnly = true, - guiFactory = "@PACKAGE@.config.MooGuiFactory", updateJSON = "https://raw.githubusercontent.com/cow-mc/Cowlection/master/update.json") public class Cowlection { public static final String MODID = "@MODID@"; @@ -54,15 +53,16 @@ public class Cowlection { logger = e.getModLog(); modsDir = e.getSourceFile().getParentFile(); + chatHelper = new ChatHelper(); + this.configDir = new File(e.getModConfigurationDirectory(), MODID + File.separatorChar); if (!configDir.exists()) { configDir.mkdirs(); } friendsHandler = new FriendsHandler(this, new File(configDir, "friends.json")); - config = new MooConfig(this, new Configuration(new File(configDir, MODID + ".cfg"))); - - chatHelper = new ChatHelper(); + moo = new CredentialStorage(new Configuration(new File(configDir, "do-not-share-me-with-other-players.cfg"))); + config = new MooConfig(this, new Configuration(new File(configDir, MODID + ".cfg"), "1")); } @EventHandler @@ -77,7 +77,7 @@ public class Cowlection { } // key bindings keyBindings = new KeyBinding[1]; - keyBindings[0] = new KeyBinding("key.cowlection.moo.desc", Keyboard.KEY_M, "key.cowlection.category"); + keyBindings[0] = new KeyBinding("key.cowlection.moo", Keyboard.KEY_M, "key.cowlection.category"); for (KeyBinding keyBinding : keyBindings) { ClientRegistry.registerKeyBinding(keyBinding); diff --git a/src/main/java/de/cowtipper/cowlection/command/MooCommand.java b/src/main/java/de/cowtipper/cowlection/command/MooCommand.java index 6be1a6c..881a446 100644 --- a/src/main/java/de/cowtipper/cowlection/command/MooCommand.java +++ b/src/main/java/de/cowtipper/cowlection/command/MooCommand.java @@ -5,9 +5,9 @@ import de.cowtipper.cowlection.Cowlection; import de.cowtipper.cowlection.command.exception.ApiContactException; import de.cowtipper.cowlection.command.exception.InvalidPlayerNameException; import de.cowtipper.cowlection.command.exception.MooCommandException; -import de.cowtipper.cowlection.config.DungeonOverlayGuiConfig; +import de.cowtipper.cowlection.config.CredentialStorage; import de.cowtipper.cowlection.config.MooConfig; -import de.cowtipper.cowlection.config.MooGuiConfig; +import de.cowtipper.cowlection.config.gui.MooConfigGui; import de.cowtipper.cowlection.data.*; import de.cowtipper.cowlection.data.HySkyBlockStats.Profile.Pet; import de.cowtipper.cowlection.handler.DungeonCache; @@ -15,6 +15,7 @@ import de.cowtipper.cowlection.search.GuiSearch; import de.cowtipper.cowlection.util.*; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.settings.GameSettings; import net.minecraft.command.*; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityArmorStand; @@ -79,12 +80,7 @@ public class MooCommand extends CommandBase { } else if (args[0].equalsIgnoreCase("list")) { handleListBestFriends(); } else if (args[0].equalsIgnoreCase("online")) { - if (main.getFriendsHandler().getBestFriends().size() > 0) { - main.getChatHelper().sendMessage(EnumChatFormatting.GRAY, "Checking online status of " + EnumChatFormatting.WHITE + main.getFriendsHandler().getBestFriends().size() + EnumChatFormatting.GRAY + " best friends. This may take a few seconds."); - main.getFriendsHandler().runBestFriendsOnlineCheck(true); - } else { - main.getChatHelper().sendMessage(EnumChatFormatting.RED, "You haven't added anyone to your best friends list yet. Do so with " + EnumChatFormatting.WHITE + "/moo add <playerName>"); - } + handleBestFriendsOnlineCheck(); } else if (args[0].equalsIgnoreCase("nameChangeCheck")) { handleNameChangeCheck(args); } @@ -100,14 +96,11 @@ public class MooCommand extends CommandBase { handleAnalyzeIsland(sender); } else if (args[0].equalsIgnoreCase("dungeon") || args[0].equalsIgnoreCase("dung")) { handleDungeon(args); - } else if (args[0].equalsIgnoreCase("dungeonGui") || args[0].equalsIgnoreCase("guiDungeon") - || args[0].equalsIgnoreCase("guiDung") || args[0].equalsIgnoreCase("dungGui")) { - displayGuiScreen(new DungeonOverlayGuiConfig(main)); } //endregion //region sub-commands: miscellaneous - else if (args[0].equalsIgnoreCase("config") || args[0].equalsIgnoreCase("toggle")) { - displayGuiScreen(new MooGuiConfig(null)); + else if (args[0].equalsIgnoreCase("config")) { + displayGuiScreen(new MooConfigGui()); } else if (args[0].equalsIgnoreCase("search")) { displayGuiScreen(new GuiSearch(main.getConfigDirectory(), CommandBase.buildString(args, 1))); } else if (args[0].equalsIgnoreCase("guiscale")) { @@ -278,6 +271,18 @@ public class MooCommand extends CommandBase { : EnumChatFormatting.DARK_GREEN + String.join(EnumChatFormatting.GREEN + ", " + EnumChatFormatting.DARK_GREEN, bestFriends))); } + private void handleBestFriendsOnlineCheck() throws MooCommandException { + if (!CredentialStorage.isMooValid) { + throw new MooCommandException("You haven't set your Hypixel API key yet or the API key is invalid. Use " + EnumChatFormatting.DARK_RED + "/api new" + EnumChatFormatting.RED + " to request a new API key from Hypixel or use " + EnumChatFormatting.DARK_RED + "/" + this.getCommandName() + " apikey <key>" + EnumChatFormatting.RED + " to manually set your existing API key."); + } + if (main.getFriendsHandler().getBestFriends().size() > 0) { + main.getChatHelper().sendMessage(EnumChatFormatting.GRAY, "Checking online status of " + EnumChatFormatting.WHITE + main.getFriendsHandler().getBestFriends().size() + EnumChatFormatting.GRAY + " best friends. This may take a few seconds."); + main.getFriendsHandler().runBestFriendsOnlineCheck(true); + } else { + main.getChatHelper().sendMessage(EnumChatFormatting.RED, "You haven't added anyone to your best friends list yet. Do so with " + EnumChatFormatting.WHITE + "/moo add <playerName>"); + } + } + private void handleNameChangeCheck(String[] args) throws CommandException { if (args.length != 2) { throw new WrongUsageException("/" + getCommandName() + " nameChangeCheck <playerName>"); @@ -562,20 +567,24 @@ public class MooCommand extends CommandBase { private void handleDungeon(String[] args) throws MooCommandException { DungeonCache dungeonCache = main.getDungeonCache(); - if (args.length == 2 && args[1].equalsIgnoreCase("gui")) { - // edit dungeon gui - displayGuiScreen(new DungeonOverlayGuiConfig(main)); + if (args.length == 2 && args[1].equalsIgnoreCase("enter")) { + // enter dungeon in case for some reason it wasn't detected automatically + dungeonCache.onDungeonEnterOrLeave(true); + } else if (args.length == 2 && args[1].equalsIgnoreCase("leave")) { + // leave dungeon in case for some reason it wasn't detected automatically + dungeonCache.onDungeonEnterOrLeave(false); } else if (dungeonCache.isInDungeon()) { dungeonCache.sendDungeonPerformance(); } else { - throw new MooCommandException(EnumChatFormatting.DARK_RED + "Looks like you're not in a dungeon... However, you can edit the Dungeon Performance overlay with " + EnumChatFormatting.RED + "/" + getCommandName() + " dungeon gui"); + throw new MooCommandException(EnumChatFormatting.DARK_RED + "Looks like you're not in a dungeon... However, you can manually enable the Dungeon Performance overlay with " + EnumChatFormatting.RED + "/" + getCommandName() + " dungeon enter" + EnumChatFormatting.DARK_RED + ". You can also force-leave a dungeon with " + EnumChatFormatting.RED + "/" + getCommandName() + " leave"); } } //endregion //region sub-commands: miscellaneous private void handleGuiScale(String[] args) throws CommandException { - int currentGuiScale = (Minecraft.getMinecraft()).gameSettings.guiScale; + GameSettings gameSettings = Minecraft.getMinecraft().gameSettings; + int currentGuiScale = gameSettings.guiScale; if (args.length == 1) { main.getChatHelper().sendMessage(EnumChatFormatting.GREEN, "\u279C Current GUI scale: " + EnumChatFormatting.DARK_GREEN + currentGuiScale); } else { @@ -583,7 +592,8 @@ public class MooCommand extends CommandBase { if (scale == -1 || scale > 10) { throw new NumberInvalidException(EnumChatFormatting.DARK_RED + args[1] + EnumChatFormatting.RED + " is an invalid GUI scale value. Valid values are integers below 10"); } - Minecraft.getMinecraft().gameSettings.guiScale = scale; + gameSettings.guiScale = scale; + gameSettings.saveOptions(); main.getChatHelper().sendMessage(EnumChatFormatting.GREEN, "\u2714 New GUI scale: " + EnumChatFormatting.DARK_GREEN + scale + EnumChatFormatting.GREEN + " (previous: " + EnumChatFormatting.DARK_GREEN + currentGuiScale + EnumChatFormatting.GREEN + ")"); } } @@ -598,7 +608,7 @@ public class MooCommand extends CommandBase { color = EnumChatFormatting.GREEN; colorSecondary = EnumChatFormatting.DARK_GREEN; } else { - firstSentence = "You haven't set your Hypixel API key yet."; + firstSentence = "You haven't set your Hypixel API key yet or the API key is invalid."; color = EnumChatFormatting.RED; colorSecondary = EnumChatFormatting.DARK_RED; } @@ -659,21 +669,20 @@ public class MooCommand extends CommandBase { private void sendCommandUsage(ICommandSender sender) { IChatComponent usage = new MooChatComponent("\u279C " + Cowlection.MODNAME + " commands:").gold().bold() + .appendSibling(createCmdHelpEntry("config", "Open mod's configuration")) + .appendSibling(new MooChatComponent("\n").reset().gray().appendText(EnumChatFormatting.DARK_GREEN + " ❢" + EnumChatFormatting.GRAY + EnumChatFormatting.ITALIC + " Commands marked with §d§l⚷" + EnumChatFormatting.GRAY + EnumChatFormatting.ITALIC + " require a valid API key")) .appendSibling(createCmdHelpSection(1, "Best friends, friends & other players")) - .appendSibling(createCmdHelpEntry("stalk", "Get info of player's status")) + .appendSibling(createCmdHelpEntry("stalk", "Get info of player's status §d§l⚷")) .appendSibling(createCmdHelpEntry("add", "Add best friends")) .appendSibling(createCmdHelpEntry("remove", "Remove best friends")) .appendSibling(createCmdHelpEntry("list", "View list of best friends")) - .appendSibling(createCmdHelpEntry("online", "View list of best friends that are currently online")) + .appendSibling(createCmdHelpEntry("online", "View list of best friends that are currently online §d§l⚷")) .appendSibling(createCmdHelpEntry("nameChangeCheck", "Force a scan for a changed name of a best friend (is done automatically as well)")) - .appendSibling(createCmdHelpEntry("toggle", "Toggle join/leave notifications")) .appendSibling(createCmdHelpSection(2, "SkyBlock")) - .appendSibling(createCmdHelpEntry("stalkskyblock", "Get info of player's SkyBlock stats")) + .appendSibling(createCmdHelpEntry("stalkskyblock", "Get info of player's SkyBlock stats §d§l⚷")) .appendSibling(createCmdHelpEntry("analyzeIsland", "Analyze a SkyBlock private island")) .appendSibling(createCmdHelpEntry("dungeon", "SkyBlock Dungeons: display current dungeon performance")) - .appendSibling(createCmdHelpEntry("dungeonGui", "SkyBlock Dungeons: edit dungeon performance GUI")) .appendSibling(createCmdHelpSection(3, "Miscellaneous")) - .appendSibling(createCmdHelpEntry("config", "Open mod's configuration")) .appendSibling(createCmdHelpEntry("search", "Open Minecraft log search")) .appendSibling(createCmdHelpEntry("guiScale", "Change GUI scale")) .appendSibling(createCmdHelpEntry("rr", "Alias for /r without auto-replacement to /msg")) @@ -706,8 +715,8 @@ public class MooCommand extends CommandBase { public List<String> addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) { if (args.length == 1) { return getListOfStringsMatchingLastWord(args, - /* Best friends, friends & other players */ "stalk", "add", "remove", "list", "online", "nameChangeCheck", "toggle", - /* SkyBlock */ "stalkskyblock", "skyblockstalk", "analyzeIsland", "dungeon", "dungeonGui", "guiDungeon", + /* Best friends, friends & other players */ "stalk", "add", "remove", "list", "online", "nameChangeCheck", + /* SkyBlock */ "stalkskyblock", "skyblockstalk", "analyzeIsland", "dungeon", /* miscellaneous */ "config", "search", "guiscale", "rr", "shrug", "apikey", /* update mod */ "update", "updateHelp", "version", "directory", /* help */ "help", diff --git a/src/main/java/de/cowtipper/cowlection/command/exception/ApiContactException.java b/src/main/java/de/cowtipper/cowlection/command/exception/ApiContactException.java index 09a04a0..f601e3e 100644 --- a/src/main/java/de/cowtipper/cowlection/command/exception/ApiContactException.java +++ b/src/main/java/de/cowtipper/cowlection/command/exception/ApiContactException.java @@ -1,7 +1,12 @@ package de.cowtipper.cowlection.command.exception; +import de.cowtipper.cowlection.Cowlection; + public class ApiContactException extends MooCommandException { public ApiContactException(String api, String failedAction) { super("Sorry, couldn't contact the " + api + " API and thus " + failedAction); + if (api.equals("Hypixel") && failedAction.contains("Invalid API key")) { + Cowlection.getInstance().getMoo().setMooValidity(false); + } } } diff --git a/src/main/java/de/cowtipper/cowlection/config/DungeonOverlayGuiConfig.java b/src/main/java/de/cowtipper/cowlection/config/DungeonOverlayGuiConfig.java deleted file mode 100644 index 18478f5..0000000 --- a/src/main/java/de/cowtipper/cowlection/config/DungeonOverlayGuiConfig.java +++ /dev/null @@ -1,129 +0,0 @@ -package de.cowtipper.cowlection.config; - -import de.cowtipper.cowlection.Cowlection; -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.util.EnumChatFormatting; -import net.minecraftforge.fml.client.config.GuiButtonExt; -import net.minecraftforge.fml.client.config.GuiCheckBox; -import net.minecraftforge.fml.client.config.GuiSlider; -import org.apache.commons.lang3.StringUtils; -import org.lwjgl.input.Keyboard; - -import java.io.IOException; - -public class DungeonOverlayGuiConfig extends GuiScreen { - private final Cowlection main; - private GuiCheckBox checkBoxShowOverlay; - private GuiSlider sliderX; - private GuiSlider sliderY; - private GuiSlider sliderGuiScale; - private GuiButtonExt buttonCancel; - private GuiButtonExt buttonSave; - private final boolean wasDungOverlayEnabled; - private final int previousPositionX; - private final int previousPositionY; - private final int previousGuiScale; - - public DungeonOverlayGuiConfig(Cowlection main) { - this.main = main; - wasDungOverlayEnabled = MooConfig.dungOverlayEnabled; - previousPositionX = MooConfig.dungOverlayPositionX; - previousPositionY = MooConfig.dungOverlayPositionY; - previousGuiScale = MooConfig.dungOverlayGuiScale; - } - - @Override - public void initGui() { - int maxX = this.width - fontRendererObj.getStringWidth(StringUtils.repeat('#', 15)); - int maxY = this.height - fontRendererObj.FONT_HEIGHT * 5; // 5 = max lines output - int startX = Math.min(maxX, this.previousPositionX); - int startY = Math.min(maxY, this.previousPositionY); - - this.buttonList.add(this.checkBoxShowOverlay = new GuiCheckBox(30, this.width / 2 - 50, this.height / 2 - 30, " Show overlay", MooConfig.dungOverlayEnabled)); - this.buttonList.add(sliderX = new GuiSlider(20, this.width / 2 - 150, this.height / 2 - 12, 300, 20, "x = ", "", 0, maxX, startX, false, true)); - this.buttonList.add(sliderY = new GuiSlider(21, this.width / 2 - 150, this.height / 2 + 12, 300, 20, "y = ", "", 0, maxY, startY, false, true)); - this.buttonList.add(sliderGuiScale = new GuiSlider(22, this.width / 2 - 100, this.height / 2 + 37, 200, 20, "GUI scale: ", "%", 50, 200, MooConfig.dungOverlayGuiScale, false, true)); - this.buttonList.add(this.buttonCancel = new GuiButtonExt(31, this.width / 2 - 150, this.height / 2 + 65, 80, 20, EnumChatFormatting.RED + "Cancel")); - this.buttonList.add(this.buttonSave = new GuiButtonExt(32, this.width / 2 + 70, this.height / 2 + 65, 80, 20, EnumChatFormatting.GREEN + "Save")); - if (!MooConfig.dungOverlayEnabled) { - sliderX.enabled = false; - sliderY.enabled = false; - sliderGuiScale.enabled = false; - } - } - - @Override - public void drawScreen(int mouseX, int mouseY, float partialTicks) { - // draw background - int padding = 20; - this.drawGradientRect(this.width / 2 - 150 - padding, this.height / 2 - 40 - fontRendererObj.FONT_HEIGHT - padding, - this.width / 2 + 150 + padding, this.height / 2 + 65 + 20 + fontRendererObj.FONT_HEIGHT + padding, - -1072689136, -804253680); - - // draw gui elements - String title = "Dungeon Performance Overlay Settings"; - this.drawCenteredString(this.fontRendererObj, EnumChatFormatting.BOLD + title, this.width / 2, this.height / 2 - 40 - fontRendererObj.FONT_HEIGHT, 0x00ffffff); - - GlStateManager.pushMatrix(); - float scaleFactor = 0.75f; - GlStateManager.scale(scaleFactor, scaleFactor, 0); - String hint = "(" + EnumChatFormatting.GOLD + EnumChatFormatting.ITALIC + "Note: " + EnumChatFormatting.RESET + "Destroyed Crypts can only be detected up to ~50 blocks away from the player)"; - this.drawCenteredString(this.fontRendererObj, hint, (int) ((this.width / 2) * (1 / scaleFactor)), (int) ((this.height / 2 + 95) * (1 / scaleFactor)), 0x00cccccc); - GlStateManager.popMatrix(); - - super.drawScreen(mouseX, mouseY, partialTicks); - - if (checkBoxShowOverlay.enabled) { - MooConfig.dungOverlayPositionX = sliderX.getValueInt(); - MooConfig.dungOverlayPositionY = sliderY.getValueInt(); - MooConfig.dungOverlayGuiScale = sliderGuiScale.getValueInt(); - } - } - - @Override - protected void keyTyped(char typedChar, int keyCode) throws IOException { - if (keyCode == Keyboard.KEY_ESCAPE) { - resetDungeonOverlayPosition(); - } - super.keyTyped(typedChar, keyCode); - } - - @Override - protected void actionPerformed(GuiButton button) throws IOException { - if (button == buttonCancel) { - resetDungeonOverlayPosition(); - closeGui(); - } else if (button == buttonSave) { - if (wasDungOverlayEnabled != checkBoxShowOverlay.isChecked() || previousPositionX != sliderX.getValueInt() || previousPositionY != sliderY.getValueInt() || previousGuiScale != sliderGuiScale.getValueInt()) { - main.getConfig().syncFromFields(); - if (wasDungOverlayEnabled != checkBoxShowOverlay.isChecked()) { - main.getChatHelper().sendMessage(EnumChatFormatting.GREEN, "The dungeon performance overlay is now " + (checkBoxShowOverlay.isChecked() ? EnumChatFormatting.DARK_GREEN + "enabled" : EnumChatFormatting.DARK_RED + "disabled")); - } else { - main.getChatHelper().sendMessage(EnumChatFormatting.GREEN, "Saved new size and position of the dungeon performance overlay!"); - } - } - closeGui(); - } else if (button == checkBoxShowOverlay) { - sliderX.enabled = checkBoxShowOverlay.isChecked(); - sliderY.enabled = checkBoxShowOverlay.isChecked(); - sliderGuiScale.enabled = checkBoxShowOverlay.isChecked(); - MooConfig.dungOverlayEnabled = checkBoxShowOverlay.isChecked(); - } - } - - private void resetDungeonOverlayPosition() { - MooConfig.dungOverlayEnabled = wasDungOverlayEnabled; - MooConfig.dungOverlayPositionX = previousPositionX; - MooConfig.dungOverlayPositionY = previousPositionY; - MooConfig.dungOverlayGuiScale = previousGuiScale; - } - - private void closeGui() { - this.mc.displayGuiScreen(null); - if (this.mc.currentScreen == null) { - this.mc.setIngameFocus(); - } - } -} diff --git a/src/main/java/de/cowtipper/cowlection/config/MooConfig.java b/src/main/java/de/cowtipper/cowlection/config/MooConfig.java index 0a498dd..1d8b4ee 100644 --- a/src/main/java/de/cowtipper/cowlection/config/MooConfig.java +++ b/src/main/java/de/cowtipper/cowlection/config/MooConfig.java @@ -2,78 +2,122 @@ package de.cowtipper.cowlection.config; import de.cowtipper.cowlection.Cowlection; import de.cowtipper.cowlection.command.TabCompletableCommand; +import de.cowtipper.cowlection.config.gui.MooConfigGui; +import de.cowtipper.cowlection.config.gui.MooConfigPreview; +import de.cowtipper.cowlection.data.DataHelper; +import de.cowtipper.cowlection.util.MooChatComponent; import de.cowtipper.cowlection.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.command.ICommand; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagInt; +import net.minecraft.nbt.NBTTagString; +import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; import net.minecraft.util.Util; import net.minecraftforge.client.ClientCommandHandler; import net.minecraftforge.common.ForgeModContainer; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.config.ConfigCategory; import net.minecraftforge.common.config.Configuration; import net.minecraftforge.common.config.Property; -import net.minecraftforge.fml.client.FMLConfigGuiFactory; import net.minecraftforge.fml.client.event.ConfigChangedEvent; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.lwjgl.input.Keyboard; import java.io.File; import java.time.LocalDate; import java.time.format.DateTimeParseException; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.regex.Pattern; /** - * Mod configuration via ingame gui + * Mod configuration * <p> * Based on <a href="https://github.com/TheGreyGhost/MinecraftByExample/blob/1-8-9final/src/main/java/minecraftbyexample/mbe70_configuration/MBEConfiguration.java">TheGreyGhost's MinecraftByExample</a> * * @see ForgeModContainer - * @see FMLConfigGuiFactory */ public class MooConfig { - static final String CATEGORY_LOGS_SEARCH = "logssearch"; - // main config + // Category: General + private static String configGuiExplanations; + public static String[] tabCompletableNamesCommands; + private static final String CATEGORY_LOGS_SEARCH = "logssearch"; + public static String[] logsDirs; + private static String defaultStartDate; + // Category: Notifications public static boolean doUpdateCheck; public static boolean showBestFriendNotifications; public static boolean showFriendNotifications; public static boolean showGuildNotifications; public static boolean doBestFriendsOnlineCheck; - public static boolean showAdvancedTooltips; - public static String[] tabCompletableNamesCommands; + // Category: SkyBlock + public static int tooltipToggleKeyBinding; + private static String tooltipAuctionHousePriceEach; + private static String tooltipItemAge; + public static boolean tooltipItemAgeShortened; + private static String tooltipItemTimestamp; private static String numeralSystem; - // SkyBlock dungeon - public static int[] dungClassRange; - public static boolean dungFilterPartiesWithDupes; - public static String dungPartyFinderArmorLookup; - public static String dungItemQualityPos; + // Category: SkyBlock Dungeons + public static int dungItemToolTipToggleKeyBinding; + private static String dungItemQualityPos; public static boolean dungOverlayEnabled; - public static int dungOverlayGuiScale; public static int dungOverlayPositionX; public static int dungOverlayPositionY; - // logs search config - public static String[] logsDirs; - private static String defaultStartDate; - // other stuff - public static String moo; + public static int dungOverlayGuiScale; + public static boolean dungOverlayTextShadow; + public static int dungClassMin; + public static boolean dungFilterPartiesWithArcherDupes; + public static boolean dungFilterPartiesWithBerserkDupes; + public static boolean dungFilterPartiesWithHealerDupes; + public static boolean dungFilterPartiesWithMageDupes; + public static boolean dungFilterPartiesWithTankDupes; + private static String dungPartyFinderArmorLookup; + private static Configuration cfg = null; + private static final List<MooConfigCategory> configCategories = new ArrayList<>(); private final Cowlection main; - private List<String> propOrderGeneral; - private List<String> propOrderLogsSearch; + private Property propTabCompletableNamesCommands; + private List<Property> logSearchProperties; public MooConfig(Cowlection main, Configuration configuration) { this.main = main; cfg = configuration; + + if (cfg.getLoadedConfigVersion() == null || !cfg.getLoadedConfigVersion().equals(cfg.getDefinedConfigVersion())) { + updateConfig(cfg.getLoadedConfigVersion()); + } + initConfig(); } - static Configuration getConfig() { - return cfg; + private void updateConfig(String oldVersion) { + if (oldVersion == null) { + // config of Cowlection v1.8.9-0.10.2 and older + + // leave log search settings as is + + if (cfg.hasCategory(Configuration.CATEGORY_CLIENT)) { + // copy old 'moo' value to new, separate config + if (cfg.hasKey(Configuration.CATEGORY_CLIENT, "moo")) { + String oldMoo = cfg.getString("moo", Configuration.CATEGORY_CLIENT, "00000000-0000-0000-0000-000000000000", "Temporary config entry, should be deleted automatically.", Utils.VALID_UUID_PATTERN); + if (StringUtils.isNotEmpty(oldMoo) && Utils.isValidUuid(oldMoo)) { + // save into new cfg: + main.getMoo().setMooIfValid(oldMoo, false); + } + } + |
