From effb8c31bdc1188d7ecdc66e4b0398ba24ed402e Mon Sep 17 00:00:00 2001 From: olim Date: Tue, 6 Feb 2024 15:00:20 +0000 Subject: initial implimentation basic implantation of features. --- src/main/resources/assets/skyblocker/lang/en_us.json | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/main/resources') diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index f17f109e..bdbc51dd 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -130,6 +130,10 @@ "text.autoconfig.skyblocker.option.general.flameOverlay": "Flame Overlay", "text.autoconfig.skyblocker.option.general.flameOverlay.flameHeight": "Flame Height", "text.autoconfig.skyblocker.option.general.flameOverlay.flameOpacity": "Flame Opacity", + "text.autoconfig.skyblocker.option.general.searchOverlay": "Search Overlay", + "text.autoconfig.skyblocker.option.general.searchOverlay.enableBazaar": "Enable For Bazaar", + "text.autoconfig.skyblocker.option.general.searchOverlay.enableAuctionHouse": "Enable For Auction House", + "text.autoconfig.skyblocker.option.general.searchOverlay.maxSuggestions": "Maximum Suggestions", "text.autoconfig.skyblocker.option.general.betterPartyFinder": "Better Party Finder", "skyblocker.itemTooltip.nullMessage": "§cItem price information on tooltip will renew in max 60 seconds. If not, check latest.log", "skyblocker.itemTooltip.noData": "§cNo Data", -- cgit From 3e07ab5081136959990e3a019368ea43e481ca28 Mon Sep 17 00:00:00 2001 From: olim Date: Tue, 6 Feb 2024 17:27:38 +0000 Subject: add History add history options to the search overlay --- .../hysky/skyblocker/config/SkyblockerConfig.java | 9 +++++ .../config/categories/GeneralCategory.java | 9 ++++- .../skyblock/searchOverlay/OverlayScreen.java | 39 +++++++++++++++++++--- .../skyblock/searchOverlay/SearchOverManager.java | 34 +++++++++++++++++++ .../resources/assets/skyblocker/lang/en_us.json | 1 + 5 files changed, 87 insertions(+), 5 deletions(-) (limited to 'src/main/resources') diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java index 714229dc..7f945035 100644 --- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java @@ -423,6 +423,15 @@ public class SkyblockerConfig { @SerialEntry public int maxSuggestions = 3; + + @SerialEntry + public int historyLength = 3; + + @SerialEntry + public List bazaarHistory = new ArrayList<>(); + + @SerialEntry + public List auctionHistory = new ArrayList<>(); } public static class TeleportOverlay { diff --git a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java index a9b965cf..f4674c2e 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java @@ -665,7 +665,14 @@ public class GeneralCategory { .binding(defaults.general.searchOverlay.maxSuggestions, () -> config.general.searchOverlay.maxSuggestions, newValue -> config.general.searchOverlay.maxSuggestions = newValue) - .controller(opt -> IntegerSliderControllerBuilder.create(opt).range(0, 5 ).step(1)) + .controller(opt -> IntegerSliderControllerBuilder.create(opt).range(0, 5).step(1)) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.historyLength")) + .binding(defaults.general.searchOverlay.historyLength, + () -> config.general.searchOverlay.historyLength, + newValue -> config.general.searchOverlay.historyLength = newValue) + .controller(opt -> IntegerSliderControllerBuilder.create(opt).range(0, 5).step(1)) .build()) .build()) .build(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java index 136edb40..7da23168 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java @@ -20,7 +20,9 @@ public class OverlayScreen extends Screen { private TextFieldWidget searchField; private ButtonWidget finishedButton; private ButtonWidget[] suggestionButtons; - //todo history buttons + private ButtonWidget[] historyButtons; + + public OverlayScreen(Text title) { super(title); @@ -32,7 +34,7 @@ public class OverlayScreen extends Screen { int rowWidth = (int)(this.width * 0.33); int startX = (int)(this.width * 0.5) - rowWidth/2; - int startY = (int)(this.height * 0.5)- (rowHeight * (1+ SkyblockerConfigManager.get().general.searchOverlay.maxSuggestions)) /2; + int startY = (int) ((int)(this.height * 0.5)- (rowHeight * (1+ SkyblockerConfigManager.get().general.searchOverlay.maxSuggestions + 0.75 + SkyblockerConfigManager.get().general.searchOverlay.historyLength)) /2); // Search field this.searchField = new TextFieldWidget(textRenderer, startX, startY, rowWidth - rowHeight, rowHeight, Text.literal("Search...")); @@ -41,12 +43,13 @@ public class OverlayScreen extends Screen { // finish buttons - finishedButton = ButtonWidget.builder(Text.literal("").setStyle(Style.EMPTY.withColor(Formatting.GREEN)), (a) -> { + finishedButton = ButtonWidget.builder(Text.literal("").setStyle(Style.EMPTY.withColor(Formatting.GREEN)), (a) -> { close(); }) .position(startX + rowWidth - rowHeight, startY) .size(rowHeight, rowHeight).build(); // suggested item buttons + int rowOffset = rowHeight; int totalSuggestions = SkyblockerConfigManager.get().general.searchOverlay.maxSuggestions; this.suggestionButtons = new ButtonWidget[totalSuggestions]; for (int i = 0; i < totalSuggestions; i++) { @@ -54,15 +57,39 @@ public class OverlayScreen extends Screen { SearchOverManager.updateSearch(a.getMessage().getString()); close(); }) - .position(startX , startY + rowHeight * (i+1)) + .position(startX , startY + rowOffset) .size(rowWidth, rowHeight).build(); suggestionButtons[i].visible = false; + rowOffset += rowHeight; + } + // history item buttons + rowOffset += (int) (rowHeight * 0.75); + int historyLength = SkyblockerConfigManager.get().general.searchOverlay.historyLength; //todo look different + this.historyButtons = new ButtonWidget[historyLength]; + for (int i = 0; i < historyLength; i++) { + String text = SearchOverManager.getHistory(i); + if (text != null){ + historyButtons[i] = ButtonWidget.builder(Text.literal(text).setStyle(Style.EMPTY), (a) -> { + SearchOverManager.updateSearch(a.getMessage().getString()); + close(); + }) + .position(startX , startY + rowOffset) + .size(rowWidth, rowHeight).build(); + rowOffset += rowHeight; + }else{ + break; + } } addDrawableChild(searchField); for (ButtonWidget suggestion : suggestionButtons){ addDrawableChild(suggestion); } + for (ButtonWidget historyOption : historyButtons){ + if (historyOption != null){ + addDrawableChild(historyOption); + } + } addDrawableChild(finishedButton); } @@ -71,6 +98,10 @@ public class OverlayScreen extends Screen { public void render(DrawContext context, int mouseX, int mouseY, float delta) { super.render(context, mouseX, mouseY, delta); context.drawGuiTexture(SEARCH_ICON_TEXTURE, finishedButton.getX() + 2, finishedButton.getY() + 2, 16, 16); //todo rowHeight -4 + if(historyButtons.length > 0 ){ + context.drawText(textRenderer, "History:", historyButtons[0].getX()+2, historyButtons[0].getY() - 10, 0xFFFFFFFF, true); //todo load form en_us and rowHeight + } + } @Override diff --git a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java index 5846dbf3..e8f78229 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -107,8 +107,42 @@ public class SearchOverManager { return ""; } } + protected static String getHistory(int index){ + if (IsAuction){ + if (SkyblockerConfigManager.get().general.searchOverlay.auctionHistory.size() >index){ + return SkyblockerConfigManager.get().general.searchOverlay.auctionHistory.get(index); + } + + }else{ + if (SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory.size() >index){ + return SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory.get(index); + } + } + return null; + + } + private static void saveHistory(){ + //save to history + int historyLength = SkyblockerConfigManager.get().general.searchOverlay.historyLength; + if (IsAuction){ + SkyblockerConfigManager.get().general.searchOverlay.auctionHistory.add(0,search); + if (SkyblockerConfigManager.get().general.searchOverlay.auctionHistory.size() >historyLength) { + SkyblockerConfigManager.get().general.searchOverlay.auctionHistory = SkyblockerConfigManager.get().general.searchOverlay.auctionHistory.subList(0, historyLength); + } + }else{ + SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory.add(0,search); + if (SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory.size() >historyLength) { + SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory = SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory.subList(0, historyLength); + } + } + SkyblockerConfigManager.save(); + } protected static void pushSearch() { + //save to history + if (!search.isEmpty()){ + saveHistory(); + } //splits text into 2 lines max = 30 chars StringBuilder line0 = new StringBuilder(); String line1; diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index bdbc51dd..d14a08fb 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -134,6 +134,7 @@ "text.autoconfig.skyblocker.option.general.searchOverlay.enableBazaar": "Enable For Bazaar", "text.autoconfig.skyblocker.option.general.searchOverlay.enableAuctionHouse": "Enable For Auction House", "text.autoconfig.skyblocker.option.general.searchOverlay.maxSuggestions": "Maximum Suggestions", + "text.autoconfig.skyblocker.option.general.searchOverlay.historyLength": "Saved Search History Length", "text.autoconfig.skyblocker.option.general.betterPartyFinder": "Better Party Finder", "skyblocker.itemTooltip.nullMessage": "§cItem price information on tooltip will renew in max 60 seconds. If not, check latest.log", "skyblocker.itemTooltip.noData": "§cNo Data", -- cgit From 6be6e2ee6b97d9807536d2205401dbfa963dce82 Mon Sep 17 00:00:00 2001 From: olim Date: Tue, 6 Feb 2024 19:39:16 +0000 Subject: Added keep previous search added option to keep the previous search --- .../java/de/hysky/skyblocker/config/SkyblockerConfig.java | 3 +++ .../hysky/skyblocker/config/categories/GeneralCategory.java | 7 +++++++ .../skyblocker/skyblock/searchOverlay/OverlayScreen.java | 1 + .../skyblocker/skyblock/searchOverlay/SearchOverManager.java | 11 ++++++++++- src/main/resources/assets/skyblocker/lang/en_us.json | 1 + 5 files changed, 22 insertions(+), 1 deletion(-) (limited to 'src/main/resources') diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java index 7f945035..7a9cb721 100644 --- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java @@ -421,6 +421,9 @@ public class SkyblockerConfig { @SerialEntry public boolean enableAuctionHouse = true; + @SerialEntry + public boolean keepPreviousSearches = false; + @SerialEntry public int maxSuggestions = 3; diff --git a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java index f4674c2e..3618f112 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java @@ -660,6 +660,13 @@ public class GeneralCategory { newValue -> config.general.searchOverlay.enableAuctionHouse = newValue) .controller(ConfigUtils::createBooleanController) .build()) + .option(Option.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.keepPreviousSearches")) + .binding(defaults.general.searchOverlay.keepPreviousSearches, + () -> config.general.searchOverlay.keepPreviousSearches, + newValue -> config.general.searchOverlay.keepPreviousSearches = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.maxSuggestions")) .binding(defaults.general.searchOverlay.maxSuggestions, diff --git a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java index cf9a57f3..d6d7584e 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java @@ -38,6 +38,7 @@ public class OverlayScreen extends Screen { // Search field this.searchField = new TextFieldWidget(textRenderer, startX, startY, rowWidth - rowHeight, rowHeight, Text.literal("Search...")); + searchField.setText(SearchOverManager.search); searchField.setChangedListener(SearchOverManager::updateSearch); searchField.setMaxLength(30); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java index 87f4a27f..e3b818d5 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -95,7 +95,16 @@ public class SearchOverManager { SignFront = front; Sign = sign; IsAuction = isAuction; - search = ""; //todo load form sign data if needed + if (SkyblockerConfigManager.get().general.searchOverlay.keepPreviousSearches){ + Text[] messages = Sign.getText(SignFront).getMessages(CLIENT.shouldFilterText()); + search = messages[0].getString(); + if(!messages[1].getString().isEmpty()){ + search += " " + messages[1].getString(); + } + }else{ + search = ""; + } + suggestionsArray = new String[]{}; } diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index d14a08fb..9800992b 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -132,6 +132,7 @@ "text.autoconfig.skyblocker.option.general.flameOverlay.flameOpacity": "Flame Opacity", "text.autoconfig.skyblocker.option.general.searchOverlay": "Search Overlay", "text.autoconfig.skyblocker.option.general.searchOverlay.enableBazaar": "Enable For Bazaar", + "text.autoconfig.skyblocker.option.general.searchOverlay.keepPreviousSearches": "Keep Previous Searches", "text.autoconfig.skyblocker.option.general.searchOverlay.enableAuctionHouse": "Enable For Auction House", "text.autoconfig.skyblocker.option.general.searchOverlay.maxSuggestions": "Maximum Suggestions", "text.autoconfig.skyblocker.option.general.searchOverlay.historyLength": "Saved Search History Length", -- cgit From c6915a199f151f05936cc6cb745f242e87a12c46 Mon Sep 17 00:00:00 2001 From: olim Date: Wed, 7 Feb 2024 18:07:40 +0000 Subject: add descriptions to the options add tool tip options for the settings --- .../de/hysky/skyblocker/config/categories/GeneralCategory.java | 7 ++++++- src/main/resources/assets/skyblocker/lang/en_us.json | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) (limited to 'src/main/resources') diff --git a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java index 3618f112..4abf7836 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java @@ -644,10 +644,11 @@ public class GeneralCategory { .build()) //Search overlay .group(OptionGroup.createBuilder() - .name(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay")) //todo description + .name(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay")) .collapsed(true) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.enableBazaar")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.enableBazaar.@Tooltip"))) .binding(defaults.general.searchOverlay.enableBazaar, () -> config.general.searchOverlay.enableBazaar, newValue -> config.general.searchOverlay.enableBazaar = newValue) @@ -655,6 +656,7 @@ public class GeneralCategory { .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.enableAuctionHouse")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.enableAuctionHouse.@Tooltip"))) .binding(defaults.general.searchOverlay.enableAuctionHouse, () -> config.general.searchOverlay.enableAuctionHouse, newValue -> config.general.searchOverlay.enableAuctionHouse = newValue) @@ -662,6 +664,7 @@ public class GeneralCategory { .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.keepPreviousSearches")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.keepPreviousSearches.@Tooltip"))) .binding(defaults.general.searchOverlay.keepPreviousSearches, () -> config.general.searchOverlay.keepPreviousSearches, newValue -> config.general.searchOverlay.keepPreviousSearches = newValue) @@ -669,6 +672,7 @@ public class GeneralCategory { .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.maxSuggestions")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.maxSuggestions.@Tooltip"))) .binding(defaults.general.searchOverlay.maxSuggestions, () -> config.general.searchOverlay.maxSuggestions, newValue -> config.general.searchOverlay.maxSuggestions = newValue) @@ -676,6 +680,7 @@ public class GeneralCategory { .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.historyLength")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.historyLength.@Tooltip"))) .binding(defaults.general.searchOverlay.historyLength, () -> config.general.searchOverlay.historyLength, newValue -> config.general.searchOverlay.historyLength = newValue) diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 9800992b..ef193c2d 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -132,10 +132,15 @@ "text.autoconfig.skyblocker.option.general.flameOverlay.flameOpacity": "Flame Opacity", "text.autoconfig.skyblocker.option.general.searchOverlay": "Search Overlay", "text.autoconfig.skyblocker.option.general.searchOverlay.enableBazaar": "Enable For Bazaar", - "text.autoconfig.skyblocker.option.general.searchOverlay.keepPreviousSearches": "Keep Previous Searches", + "text.autoconfig.skyblocker.option.general.searchOverlay.enableBazaar.@Tooltip": "Show custom search overlay when searching in bazaar.", "text.autoconfig.skyblocker.option.general.searchOverlay.enableAuctionHouse": "Enable For Auction House", + "text.autoconfig.skyblocker.option.general.searchOverlay.enableAuctionHouse.@Tooltip": "Show custom search overlay when searching in auction house.", + "text.autoconfig.skyblocker.option.general.searchOverlay.keepPreviousSearches": "Keep Previous Searches", + "text.autoconfig.skyblocker.option.general.searchOverlay.keepPreviousSearches.@Tooltip": "Keep existing search queue when opening overlay.", "text.autoconfig.skyblocker.option.general.searchOverlay.maxSuggestions": "Maximum Suggestions", + "text.autoconfig.skyblocker.option.general.searchOverlay.maxSuggestions.@Tooltip": "The maximum number off suggested items to show.", "text.autoconfig.skyblocker.option.general.searchOverlay.historyLength": "Saved Search History Length", + "text.autoconfig.skyblocker.option.general.searchOverlay.historyLength.@Tooltip": "The long of a search history to save and display for the overlay.", "text.autoconfig.skyblocker.option.general.betterPartyFinder": "Better Party Finder", "skyblocker.itemTooltip.nullMessage": "§cItem price information on tooltip will renew in max 60 seconds. If not, check latest.log", "skyblocker.itemTooltip.noData": "§cNo Data", -- cgit From bb92e2013609e6f14bf6fdfbd491058948d7962d Mon Sep 17 00:00:00 2001 From: olim Date: Wed, 7 Feb 2024 19:46:13 +0000 Subject: add history label to translatable location --- .../de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java | 5 ++--- src/main/resources/assets/skyblocker/lang/en_us.json | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src/main/resources') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java index 26608f85..ece25884 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java @@ -1,8 +1,6 @@ package de.hysky.skyblocker.skyblock.searchOverlay; import de.hysky.skyblocker.config.SkyblockerConfigManager; -import it.unimi.dsi.fastutil.Pair; -import it.unimi.dsi.fastutil.ints.IntIntPair; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.ButtonWidget; @@ -109,7 +107,8 @@ public class OverlayScreen extends Screen { super.render(context, mouseX, mouseY, delta); context.drawGuiTexture(SEARCH_ICON_TEXTURE, finishedButton.getX() + 2, finishedButton.getY() + 2, 16, 16); //todo rowHeight -4 if(historyButtons.length > 0 && historyButtons[0] != null){ - context.drawText(textRenderer, "History:", historyButtons[0].getX()+2, historyButtons[0].getY() - 10, 0xFFFFFFFF, true); //todo load form en_us and rowHeight + context.drawText(textRenderer, Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.historyLabel") + , historyButtons[0].getX()+2, historyButtons[0].getY() - 10, 0xFFFFFFFF, true); } } diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index ef193c2d..acab72d0 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -141,6 +141,7 @@ "text.autoconfig.skyblocker.option.general.searchOverlay.maxSuggestions.@Tooltip": "The maximum number off suggested items to show.", "text.autoconfig.skyblocker.option.general.searchOverlay.historyLength": "Saved Search History Length", "text.autoconfig.skyblocker.option.general.searchOverlay.historyLength.@Tooltip": "The long of a search history to save and display for the overlay.", + "text.autoconfig.skyblocker.option.general.searchOverlay.historyLabel": "History:", "text.autoconfig.skyblocker.option.general.betterPartyFinder": "Better Party Finder", "skyblocker.itemTooltip.nullMessage": "§cItem price information on tooltip will renew in max 60 seconds. If not, check latest.log", "skyblocker.itemTooltip.noData": "§cNo Data", -- cgit From 91ce7cff49db6df844900dd4a9c405747ff4935a Mon Sep 17 00:00:00 2001 From: olim Date: Thu, 8 Feb 2024 16:35:29 +0000 Subject: add commands to open seach add /bzs to search bazaar and /ahs to search ah --- .../hysky/skyblocker/config/SkyblockerConfig.java | 3 + .../config/categories/GeneralCategory.java | 8 +++ .../skyblocker/mixin/ClientPlayerEntityMixin.java | 3 +- .../skyblock/searchOverlay/OverlayScreen.java | 5 +- .../skyblock/searchOverlay/SearchOverManager.java | 72 ++++++++++++++++++---- .../resources/assets/skyblocker/lang/en_us.json | 2 + 6 files changed, 75 insertions(+), 18 deletions(-) (limited to 'src/main/resources') diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java index 7a9cb721..fd548d6a 100644 --- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java @@ -430,6 +430,9 @@ public class SkyblockerConfig { @SerialEntry public int historyLength = 3; + @SerialEntry + public boolean enableCommands = false; + @SerialEntry public List bazaarHistory = new ArrayList<>(); diff --git a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java index 4abf7836..3d7f63ce 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java @@ -686,6 +686,14 @@ public class GeneralCategory { newValue -> config.general.searchOverlay.historyLength = newValue) .controller(opt -> IntegerSliderControllerBuilder.create(opt).range(0, 5).step(1)) .build()) + .option(Option.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.enableCommands")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.enableCommands.@Tooltip"))) + .binding(defaults.general.searchOverlay.enableCommands, + () -> config.general.searchOverlay.enableCommands, + newValue -> config.general.searchOverlay.enableCommands = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) .build()) .build(); } diff --git a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java index 84211f9d..bbe58d36 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java @@ -63,8 +63,7 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity } @Inject(method = "openEditSignScreen", at = @At("HEAD"), cancellable = true) public void skyblocker$searchOverlay(SignBlockEntity sign, boolean front, CallbackInfo callbackInfo) { - - assert client.currentScreen != null; + if (client == null) return; if (SkyblockerConfigManager.get().general.searchOverlay.enableAuctionHouse && (FabricLoader.getInstance().isDevelopmentEnvironment() || client.currentScreen.getTitle().getString().toLowerCase().contains("auction")) ) { if (sign.getText(front).getMessage(3, false).getString().equalsIgnoreCase("enter query")) { SearchOverManager.updateSign(sign, front,true); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java index 45ec2781..db72b3d8 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java @@ -3,10 +3,8 @@ package de.hysky.skyblocker.skyblock.searchOverlay; import de.hysky.skyblocker.config.SkyblockerConfigManager; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.client.item.TooltipContext; import net.minecraft.item.ItemStack; import net.minecraft.text.Style; import net.minecraft.text.Text; @@ -24,7 +22,6 @@ public class OverlayScreen extends Screen { protected static final Identifier SEARCH_ICON_TEXTURE = new Identifier("icon/search"); private static final int rowHeight = 20; - private TextFieldWidget searchField; private ButtonWidget finishedButton; private ButtonWidget[] suggestionButtons; @@ -42,7 +39,7 @@ public class OverlayScreen extends Screen { super.init(); int rowWidth = (int)(this.width * 0.4); int startX = (int)(this.width * 0.5) - rowWidth/2; - int startY = (int) ((int)(this.height * 0.5)- (rowHeight * (1+ SkyblockerConfigManager.get().general.searchOverlay.maxSuggestions + 0.75 + SkyblockerConfigManager.get().general.searchOverlay.historyLength)) / 2); + int startY = (int) ((int)(this.height * 0.5)- (rowHeight * (1 + SkyblockerConfigManager.get().general.searchOverlay.maxSuggestions + 0.75 + SkyblockerConfigManager.get().general.searchOverlay.historyLength)) / 2); // Search field this.searchField = new TextFieldWidget(textRenderer,startX, startY, rowWidth - rowHeight, rowHeight, Text.literal("Search...")); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java index 84bcada9..d57e3174 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -4,25 +4,31 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.context.CommandContext; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.utils.Http; import de.hysky.skyblocker.utils.NEURepoManager; +import de.hysky.skyblocker.utils.scheduler.MessageScheduler; import io.github.moulberry.repo.data.NEUItem; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.client.MinecraftClient; +import net.minecraft.command.CommandRegistryAccess; import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket; import net.minecraft.text.Text; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.text.WordUtils; import org.jetbrains.annotations.Nullable; -import java.net.http.HttpHeaders; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; + public class SearchOverManager { private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); @@ -46,6 +52,7 @@ public class SearchOverManager { private static @Nullable SignBlockEntity Sign = null; private static boolean SignFront = true; private static boolean IsAuction; + private static boolean IsCommand; protected static String search = ""; @@ -60,6 +67,32 @@ public class SearchOverManager { * uses the skyblock api and Moulberry auction to load a list of items in bazaar and auction house */ public static void init() { + ClientCommandRegistrationCallback.EVENT.register(SearchOverManager::registerSearchCommands); + + LoadItems(); + } + + private static void registerSearchCommands(CommandDispatcher dispatcher, CommandRegistryAccess registryAccess) { + if (SkyblockerConfigManager.get().general.searchOverlay.enableCommands) { + dispatcher.register(literal("ahs") + .executes(context -> startCommand(true)) + ); + dispatcher.register(literal("bzs") + .executes(context -> startCommand(false)) + ); + } + } + + private static int startCommand(boolean isAuction) { + IsCommand = true; + IsAuction = isAuction; + search = ""; + suggestionsArray = new String[]{}; + CLIENT.send(() -> CLIENT.setScreen( new OverlayScreen(Text.of("")))); + return Command.SINGLE_SUCCESS; + } + + private static void LoadItems(){ //get bazaar items try { String response = Http.sendGetRequest("https://api.hypixel.net/v2/resources/skyblock/items"); @@ -108,11 +141,10 @@ public class SearchOverManager { } } } - - } catch (Exception e) { - //can not get items for bazaar search //todo log + //can not get items for bazaar search //todo log } + //get auction items try { JsonObject AuctionData = SkyblockerMod.GSON.fromJson(Http.sendGetRequest(THREE_DAY_AVERAGE), JsonObject.class); @@ -137,11 +169,9 @@ public class SearchOverManager { continue; } } - } catch (Exception e) { - //can not find ah todo logger + //can not find ah todo logger } - } /** * Capitalizes the first letter off every word in a string @@ -173,6 +203,7 @@ public class SearchOverManager { public static void updateSign(SignBlockEntity sign, boolean front, boolean isAuction) { SignFront = front; Sign = sign; + IsCommand = false; IsAuction = isAuction; if (SkyblockerConfigManager.get().general.searchOverlay.keepPreviousSearches){ Text[] messages = Sign.getText(SignFront).getMessages(CLIENT.shouldFilterText()); @@ -186,9 +217,7 @@ public class SearchOverManager { }else{ search = ""; } - suggestionsArray = new String[]{}; - } /** @@ -259,7 +288,6 @@ public class SearchOverManager { return null; } - /** * Add the current search value to the start of the history list and truncate to the max history value and save this to the config */ @@ -288,6 +316,26 @@ public class SearchOverManager { if (!search.isEmpty()){ saveHistory(); } + if (IsCommand){ + pushCommand(); + } + else { + pushSign(); + } + + + } + private static void pushCommand() { + String command; + if (IsAuction){ + command = "/ahSearch " + search; + }else{ + command = "/bz " + search; + } + MessageScheduler.INSTANCE.queueMessage(command, 0); + } + + private static void pushSign() { //splits text into 2 lines max = 30 chars StringBuilder line0 = new StringBuilder(); String line1; diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index acab72d0..bd6482bf 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -141,6 +141,8 @@ "text.autoconfig.skyblocker.option.general.searchOverlay.maxSuggestions.@Tooltip": "The maximum number off suggested items to show.", "text.autoconfig.skyblocker.option.general.searchOverlay.historyLength": "Saved Search History Length", "text.autoconfig.skyblocker.option.general.searchOverlay.historyLength.@Tooltip": "The long of a search history to save and display for the overlay.", + "text.autoconfig.skyblocker.option.general.searchOverlay.enableCommands": "Open from commands", + "text.autoconfig.skyblocker.option.general.searchOverlay.enableCommands.@Tooltip": "Opens the bazaar search with \"/bzs\" and auction house with \"/ahs\". A re-log is required for this setting to be updated.", "text.autoconfig.skyblocker.option.general.searchOverlay.historyLabel": "History:", "text.autoconfig.skyblocker.option.general.betterPartyFinder": "Better Party Finder", "skyblocker.itemTooltip.nullMessage": "§cItem price information on tooltip will renew in max 60 seconds. If not, check latest.log", -- cgit From cffa68314fc74fbedd97708df5ccb7c098eb638f Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Mon, 12 Feb 2024 15:55:53 -0500 Subject: Fix bazaar and auction house items loading, item matching, and tooltips --- .../hysky/skyblocker/config/SkyblockerConfig.java | 81 +++--- .../config/categories/GeneralCategory.java | 1 + .../skyblocker/mixin/ClientPlayerEntityMixin.java | 46 ++-- .../skyblock/item/tooltip/TooltipInfoType.java | 2 +- .../skyblock/searchOverlay/OverlayScreen.java | 120 ++++----- .../skyblock/searchOverlay/SearchOverManager.java | 277 +++++++++------------ .../resources/assets/skyblocker/lang/en_us.json | 4 +- .../skyblock/searchOverlay/SplitStringTest.java | 31 +++ 8 files changed, 258 insertions(+), 304 deletions(-) create mode 100644 src/test/java/de/hysky/skyblocker/skyblock/searchOverlay/SplitStringTest.java (limited to 'src/main/resources') diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java index fd548d6a..1bfd1b3c 100644 --- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java @@ -414,30 +414,30 @@ public class SkyblockerConfig { @SerialEntry public Alignment alignment = Alignment.MIDDLE; } - public static class SearchOverlay { - @SerialEntry - public boolean enableBazaar = true; - - @SerialEntry - public boolean enableAuctionHouse = true; - @SerialEntry - public boolean keepPreviousSearches = false; - - @SerialEntry - public int maxSuggestions = 3; - - @SerialEntry - public int historyLength = 3; + public enum Direction { + HORIZONTAL, VERTICAL; - @SerialEntry - public boolean enableCommands = false; + @Override + public String toString() { + return switch (this) { + case HORIZONTAL -> "Horizontal"; + case VERTICAL -> "Vertical"; + }; + } + } - @SerialEntry - public List bazaarHistory = new ArrayList<>(); + public enum Alignment { + LEFT, RIGHT, MIDDLE; - @SerialEntry - public List auctionHistory = new ArrayList<>(); + @Override + public String toString() { + return switch (this) { + case LEFT -> "Left"; + case RIGHT -> "Right"; + case MIDDLE -> "Middle"; + }; + } } public static class TeleportOverlay { @@ -468,29 +468,30 @@ public class SkyblockerConfig { public float flameOpacity = 0f; } - public enum Direction { - HORIZONTAL, VERTICAL; + public static class SearchOverlay { + @SerialEntry + public boolean enableBazaar = true; - @Override - public String toString() { - return switch (this) { - case HORIZONTAL -> "Horizontal"; - case VERTICAL -> "Vertical"; - }; - } - } + @SerialEntry + public boolean enableAuctionHouse = true; - public enum Alignment { - LEFT, RIGHT, MIDDLE; + @SerialEntry + public boolean keepPreviousSearches = false; - @Override - public String toString() { - return switch (this) { - case LEFT -> "Left"; - case RIGHT -> "Right"; - case MIDDLE -> "Middle"; - }; - } + @SerialEntry + public int maxSuggestions = 3; + + @SerialEntry + public int historyLength = 3; + + @SerialEntry + public boolean enableCommands = false; + + @SerialEntry + public List bazaarHistory = new ArrayList<>(); + + @SerialEntry + public List auctionHistory = new ArrayList<>(); } public static class RichPresence { diff --git a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java index 3d7f63ce..9c3b672f 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java @@ -642,6 +642,7 @@ public class GeneralCategory { .controller(opt -> FloatSliderControllerBuilder.create(opt).range(0.0f, 0.8f).step(0.1f)) .build()) .build()) + //Search overlay .group(OptionGroup.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay")) diff --git a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java index bbe58d36..2a4c38a7 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java @@ -1,7 +1,6 @@ package de.hysky.skyblocker.mixin; import com.mojang.authlib.GameProfile; - import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen; import de.hysky.skyblocker.skyblock.item.HotbarSlotLock; @@ -10,7 +9,6 @@ import de.hysky.skyblocker.skyblock.rift.HealingMelonIndicator; import de.hysky.skyblocker.skyblock.searchOverlay.OverlayScreen; import de.hysky.skyblocker.skyblock.searchOverlay.SearchOverManager; import de.hysky.skyblocker.utils.Utils; -import net.fabricmc.loader.api.FabricLoader; import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.AbstractClientPlayerEntity; @@ -52,30 +50,28 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity } @Inject(method = "openEditSignScreen", at = @At("HEAD"), cancellable = true) - public void skyblocker$partyFinderRange(SignBlockEntity sign, boolean front, CallbackInfo callbackInfo) { - if (PartyFinderScreen.isInKuudraPartyFinder) return; - if (client.currentScreen instanceof PartyFinderScreen partyFinderScreen && !partyFinderScreen.isAborted()) { - if (sign.getText(front).getMessage(3, false).getString().toLowerCase().contains("level")) { - partyFinderScreen.updateSign(sign, front); - callbackInfo.cancel(); - } + public void skyblocker$redirectEditSignScreen(SignBlockEntity sign, boolean front, CallbackInfo callbackInfo) { + // Fancy Party Finder + if (!PartyFinderScreen.isInKuudraPartyFinder && client.currentScreen instanceof PartyFinderScreen partyFinderScreen && !partyFinderScreen.isAborted() && sign.getText(front).getMessage(3, false).getString().toLowerCase().contains("level")) { + partyFinderScreen.updateSign(sign, front); + callbackInfo.cancel(); + return; } - } - @Inject(method = "openEditSignScreen", at = @At("HEAD"), cancellable = true) - public void skyblocker$searchOverlay(SignBlockEntity sign, boolean front, CallbackInfo callbackInfo) { - if (client == null) return; - if (SkyblockerConfigManager.get().general.searchOverlay.enableAuctionHouse && (FabricLoader.getInstance().isDevelopmentEnvironment() || client.currentScreen.getTitle().getString().toLowerCase().contains("auction")) ) { - if (sign.getText(front).getMessage(3, false).getString().equalsIgnoreCase("enter query")) { - SearchOverManager.updateSign(sign, front,true); - client.setScreen(new OverlayScreen(Text.of(""))); - callbackInfo.cancel(); - } - } - else if (SkyblockerConfigManager.get().general.searchOverlay.enableBazaar && (FabricLoader.getInstance().isDevelopmentEnvironment() || client.currentScreen.getTitle().getString().toLowerCase().contains("bazaar")) ) { - if (sign.getText(front).getMessage(3, false).getString().equalsIgnoreCase("enter query")) { - SearchOverManager.updateSign(sign, front,false); - client.setScreen(new OverlayScreen(Text.of(""))); - callbackInfo.cancel(); + + // Search Overlay + if (client.currentScreen != null) { + if (SkyblockerConfigManager.get().general.searchOverlay.enableAuctionHouse && client.currentScreen.getTitle().getString().toLowerCase().contains("auction")) { + if (sign.getText(front).getMessage(3, false).getString().equalsIgnoreCase("enter query")) { + SearchOverManager.updateSign(sign, front, true); + client.setScreen(new OverlayScreen(Text.of(""))); + callbackInfo.cancel(); + } + } else if (SkyblockerConfigManager.get().general.searchOverlay.enableBazaar && client.currentScreen.getTitle().getString().toLowerCase().contains("bazaar")) { + if (sign.getText(front).getMessage(3, false).getString().equalsIgnoreCase("enter query")) { + SearchOverManager.updateSign(sign, front, false); + client.setScreen(new OverlayScreen(Text.of(""))); + callbackInfo.cancel(); + } } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipInfoType.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipInfoType.java index 9b83f276..fc5c7087 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipInfoType.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipInfoType.java @@ -18,7 +18,7 @@ public enum TooltipInfoType implements Runnable { BAZAAR("https://hysky.de/api/bazaar", itemTooltip -> itemTooltip.enableBazaarPrice || SkyblockerConfigManager.get().locations.dungeons.dungeonChestProfit.enableProfitCalculator || SkyblockerConfigManager.get().general.chestValue.enableChestValue, itemTooltip -> itemTooltip.enableBazaarPrice, false), LOWEST_BINS("https://hysky.de/api/auctions/lowestbins", itemTooltip -> itemTooltip.enableLowestBIN || SkyblockerConfigManager.get().locations.dungeons.dungeonChestProfit.enableProfitCalculator || SkyblockerConfigManager.get().general.chestValue.enableChestValue, itemTooltip -> itemTooltip.enableLowestBIN, false), ONE_DAY_AVERAGE("https://moulberry.codes/auction_averages_lbin/1day.json", itemTooltip -> itemTooltip.enableAvgBIN, false), - THREE_DAY_AVERAGE("https://moulberry.codes/auction_averages_lbin/3day.json", itemTooltip -> itemTooltip.enableAvgBIN, false), + THREE_DAY_AVERAGE("https://moulberry.codes/auction_averages_lbin/3day.json", itemTooltip -> itemTooltip.enableAvgBIN || SkyblockerConfigManager.get().general.searchOverlay.enableAuctionHouse, itemTooltip -> itemTooltip.enableAvgBIN, false), MOTES("https://hysky.de/api/motesprice", itemTooltip -> itemTooltip.enableMotesPrice, itemTooltip -> itemTooltip.enableMotesPrice && Utils.isInTheRift(), true), OBTAINED(itemTooltip -> itemTooltip.enableObtainedDate), MUSEUM("https://hysky.de/api/museum", itemTooltip -> itemTooltip.enableMuseumInfo, true), diff --git a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java index b10510ed..e1545c6c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java @@ -3,22 +3,15 @@ package de.hysky.skyblocker.skyblock.searchOverlay; import de.hysky.skyblocker.config.SkyblockerConfigManager; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.client.item.TooltipContext; import net.minecraft.item.ItemStack; -import net.minecraft.text.MutableText; import net.minecraft.text.Style; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; import org.lwjgl.glfw.GLFW; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - import static de.hysky.skyblocker.skyblock.itemlist.ItemRepository.getItemStack; public class OverlayScreen extends Screen { @@ -40,20 +33,18 @@ public class OverlayScreen extends Screen { @Override protected void init() { super.init(); - int rowWidth = (int)(this.width * 0.4); - int startX = (int)(this.width * 0.5) - rowWidth/2; - int startY = (int) ((int)(this.height * 0.5)- (rowHeight * (1 + SkyblockerConfigManager.get().general.searchOverlay.maxSuggestions + 0.75 + SkyblockerConfigManager.get().general.searchOverlay.historyLength)) / 2); + int rowWidth = (int) (this.width * 0.4); + int startX = (int) (this.width * 0.5) - rowWidth / 2; + int startY = (int) ((int) (this.height * 0.5) - (rowHeight * (1 + SkyblockerConfigManager.get().general.searchOverlay.maxSuggestions + 0.75 + SkyblockerConfigManager.get().general.searchOverlay.historyLength)) / 2); // Search field - this.searchField = new TextFieldWidget(textRenderer,startX, startY, rowWidth - rowHeight, rowHeight, Text.literal("Search...")); + this.searchField = new TextFieldWidget(textRenderer, startX, startY, rowWidth - rowHeight, rowHeight, Text.translatable("gui.recipebook.search_hint")); searchField.setText(SearchOverManager.search); searchField.setChangedListener(SearchOverManager::updateSearch); searchField.setMaxLength(30); // finish buttons - finishedButton = ButtonWidget.builder(Text.literal("").setStyle(Style.EMPTY.withColor(Formatting.GREEN)), (a) -> { - close(); - }) + finishedButton = ButtonWidget.builder(Text.literal("").setStyle(Style.EMPTY.withColor(Formatting.GREEN)), a -> close()) .position(startX + rowWidth - rowHeight, startY) .size(rowHeight, rowHeight).build(); @@ -62,7 +53,7 @@ public class OverlayScreen extends Screen { int totalSuggestions = SkyblockerConfigManager.get().general.searchOverlay.maxSuggestions; this.suggestionButtons = new ButtonWidget[totalSuggestions]; for (int i = 0; i < totalSuggestions; i++) { - suggestionButtons[i] = ButtonWidget.builder(Text.literal(SearchOverManager.getSuggestion(i)).setStyle(Style.EMPTY), (a) -> { + suggestionButtons[i] = ButtonWidget.builder(Text.literal(SearchOverManager.getSuggestion(i)).setStyle(Style.EMPTY), a -> { SearchOverManager.updateSearch(a.getMessage().getString()); close(); }) @@ -85,31 +76,18 @@ public class OverlayScreen extends Screen { .position(startX, startY + rowOffset) .size(rowWidth, rowHeight).build(); rowOffset += rowHeight; - - //set the tool tip - String id = SearchOverManager.getHistoryId(i); - if (id == null || id.isEmpty() || client == null) continue; - ItemStack item = getItemStack(id); - if (item == null) continue; - MutableText tooltip = Text.literal(""); - item.getTooltip(client.player, TooltipContext.BASIC).forEach(line -> { - tooltip.append(line); - tooltip.append(Text.literal("\n")); - }); - historyButtons[i].setTooltip(Tooltip.of(Text.of(tooltip))); - } - else { + } else { break; } } //add drawables in order to make tab navigation sensible addDrawableChild(searchField); - for (ButtonWidget suggestion : suggestionButtons){ + for (ButtonWidget suggestion : suggestionButtons) { addDrawableChild(suggestion); } - for (ButtonWidget historyOption : historyButtons){ - if (historyOption != null){ + for (ButtonWidget historyOption : historyButtons) { + if (historyOption != null) { addDrawableChild(historyOption); } } @@ -127,37 +105,32 @@ public class OverlayScreen extends Screen { super.render(context, mouseX, mouseY, delta); int renderOffset = (rowHeight - 16) / 2; context.drawGuiTexture(SEARCH_ICON_TEXTURE, finishedButton.getX() + renderOffset, finishedButton.getY() + renderOffset, 16, 16); - if(historyButtons.length > 0 && historyButtons[0] != null){ - context.drawText(textRenderer, Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.historyLabel") - , historyButtons[0].getX() + renderOffset, historyButtons[0].getY() - (rowHeight / 2), 0xFFFFFFFF, true); + if (historyButtons.length > 0 && historyButtons[0] != null) { + context.drawText(textRenderer, Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.historyLabel"), historyButtons[0].getX() + renderOffset, historyButtons[0].getY() - rowHeight / 2, 0xFFFFFFFF, true); } - //draw item stacks to buttons + //draw item stacks and tooltip to buttons for (int i = 0; i < suggestionButtons.length; i++) { - String id = SearchOverManager.getSuggestionId(i); - if (id.isEmpty()) continue; - ItemStack item = getItemStack(id); - if (item == null) continue; - context.drawItem(item,suggestionButtons[i].getX() + renderOffset,suggestionButtons[i].getY() + renderOffset); + drawItemAndTooltip(context, mouseX, mouseY, SearchOverManager.getSuggestionId(i), suggestionButtons[i], renderOffset); } for (int i = 0; i < historyButtons.length; i++) { - String id = SearchOverManager.getHistoryId(i); - if (id == null || id.isEmpty()) continue; - ItemStack item = getItemStack(id); - if (item == null) continue; - context.drawItem(item,historyButtons[i].getX() + renderOffset,historyButtons[i].getY() + renderOffset); + drawItemAndTooltip(context, mouseX, mouseY, SearchOverManager.getHistoryId(i), historyButtons[i], renderOffset); } } /** - * Closes the overlay screen and gets the manager to send a packet update about the sign + * Draws the item and tooltip for the given button */ - @Override - public void close() { - assert this.client != null; - assert this.client.player != null; - SearchOverManager.pushSearch(); - super.close(); + private void drawItemAndTooltip(DrawContext context, int mouseX, int mouseY, String id, ButtonWidget button, int renderOffset) { + if (id == null || id.isEmpty()) return; + ItemStack item = getItemStack(id); + if (item == null) return; + context.drawItem(item, button.getX() + renderOffset, button.getY() + renderOffset); + + // Draw tooltip + if (button.isMouseOver(mouseX, mouseY)) { + context.drawItemTooltip(textRenderer, item, mouseX, mouseY); + } } /** @@ -169,32 +142,14 @@ public class OverlayScreen extends Screen { //update suggestion buttons text for (int i = 0; i < SkyblockerConfigManager.get().general.searchOverlay.maxSuggestions; i++) { String text = SearchOverManager.getSuggestion(i); - if (!text.isEmpty()){ + if (!text.isEmpty()) { suggestionButtons[i].visible = true; boolean isNewText = !text.equals(suggestionButtons[i].getMessage().getString()); if (!isNewText) continue; suggestionButtons[i].setMessage(Text.literal(text).setStyle(Style.EMPTY)); - - //update the tool tip - String id = SearchOverManager.getSuggestionId(i); - if (id.isEmpty() || client == null) { - suggestionButtons[i].setTooltip(null); - continue; - } - ItemStack item = getItemStack(id); - if (item == null) { - suggestionButtons[i].setTooltip(null); - continue; - } - MutableText tooltip = Text.literal(""); - item.getTooltip(client.player, TooltipContext.BASIC).forEach(line -> { - tooltip.append(line); - tooltip.append(Text.literal("\n")); - }); - suggestionButtons[i].setTooltip(Tooltip.of(Text.of(tooltip))); - }else{ + } else { suggestionButtons[i].visible = false; } } @@ -205,11 +160,26 @@ public class OverlayScreen extends Screen { */ @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - super.keyPressed(keyCode,scanCode,modifiers); - if (keyCode == GLFW.GLFW_KEY_ENTER && searchField.isActive()){ + if (keyCode == GLFW.GLFW_KEY_ENTER && searchField.isActive()) { close(); return true; } + return super.keyPressed(keyCode, scanCode, modifiers); + } + + @Override + public boolean shouldPause() { return false; } + + /** + * Closes the overlay screen and gets the manager to send a packet update about the sign + */ + @Override + public void close() { + assert this.client != null; + assert this.client.player != null; + SearchOverManager.pushSearch(); + super.close(); + } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java index 1b019a7f..b2a453a9 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -1,19 +1,18 @@ package de.hysky.skyblocker.skyblock.searchOverlay; -import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.mojang.brigadier.Command; import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.context.CommandContext; -import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.config.SkyblockerConfig; import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.dwarven.CrystalsHud; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; import de.hysky.skyblocker.utils.Http; import de.hysky.skyblocker.utils.NEURepoManager; import de.hysky.skyblocker.utils.scheduler.MessageScheduler; import io.github.moulberry.repo.data.NEUItem; +import it.unimi.dsi.fastutil.Pair; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.block.entity.SignBlockEntity; @@ -21,11 +20,16 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.command.CommandRegistryAccess; import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -37,11 +41,6 @@ public class SearchOverManager { private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); private static final Logger LOGGER = LoggerFactory.getLogger("Skyblocker Search Overlay"); - /** - * website where actionable items are stored - */ - private static final String THREE_DAY_AVERAGE = "https://moulberry.codes/auction_averages_lbin/3day.json"; - private static final Pattern BAZAAR_ENCHANTMENT_PATTERN = Pattern.compile("ENCHANTMENT_(\\D*)_(\\d+)"); private static final Pattern AUCTION_PET_AND_RUNE_PATTERN = Pattern.compile("([A-Z0-9_]+);(\\d+)"); @@ -50,20 +49,20 @@ public class SearchOverManager { */ private static final String[] ROMAN_NUMERALS = new String[]{ "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", - "XII", "XIII", "XIV", "XV", "XVI", "XVII","XVIII", "XIX", "XX" + "XII", "XIII", "XIV", "XV", "XVI", "XVII", "XVIII", "XIX", "XX" }; - private static @Nullable SignBlockEntity Sign = null; - private static boolean SignFront = true; - private static boolean IsAuction; - private static boolean IsCommand; + private static @Nullable SignBlockEntity sign = null; + private static boolean signFront = true; + private static boolean isAuction; + private static boolean isCommand; protected static String search = ""; - private static final Map itemNameLookup = new HashMap<>(); - private static final HashSet bazaarItems =new HashSet<>(); - private static final HashSet auctionItems =new HashSet<>(); - private static final HashMap namesToId =new HashMap<>(); + // Use non-final variables and swap them to prevent concurrent modification + private static HashSet bazaarItems; + private static HashSet auctionItems; + private static HashMap namesToId; public static String[] suggestionsArray = {}; @@ -72,47 +71,31 @@ public class SearchOverManager { */ public static void init() { ClientCommandRegistrationCallback.EVENT.register(SearchOverManager::registerSearchCommands); - - LoadItems(); + NEURepoManager.runAsyncAfterLoad(SearchOverManager::loadItems); } private static void registerSearchCommands(CommandDispatcher dispatcher, CommandRegistryAccess registryAccess) { if (SkyblockerConfigManager.get().general.searchOverlay.enableCommands) { - dispatcher.register(literal("ahs") - .executes(context -> startCommand(true)) - ); - dispatcher.register(literal("bzs") - .executes(context -> startCommand(false)) - ); + dispatcher.register(literal("ahs").executes(context -> startCommand(true))); + dispatcher.register(literal("bzs").executes(context -> startCommand(false))); } } private static int startCommand(boolean isAuction) { - IsCommand = true; - IsAuction = isAuction; + isCommand = true; + SearchOverManager.isAuction = isAuction; search = ""; suggestionsArray = new String[]{}; - CLIENT.send(() -> CLIENT.setScreen( new OverlayScreen(Text.of("")))); + CLIENT.send(() -> CLIENT.setScreen(new OverlayScreen(Text.of("")))); return Command.SINGLE_SUCCESS; } - private static void LoadItems(){ + private static void loadItems() { + HashSet bazaarItems = new HashSet<>(); + HashSet auctionItems = new HashSet<>(); + HashMap namesToId = new HashMap<>(); + //get bazaar items - try { - String response = Http.sendGetRequest("https://api.hypixel.net/v2/resources/skyblock/items"); - JsonArray items = JsonParser.parseString(response).getAsJsonObject().getAsJsonArray("items"); - for (JsonElement entry : items) { - if (entry.isJsonObject()) { - JsonObject item = entry.getAsJsonObject(); - String itemId = item.get("id").getAsString(); - String itemName = item.get("name").getAsString(); - itemNameLookup.put(itemId,itemName); - } - } - } catch (Exception e) { - //can not get items skyblock items - LOGGER.error("[Skyblocker] skyblock items list download failed! ", e); - } try (Http.ApiResponse response = Http.sendHypixelRequest("skyblock/bazaar", "")) { JsonObject products = JsonParser.parseString(response.content()).getAsJsonObject().get("products").getAsJsonObject(); for (Map.Entry entry : products.entrySet()) { @@ -120,7 +103,8 @@ public class SearchOverManager { JsonObject product = entry.getValue().getAsJsonObject(); String id = product.get("product_id").getAsString(); int sellVolume = product.get("quick_status").getAsJsonObject().get("sellVolume").getAsInt(); - if (sellVolume == 0) continue; //do not add items that do not sell e.g. they are not actual in the bazaar + if (sellVolume == 0) + continue; //do not add items that do not sell e.g. they are not actual in the bazaar Matcher matcher = BAZAAR_ENCHANTMENT_PATTERN.matcher(id); if (matcher.matches()) {//format enchantments //remove ultimate if in name @@ -140,9 +124,9 @@ public class SearchOverManager { continue; } //look up id for name - String name = itemNameLookup.get(product.get("product_id").getAsString()); - if (name != null){ - name = trimItemColor(name); + NEUItem neuItem = NEURepoManager.NEU_REPO.getItems().getItemBySkyblockId(id); + if (neuItem != null) { + String name = Formatting.strip(neuItem.getDisplayName()); bazaarItems.add(name); namesToId.put(name, id); continue; @@ -150,18 +134,19 @@ public class SearchOverManager { } } } catch (Exception e) { - //can not get items for bazaar search - LOGGER.error("[Skyblocker] bazaar item list download failed! ", e); + LOGGER.error("[Skyblocker] Failed to load bazaar item list! ", e); } //get auction items try { - JsonObject AuctionData = SkyblockerMod.GSON.fromJson(Http.sendGetRequest(THREE_DAY_AVERAGE), JsonObject.class); - for (Map.Entry entry : AuctionData.entrySet()) { + if (TooltipInfoType.THREE_DAY_AVERAGE.getData() == null) { + TooltipInfoType.THREE_DAY_AVERAGE.run(); + } + for (Map.Entry entry : TooltipInfoType.THREE_DAY_AVERAGE.getData().entrySet()) { String id = entry.getKey(); Matcher matcher = AUCTION_PET_AND_RUNE_PATTERN.matcher(id); - if (matcher.find()){//is a pet or rune convert id to name + if (matcher.find()) {//is a pet or rune convert id to name String name = matcher.group(1).replace("_", " "); name = capitalizeFully(name); auctionItems.add(name); @@ -170,19 +155,23 @@ public class SearchOverManager { } //something else look up in NEU repo. id = id.split("[+-]")[0]; - NEUItem item = NEURepoManager.NEU_REPO.getItems().getItemBySkyblockId(id); - if (item != null){ - String name = trimItemColor(item.getDisplayName()); + NEUItem neuItem = NEURepoManager.NEU_REPO.getItems().getItemBySkyblockId(id); + if (neuItem != null) { + String name = Formatting.strip(neuItem.getDisplayName()); auctionItems.add(name); namesToId.put(name, id); continue; } } } catch (Exception e) { - //can not find ah - LOGGER.error("[Skyblocker] ah item list download failed! ", e); + LOGGER.error("[Skyblocker] Failed to load auction house item list! ", e); } + + SearchOverManager.bazaarItems = bazaarItems; + SearchOverManager.auctionItems = auctionItems; + SearchOverManager.namesToId = namesToId; } + /** * Capitalizes the first letter off every word in a string * @param str string to capitalize @@ -196,35 +185,28 @@ public class SearchOverManager { .map(t -> t.substring(0, 1).toUpperCase() + t.substring(1).toLowerCase()) .collect(Collectors.joining(" ")); } - /** - * Removes the item color text tags from the whole of the text - * @param str string to remove color - */ - private static String trimItemColor(String str){ - if (str.isEmpty()) return str; - return str.replaceAll("§[0-9a-g]",""); - } + /** * Receives data when a search is started and resets values * @param sign the sign that is being edited * @param front if it's the front of the sign * @param isAuction if the sign is loaded from the auction house menu or bazaar */ - public static void updateSign(SignBlockEntity sign, boolean front, boolean isAuction) { - SignFront = front; - Sign = sign; - IsCommand = false; - IsAuction = isAuction; - if (SkyblockerConfigManager.get().general.searchOverlay.keepPreviousSearches){ - Text[] messages = Sign.getText(SignFront).getMessages(CLIENT.shouldFilterText()); + public static void updateSign(@NotNull SignBlockEntity sign, boolean front, boolean isAuction) { + signFront = front; + SearchOverManager.sign = sign; + isCommand = false; + SearchOverManager.isAuction = isAuction; + if (SkyblockerConfigManager.get().general.searchOverlay.keepPreviousSearches) { + Text[] messages = SearchOverManager.sign.getText(signFront).getMessages(CLIENT.shouldFilterText()); search = messages[0].getString(); - if(!messages[1].getString().isEmpty()){ - if (!search.endsWith(" ")){ + if (!messages[1].getString().isEmpty()) { + if (!search.endsWith(" ")) { search += " "; } - search += messages[1].getString(); + search += messages[1].getString(); } - }else{ + } else { search = ""; } suggestionsArray = new String[]{}; @@ -238,81 +220,66 @@ public class SearchOverManager { search = newValue; //update the suggestion values int totalSuggestions = SkyblockerConfigManager.get().general.searchOverlay.maxSuggestions; - suggestionsArray = new String[totalSuggestions]; if (newValue.isBlank() || totalSuggestions == 0) return; //do not search for empty value - if (IsAuction){ - suggestionsArray = auctionItems.stream().filter(item -> item.toLowerCase().contains(search.toLowerCase())).limit(totalSuggestions).toList().toArray(suggestionsArray); - }else { - suggestionsArray = bazaarItems.stream().filter(item -> item.toLowerCase().contains(search.toLowerCase())).limit(totalSuggestions).toList().toArray(suggestionsArray); - } + suggestionsArray = (isAuction ? auctionItems : bazaarItems).stream().filter(item -> item.toLowerCase().contains(search.toLowerCase())).limit(totalSuggestions).toArray(String[]::new); } /** * Gets the suggestion in the suggestion array at the index * @param index index of suggestion */ - protected static String getSuggestion(int index){ - if (suggestionsArray.length> index && suggestionsArray[index] != null){ + protected static String getSuggestion(int index) { + if (suggestionsArray.length > index && suggestionsArray[index] != null) { return suggestionsArray[index]; - }else{//there are no suggestions yet + } else {//there are no suggestions yet return ""; } } - protected static String getSuggestionId(int index){ - if (suggestionsArray.length> index && suggestionsArray[index] != null){ - return namesToId.get(suggestionsArray[index]); - }else{//there are no suggestions yet - return ""; - } + + protected static String getSuggestionId(int index) { + return namesToId.get(getSuggestion(index)); } /** * Gets the item name in the history array at the index * @param index index of suggestion */ - protected static String getHistory(int index){ - if (IsAuction){ - if (SkyblockerConfigManager.get().general.searchOverlay.auctionHistory.size() >index){ - return SkyblockerConfigManager.get().general.searchOverlay.auctionHistory.get(index); + protected static String getHistory(int index) { + if (isAuction) { + if (SkyblockerConfigManager.get().general.searchOverlay.auctionHistory.size() > index) { + return SkyblockerConfigManager.get().general.searchOverlay.auctionHistory.get(index); } - - }else{ - if (SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory.size() >index){ - return SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory.get(index); + } else { + if (SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory.size() > index) { + return SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory.get(index); } } - return null; + return null; } - protected static String getHistoryId(int index){ - if (IsAuction){ - if (SkyblockerConfigManager.get().general.searchOverlay.auctionHistory.size() > index){ - return namesToId.get(capitalizeFully(SkyblockerConfigManager.get().general.searchOverlay.auctionHistory.get(index))); - } - - }else{ - if (SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory.size() > index){ - return namesToId.get(capitalizeFully(SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory.get(index))); - } - } - return null; + protected static String getHistoryId(int index) { + return namesToId.get(getHistory(index)); } /** * Add the current search value to the start of the history list and truncate to the max history value and save this to the config */ - private static void saveHistory(){ + private static void saveHistory() { //save to history - int historyLength = SkyblockerConfigManager.get().general.searchOverlay.historyLength; - if (IsAuction){ - SkyblockerConfigManager.get().general.searchOverlay.auctionHistory.add(0, search); - if (SkyblockerConfigManager.get().general.searchOverlay.auctionHistory.size() > historyLength) { - SkyblockerConfigManager.get().general.searchOverlay.auctionHistory = SkyblockerConfigManager.get().general.searchOverlay.auctionHistory.subList(0, historyLength); + SkyblockerConfig.SearchOverlay config = SkyblockerConfigManager.get().general.searchOverlay; + if (isAuction) { + if (config.auctionHistory.isEmpty() || !config.auctionHistory.get(0).equals(search)) { + config.auctionHistory.add(0, search); + if (config.auctionHistory.size() > config.historyLength) { + config.auctionHistory = config.auctionHistory.subList(0, config.historyLength); + } } - }else{ - SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory.add(0, search); - if (SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory.size() > historyLength) { - SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory = SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory.subList(0, historyLength); + } else { + if (config.bazaarHistory.isEmpty() || !config.bazaarHistory.get(0).equals(search)) { + config.bazaarHistory.add(0, search); + if (config.bazaarHistory.size() > config.historyLength) { + config.bazaarHistory = config.bazaarHistory.subList(0, config.historyLength); + } } } SkyblockerConfigManager.save(); @@ -323,18 +290,16 @@ public class SearchOverManager { */ protected static void pushSearch() { //save to history - if (!search.isEmpty()){ + if (!search.isEmpty()) { saveHistory(); } - if (IsCommand){ + if (isCommand) { pushCommand(); - } - else { + } else { pushSign(); } - - } + /** * runs the command to search for the value in ({@link SearchOverManager#search}) */ @@ -342,12 +307,12 @@ public class SearchOverManager { if (search.isEmpty()) return; String command; - if (IsAuction){ + if (isAuction) { command = "/ahSearch " + search; - }else{ - command = "/bz " + search; + } else { + command = "/bz " + search; } - MessageScheduler.INSTANCE.queueMessage(command, 0); + MessageScheduler.INSTANCE.sendMessageAfterCooldown(command); } /** @@ -355,38 +320,28 @@ public class SearchOverManager { */ private static void pushSign() { //splits text into 2 lines max = 30 chars - StringBuilder line0 = new StringBuilder(); - String line1; - if (search.length() <= 15) { - line0 = new StringBuilder(search); - line1 = ""; - }else { - String[] words = search.split(" "); - for (String word : words) { - if (line0.isEmpty()) { - line0 = new StringBuilder(word); - continue; - } - if (line0.length() + word.length() < 14) { //max 15 but including space is 14 - line0.append(" ").append(word); - } - else { - break; - } - } - line1 = search.substring(line0.length(), Math.min(search.length(), 30)); - } + Pair split = splitString(search); // send packet to update sign - if (CLIENT.player != null || Sign != null) { - Text[] messages = Sign.getText(SignFront).getMessages(CLIENT.shouldFilterText()); - CLIENT.player.networkHandler.sendPacket(new UpdateSignC2SPacket(Sign.getPos(), SignFront, - line0.toString(), - line1, + if (CLIENT.player != null && sign != null) { + Text[] messages = sign.getText(signFront).getMessages(CLIENT.shouldFilterText()); + CLIENT.player.networkHandler.sendPacket(new UpdateSignC2SPacket(sign.getPos(), signFront, + split.left(), + split.right(), messages[2].getString(), messages[3].getString() )); } } + static Pair splitString(String s) { + if (s.length() <= 15) { + return Pair.of(s, ""); + } + int index = s.lastIndexOf(' ', 15); + if (index == -1) { + return Pair.of(s.substring(0, 15), ""); + } + return Pair.of(s.substring(0, index), s.substring(index + 1, Math.min(index + 16, s.length())).trim()); + } } diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index bd6482bf..ee178907 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -138,9 +138,9 @@ "text.autoconfig.skyblocker.option.general.searchOverlay.keepPreviousSearches": "Keep Previous Searches", "text.autoconfig.skyblocker.option.general.searchOverlay.keepPreviousSearches.@Tooltip": "Keep existing search queue when opening overlay.", "text.autoconfig.skyblocker.option.general.searchOverlay.maxSuggestions": "Maximum Suggestions", - "text.autoconfig.skyblocker.option.general.searchOverlay.maxSuggestions.@Tooltip": "The maximum number off suggested items to show.", + "text.autoconfig.skyblocker.option.general.searchOverlay.maxSuggestions.@Tooltip": "The maximum number of suggested items to show.", "text.autoconfig.skyblocker.option.general.searchOverlay.historyLength": "Saved Search History Length", - "text.autoconfig.skyblocker.option.general.searchOverlay.historyLength.@Tooltip": "The long of a search history to save and display for the overlay.", + "text.autoconfig.skyblocker.option.general.searchOverlay.historyLength.@Tooltip": "The length of search history to save and display for the overlay.", "text.autoconfig.skyblocker.option.general.searchOverlay.enableCommands": "Open from commands", "text.autoconfig.skyblocker.option.general.searchOverlay.enableCommands.@Tooltip": "Opens the bazaar search with \"/bzs\" and auction house with \"/ahs\". A re-log is required for this setting to be updated.", "text.autoconfig.skyblocker.option.general.searchOverlay.historyLabel": "History:", diff --git a/src/test/java/de/hysky/skyblocker/skyblock/searchOverlay/SplitStringTest.java b/src/test/java/de/hysky/skyblocker/skyblock/searchOverlay/SplitStringTest.java new file mode 100644 index 00000000..c397b5a4 --- /dev/null +++ b/src/test/java/de/hysky/skyblocker/skyblock/searchOverlay/SplitStringTest.java @@ -0,0 +1,31 @@ +package de.hysky.skyblocker.skyblock.searchOverlay; + +import it.unimi.dsi.fastutil.Pair; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class SplitStringTest { + @Test + void testSplitString1() { + String input = "aaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaa a"; + Pair split = SearchOverManager.splitString(input); + Assertions.assertEquals("aaaaaaaaaaaaaaa", split.left()); + Assertions.assertEquals("aaaaaaaaaaaaaaa", split.right()); + } + + @Test + void testSplitString2() { + String input = "a a a a aaa aa aa aaaa aaa aa aa aa a a aa aaa a aaa aa"; + Pair split = SearchOverManager.splitString(input); + Assertions.assertEquals("a a a a aaa aa", split.left()); + Assertions.assertEquals("aa aaaa aaa aa", split.right()); + } + + @Test + void testSplitString3() { + String input = "aaaaa aaaaa aaaaa"; + Pair split = SearchOverManager.splitString(input); + Assertions.assertEquals("aaaaa aaaaa", split.left()); + Assertions.assertEquals("aaaaa", split.right()); + } +} -- cgit