From 7769de8c37ca43da2fed332effddbe284f601b32 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Tue, 28 May 2024 19:05:25 +0300 Subject: Tooltip manager initial commit --- .../skyblocker/utils/tooltip/TooltipAdder.java | 35 ++++++++++++++ .../skyblocker/utils/tooltip/TooltipManager.java | 56 ++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipAdder.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java (limited to 'src/main/java/de/hysky/skyblocker/utils') diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipAdder.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipAdder.java new file mode 100644 index 00000000..1e628e99 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipAdder.java @@ -0,0 +1,35 @@ +package de.hysky.skyblocker.utils.tooltip; + +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; + +import java.util.List; +import java.util.regex.Pattern; + +/** + * Extend this class and add it to {@link TooltipManager#adders} to add additional text to tooltips. + */ +public abstract class TooltipAdder { + public final Pattern titlePattern; + //Lower priority means it will be applied first + public final int priority; + + protected TooltipAdder(String titlePattern, int priority) { + this(Pattern.compile(titlePattern), priority); + } + + protected TooltipAdder(Pattern titlePattern, int priority) { + this.titlePattern = titlePattern; + this.priority = priority; + } + + /** + * Creates a TooltipAdder that will be applied to all screens. + */ + protected TooltipAdder(int priority) { + this.titlePattern = null; + this.priority = priority; + } + + public abstract void addToTooltip(List lore, Slot focusedSlot); +} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java new file mode 100644 index 00000000..6a744283 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java @@ -0,0 +1,56 @@ +package de.hysky.skyblocker.utils.tooltip; + +import de.hysky.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public class TooltipManager { + private static final TooltipAdder[] adders = new TooltipAdder[]{}; + private static final ArrayList currentScreenAdders = new ArrayList<>(); + + private TooltipManager() { + } + + public static void init() { + ScreenEvents.AFTER_INIT.register((client, screen, width, height) -> { + onScreenChange(screen); + ScreenEvents.remove(screen).register(ignored -> currentScreenAdders.clear()); + }); + } + + private static void onScreenChange(Screen screen) { + final String title = screen.getTitle().getString(); + for (TooltipAdder adder : adders) { + if (adder.titlePattern == null || adder.titlePattern.matcher(title).matches()) { + currentScreenAdders.add(adder); + } + } + currentScreenAdders.sort(Comparator.comparingInt(adder -> adder.priority)); + } + + /** + *

Adds additional text from all adders that are applicable to the current screen. + * This method is run on each tooltip render, so don't do any heavy calculations here.

+ * + *

If you want to add info to the tooltips of multiple items, consider using a switch statement with {@code focusedSlot.getIndex()}

+ * + * @param lore The lore of the focused item. + * @param focusedSlot The slot that is currently focused by the cursor. + * @return The lore itself after all adders have added their text. + * @deprecated This method is public only for the sake of the mixin. Don't call directly, not that there is any point to it. + */ + @Deprecated + public static List addToTooltip(List lore, Slot focusedSlot) { + if (!Utils.isOnSkyblock()) return lore; + for (TooltipAdder adder : currentScreenAdders) { + adder.addToTooltip(lore, focusedSlot); + } + return lore; + } +} -- cgit