aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCow <cow@volloeko.de>2020-09-24 17:58:17 +0200
committerCow <cow@volloeko.de>2020-09-24 17:58:17 +0200
commit7d4f2b900254d961b847f573237e3e6f40bff8e9 (patch)
tree8fa85fc9212ffc9b8a16796c682d87667ec294a5
parent705299e37d27d421156a09213e0654d0ab4fb01c (diff)
downloadCowlection-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
-rw-r--r--CHANGELOG.md15
-rw-r--r--README.md7
-rw-r--r--src/main/java/de/cowtipper/cowlection/Cowlection.java10
-rw-r--r--src/main/java/de/cowtipper/cowlection/command/MooCommand.java65
-rw-r--r--src/main/java/de/cowtipper/cowlection/command/exception/ApiContactException.java5
-rw-r--r--src/main/java/de/cowtipper/cowlection/config/DungeonOverlayGuiConfig.java129
-rw-r--r--src/main/java/de/cowtipper/cowlection/config/MooConfig.java614
-rw-r--r--src/main/java/de/cowtipper/cowlection/config/MooGuiConfig.java85
-rw-r--r--src/main/java/de/cowtipper/cowlection/config/MooGuiFactory.java29
-rw-r--r--src/main/java/de/cowtipper/cowlection/config/gui/MooConfigCategoryScrolling.java856
-rw-r--r--src/main/java/de/cowtipper/cowlection/config/gui/MooConfigGui.java206
-rw-r--r--src/main/java/de/cowtipper/cowlection/config/gui/MooConfigMenuList.java70
-rw-r--r--src/main/java/de/cowtipper/cowlection/config/gui/MooConfigPreview.java175
-rw-r--r--src/main/java/de/cowtipper/cowlection/data/DataHelper.java22
-rw-r--r--src/main/java/de/cowtipper/cowlection/data/HyApiKey.java20
-rw-r--r--src/main/java/de/cowtipper/cowlection/handler/FriendsHandler.java6
-rw-r--r--src/main/java/de/cowtipper/cowlection/listener/ChatListener.java11
-rw-r--r--src/main/java/de/cowtipper/cowlection/listener/PlayerListener.java29
-rw-r--r--src/main/java/de/cowtipper/cowlection/listener/skyblock/DungeonsListener.java130
-rw-r--r--src/main/java/de/cowtipper/cowlection/listener/skyblock/SkyBlockListener.java41
-rw-r--r--src/main/java/de/cowtipper/cowlection/search/GuiSearch.java45
-rw-r--r--src/main/java/de/cowtipper/cowlection/search/LogFilesSearcher.java4
-rw-r--r--src/main/java/de/cowtipper/cowlection/util/ApiUtils.java16
-rw-r--r--src/main/java/de/cowtipper/cowlection/util/Utils.java2
-rw-r--r--src/main/resources/assets/cowlection/lang/en_US.lang76
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
diff --git a/README.md b/README.md
index 2687fca..1661b74 100644
--- a/README.md
+++ b/README.md
@@ -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` &rarr; 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` &rarr; `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);
+ }
+ }
+