aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/api/0444-ItemStack-Tooltip-API.patch
blob: dccbe82eebaddf65a6a061459e15a6c38eb97df2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Yannick Lamprecht <yannicklamprecht@live.de>
Date: Mon, 22 Jan 2024 13:27:18 +0100
Subject: [PATCH] ItemStack Tooltip API


diff --git a/src/main/java/io/papermc/paper/inventory/tooltip/TooltipContext.java b/src/main/java/io/papermc/paper/inventory/tooltip/TooltipContext.java
new file mode 100644
index 0000000000000000000000000000000000000000..39ac768b3c5148544cb1aaf2c817e661f6856f64
--- /dev/null
+++ b/src/main/java/io/papermc/paper/inventory/tooltip/TooltipContext.java
@@ -0,0 +1,75 @@
+package io.papermc.paper.inventory.tooltip;
+
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.Contract;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Context for computing itemstack tooltips via
+ * {@link org.bukkit.inventory.ItemStack#computeTooltipLines(TooltipContext, Player)}
+ */
+public interface TooltipContext {
+
+    /**
+     * Creates a new context with the given advanced and creative
+     * mode settings.
+     *
+     * @param advanced whether the context is for advanced tooltips
+     * @param creative whether the context is for the creative inventory
+     * @return a new context
+     */
+    @Contract("_, _ -> new")
+    static @NotNull TooltipContext create(final boolean advanced, final boolean creative) {
+        return new TooltipContextImpl(advanced, creative);
+    }
+
+    /**
+     * Creates a new context that is neither advanced nor creative.
+     *
+     * @return a new context
+     */
+    @Contract("-> new")
+    static @NotNull TooltipContext create() {
+        return new TooltipContextImpl(false, false);
+    }
+
+    /**
+     * Returns whether the context is for advanced
+     * tooltips.
+     * <p>
+     * Advanced tooltips are shown by default
+     * when a player has {@code F3+H} enabled.
+     *
+     * @return true if for advanced tooltips
+     */
+    boolean isAdvanced();
+
+    /**
+     * Returns whether the context is for the creative
+     * mode inventory.
+     * <p>
+     * Creative tooltips are shown by default when a player is
+     * in the creative inventory.
+     *
+     * @return true if for creative mode inventory
+     */
+    boolean isCreative();
+
+    /**
+     * Returns a new context with {@link #isAdvanced()}
+     * set to true.
+     *
+     * @return a new context
+     */
+    @Contract("-> new")
+    @NotNull TooltipContext asAdvanced();
+
+    /**
+     * Returns a new context with {@link #isCreative()}
+     * set to true.
+     *
+     * @return a new context
+     */
+    @Contract("-> new")
+    @NotNull TooltipContext asCreative();
+}
diff --git a/src/main/java/io/papermc/paper/inventory/tooltip/TooltipContextImpl.java b/src/main/java/io/papermc/paper/inventory/tooltip/TooltipContextImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..1d9bed6691f581529c53b577b26f1d0f902ccb0d
--- /dev/null
+++ b/src/main/java/io/papermc/paper/inventory/tooltip/TooltipContextImpl.java
@@ -0,0 +1,16 @@
+package io.papermc.paper.inventory.tooltip;
+
+import org.jetbrains.annotations.NotNull;
+
+record TooltipContextImpl(boolean isCreative, boolean isAdvanced) implements TooltipContext {
+
+    @Override
+    public @NotNull TooltipContext asCreative() {
+        return new TooltipContextImpl(true, this.isAdvanced);
+    }
+
+    @Override
+    public @NotNull TooltipContext asAdvanced() {
+        return new TooltipContextImpl(this.isCreative, true);
+    }
+}
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
index c8c966feade4881f7a741ce059803f089e96107c..8534478dba8b9bdcb9cd1535fb0be18f8638f8b1 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
@@ -277,4 +277,6 @@ public interface UnsafeValues {
     @org.jetbrains.annotations.ApiStatus.Internal
     io.papermc.paper.plugin.lifecycle.event.LifecycleEventManager<org.bukkit.plugin.Plugin> createPluginLifecycleEventManager(final org.bukkit.plugin.java.JavaPlugin plugin, final java.util.function.BooleanSupplier registrationCheck);
     // Paper end - lifecycle event API
+
+    @NotNull java.util.List<net.kyori.adventure.text.Component> computeTooltipLines(@NotNull ItemStack itemStack, @NotNull io.papermc.paper.inventory.tooltip.TooltipContext tooltipContext, @Nullable org.bukkit.entity.Player player); // Paper - expose itemstack tooltip lines
 }
diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java
index 13d035ace9fbe93c3754595ac6cadbfbe30062a5..718070359c644de65c8fc2b34ad39913525d18c6 100644
--- a/src/main/java/org/bukkit/inventory/ItemStack.java
+++ b/src/main/java/org/bukkit/inventory/ItemStack.java
@@ -1037,4 +1037,21 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
         return type.isAir() || amount <= 0;
     }
     // Paper end
+    // Paper start - expose itemstack tooltip lines
+    /**
+     * Computes the tooltip lines for this stack.
+     * <p>
+     * <b>Disclaimer:</b>
+     * Tooltip contents are not guaranteed to be consistent across different
+     * Minecraft versions.
+     *
+     * @param tooltipContext the tooltip context
+     * @param player a player for player-specific tooltip lines
+     * @return an immutable list of components (can be empty)
+     */
+    @SuppressWarnings("deprecation") // abusing unsafe as a bridge
+    public java.util.@NotNull @org.jetbrains.annotations.Unmodifiable List<net.kyori.adventure.text.Component> computeTooltipLines(final @NotNull io.papermc.paper.inventory.tooltip.TooltipContext tooltipContext, final @Nullable org.bukkit.entity.Player player) {
+        return Bukkit.getUnsafe().computeTooltipLines(this, tooltipContext, player);
+    }
+    // Paper end - expose itemstack tooltip lines
 }