From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Yannick Lamprecht 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. + *

+ * 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. + *

+ * 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 3f1b48fd65df954e874e6dc6b9093cb12370e2c5..0e9ccfee7a03d341e7c4d271f53b4ed168b404ef 100644 --- a/src/main/java/org/bukkit/UnsafeValues.java +++ b/src/main/java/org/bukkit/UnsafeValues.java @@ -273,4 +273,6 @@ public interface UnsafeValues { @org.jetbrains.annotations.ApiStatus.Internal io.papermc.paper.plugin.lifecycle.event.LifecycleEventManager createPluginLifecycleEventManager(final org.bukkit.plugin.java.JavaPlugin plugin, final java.util.function.BooleanSupplier registrationCheck); // Paper end - lifecycle event API + + @NotNull java.util.List 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 f8573571cd256b9bf68e0e8c6fa523be5b46b83e..61de2daa17957079ccc3ae36d40745d6cb516d16 100644 --- a/src/main/java/org/bukkit/inventory/ItemStack.java +++ b/src/main/java/org/bukkit/inventory/ItemStack.java @@ -1029,4 +1029,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. + *

+ * Disclaimer: + * 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 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 }