From d7cd2aacf94e3064001729f0a2b2e3f064de6d8b Mon Sep 17 00:00:00 2001 From: olim Date: Tue, 28 May 2024 15:23:53 +0100 Subject: add pet level filters and star filters adds the ability to search for max level pet as well as hiding skins when search for a pet. and when i item is starable adds the ability to search for an amount of stars --- .../skyblock/searchoverlay/OverlayScreen.java | 44 +++++++++ .../skyblock/searchoverlay/SearchOverManager.java | 105 ++++++++++++++++----- 2 files changed, 128 insertions(+), 21 deletions(-) (limited to 'src/main/java/de/hysky') 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 a03f3549..489677ec 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/OverlayScreen.java @@ -1,10 +1,14 @@ package de.hysky.skyblocker.skyblock.searchoverlay; import de.hysky.skyblocker.config.SkyblockerConfigManager; +import dev.isxander.yacl3.gui.TooltipButtonWidget; 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.SliderWidget; import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.client.gui.widget.ToggleButtonWidget; import net.minecraft.item.ItemStack; import net.minecraft.text.Style; import net.minecraft.text.Text; @@ -20,6 +24,8 @@ public class OverlayScreen extends Screen { private static final int rowHeight = 20; private TextFieldWidget searchField; private ButtonWidget finishedButton; + private ButtonWidget maxPetButton; + private TextFieldWidget dungeonStarField; private ButtonWidget[] suggestionButtons; private ButtonWidget[] historyButtons; @@ -48,6 +54,7 @@ public class OverlayScreen extends Screen { .position(startX + rowWidth - rowHeight, startY) .size(rowHeight, rowHeight).build(); + // suggested item buttons int rowOffset = rowHeight; int totalSuggestions = SkyblockerConfigManager.get().uiAndVisuals.searchOverlay.maxSuggestions; @@ -80,6 +87,34 @@ public class OverlayScreen extends Screen { break; } } + //auction only elements + if (SearchOverManager.isAuction) { + //max pet level button + maxPetButton = ButtonWidget.builder(Text.literal("temp"), a -> { + SearchOverManager.maxPetLevel = !SearchOverManager.maxPetLevel; + if (SearchOverManager.maxPetLevel) { + maxPetButton.setMessage(Text.literal("Max Pet Level ✔").formatted(Formatting.GREEN)); + } else { + maxPetButton.setMessage(Text.literal("Max Pet Level ❌").formatted(Formatting.RED)); + } + }) + .position(startX + rowWidth, startY) + .size(rowWidth / 2, rowHeight).build(); + if (SearchOverManager.maxPetLevel) { + maxPetButton.setMessage(Text.literal("Max Pet Level ✔").formatted(Formatting.GREEN)); + } else { + maxPetButton.setMessage(Text.literal("Max Pet Level ❌").formatted(Formatting.RED)); + } + + //dungeon star input + this.dungeonStarField = new TextFieldWidget(textRenderer, startX + (int) (rowWidth * 1.25), startY + rowHeight, rowWidth / 4, rowHeight, Text.literal("")); + if (SearchOverManager.dungeonStars > 0) { + dungeonStarField.setText(String.valueOf(SearchOverManager.dungeonStars)); + } + dungeonStarField.setMaxLength(2); + dungeonStarField.setTooltip(Tooltip.of(Text.of("Star count for dungeon items"))); + dungeonStarField.setChangedListener(SearchOverManager::updateDungeonStars); + } //add drawables in order to make tab navigation sensible addDrawableChild(searchField); @@ -93,6 +128,11 @@ public class OverlayScreen extends Screen { } addDrawableChild(finishedButton); + if (SearchOverManager.isAuction) { + addDrawableChild(maxPetButton); + addDrawableChild(dungeonStarField); + } + //focus the search box this.setInitialFocus(searchField); } @@ -105,9 +145,13 @@ 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); + //labels if (historyButtons.length > 0 && historyButtons[0] != null) { context.drawText(textRenderer, Text.translatable("skyblocker.config.general.searchOverlay.historyLabel"), historyButtons[0].getX() + renderOffset, historyButtons[0].getY() - rowHeight / 2, 0xFFFFFFFF, true); } + if (SearchOverManager.isAuction) { + context.drawText(textRenderer, Text.literal("Stars:"), dungeonStarField.getX() - dungeonStarField.getWidth() + renderOffset, dungeonStarField.getY() + rowHeight / 4, 0xFFFFFFFF, true); + } //draw item stacks and tooltip to buttons for (int i = 0; i < suggestionButtons.length; i++) { 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 917a6aa0..c6cc05aa 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/SearchOverManager.java @@ -10,6 +10,7 @@ import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; import de.hysky.skyblocker.utils.NEURepoManager; import de.hysky.skyblocker.utils.scheduler.MessageScheduler; import io.github.moulberry.repo.data.NEUItem; +import io.github.moulberry.repo.util.NEUId; import it.unimi.dsi.fastutil.Pair; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; @@ -24,10 +25,7 @@ import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -40,8 +38,7 @@ public class SearchOverManager { private static final Logger LOGGER = LoggerFactory.getLogger("Skyblocker Search Overlay"); 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+)"); - + private static final String PET_NAME_START = "[Lvl {LVL}] "; /** * converts index (in array) +1 to a roman numeral */ @@ -52,14 +49,18 @@ public class SearchOverManager { private static @Nullable SignBlockEntity sign = null; private static boolean signFront = true; - private static boolean isAuction; + protected static boolean isAuction; private static boolean isCommand; protected static String search = ""; + protected static Boolean maxPetLevel = false; + protected static int dungeonStars = -1; // Use non-final variables and swap them to prevent concurrent modification private static HashSet bazaarItems; private static HashSet auctionItems; + private static HashSet auctionPets; + private static HashSet starableItems; private static HashMap namesToId; public static String[] suggestionsArray = {}; @@ -91,6 +92,8 @@ public class SearchOverManager { private static void loadItems() { HashSet bazaarItems = new HashSet<>(); HashSet auctionItems = new HashSet<>(); + HashSet auctionPets = new HashSet<>(); + HashSet starableItems = new HashSet<>(); HashMap namesToId = new HashMap<>(); //get bazaar items @@ -138,29 +141,29 @@ public class SearchOverManager { } //get auction items + Set<@NEUId String> essenceCosts = NEURepoManager.NEU_REPO.getConstants().getEssenceCost().getCosts().keySet(); try { 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 - String name = matcher.group(1).replace("_", " "); - name = capitalizeFully(name); - auctionItems.add(name); - namesToId.put(name, id); - continue; - } - //something else look up in NEU repo. + //look up in NEU repo. id = id.split("[+-]")[0]; NEUItem neuItem = NEURepoManager.NEU_REPO.getItems().getItemBySkyblockId(id); if (neuItem != null) { String name = Formatting.strip(neuItem.getDisplayName()); + //add names that are pets to the list of pets to work with the lvl 100 button + if (name != null && name.startsWith(PET_NAME_START)) { + name = name.replace(PET_NAME_START, ""); + auctionPets.add(name); + } + //if it has essence cost add to starable items + if (essenceCosts.contains(neuItem.getSkyblockItemId())) { + starableItems.add(name); + } auctionItems.add(name); namesToId.put(name, id); - continue; } } } catch (Exception e) { @@ -169,11 +172,14 @@ public class SearchOverManager { SearchOverManager.bazaarItems = bazaarItems; SearchOverManager.auctionItems = auctionItems; + SearchOverManager.auctionPets = auctionPets; + SearchOverManager.starableItems = starableItems; SearchOverManager.namesToId = namesToId; } /** * Capitalizes the first letter off every word in a string + * * @param str string to capitalize */ private static String capitalizeFully(String str) { @@ -188,8 +194,9 @@ public class SearchOverManager { /** * 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 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(@NotNull SignBlockEntity sign, boolean front, boolean isAuction) { @@ -214,6 +221,7 @@ public class SearchOverManager { /** * Updates the search value and the suggestions based on that value. + * * @param newValue new search value */ protected static void updateSearch(String newValue) { @@ -224,8 +232,18 @@ public class SearchOverManager { suggestionsArray = (isAuction ? auctionItems : bazaarItems).stream().filter(item -> item.toLowerCase().contains(search.toLowerCase())).limit(totalSuggestions).toArray(String[]::new); } + protected static void updateDungeonStars(String newValue) { + try { + dungeonStars = Math.min(Integer.parseInt(newValue), 10); + } catch (Exception e) { + //not parsable number just set to 0 + dungeonStars = 0; + } + } + /** * Gets the suggestion in the suggestion array at the index + * * @param index index of suggestion */ protected static String getSuggestion(int index) { @@ -242,6 +260,7 @@ public class SearchOverManager { /** * Gets the item name in the history array at the index + * * @param index index of suggestion */ protected static String getHistory(int index) { @@ -286,13 +305,18 @@ public class SearchOverManager { } /** - *Saves the current value of ({@link SearchOverManager#search}) then pushes it to a command or sign depending on how the gui was opened + * Saves the current value of ({@link SearchOverManager#search}) then pushes it to a command or sign depending on how the gui was opened */ protected static void pushSearch() { //save to history if (!search.isEmpty()) { saveHistory(); } + //add pet level or dungeon starts if in ah + if (isAuction) { + addExtras(); + } + //push if (isCommand) { pushCommand(); } else { @@ -300,6 +324,45 @@ public class SearchOverManager { } } + /** + * Adds pet level 100 or necessary dungeon starts if needed + */ + private static void addExtras() { + // pet level + if (maxPetLevel) { + if (auctionPets.contains(search)) { + if (search.equals("Golden Dragon")) { + search = "[Lvl 200] " + search; + } else { + search = "[Lvl 100] " + search; + } + } + } else { + // still filter for only pets + if (auctionPets.contains(search)) { + // add bracket so only get pets + search = "] " + search; + } + } + + // dungeon stars + // check if it's a dungeon item and if so add correct stars + if (dungeonStars > 0 && starableItems.contains(search)) { + StringBuilder starString = new StringBuilder(" "); + //add stars up to 5 + starString.append("✪".repeat(Math.max(0, Math.min(dungeonStars, 5)))); + //add number for other stars + switch (dungeonStars) { + case 6 -> starString.append("➊"); + case 7 -> starString.append("➋"); + case 8 -> starString.append("➌"); + case 9 -> starString.append("➍"); + case 10 -> starString.append("➎"); + } + search += starString.toString(); + } + } + /** * runs the command to search for the value in ({@link SearchOverManager#search}) */ -- cgit From 1811e0fb488f693d40b0be4100b29969e154bb0a Mon Sep 17 00:00:00 2001 From: olim Date: Tue, 28 May 2024 15:40:19 +0100 Subject: stop pet / dungeon detection being case sensitive --- .../skyblocker/skyblock/searchoverlay/SearchOverManager.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src/main/java/de/hysky') 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 c6cc05aa..365d7007 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/SearchOverManager.java @@ -156,11 +156,11 @@ public class SearchOverManager { //add names that are pets to the list of pets to work with the lvl 100 button if (name != null && name.startsWith(PET_NAME_START)) { name = name.replace(PET_NAME_START, ""); - auctionPets.add(name); + auctionPets.add(name.toLowerCase()); } //if it has essence cost add to starable items - if (essenceCosts.contains(neuItem.getSkyblockItemId())) { - starableItems.add(name); + if (name != null && essenceCosts.contains(neuItem.getSkyblockItemId())) { + starableItems.add(name.toLowerCase()); } auctionItems.add(name); namesToId.put(name, id); @@ -330,8 +330,8 @@ public class SearchOverManager { private static void addExtras() { // pet level if (maxPetLevel) { - if (auctionPets.contains(search)) { - if (search.equals("Golden Dragon")) { + if (auctionPets.contains(search.toLowerCase())) { + if (search.equalsIgnoreCase("golden dragon")) { search = "[Lvl 200] " + search; } else { search = "[Lvl 100] " + search; @@ -347,7 +347,7 @@ public class SearchOverManager { // dungeon stars // check if it's a dungeon item and if so add correct stars - if (dungeonStars > 0 && starableItems.contains(search)) { + if (dungeonStars > 0 && starableItems.contains(search.toLowerCase())) { StringBuilder starString = new StringBuilder(" "); //add stars up to 5 starString.append("✪".repeat(Math.max(0, Math.min(dungeonStars, 5)))); -- cgit From 3999a2a3afeccf217719c2a5291508ceba79d237 Mon Sep 17 00:00:00 2001 From: olim Date: Tue, 28 May 2024 16:10:17 +0100 Subject: front load pets when searching the ah make pets show ahead of skins ect when they are a likly match --- .../skyblock/searchoverlay/SearchOverManager.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'src/main/java/de/hysky') 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 365d7007..2ddca077 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/SearchOverManager.java @@ -229,7 +229,24 @@ public class SearchOverManager { //update the suggestion values int totalSuggestions = SkyblockerConfigManager.get().uiAndVisuals.searchOverlay.maxSuggestions; if (newValue.isBlank() || totalSuggestions == 0) return; //do not search for empty value - suggestionsArray = (isAuction ? auctionItems : bazaarItems).stream().filter(item -> item.toLowerCase().contains(search.toLowerCase())).limit(totalSuggestions).toArray(String[]::new); + suggestionsArray = (isAuction ? auctionItems : bazaarItems).stream().sorted(Comparator.comparing(SearchOverManager::shouldFrontLoad, Comparator.reverseOrder())).filter(item -> item.toLowerCase().contains(search.toLowerCase())).limit(totalSuggestions).toArray(String[]::new); + } + + /** + * determines if a value should be moved to the front of the search + * @param name name of the suggested item + * @return if the value should be at the front of the search queue + */ + private static boolean shouldFrontLoad(String name) { + if (!isAuction) { + return false; + } + //do nothing to non pets + if (!auctionPets.contains(name.toLowerCase())) { + return false; + } + //only front load pets when there is enough of the pet typed, so it does not spoil searching for other items + return (double) search.length() / name.length() > 0.5; } protected static void updateDungeonStars(String newValue) { -- cgit From cd7d1f8f8b7a57383e0eae01f6fe9653411dd8c8 Mon Sep 17 00:00:00 2001 From: olim Date: Tue, 28 May 2024 16:12:26 +0100 Subject: fix lowercase for non max level pets --- .../de/hysky/skyblocker/skyblock/searchoverlay/SearchOverManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main/java/de/hysky') 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 2ddca077..54845d6d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/SearchOverManager.java @@ -356,7 +356,7 @@ public class SearchOverManager { } } else { // still filter for only pets - if (auctionPets.contains(search)) { + if (auctionPets.contains(search.toLowerCase())) { // add bracket so only get pets search = "] " + search; } -- cgit From 362d317ad67635205e4bc087ce07dff71b4ddd43 Mon Sep 17 00:00:00 2001 From: olim Date: Tue, 28 May 2024 17:04:50 +0100 Subject: add translation strings --- .../skyblocker/skyblock/searchoverlay/OverlayScreen.java | 12 ++++++------ .../skyblocker/skyblock/searchoverlay/SearchOverManager.java | 3 ++- src/main/resources/assets/skyblocker/lang/en_us.json | 3 +++ 3 files changed, 11 insertions(+), 7 deletions(-) (limited to 'src/main/java/de/hysky') 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 489677ec..dba55fa3 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/OverlayScreen.java @@ -93,17 +93,17 @@ public class OverlayScreen extends Screen { maxPetButton = ButtonWidget.builder(Text.literal("temp"), a -> { SearchOverManager.maxPetLevel = !SearchOverManager.maxPetLevel; if (SearchOverManager.maxPetLevel) { - maxPetButton.setMessage(Text.literal("Max Pet Level ✔").formatted(Formatting.GREEN)); + maxPetButton.setMessage(Text.translatable("skyblocker.config.general.searchOverlay.maxPet").append(Text.literal(" ✔")).formatted(Formatting.GREEN)); } else { - maxPetButton.setMessage(Text.literal("Max Pet Level ❌").formatted(Formatting.RED)); + maxPetButton.setMessage(Text.translatable("skyblocker.config.general.searchOverlay.maxPet").append(Text.literal(" ❌")).formatted(Formatting.RED)); } }) .position(startX + rowWidth, startY) .size(rowWidth / 2, rowHeight).build(); if (SearchOverManager.maxPetLevel) { - maxPetButton.setMessage(Text.literal("Max Pet Level ✔").formatted(Formatting.GREEN)); + maxPetButton.setMessage(Text.translatable("skyblocker.config.general.searchOverlay.maxPet").append(Text.literal(" ✔")).formatted(Formatting.GREEN)); } else { - maxPetButton.setMessage(Text.literal("Max Pet Level ❌").formatted(Formatting.RED)); + maxPetButton.setMessage(Text.translatable("skyblocker.config.general.searchOverlay.maxPet").append(Text.literal(" ❌")).formatted(Formatting.RED)); } //dungeon star input @@ -112,7 +112,7 @@ public class OverlayScreen extends Screen { dungeonStarField.setText(String.valueOf(SearchOverManager.dungeonStars)); } dungeonStarField.setMaxLength(2); - dungeonStarField.setTooltip(Tooltip.of(Text.of("Star count for dungeon items"))); + dungeonStarField.setTooltip(Tooltip.of(Text.translatable("skyblocker.config.general.searchOverlay.starsTooltip"))); dungeonStarField.setChangedListener(SearchOverManager::updateDungeonStars); } @@ -150,7 +150,7 @@ public class OverlayScreen extends Screen { context.drawText(textRenderer, Text.translatable("skyblocker.config.general.searchOverlay.historyLabel"), historyButtons[0].getX() + renderOffset, historyButtons[0].getY() - rowHeight / 2, 0xFFFFFFFF, true); } if (SearchOverManager.isAuction) { - context.drawText(textRenderer, Text.literal("Stars:"), dungeonStarField.getX() - dungeonStarField.getWidth() + renderOffset, dungeonStarField.getY() + rowHeight / 4, 0xFFFFFFFF, true); + context.drawText(textRenderer, Text.translatable("skyblocker.config.general.searchOverlay.starsLabel"), dungeonStarField.getX() - dungeonStarField.getWidth() + renderOffset, dungeonStarField.getY() + rowHeight / 4, 0xFFFFFFFF, true); } //draw item stacks and tooltip to buttons 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 54845d6d..7f2f17e1 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/SearchOverManager.java @@ -234,6 +234,7 @@ public class SearchOverManager { /** * determines if a value should be moved to the front of the search + * * @param name name of the suggested item * @return if the value should be at the front of the search queue */ @@ -243,7 +244,7 @@ public class SearchOverManager { } //do nothing to non pets if (!auctionPets.contains(name.toLowerCase())) { - return false; + return false; } //only front load pets when there is enough of the pet typed, so it does not spoil searching for other items return (double) search.length() / name.length() > 0.5; diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 930ebb43..5775f7c2 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -251,6 +251,9 @@ "skyblocker.config.general.quiverWarning.enableQuiverWarningInDungeons": "Enable Quiver Warning In Dungeons", "skyblocker.config.general.searchOverlay.historyLabel": "History:", + "skyblocker.config.general.searchOverlay.starsLabel": "Stars:", + "skyblocker.config.general.searchOverlay.starsTooltip": "Star count for dungeon items", + "skyblocker.config.general.searchOverlay.maxPet": "Max Pet Level", "skyblocker.config.general.shortcuts": "Shortcuts", "skyblocker.config.general.shortcuts.config": "Shortcuts Config...", -- cgit From 67ab56d515f846a25ac80e496eaa53925b56c908 Mon Sep 17 00:00:00 2001 From: olim Date: Tue, 28 May 2024 21:45:49 +0100 Subject: revamp ui add background an move stars and pet options to look better hopefully --- .../skyblock/searchoverlay/OverlayScreen.java | 98 ++++++++++++++++------ .../skyblock/searchoverlay/SearchOverManager.java | 11 +-- .../resources/assets/skyblocker/lang/en_us.json | 2 +- 3 files changed, 74 insertions(+), 37 deletions(-) (limited to 'src/main/java/de/hysky') 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 dba55fa3..0850c80a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/OverlayScreen.java @@ -1,15 +1,13 @@ package de.hysky.skyblocker.skyblock.searchoverlay; import de.hysky.skyblocker.config.SkyblockerConfigManager; -import dev.isxander.yacl3.gui.TooltipButtonWidget; 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.SliderWidget; import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.client.gui.widget.ToggleButtonWidget; 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; @@ -21,11 +19,12 @@ import static de.hysky.skyblocker.skyblock.itemlist.ItemRepository.getItemStack; public class OverlayScreen extends Screen { protected static final Identifier SEARCH_ICON_TEXTURE = new Identifier("icon/search"); + private static final Identifier BACKGROUND_TEXTURE = new Identifier("social_interactions/background"); private static final int rowHeight = 20; private TextFieldWidget searchField; private ButtonWidget finishedButton; private ButtonWidget maxPetButton; - private TextFieldWidget dungeonStarField; + private ButtonWidget dungeonStarButton; private ButtonWidget[] suggestionButtons; private ButtonWidget[] historyButtons; @@ -92,28 +91,20 @@ public class OverlayScreen extends Screen { //max pet level button maxPetButton = ButtonWidget.builder(Text.literal("temp"), a -> { SearchOverManager.maxPetLevel = !SearchOverManager.maxPetLevel; - if (SearchOverManager.maxPetLevel) { - maxPetButton.setMessage(Text.translatable("skyblocker.config.general.searchOverlay.maxPet").append(Text.literal(" ✔")).formatted(Formatting.GREEN)); - } else { - maxPetButton.setMessage(Text.translatable("skyblocker.config.general.searchOverlay.maxPet").append(Text.literal(" ❌")).formatted(Formatting.RED)); - } + updateMaxPetText(); }) - .position(startX + rowWidth, startY) + .tooltip(Tooltip.of(Text.translatable("skyblocker.config.general.searchOverlay.maxPet.@Tooltip"))) + .position(startX, startY - rowHeight - 8) .size(rowWidth / 2, rowHeight).build(); - if (SearchOverManager.maxPetLevel) { - maxPetButton.setMessage(Text.translatable("skyblocker.config.general.searchOverlay.maxPet").append(Text.literal(" ✔")).formatted(Formatting.GREEN)); - } else { - maxPetButton.setMessage(Text.translatable("skyblocker.config.general.searchOverlay.maxPet").append(Text.literal(" ❌")).formatted(Formatting.RED)); - } + updateMaxPetText(); //dungeon star input - this.dungeonStarField = new TextFieldWidget(textRenderer, startX + (int) (rowWidth * 1.25), startY + rowHeight, rowWidth / 4, rowHeight, Text.literal("")); - if (SearchOverManager.dungeonStars > 0) { - dungeonStarField.setText(String.valueOf(SearchOverManager.dungeonStars)); - } - dungeonStarField.setMaxLength(2); - dungeonStarField.setTooltip(Tooltip.of(Text.translatable("skyblocker.config.general.searchOverlay.starsTooltip"))); - dungeonStarField.setChangedListener(SearchOverManager::updateDungeonStars); + dungeonStarButton = ButtonWidget.builder(Text.literal("✪"), a -> updateStars()) + .tooltip(Tooltip.of(Text.translatable("skyblocker.config.general.searchOverlay.starsTooltip"))) + .position(startX + (int) (rowWidth * 0.5), startY - rowHeight - 8) + .size(rowWidth / 2, rowHeight).build(); + + updateStars(); } //add drawables in order to make tab navigation sensible @@ -130,13 +121,71 @@ public class OverlayScreen extends Screen { if (SearchOverManager.isAuction) { addDrawableChild(maxPetButton); - addDrawableChild(dungeonStarField); + addDrawableChild(dungeonStarButton); + } //focus the search box this.setInitialFocus(searchField); } + /** + * finds if the mouse is clicked on the dungeon star button and if so works out amount of stars to set + * + * @param mouseX the X coordinate of the mouse + * @param mouseY the Y coordinate of the mouse + * @param button the mouse button number + * @return super + */ + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (SearchOverManager.isAuction && dungeonStarButton.isHovered() && client != null) { + double actualTextWidth = client.textRenderer.getWidth(dungeonStarButton.getMessage()); + double textOffset = (dungeonStarButton.getWidth() - actualTextWidth) / 2; + double offset = mouseX - (dungeonStarButton.getX() + textOffset); + int starCount = (int) ((offset / actualTextWidth) * 10); + starCount = Math.clamp(0, starCount + 1, 10); + //if same as old value set stars to 0 else set to selected amount + if (starCount == SearchOverManager.dungeonStars) { + SearchOverManager.dungeonStars = 0; + } else { + SearchOverManager.dungeonStars = starCount; + } + } + + return super.mouseClicked(mouseX, mouseY, button); + } + + private void updateMaxPetText() { + if (SearchOverManager.maxPetLevel) { + maxPetButton.setMessage(Text.translatable("skyblocker.config.general.searchOverlay.maxPet").append(Text.literal(" ✔")).formatted(Formatting.GREEN)); + } else { + maxPetButton.setMessage(Text.translatable("skyblocker.config.general.searchOverlay.maxPet").append(Text.literal(" ❌")).formatted(Formatting.RED)); + } + } + + private void updateStars() { + MutableText stars = Text.empty(); + for (int i = 0; i < SearchOverManager.dungeonStars; i++) { + stars.append(Text.literal("✪").formatted(Formatting.GREEN)); + } + for (int i = SearchOverManager.dungeonStars; i < 10; i++) { + stars.append(Text.literal("✪")); + } + dungeonStarButton.setMessage(stars); + } + + @Override + public void renderBackground(DrawContext context, int mouseX, int mouseY, float delta) { + super.renderBackground(context, mouseX, mouseY, delta); + //find max height + int maxHeight = rowHeight * (1 + suggestionButtons.length + historyButtons.length); + if (historyButtons.length > 0) { //add space for history label if it could exist + maxHeight += (int) (rowHeight * 0.75); + } + context.drawGuiTexture(BACKGROUND_TEXTURE, searchField.getX() - 8, searchField.getY() - 8, (int) (this.width * 0.4) + 16, maxHeight + 16); + } + /** * Renders the search icon, label for the history and item Stacks for item names */ @@ -149,9 +198,6 @@ public class OverlayScreen extends Screen { if (historyButtons.length > 0 && historyButtons[0] != null) { context.drawText(textRenderer, Text.translatable("skyblocker.config.general.searchOverlay.historyLabel"), historyButtons[0].getX() + renderOffset, historyButtons[0].getY() - rowHeight / 2, 0xFFFFFFFF, true); } - if (SearchOverManager.isAuction) { - context.drawText(textRenderer, Text.translatable("skyblocker.config.general.searchOverlay.starsLabel"), dungeonStarField.getX() - dungeonStarField.getWidth() + renderOffset, dungeonStarField.getY() + rowHeight / 4, 0xFFFFFFFF, true); - } //draw item stacks and tooltip to buttons for (int i = 0; i < suggestionButtons.length; i++) { 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 7f2f17e1..7f31c207 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/SearchOverManager.java @@ -54,7 +54,7 @@ public class SearchOverManager { protected static String search = ""; protected static Boolean maxPetLevel = false; - protected static int dungeonStars = -1; + protected static int dungeonStars = 0; // Use non-final variables and swap them to prevent concurrent modification private static HashSet bazaarItems; @@ -250,15 +250,6 @@ public class SearchOverManager { return (double) search.length() / name.length() > 0.5; } - protected static void updateDungeonStars(String newValue) { - try { - dungeonStars = Math.min(Integer.parseInt(newValue), 10); - } catch (Exception e) { - //not parsable number just set to 0 - dungeonStars = 0; - } - } - /** * Gets the suggestion in the suggestion array at the index * diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 5775f7c2..57abdc46 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -251,9 +251,9 @@ "skyblocker.config.general.quiverWarning.enableQuiverWarningInDungeons": "Enable Quiver Warning In Dungeons", "skyblocker.config.general.searchOverlay.historyLabel": "History:", - "skyblocker.config.general.searchOverlay.starsLabel": "Stars:", "skyblocker.config.general.searchOverlay.starsTooltip": "Star count for dungeon items", "skyblocker.config.general.searchOverlay.maxPet": "Max Pet Level", + "skyblocker.config.general.searchOverlay.maxPet.@Tooltip": "Only show pets that are max level", "skyblocker.config.general.shortcuts": "Shortcuts", "skyblocker.config.general.shortcuts.config": "Shortcuts Config...", -- cgit From 9df1209ded3141b926a9e5b0dd289dd2c331c7b7 Mon Sep 17 00:00:00 2001 From: olim Date: Wed, 29 May 2024 14:58:18 +0100 Subject: improve color of stars --- .../de/hysky/skyblocker/skyblock/searchoverlay/OverlayScreen.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/main/java/de/hysky') 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 0850c80a..2a89e7fd 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/OverlayScreen.java @@ -49,7 +49,7 @@ public class OverlayScreen extends Screen { searchField.setMaxLength(30); // finish buttons - finishedButton = ButtonWidget.builder(Text.literal("").setStyle(Style.EMPTY.withColor(Formatting.GREEN)), a -> close()) + finishedButton = ButtonWidget.builder(Text.literal(""), a -> close()) .position(startX + rowWidth - rowHeight, startY) .size(rowHeight, rowHeight).build(); @@ -89,7 +89,7 @@ public class OverlayScreen extends Screen { //auction only elements if (SearchOverManager.isAuction) { //max pet level button - maxPetButton = ButtonWidget.builder(Text.literal("temp"), a -> { + maxPetButton = ButtonWidget.builder(Text.literal(""), a -> { SearchOverManager.maxPetLevel = !SearchOverManager.maxPetLevel; updateMaxPetText(); }) @@ -144,7 +144,7 @@ public class OverlayScreen extends Screen { double textOffset = (dungeonStarButton.getWidth() - actualTextWidth) / 2; double offset = mouseX - (dungeonStarButton.getX() + textOffset); int starCount = (int) ((offset / actualTextWidth) * 10); - starCount = Math.clamp(0, starCount + 1, 10); + starCount = Math.clamp(starCount + 1, 0, 10); //if same as old value set stars to 0 else set to selected amount if (starCount == SearchOverManager.dungeonStars) { SearchOverManager.dungeonStars = 0; @@ -167,7 +167,7 @@ public class OverlayScreen extends Screen { private void updateStars() { MutableText stars = Text.empty(); for (int i = 0; i < SearchOverManager.dungeonStars; i++) { - stars.append(Text.literal("✪").formatted(Formatting.GREEN)); + stars.append(Text.literal("✪").formatted(i < 5 ? Formatting.YELLOW : Formatting.RED)); } for (int i = SearchOverManager.dungeonStars; i < 10; i++) { stars.append(Text.literal("✪")); -- cgit From 652cf697722ed4523a80799f176692e5f6a59a0b Mon Sep 17 00:00:00 2001 From: olim Date: Wed, 29 May 2024 15:12:42 +0100 Subject: clean code --- .../skyblock/searchoverlay/OverlayScreen.java | 17 ++++++++++++++--- .../skyblock/searchoverlay/SearchOverManager.java | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) (limited to 'src/main/java/de/hysky') 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 2a89e7fd..b227ff01 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/OverlayScreen.java @@ -122,7 +122,6 @@ public class OverlayScreen extends Screen { if (SearchOverManager.isAuction) { addDrawableChild(maxPetButton); addDrawableChild(dungeonStarButton); - } //focus the search box @@ -130,7 +129,7 @@ public class OverlayScreen extends Screen { } /** - * finds if the mouse is clicked on the dungeon star button and if so works out amount of stars to set + * Finds if the mouse is clicked on the dungeon star button and if so works out what stars the user clicked on * * @param mouseX the X coordinate of the mouse * @param mouseY the Y coordinate of the mouse @@ -156,6 +155,9 @@ public class OverlayScreen extends Screen { return super.mouseClicked(mouseX, mouseY, button); } + /** + * Updates the text displayed on the max pet level button to represent the settings current state + */ private void updateMaxPetText() { if (SearchOverManager.maxPetLevel) { maxPetButton.setMessage(Text.translatable("skyblocker.config.general.searchOverlay.maxPet").append(Text.literal(" ✔")).formatted(Formatting.GREEN)); @@ -164,6 +166,9 @@ public class OverlayScreen extends Screen { } } + /** + * Updates stars in dungeon star input to represent the current star value + */ private void updateStars() { MutableText stars = Text.empty(); for (int i = 0; i < SearchOverManager.dungeonStars; i++) { @@ -175,6 +180,13 @@ public class OverlayScreen extends Screen { dungeonStarButton.setMessage(stars); } + /** + * Renders the background for the search using the social interactions background + * @param context context + * @param mouseX mouseX + * @param mouseY mouseY + * @param delta delta + */ @Override public void renderBackground(DrawContext context, int mouseX, int mouseY, float delta) { super.renderBackground(context, mouseX, mouseY, delta); @@ -194,7 +206,6 @@ 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); - //labels if (historyButtons.length > 0 && historyButtons[0] != null) { context.drawText(textRenderer, Text.translatable("skyblocker.config.general.searchOverlay.historyLabel"), historyButtons[0].getX() + renderOffset, historyButtons[0].getY() - rowHeight / 2, 0xFFFFFFFF, true); } 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 7f31c207..bb1875ba 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/SearchOverManager.java @@ -141,8 +141,8 @@ public class SearchOverManager { } //get auction items - Set<@NEUId String> essenceCosts = NEURepoManager.NEU_REPO.getConstants().getEssenceCost().getCosts().keySet(); try { + Set<@NEUId String> essenceCosts = NEURepoManager.NEU_REPO.getConstants().getEssenceCost().getCosts().keySet(); if (TooltipInfoType.THREE_DAY_AVERAGE.getData() == null) { TooltipInfoType.THREE_DAY_AVERAGE.run(); } -- cgit