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. --- .../java/de/hysky/skyblocker/SkyblockerMod.java | 2 + .../hysky/skyblocker/config/SkyblockerConfig.java | 13 ++ .../config/categories/GeneralCategory.java | 26 ++++ .../skyblocker/mixin/ClientPlayerEntityMixin.java | 23 ++++ .../skyblock/searchOverlay/OverlayScreen.java | 107 +++++++++++++++ .../skyblock/searchOverlay/SearchOverManager.java | 147 +++++++++++++++++++++ 6 files changed, 318 insertions(+) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java (limited to 'src/main/java/de/hysky/skyblocker') diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java index c11e4c86..6bdf619e 100644 --- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java +++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java @@ -23,6 +23,7 @@ import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; import de.hysky.skyblocker.skyblock.itemlist.ItemRepository; import de.hysky.skyblocker.skyblock.quicknav.QuickNav; import de.hysky.skyblocker.skyblock.rift.TheRift; +import de.hysky.skyblocker.skyblock.searchOverlay.SearchOverManager; import de.hysky.skyblocker.skyblock.shortcut.Shortcuts; import de.hysky.skyblocker.skyblock.special.SpecialEffects; import de.hysky.skyblocker.skyblock.tabhud.TabHud; @@ -119,6 +120,7 @@ public class SkyblockerMod implements ClientModInitializer { FireFreezeStaffTimer.init(); GuardianHealth.init(); TheRift.init(); + SearchOverManager.init(); TitleContainer.init(); ScreenMaster.init(); DungeonTextures.init(); diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java index 4acb8064..714229dc 100644 --- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java @@ -237,6 +237,9 @@ public class SkyblockerConfig { @SerialEntry public FlameOverlay flameOverlay = new FlameOverlay(); + @SerialEntry + public SearchOverlay searchOverlay = new SearchOverlay(); + @SerialEntry public List lockedSlots = new ArrayList<>(); @@ -411,6 +414,16 @@ 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 int maxSuggestions = 3; + } public static class TeleportOverlay { @SerialEntry 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 808b3c2c..a9b965cf 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,32 @@ 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")) //todo description + .collapsed(true) + .option(Option.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.enableBazaar")) + .binding(defaults.general.searchOverlay.enableBazaar, + () -> config.general.searchOverlay.enableBazaar, + newValue -> config.general.searchOverlay.enableBazaar = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.enableAuctionHouse")) + .binding(defaults.general.searchOverlay.enableAuctionHouse, + () -> config.general.searchOverlay.enableAuctionHouse, + newValue -> config.general.searchOverlay.enableAuctionHouse = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.maxSuggestions")) + .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)) + .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 1d54b02c..1e2fd111 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java @@ -7,12 +7,16 @@ import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen; import de.hysky.skyblocker.skyblock.item.HotbarSlotLock; import de.hysky.skyblocker.skyblock.item.ItemProtection; 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; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.world.ClientWorld; +import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -57,4 +61,23 @@ 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 (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,true); + client.setScreen(new OverlayScreen(Text.of(""))); + callbackInfo.cancel(); + } + } + } } \ No newline at end of file diff --git a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java new file mode 100644 index 00000000..a4bee7ae --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java @@ -0,0 +1,107 @@ +package de.hysky.skyblocker.skyblock.searchOverlay; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.text.Style; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.Identifier; + +import java.util.Objects; + +public class OverlayScreen extends Screen { + + protected static final Identifier SEARCH_ICON_TEXTURE = new Identifier("icon/search"); + + private TextFieldWidget searchField; + private ButtonWidget finishedButton; + private ButtonWidget[] suggestionButtons; + //todo history buttons + + public OverlayScreen(Text title) { + super(title); + } + @Override + protected void init() { + super.init(); + int rowHeight = 20; + 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; + + // Search field + this.searchField = new TextFieldWidget(textRenderer, startX, startY, rowWidth - 30, rowHeight, Text.literal("Search...")); + searchField.setChangedListener(SearchOverManager::updateSearch); + searchField.setFocused(true); + searchField.active = true; + + // finish buttons + finishedButton = ButtonWidget.builder(Text.literal("SEARCH").setStyle(Style.EMPTY.withColor(Formatting.GREEN)), (a) -> { //todo search icon + close(); + }) + .position(startX + rowWidth - 30, startY) + .size(30, rowHeight).build(); + // suggested item buttons + 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) -> { + SearchOverManager.updateSearch(a.getMessage().getString()); + close(); + }) + .position(startX , startY + rowHeight * (i+1)) + .size(rowWidth, rowHeight).build(); + suggestionButtons[i].visible = false; + } + + addDrawableChild(searchField); + for (ButtonWidget suggestion : suggestionButtons){ + addDrawableChild(suggestion); + } + addDrawableChild(finishedButton); + + + + } + + + @Override + public void render(DrawContext context, int mouseX, int mouseY, float delta) { + super.render(context, mouseX, mouseY, delta); + } + + @Override + public void renderBackground(DrawContext context, int mouseX, int mouseY, float delta) { + super.renderBackground(context, mouseX, mouseY, delta); + //todo draw custom background + + } + + @Override + public void close() { + assert this.client != null; + assert this.client.player != null; + SearchOverManager.pushSearch(); + super.close(); + } + @Override + public final void tick() { + super.tick(); + //update suggestion buttons text + for (int i = 0; i < SkyblockerConfigManager.get().general.searchOverlay.maxSuggestions; i++) { + String text = SearchOverManager.getSuggestion(i); + if (!Objects.equals(text, "")){ + suggestionButtons[i].visible = true; + suggestionButtons[i].setMessage(Text.literal(text).setStyle(Style.EMPTY)); + }else{ + suggestionButtons[i].visible = false; + } + + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java new file mode 100644 index 00000000..5846dbf3 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -0,0 +1,147 @@ +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 de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.Http; +import net.minecraft.block.entity.SignBlockEntity; +import net.minecraft.client.MinecraftClient; +import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket; +import net.minecraft.text.Text; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public class SearchOverManager { + + private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); + + public static boolean visible = false; + public static String search = ""; + private static @Nullable SignBlockEntity Sign = null; + private static boolean SignFront = true; + + private static boolean IsAuction; + + + public static Map itemNameLookup = new HashMap<>(); + public static List bazaarItems =new ArrayList<>(); + public static List auctionItems =new ArrayList<>(); + + public static String[] suggestionsArray = {}; + public static void init() { + //get bazaar items + System.out.println("is there somethin"); + try { + String response = Http.sendGetRequest("https://api.hypixel.net/v2/resources/skyblock/items"); + System.out.println("response:"); + JsonArray items = JsonParser.parseString(response).getAsJsonObject().getAsJsonArray("items"); + System.out.println("jsonItem:"); + 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 + } + try (Http.ApiResponse response = Http.sendHypixelRequest("skyblock/bazaar", "")) { + JsonObject products = JsonParser.parseString(response.content()).getAsJsonObject().get("products").getAsJsonObject(); + for (Map.Entry entry : products.entrySet()) { + if (entry.getValue().isJsonObject()) { + JsonObject product = entry.getValue().getAsJsonObject(); + String name = itemNameLookup.get(product.get("product_id").getAsString()); //todo work with enchants + if (name != null){ + bazaarItems.add(name); + } + + } + + } + + + } catch (Exception e) { + //can not get items for bazaar search + } + //get auction items + //items not in bazaar? todo work out how to get this (e.g. there are no pets) (there is a can auction flag) + for (String itemName : itemNameLookup.values()){ + if (!bazaarItems.contains(itemName)){ + auctionItems.add(itemName); + } + } + + } + + public static void updateSign(SignBlockEntity sign, boolean front, boolean isAuction) { + visible= true; + SignFront = front; + Sign = sign; + IsAuction = isAuction; + search = ""; //todo load form sign data if needed + suggestionsArray = new String[]{}; + + } + protected static void updateSearch(String newValue) { + 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); + } + } + protected static String getSuggestion(int index){ + if (suggestionsArray.length> index && suggestionsArray[index] != null ){ + return suggestionsArray[index]; + }else{//there are no suggestions yet + return ""; + } + } + + protected static void pushSearch() { + //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)); + } + + // 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, + messages[2].getString(), + messages[3].getString() + )); + } + } + +} -- cgit From 30c2d8155c895f1d6da57c3e2998458904b11cc1 Mon Sep 17 00:00:00 2001 From: olim Date: Tue, 6 Feb 2024 16:00:02 +0000 Subject: small tweaks use magnifying glass icon. use bazaar data in bazaar. and have max length for search box --- .../hysky/skyblocker/mixin/ClientPlayerEntityMixin.java | 2 +- .../skyblocker/skyblock/searchOverlay/OverlayScreen.java | 16 +++++++--------- 2 files changed, 8 insertions(+), 10 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker') diff --git a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java index 1e2fd111..84211f9d 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java @@ -74,7 +74,7 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity } 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,true); + SearchOverManager.updateSign(sign, front,false); client.setScreen(new OverlayScreen(Text.of(""))); callbackInfo.cancel(); } 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 a4bee7ae..136edb40 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java @@ -35,17 +35,17 @@ public class OverlayScreen extends Screen { int startY = (int)(this.height * 0.5)- (rowHeight * (1+ SkyblockerConfigManager.get().general.searchOverlay.maxSuggestions)) /2; // Search field - this.searchField = new TextFieldWidget(textRenderer, startX, startY, rowWidth - 30, rowHeight, Text.literal("Search...")); + this.searchField = new TextFieldWidget(textRenderer, startX, startY, rowWidth - rowHeight, rowHeight, Text.literal("Search...")); searchField.setChangedListener(SearchOverManager::updateSearch); - searchField.setFocused(true); - searchField.active = true; + searchField.setMaxLength(30); + // finish buttons - finishedButton = ButtonWidget.builder(Text.literal("SEARCH").setStyle(Style.EMPTY.withColor(Formatting.GREEN)), (a) -> { //todo search icon + finishedButton = ButtonWidget.builder(Text.literal("").setStyle(Style.EMPTY.withColor(Formatting.GREEN)), (a) -> { close(); }) - .position(startX + rowWidth - 30, startY) - .size(30, rowHeight).build(); + .position(startX + rowWidth - rowHeight, startY) + .size(rowHeight, rowHeight).build(); // suggested item buttons int totalSuggestions = SkyblockerConfigManager.get().general.searchOverlay.maxSuggestions; this.suggestionButtons = new ButtonWidget[totalSuggestions]; @@ -65,14 +65,12 @@ public class OverlayScreen extends Screen { } addDrawableChild(finishedButton); - - } - @Override 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 } @Override -- 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/java/de/hysky/skyblocker') 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 761bef456f7e76005bf0f8f9b1551040f36f5cea Mon Sep 17 00:00:00 2001 From: olim Date: Tue, 6 Feb 2024 17:47:04 +0000 Subject: fix crash --- .../java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main/java/de/hysky/skyblocker') 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 7da23168..33e9d399 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java @@ -98,7 +98,7 @@ 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 ){ + 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 } -- cgit From 3639059855336f7755d56a71b8757781fb3e7271 Mon Sep 17 00:00:00 2001 From: olim Date: Tue, 6 Feb 2024 18:20:47 +0000 Subject: keyboard qol auto focus the search box and if enter key pressed in box close the overlay --- .../skyblock/searchOverlay/OverlayScreen.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'src/main/java/de/hysky/skyblocker') 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 33e9d399..8e8fdc2a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java @@ -1,7 +1,6 @@ package de.hysky.skyblocker.skyblock.searchOverlay; import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.ButtonWidget; @@ -10,6 +9,7 @@ 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.Objects; @@ -92,6 +92,8 @@ public class OverlayScreen extends Screen { } addDrawableChild(finishedButton); + this.setInitialFocus(searchField); + } @Override @@ -102,6 +104,7 @@ public class OverlayScreen extends Screen { context.drawText(textRenderer, "History:", historyButtons[0].getX()+2, historyButtons[0].getY() - 10, 0xFFFFFFFF, true); //todo load form en_us and rowHeight } + } @Override @@ -132,5 +135,17 @@ public class OverlayScreen extends Screen { } } + } + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + super.keyPressed(keyCode,scanCode,modifiers); + //if enter key pressed and search box selected close + if (keyCode == GLFW.GLFW_KEY_ENTER && searchField.isActive()){ + close(); + return true; + } + return false; + } + } -- cgit From b13dd8dd03d9fc25e44d5c249dc330606ef220ba Mon Sep 17 00:00:00 2001 From: olim Date: Tue, 6 Feb 2024 18:42:44 +0000 Subject: fixed some names removed colour codes from names so they do not interfere with search --- .../skyblocker/skyblock/searchOverlay/OverlayScreen.java | 3 --- .../skyblock/searchOverlay/SearchOverManager.java | 16 +++++++++++++--- 2 files changed, 13 insertions(+), 6 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker') 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 8e8fdc2a..cf9a57f3 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java @@ -93,7 +93,6 @@ public class OverlayScreen extends Screen { addDrawableChild(finishedButton); this.setInitialFocus(searchField); - } @Override @@ -103,8 +102,6 @@ public class OverlayScreen extends Screen { 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 } - - } @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 e8f78229..87f4a27f 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -58,6 +58,7 @@ public class SearchOverManager { JsonObject product = entry.getValue().getAsJsonObject(); String name = itemNameLookup.get(product.get("product_id").getAsString()); //todo work with enchants if (name != null){ + name = trimItemColor(name); bazaarItems.add(name); } @@ -72,12 +73,22 @@ public class SearchOverManager { //get auction items //items not in bazaar? todo work out how to get this (e.g. there are no pets) (there is a can auction flag) for (String itemName : itemNameLookup.values()){ - if (!bazaarItems.contains(itemName)){ - auctionItems.add(itemName); + String cleanName = trimItemColor(itemName); + if (!bazaarItems.contains(cleanName)){ + auctionItems.add(cleanName); } } } + private static String trimItemColor(String string){ + if (string.isEmpty()) return string; + if (string.startsWith("§") ){ + return string.substring(2); + }else { + return string; + } + } + public static void updateSign(SignBlockEntity sign, boolean front, boolean isAuction) { visible= true; @@ -119,7 +130,6 @@ public class SearchOverManager { } } return null; - } private static void saveHistory(){ //save to history -- 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/java/de/hysky/skyblocker') 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 c50fd1929d524e4eb21b194a34dbd7e8db13b7c1 Mon Sep 17 00:00:00 2001 From: olim Date: Tue, 6 Feb 2024 20:51:04 +0000 Subject: improve search lists added enchants to bazaar list. and improved auction list --- .../skyblock/searchOverlay/SearchOverManager.java | 68 +++++++++++++++++----- 1 file changed, 55 insertions(+), 13 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker') 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 e3b818d5..46743f1f 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -4,20 +4,34 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.utils.Http; import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.client.MinecraftClient; 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; public class SearchOverManager { private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); + 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 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" + }; + public static boolean visible = false; public static String search = ""; private static @Nullable SignBlockEntity Sign = null; @@ -27,8 +41,8 @@ public class SearchOverManager { public static Map itemNameLookup = new HashMap<>(); - public static List bazaarItems =new ArrayList<>(); - public static List auctionItems =new ArrayList<>(); + public static HashSet bazaarItems =new HashSet<>(); + public static HashSet auctionItems =new HashSet<>(); public static String[] suggestionsArray = {}; public static void init() { @@ -56,29 +70,57 @@ public class SearchOverManager { for (Map.Entry entry : products.entrySet()) { if (entry.getValue().isJsonObject()) { JsonObject product = entry.getValue().getAsJsonObject(); - String name = itemNameLookup.get(product.get("product_id").getAsString()); //todo work with enchants - if (name != null){ - name = trimItemColor(name); - bazaarItems.add(name); + String id = product.get("product_id").getAsString(); + Matcher matcher = BAZAAR_ENCHANTMENT_PATTERN.matcher(id); + if (matcher.matches()) {//format enchantments + String name = matcher.group(1).replace("_", " "); + name = capitalizeFully(name); + int enchantLevel = Integer.parseInt(matcher.group(2)); + String level = ""; + if (enchantLevel > 0){ + level = ROMAN_NUMERALS[enchantLevel-1]; + } + bazaarItems.add(name + " " + level); + }else{//look up id for name + String name = itemNameLookup.get(product.get("product_id").getAsString()); + if (name != null){ + name = trimItemColor(name); + bazaarItems.add(name); + } } - } } } catch (Exception e) { - //can not get items for bazaar search + //can not get items for bazaar search //todo log } //get auction items - //items not in bazaar? todo work out how to get this (e.g. there are no pets) (there is a can auction flag) - for (String itemName : itemNameLookup.values()){ - String cleanName = trimItemColor(itemName); - if (!bazaarItems.contains(cleanName)){ - auctionItems.add(cleanName); + try { + JsonObject AuctionData = SkyblockerMod.GSON.fromJson(Http.sendGetRequest(THREE_DAY_AVERAGE), JsonObject.class); + for (Map.Entry entry : AuctionData.entrySet()) { + String name = itemNameLookup.get(entry.getKey()); + if (name != null){ + name = trimItemColor(name); + auctionItems.add(name); + } } + + + } catch (Exception e) { + //can not find ah todo logger + } + + } + private static String capitalizeFully(String str) { + if (str == null || str.isEmpty()) { + return str; } + return Arrays.stream(str.split("\\s+")) + .map(t -> t.substring(0, 1).toUpperCase() + t.substring(1).toLowerCase()) + .collect(Collectors.joining(" ")); } private static String trimItemColor(String string){ if (string.isEmpty()) return string; -- cgit From 59d9615496f5539bf06835d83240e792414676b7 Mon Sep 17 00:00:00 2001 From: olim Date: Tue, 6 Feb 2024 21:01:12 +0000 Subject: slightly improve auction items list remove unneeded data from auction items id so more likely to get name. --- .../hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker') 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 46743f1f..1da756e4 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -100,7 +100,9 @@ public class SearchOverManager { try { JsonObject AuctionData = SkyblockerMod.GSON.fromJson(Http.sendGetRequest(THREE_DAY_AVERAGE), JsonObject.class); for (Map.Entry entry : AuctionData.entrySet()) { - String name = itemNameLookup.get(entry.getKey()); + String id = entry.getKey(); + id = id.split("[+;-]")[0]; + String name = itemNameLookup.get(id); if (name != null){ name = trimItemColor(name); auctionItems.add(name); @@ -113,6 +115,7 @@ public class SearchOverManager { } } + private static String capitalizeFully(String str) { if (str == null || str.isEmpty()) { return str; @@ -122,6 +125,7 @@ public class SearchOverManager { .map(t -> t.substring(0, 1).toUpperCase() + t.substring(1).toLowerCase()) .collect(Collectors.joining(" ")); } + private static String trimItemColor(String string){ if (string.isEmpty()) return string; if (string.startsWith("§") ){ @@ -131,7 +135,6 @@ public class SearchOverManager { } } - public static void updateSign(SignBlockEntity sign, boolean front, boolean isAuction) { visible= true; SignFront = front; -- cgit From a0dd6b066f8ba6b3aa2aadb69a04f5e3ad79ba93 Mon Sep 17 00:00:00 2001 From: olim Date: Tue, 6 Feb 2024 21:02:45 +0000 Subject: fix duplicating " " when loading a sing an extra space was being added even if one existed already --- .../hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/main/java/de/hysky/skyblocker') 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 1da756e4..00120dd9 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -144,7 +144,10 @@ public class SearchOverManager { Text[] messages = Sign.getText(SignFront).getMessages(CLIENT.shouldFilterText()); search = messages[0].getString(); if(!messages[1].getString().isEmpty()){ - search += " " + messages[1].getString(); + if (!search.endsWith(" ")){ + search += " "; + } + search += messages[1].getString(); } }else{ search = ""; -- cgit From 5420bf99cbb046c82e8aab2b80060ec4878488dc Mon Sep 17 00:00:00 2001 From: olim Date: Tue, 6 Feb 2024 21:32:01 +0000 Subject: add pets and runes. and pet skins add pets and runes to search for ah. and also added pet skins --- .../skyblock/searchOverlay/SearchOverManager.java | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'src/main/java/de/hysky/skyblocker') 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 00120dd9..dddabac2 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -27,6 +27,8 @@ public class SearchOverManager { 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+)"); + private static final Pattern AUCTION_PET_SKIN_PATTERN = Pattern.compile("PET_SKIN_(\\D*)"); 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" @@ -89,7 +91,6 @@ public class SearchOverManager { } } } - } @@ -101,6 +102,22 @@ public class SearchOverManager { JsonObject AuctionData = SkyblockerMod.GSON.fromJson(Http.sendGetRequest(THREE_DAY_AVERAGE), JsonObject.class); for (Map.Entry entry : AuctionData.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); + continue; + } + matcher = AUCTION_PET_SKIN_PATTERN.matcher(id); + if (matcher.find()){//is a pet skin + String name = matcher.group(1).replace("_", " "); + name = capitalizeFully(name); + name += " Skin"; + auctionItems.add(name); + continue; + } + //something else just loop up id. id = id.split("[+;-]")[0]; String name = itemNameLookup.get(id); if (name != null){ @@ -112,6 +129,7 @@ public class SearchOverManager { } catch (Exception e) { //can not find ah todo logger + System.out.println(e); } } -- cgit From 8c8ab45278dd71f06dd06623476e5f1c9d154809 Mon Sep 17 00:00:00 2001 From: olim Date: Tue, 6 Feb 2024 21:42:45 +0000 Subject: removed bazaar items not in bazaar for some reason the bazaar item list had items that were not in it so add a check to make sure the sell volume of an item is not 0 --- .../de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/main/java/de/hysky/skyblocker') 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 dddabac2..355b2e17 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -73,6 +73,8 @@ public class SearchOverManager { if (entry.getValue().isJsonObject()) { 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 Matcher matcher = BAZAAR_ENCHANTMENT_PATTERN.matcher(id); if (matcher.matches()) {//format enchantments String name = matcher.group(1).replace("_", " "); -- cgit From 4e010e0e247260fd45518406e39ee4831f56fafe Mon Sep 17 00:00:00 2001 From: olim Date: Wed, 7 Feb 2024 16:48:49 +0000 Subject: slightly improve pet skins made it so most pet skins are named correctly --- .../skyblocker/skyblock/searchOverlay/SearchOverManager.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker') 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 355b2e17..dfd6a3ab 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -49,12 +49,9 @@ public class SearchOverManager { public static String[] suggestionsArray = {}; public static void init() { //get bazaar items - System.out.println("is there somethin"); try { String response = Http.sendGetRequest("https://api.hypixel.net/v2/resources/skyblock/items"); - System.out.println("response:"); JsonArray items = JsonParser.parseString(response).getAsJsonObject().getAsJsonArray("items"); - System.out.println("jsonItem:"); for (JsonElement entry : items) { if (entry.isJsonObject()) { JsonObject item = entry.getAsJsonObject(); @@ -115,6 +112,11 @@ public class SearchOverManager { if (matcher.find()){//is a pet skin String name = matcher.group(1).replace("_", " "); name = capitalizeFully(name); + //put name of pet first however does not work with multi-word pets e.g. black cat. + if (name.contains(" ")){ + String[] splitName = name.split(" ",2); + name = splitName[1] + " " + splitName[0]; + } name += " Skin"; auctionItems.add(name); continue; -- cgit From 367d70ab4d66fc0bd6aef31ce21afa055b517f54 Mon Sep 17 00:00:00 2001 From: olim Date: Wed, 7 Feb 2024 16:55:17 +0000 Subject: improved enchants in bz removed the Ultimate from the name of enchants in bz so they are search able --- .../de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/main/java/de/hysky/skyblocker') 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 dfd6a3ab..c076edc7 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -74,7 +74,9 @@ public class SearchOverManager { 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 - String name = matcher.group(1).replace("_", " "); + //remove ultimate if in name + String name = matcher.group(1).replace("ULTIMATE_",""); + name = name.replace("_", " "); name = capitalizeFully(name); int enchantLevel = Integer.parseInt(matcher.group(2)); String level = ""; -- 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/java/de/hysky/skyblocker') 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 f6d17c2ec7f33cf7ebc2fa8b7f21c9f541ba4ac2 Mon Sep 17 00:00:00 2001 From: olim Date: Wed, 7 Feb 2024 18:52:54 +0000 Subject: add descriptions for functions adds descriptions fall all new functions and removes unused renderBackground function --- .../skyblock/searchOverlay/OverlayScreen.java | 30 +++++++---- .../skyblock/searchOverlay/SearchOverManager.java | 59 +++++++++++++++++++--- 2 files changed, 72 insertions(+), 17 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker') 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 d6d7584e..26608f85 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java @@ -1,6 +1,8 @@ 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; @@ -27,6 +29,10 @@ public class OverlayScreen extends Screen { public OverlayScreen(Text title) { super(title); } + + /** + * Creates the layout for the overlay screen. + */ @Override protected void init() { super.init(); @@ -95,7 +101,9 @@ public class OverlayScreen extends Screen { this.setInitialFocus(searchField); } - + /** + * Renders the search icon and the label for the history + */ @Override public void render(DrawContext context, int mouseX, int mouseY, float delta) { super.render(context, mouseX, mouseY, delta); @@ -105,13 +113,9 @@ public class OverlayScreen extends Screen { } } - @Override - public void renderBackground(DrawContext context, int mouseX, int mouseY, float delta) { - super.renderBackground(context, mouseX, mouseY, delta); - //todo draw custom background - - } - + /** + * Closes the overlay screen and gets the manager to send a packet update about the sign + */ @Override public void close() { assert this.client != null; @@ -119,6 +123,10 @@ public class OverlayScreen extends Screen { SearchOverManager.pushSearch(); super.close(); } + + /** + * updates if the suggestions buttons should be visible based on if they have a value + */ @Override public final void tick() { super.tick(); @@ -135,10 +143,14 @@ public class OverlayScreen extends Screen { } } + + /** + * When a key is pressed. If enter key pressed and search box selected close + */ @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { super.keyPressed(keyCode,scanCode,modifiers); - //if enter key pressed and search box selected close + // if (keyCode == GLFW.GLFW_KEY_ENTER && searchField.isActive()){ close(); return 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 c076edc7..7bd6a259 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -25,10 +25,18 @@ public class SearchOverManager { private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); + /** + * 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+)"); private static final Pattern AUCTION_PET_SKIN_PATTERN = Pattern.compile("PET_SKIN_(\\D*)"); + + /** + * converts index (in array) +1 to a roman numeral + */ 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" @@ -47,6 +55,10 @@ public class SearchOverManager { public static HashSet auctionItems =new HashSet<>(); public static String[] suggestionsArray = {}; + + /** + * uses the skyblock api and Moulberry auction to load a list of items in bazaar and auction house + */ public static void init() { //get bazaar items try { @@ -139,7 +151,10 @@ public class SearchOverManager { } } - + /** + * Capitalizes the first letter off every word in a string + * @param str string to capitalize + */ private static String capitalizeFully(String str) { if (str == null || str.isEmpty()) { return str; @@ -149,16 +164,24 @@ public class SearchOverManager { .map(t -> t.substring(0, 1).toUpperCase() + t.substring(1).toLowerCase()) .collect(Collectors.joining(" ")); } - - private static String trimItemColor(String string){ - if (string.isEmpty()) return string; - if (string.startsWith("§") ){ - return string.substring(2); + /** + * Removes the item color text tags from the start of a string if it has one + * @param str string to remove color + */ + private static String trimItemColor(String str){ + if (str.isEmpty()) return str; + if (str.startsWith("§") ){ + return str.substring(2); }else { - return string; + return str; } } - + /** + * 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) { visible= true; SignFront = front; @@ -180,6 +203,10 @@ public class SearchOverManager { suggestionsArray = new String[]{}; } + /** + * Updates the search value and the suggestions based on that value. + * @param newValue new search value + */ protected static void updateSearch(String newValue) { search = newValue; //update the suggestion values @@ -192,6 +219,11 @@ public class SearchOverManager { suggestionsArray = bazaarItems.stream().filter(item -> item.toLowerCase().contains(search.toLowerCase())).limit(totalSuggestions).toList().toArray(suggestionsArray); } } + + /** + * 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 ){ return suggestionsArray[index]; @@ -199,6 +231,10 @@ public class SearchOverManager { return ""; } } + /** + * 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){ @@ -212,6 +248,10 @@ 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 + */ private static void saveHistory(){ //save to history int historyLength = SkyblockerConfigManager.get().general.searchOverlay.historyLength; @@ -229,6 +269,9 @@ public class SearchOverManager { SkyblockerConfigManager.save(); } + /** + *Saves the current search value and then splits it onto the first to lines of the sign making sure not to split a word in 2 + */ protected static void pushSearch() { //save to history if (!search.isEmpty()){ -- 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/java/de/hysky/skyblocker') 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 c8b27d8be31aadcc6b98c8812096cdf85e226c8f Mon Sep 17 00:00:00 2001 From: olim Date: Wed, 7 Feb 2024 20:04:59 +0000 Subject: fix auction item list found that there is a neu repo thing to get item names. uses this for auction items. --- .../skyblock/searchOverlay/SearchOverManager.java | 36 +++++++--------------- 1 file changed, 11 insertions(+), 25 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker') 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 7bd6a259..e4f77f9a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -7,6 +7,8 @@ import com.google.gson.JsonParser; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.utils.Http; +import de.hysky.skyblocker.utils.NEURepoManager; +import io.github.moulberry.repo.data.NEUItem; import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.client.MinecraftClient; import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket; @@ -32,7 +34,6 @@ public class SearchOverManager { 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 Pattern AUCTION_PET_SKIN_PATTERN = Pattern.compile("PET_SKIN_(\\D*)"); /** * converts index (in array) +1 to a roman numeral @@ -115,6 +116,7 @@ public class SearchOverManager { JsonObject AuctionData = SkyblockerMod.GSON.fromJson(Http.sendGetRequest(THREE_DAY_AVERAGE), JsonObject.class); for (Map.Entry entry : AuctionData.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("_", " "); @@ -122,26 +124,14 @@ public class SearchOverManager { auctionItems.add(name); continue; } - matcher = AUCTION_PET_SKIN_PATTERN.matcher(id); - if (matcher.find()){//is a pet skin - String name = matcher.group(1).replace("_", " "); - name = capitalizeFully(name); - //put name of pet first however does not work with multi-word pets e.g. black cat. - if (name.contains(" ")){ - String[] splitName = name.split(" ",2); - name = splitName[1] + " " + splitName[0]; - } - name += " Skin"; - auctionItems.add(name); - continue; - } - //something else just loop up id. - id = id.split("[+;-]")[0]; - String name = itemNameLookup.get(id); - if (name != null){ - name = trimItemColor(name); + //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()); auctionItems.add(name); } + } @@ -165,16 +155,12 @@ public class SearchOverManager { .collect(Collectors.joining(" ")); } /** - * Removes the item color text tags from the start of a string if it has one + * 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; - if (str.startsWith("§") ){ - return str.substring(2); - }else { - return str; - } + return str.replaceAll("§[0-9a-g]",""); } /** * Receives data when a search is started and resets values -- cgit From 801735a06e283d185a1d3b06aad55444a6c7578f Mon Sep 17 00:00:00 2001 From: olim Date: Wed, 7 Feb 2024 21:44:19 +0000 Subject: added icons added icons to the suggested options and history --- .../skyblock/searchOverlay/OverlayScreen.java | 26 ++++++++++- .../skyblock/searchOverlay/SearchOverManager.java | 52 +++++++++++++++++----- 2 files changed, 67 insertions(+), 11 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker') 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 ece25884..6760f20d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java @@ -3,15 +3,22 @@ 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; 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 { @@ -35,7 +42,7 @@ public class OverlayScreen extends Screen { protected void init() { super.init(); int rowHeight = 20; - int rowWidth = (int)(this.width * 0.33); + 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); @@ -64,6 +71,7 @@ public class OverlayScreen extends Screen { }) .position(startX , startY + rowOffset) .size(rowWidth, rowHeight).build(); + suggestionButtons[i].visible = false; rowOffset += rowHeight; } @@ -110,6 +118,22 @@ public class OverlayScreen extends Screen { context.drawText(textRenderer, Text.translatable("text.autoconfig.skyblocker.option.general.searchOverlay.historyLabel") , historyButtons[0].getX()+2, historyButtons[0].getY() - 10, 0xFFFFFFFF, true); } + //draw item stacks 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() + 2,suggestionButtons[i].getY() + 2); + } + 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() + 2,historyButtons[i].getY() + 2); + } + } /** 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 e4f77f9a..682d514e 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -54,6 +54,8 @@ public class SearchOverManager { public static Map itemNameLookup = new HashMap<>(); public static HashSet bazaarItems =new HashSet<>(); public static HashSet auctionItems =new HashSet<>(); + public static HashMap namesToId =new HashMap<>(); + public static String[] suggestionsArray = {}; @@ -88,22 +90,27 @@ public class SearchOverManager { Matcher matcher = BAZAAR_ENCHANTMENT_PATTERN.matcher(id); if (matcher.matches()) {//format enchantments //remove ultimate if in name - String name = matcher.group(1).replace("ULTIMATE_",""); + String name = matcher.group(1).replace("ULTIMATE_", ""); name = name.replace("_", " "); name = capitalizeFully(name); int enchantLevel = Integer.parseInt(matcher.group(2)); String level = ""; - if (enchantLevel > 0){ - level = ROMAN_NUMERALS[enchantLevel-1]; - } - bazaarItems.add(name + " " + level); - }else{//look up id for name - String name = itemNameLookup.get(product.get("product_id").getAsString()); - if (name != null){ - name = trimItemColor(name); - bazaarItems.add(name); + if (enchantLevel > 0) { + level = ROMAN_NUMERALS[enchantLevel - 1]; } + bazaarItems.add(name + " " + level); + namesToId.put(name + " " + level, "ENCHANTED_BOOK"); + continue; + } + //look up id for name + String name = itemNameLookup.get(product.get("product_id").getAsString()); + if (name != null){ + name = trimItemColor(name); + bazaarItems.add(name); + namesToId.put(name, id); + continue; } + } } @@ -122,6 +129,7 @@ public class SearchOverManager { String name = matcher.group(1).replace("_", " "); name = capitalizeFully(name); auctionItems.add(name); + namesToId.put(name, id); continue; } //something else look up in NEU repo. @@ -130,6 +138,8 @@ public class SearchOverManager { if (item != null){ String name = trimItemColor(item.getDisplayName()); auctionItems.add(name); + namesToId.put(name, id); + continue; } } @@ -217,6 +227,13 @@ public class SearchOverManager { 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 ""; + } + } /** * Gets the item name in the history array at the index * @param index index of suggestion @@ -235,6 +252,21 @@ public class SearchOverManager { 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; + } + + /** * 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 */ -- cgit From 7a0635b4f7825ac335e79e4ec738cefcce47c2f2 Mon Sep 17 00:00:00 2001 From: olim Date: Thu, 8 Feb 2024 12:07:57 +0000 Subject: fix small bugs and formatting fix most formatting issues and a few small bugs --- .../skyblock/searchOverlay/OverlayScreen.java | 39 +++++++++---------- .../skyblock/searchOverlay/SearchOverManager.java | 45 +++++++++------------- 2 files changed, 37 insertions(+), 47 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker') 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 6760f20d..45ec2781 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java @@ -23,14 +23,13 @@ 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 int rowHeight = 20; private TextFieldWidget searchField; private ButtonWidget finishedButton; private ButtonWidget[] suggestionButtons; private ButtonWidget[] historyButtons; - - public OverlayScreen(Text title) { super(title); } @@ -41,25 +40,23 @@ public class OverlayScreen extends Screen { @Override protected void init() { super.init(); - int rowHeight = 20; 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...")); + this.searchField = new TextFieldWidget(textRenderer,startX, startY, rowWidth - rowHeight, rowHeight, Text.literal("Search...")); 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(); }) .position(startX + rowWidth - rowHeight, startY) .size(rowHeight, rowHeight).build(); + // suggested item buttons int rowOffset = rowHeight; int totalSuggestions = SkyblockerConfigManager.get().general.searchOverlay.maxSuggestions; @@ -69,9 +66,8 @@ public class OverlayScreen extends Screen { SearchOverManager.updateSearch(a.getMessage().getString()); close(); }) - .position(startX , startY + rowOffset) + .position(startX, startY + rowOffset) .size(rowWidth, rowHeight).build(); - suggestionButtons[i].visible = false; rowOffset += rowHeight; } @@ -81,12 +77,12 @@ public class OverlayScreen extends Screen { this.historyButtons = new ButtonWidget[historyLength]; for (int i = 0; i < historyLength; i++) { String text = SearchOverManager.getHistory(i); - if (text != null){ + if (text != null) { historyButtons[i] = ButtonWidget.builder(Text.literal(text).setStyle(Style.EMPTY), (a) -> { SearchOverManager.updateSearch(a.getMessage().getString()); close(); }) - .position(startX , startY + rowOffset) + .position(startX, startY + rowOffset) .size(rowWidth, rowHeight).build(); rowOffset += rowHeight; }else{ @@ -94,6 +90,7 @@ public class OverlayScreen extends Screen { } } + //add drawables in order to make tab navigation sensible addDrawableChild(searchField); for (ButtonWidget suggestion : suggestionButtons){ addDrawableChild(suggestion); @@ -105,35 +102,38 @@ public class OverlayScreen extends Screen { } addDrawableChild(finishedButton); + //focus the search box this.setInitialFocus(searchField); } + /** - * Renders the search icon and the label for the history + * Renders the search icon, label for the history and item Stacks for item names */ @Override 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 + 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()+2, historyButtons[0].getY() - 10, 0xFFFFFFFF, true); + , historyButtons[0].getX() + renderOffset, historyButtons[0].getY() - (rowHeight / 2), 0xFFFFFFFF, true); } + //draw item stacks 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() + 2,suggestionButtons[i].getY() + 2); + context.drawItem(item,suggestionButtons[i].getX() + renderOffset,suggestionButtons[i].getY() + renderOffset); } for (int i = 0; i < historyButtons.length; i++) { String id = SearchOverManager.getHistoryId(i); - if (id != null && id.isEmpty()) continue; + if (id == null || id.isEmpty()) continue; ItemStack item = getItemStack(id); if (item == null) continue; - context.drawItem(item,historyButtons[i].getX() + 2,historyButtons[i].getY() + 2); + context.drawItem(item,historyButtons[i].getX() + renderOffset,historyButtons[i].getY() + renderOffset); } - } /** @@ -162,7 +162,6 @@ public class OverlayScreen extends Screen { }else{ suggestionButtons[i].visible = false; } - } } @@ -173,12 +172,10 @@ 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()){ close(); return true; } return false; } - } 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 682d514e..84bcada9 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -43,19 +43,16 @@ public class SearchOverManager { "XII", "XIII", "XIV", "XV", "XVI", "XVII","XVIII", "XIX", "XX" }; - public static boolean visible = false; - public static String search = ""; private static @Nullable SignBlockEntity Sign = null; private static boolean SignFront = true; - private static boolean IsAuction; + protected static String search = ""; - public static Map itemNameLookup = new HashMap<>(); - public static HashSet bazaarItems =new HashSet<>(); - public static HashSet auctionItems =new HashSet<>(); - public static HashMap namesToId =new HashMap<>(); - + 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<>(); public static String[] suggestionsArray = {}; @@ -74,7 +71,6 @@ public class SearchOverManager { String itemName = item.get("name").getAsString(); itemNameLookup.put(itemId,itemName); } - } } catch (Exception e) { //can not get items skyblock items @@ -110,7 +106,6 @@ public class SearchOverManager { namesToId.put(name, id); continue; } - } } @@ -141,13 +136,10 @@ public class SearchOverManager { namesToId.put(name, id); continue; } - } - } catch (Exception e) { //can not find ah todo logger - System.out.println(e); } } @@ -179,7 +171,6 @@ public class SearchOverManager { * @param isAuction if the sign is loaded from the auction house menu or bazaar */ public static void updateSign(SignBlockEntity sign, boolean front, boolean isAuction) { - visible= true; SignFront = front; Sign = sign; IsAuction = isAuction; @@ -199,6 +190,7 @@ public class SearchOverManager { suggestionsArray = new String[]{}; } + /** * Updates the search value and the suggestions based on that value. * @param newValue new search value @@ -221,19 +213,20 @@ public class SearchOverManager { * @param index index of suggestion */ protected static String getSuggestion(int index){ - if (suggestionsArray.length> index && suggestionsArray[index] != null ){ + if (suggestionsArray.length> index && suggestionsArray[index] != null){ return suggestionsArray[index]; }else{//there are no suggestions yet return ""; } } protected static String getSuggestionId(int index){ - if (suggestionsArray.length> index && suggestionsArray[index] != null ){ + if (suggestionsArray.length> index && suggestionsArray[index] != null){ return namesToId.get(suggestionsArray[index]); }else{//there are no suggestions yet return ""; } } + /** * Gets the item name in the history array at the index * @param index index of suggestion @@ -254,12 +247,12 @@ public class SearchOverManager { protected static String getHistoryId(int index){ if (IsAuction){ - if (SkyblockerConfigManager.get().general.searchOverlay.auctionHistory.size() >index){ + 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){ + if (SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory.size() > index){ return namesToId.get(capitalizeFully(SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory.get(index))); } } @@ -274,13 +267,13 @@ public class SearchOverManager { //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.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.add(0, search); + if (SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory.size() > historyLength) { SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory = SkyblockerConfigManager.get().general.searchOverlay.bazaarHistory.subList(0, historyLength); } } @@ -298,24 +291,24 @@ public class SearchOverManager { //splits text into 2 lines max = 30 chars StringBuilder line0 = new StringBuilder(); String line1; - if (search.length() <= 15){ + if (search.length() <= 15) { line0 = new StringBuilder(search); line1 = ""; }else { String[] words = search.split(" "); - for (String word : words){ + 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 + 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)); + line1 = search.substring(line0.length(), Math.min(search.length(), 30)); } // send packet to update sign -- 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/java/de/hysky/skyblocker') 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 7dd0678eab47ba81420b2110b03821fe5d37d3f8 Mon Sep 17 00:00:00 2001 From: olim Date: Thu, 8 Feb 2024 17:31:04 +0000 Subject: add tool tips add a tool tip to the button depending on the item they are showing. assuming it is the name of an item --- .../skyblock/searchOverlay/OverlayScreen.java | 36 ++++++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker') 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 db72b3d8..b626ed7a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java @@ -3,9 +3,12 @@ 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; @@ -82,7 +85,20 @@ public class OverlayScreen extends Screen { .position(startX, startY + rowOffset) .size(rowWidth, rowHeight).build(); rowOffset += rowHeight; - }else{ + + //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 { break; } } @@ -153,14 +169,28 @@ 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 (!Objects.equals(text, "")){ + if (!text.isEmpty()){ + String text2 = suggestionButtons[i].getMessage().getString(); + boolean isNewText = !text.equals(suggestionButtons[i].getMessage().getString()); + if (!isNewText) continue; suggestionButtons[i].visible = true; suggestionButtons[i].setMessage(Text.literal(text).setStyle(Style.EMPTY)); + + //update the tool tip + String id = SearchOverManager.getSuggestionId(i); + if (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")); + }); + suggestionButtons[i].setTooltip(Tooltip.of(Text.of(tooltip))); }else{ suggestionButtons[i].visible = false; } } - } /** -- cgit From 65f0b628a6db1c5c6f15622b6a7948c6e19b540f Mon Sep 17 00:00:00 2001 From: olim Date: Thu, 8 Feb 2024 17:42:28 +0000 Subject: small fixes and comments fix small bugs and add more comments --- .../skyblocker/skyblock/searchOverlay/OverlayScreen.java | 10 ++++++++-- .../skyblocker/skyblock/searchOverlay/SearchOverManager.java | 11 ++++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker') 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 b626ed7a..9155a894 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java @@ -178,9 +178,15 @@ public class OverlayScreen extends Screen { //update the tool tip String id = SearchOverManager.getSuggestionId(i); - if (id.isEmpty() || client == null) continue; + if (id.isEmpty() || client == null) { + suggestionButtons[i].setTooltip(null); + continue; + } ItemStack item = getItemStack(id); - if (item == null) continue; + if (item == null) { + suggestionButtons[i].setTooltip(null); + continue; + } MutableText tooltip = Text.literal(""); item.getTooltip(client.player, TooltipContext.BASIC).forEach(line -> { tooltip.append(line); 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 d57e3174..3b48afa0 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -9,6 +9,7 @@ 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.skyblock.dwarven.CrystalsHud; import de.hysky.skyblocker.utils.Http; import de.hysky.skyblocker.utils.NEURepoManager; import de.hysky.skyblocker.utils.scheduler.MessageScheduler; @@ -309,7 +310,7 @@ public class SearchOverManager { } /** - *Saves the current search value and then splits it onto the first to lines of the sign making sure not to split a word in 2 + *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 @@ -325,7 +326,12 @@ public class SearchOverManager { } + /** + * runs the command to search for the value in ({@link SearchOverManager#search}) + */ private static void pushCommand() { + if (search.isEmpty()) return; + String command; if (IsAuction){ command = "/ahSearch " + search; @@ -335,6 +341,9 @@ public class SearchOverManager { MessageScheduler.INSTANCE.queueMessage(command, 0); } + /** + * pushes the ({@link SearchOverManager#search}) to the sign. It needs to split it over two lines without splitting a word + */ private static void pushSign() { //splits text into 2 lines max = 30 chars StringBuilder line0 = new StringBuilder(); -- cgit From 4739afedd23b85eee08e90b281f48b77af5528a1 Mon Sep 17 00:00:00 2001 From: olim Date: Thu, 8 Feb 2024 17:45:15 +0000 Subject: add logger outputs to catch added logger outputs in try catch when loading item lists --- .../skyblocker/skyblock/searchOverlay/SearchOverManager.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker') 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 3b48afa0..fbb3b5c9 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -22,6 +22,8 @@ import net.minecraft.command.CommandRegistryAccess; import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket; import net.minecraft.text.Text; import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.*; import java.util.regex.Matcher; @@ -33,6 +35,7 @@ import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.lit 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 @@ -108,6 +111,7 @@ public class SearchOverManager { } } 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(); @@ -143,7 +147,8 @@ public class SearchOverManager { } } } catch (Exception e) { - //can not get items for bazaar search //todo log + //can not get items for bazaar search + LOGGER.error("[Skyblocker] bazaar item list download failed! ", e); } //get auction items @@ -171,7 +176,8 @@ public class SearchOverManager { } } } catch (Exception e) { - //can not find ah todo logger + //can not find ah + LOGGER.error("[Skyblocker] ah item list download failed! ", e); } } /** -- cgit From 753fa369f40e5ec9521e5ff833892362696fa58e Mon Sep 17 00:00:00 2001 From: olim Date: Thu, 8 Feb 2024 18:02:59 +0000 Subject: correct tool tip and name for books in bazaar corrected the tool tip for books in the bazaar. and fixed bug with suggestions not rendering. --- .../de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java | 7 ++++--- .../hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java | 7 +++++-- 2 files changed, 9 insertions(+), 5 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker') 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 9155a894..b10510ed 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/OverlayScreen.java @@ -73,7 +73,7 @@ public class OverlayScreen extends Screen { } // history item buttons rowOffset += (int) (rowHeight * 0.75); - int historyLength = SkyblockerConfigManager.get().general.searchOverlay.historyLength; //todo look different + int historyLength = SkyblockerConfigManager.get().general.searchOverlay.historyLength; this.historyButtons = new ButtonWidget[historyLength]; for (int i = 0; i < historyLength; i++) { String text = SearchOverManager.getHistory(i); @@ -170,10 +170,11 @@ public class OverlayScreen extends Screen { for (int i = 0; i < SkyblockerConfigManager.get().general.searchOverlay.maxSuggestions; i++) { String text = SearchOverManager.getSuggestion(i); if (!text.isEmpty()){ - String text2 = suggestionButtons[i].getMessage().getString(); + suggestionButtons[i].visible = true; + boolean isNewText = !text.equals(suggestionButtons[i].getMessage().getString()); if (!isNewText) continue; - suggestionButtons[i].visible = true; + suggestionButtons[i].setMessage(Text.literal(text).setStyle(Style.EMPTY)); //update the tool tip 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 fbb3b5c9..1b019a7f 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchOverlay/SearchOverManager.java @@ -124,7 +124,10 @@ public class SearchOverManager { Matcher matcher = BAZAAR_ENCHANTMENT_PATTERN.matcher(id); if (matcher.matches()) {//format enchantments //remove ultimate if in name - String name = matcher.group(1).replace("ULTIMATE_", ""); + String name = matcher.group(1); + if (!name.contains("WISE")) { //only way found to remove ultimate from everything but ultimate wise + name = name.replace("ULTIMATE_", ""); + } name = name.replace("_", " "); name = capitalizeFully(name); int enchantLevel = Integer.parseInt(matcher.group(2)); @@ -133,7 +136,7 @@ public class SearchOverManager { level = ROMAN_NUMERALS[enchantLevel - 1]; } bazaarItems.add(name + " " + level); - namesToId.put(name + " " + level, "ENCHANTED_BOOK"); + namesToId.put(name + " " + level, matcher.group(1) + ";" + matcher.group(2)); continue; } //look up id for name -- 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/java/de/hysky/skyblocker') 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