diff options
author | Rime <81419447+Emirlol@users.noreply.github.com> | 2024-05-28 19:05:25 +0300 |
---|---|---|
committer | Rime <81419447+Emirlol@users.noreply.github.com> | 2024-06-08 04:13:47 +0300 |
commit | 7769de8c37ca43da2fed332effddbe284f601b32 (patch) | |
tree | 65dd3eaaf3576a4a79b6bcc5b0e6ee1b1a830800 /src/main/java/de/hysky/skyblocker/utils | |
parent | 4bde27dc8c1e89d38f76477c5cd8d30a411c8bb6 (diff) | |
download | Skyblocker-7769de8c37ca43da2fed332effddbe284f601b32.tar.gz Skyblocker-7769de8c37ca43da2fed332effddbe284f601b32.tar.bz2 Skyblocker-7769de8c37ca43da2fed332effddbe284f601b32.zip |
Tooltip manager initial commit
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/utils')
-rw-r--r-- | src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipAdder.java | 35 | ||||
-rw-r--r-- | src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java | 56 |
2 files changed, 91 insertions, 0 deletions
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<Text> 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<TooltipAdder> 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)); + } + + /** + * <p>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.</p> + * + * <p>If you want to add info to the tooltips of multiple items, consider using a switch statement with {@code focusedSlot.getIndex()}</p> + * + * @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<Text> addToTooltip(List<Text> lore, Slot focusedSlot) { + if (!Utils.isOnSkyblock()) return lore; + for (TooltipAdder adder : currentScreenAdders) { + adder.addToTooltip(lore, focusedSlot); + } + return lore; + } +} |