From e6a7562e39b2b940b2fecc572c9de88c52a0f09b Mon Sep 17 00:00:00 2001 From: Wasinthorn Suksri Date: Fri, 25 Jul 2025 03:39:31 +0700 Subject: Added Visitor Wiki Lookup (#1512) * feat: initial wiki lookup for visitors * fix: add slot id condition check * chore: style minor fix * fix: encode '?' for url --- .../skyblocker/mixins/HandledScreenMixin.java | 14 ++++++++++-- .../skyblock/garden/VisitorWikiLookup.java | 13 +++++++++++ .../hysky/skyblocker/skyblock/item/WikiLookup.java | 25 +++++++++++++++++----- .../skyblock/itemlist/ItemRepository.java | 6 +++++- 4 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorWikiLookup.java (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java index 935ebec6..b3812afc 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java @@ -9,6 +9,7 @@ import de.hysky.skyblocker.skyblock.PetCache; import de.hysky.skyblocker.skyblock.experiment.ExperimentSolver; import de.hysky.skyblocker.skyblock.experiment.SuperpairsSolver; import de.hysky.skyblocker.skyblock.experiment.UltrasequencerSolver; +import de.hysky.skyblocker.skyblock.garden.VisitorWikiLookup; import de.hysky.skyblocker.skyblock.garden.visitor.VisitorHelper; import de.hysky.skyblocker.skyblock.item.*; import de.hysky.skyblocker.skyblock.item.background.ItemBackgroundManager; @@ -118,10 +119,19 @@ public abstract class HandledScreenMixin extends Screen SkyblockerConfig config = SkyblockerConfigManager.get(); //wiki lookup if (config.general.wikiLookup.enableWikiLookup) { + var title = this.getTitle().getString(); if (WikiLookup.officialWikiLookup.matchesKey(keyCode, scanCode)) { - WikiLookup.openWiki(this.focusedSlot, client.player, true); + if (VisitorWikiLookup.canSearch(title, this.focusedSlot)) { + WikiLookup.openWikiItemName(this.focusedSlot.getStack().getName().getString(), this.client.player, true); + } else { + WikiLookup.openWiki(this.focusedSlot, this.client.player, true); + } } else if (WikiLookup.fandomWikiLookup.matchesKey(keyCode, scanCode)) { - WikiLookup.openWiki(this.focusedSlot, client.player, false); + if (VisitorWikiLookup.canSearch(title, this.focusedSlot)) { + WikiLookup.openWikiItemName(this.focusedSlot.getStack().getName().getString(), this.client.player, false); + } else { + WikiLookup.openWiki(this.focusedSlot, this.client.player, false); + } } } //item protection diff --git a/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorWikiLookup.java b/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorWikiLookup.java new file mode 100644 index 00000000..8e21e26c --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorWikiLookup.java @@ -0,0 +1,13 @@ +package de.hysky.skyblocker.skyblock.garden; + +import net.minecraft.item.Items; +import net.minecraft.screen.slot.Slot; +import org.jetbrains.annotations.NotNull; + +public class VisitorWikiLookup { + public static boolean canSearch(String title, @NotNull Slot slot) { + if (slot.id <= 9 || slot.id >= 44) return false; + if (slot.getStack().isOf(Items.BLACK_STAINED_GLASS_PANE)) return false; + return title.matches("^Visitor's Logbook$"); + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/WikiLookup.java b/src/main/java/de/hysky/skyblocker/skyblock/item/WikiLookup.java index 3d77c735..1648686a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/WikiLookup.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/WikiLookup.java @@ -17,6 +17,8 @@ import org.lwjgl.glfw.GLFW; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.concurrent.CompletableFuture; public class WikiLookup { @@ -48,10 +50,23 @@ public class WikiLookup { public static void openWiki(ItemStack stack, PlayerEntity player, boolean useOfficial) { ItemUtils.getItemIdOptional(stack) .map(neuId -> ItemRepository.getWikiLink(neuId, useOfficial)) - .ifPresentOrElse(wikiLink -> CompletableFuture.runAsync(() -> Util.getOperatingSystem().open(wikiLink)).exceptionally(e -> { - LOGGER.error("[Skyblocker] Error while retrieving wiki article...", e); - player.sendMessage(Constants.PREFIX.get().append("Error while retrieving wiki article, see logs..."), false); - return null; - }), () -> player.sendMessage(Constants.PREFIX.get().append(useOfficial ? Text.translatable("skyblocker.wikiLookup.noArticleFound.official") : Text.translatable("skyblocker.wikiLookup.noArticleFound.fandom")), false)); + .ifPresentOrElse(wikiLink -> openWikiLink(wikiLink, player), + () -> player.sendMessage(Constants.PREFIX.get().append(useOfficial ? Text.translatable("skyblocker.wikiLookup.noArticleFound.official") : Text.translatable("skyblocker.wikiLookup.noArticleFound.fandom")), false)); + } + + public static void openWikiItemName(String itemName, PlayerEntity player, boolean useOfficial) { + itemName = itemName.replace(" ", "_"); + // Special case for only a visitor that has '?' + itemName = itemName.replace("?", URLEncoder.encode("?", StandardCharsets.UTF_8)); + String wikiLink = ItemRepository.getWikiLink(useOfficial) + "/" + itemName; + openWikiLink(wikiLink, player); + } + + private static void openWikiLink(String wikiLink, PlayerEntity player) { + CompletableFuture.runAsync(() -> Util.getOperatingSystem().open(wikiLink)).exceptionally(e -> { + LOGGER.error("[Skyblocker] Error while retrieving wiki article...", e); + player.sendMessage(Constants.PREFIX.get().append("Error while retrieving wiki article, see logs..."), false); + return null; + }); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRepository.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRepository.java index 9ea7f06b..f3a80bd0 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRepository.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRepository.java @@ -121,7 +121,7 @@ public class ItemRepository { List info = item.getInfo(); String wikiLink0 = info.getFirst(); String wikiLink1 = info.size() > 1 ? info.get(1) : ""; - String wikiDomain = useOfficial ? "https://wiki.hypixel.net" : "https://hypixel-skyblock.fandom.com"; + String wikiDomain = getWikiLink(useOfficial); if (wikiLink0.startsWith(wikiDomain)) { return wikiLink0; } else if (wikiLink1.startsWith(wikiDomain)) { @@ -130,6 +130,10 @@ public class ItemRepository { return null; } + public static String getWikiLink(boolean useOfficial) { + return useOfficial ? "https://wiki.hypixel.net" : "https://hypixel-skyblock.fandom.com"; + } + public static List getRecipesAndUsages(ItemStack stack) { return Stream.concat(getRecipes(stack), getUsages(stack)).toList(); } -- cgit