Fix ItemStack amount issues with Chat Components (#12216)

This commit is contained in:
Pedro 2025-04-30 21:24:49 -04:00 committed by GitHub
parent bc3d946fdf
commit 0e9b94d533
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 14 additions and 4 deletions

View File

@ -210,12 +210,12 @@ public interface ItemFactory {
@Deprecated(since = "1.19.3") // Paper
ItemStack enchantItem(@NotNull final ItemStack item, final int level, final boolean allowTreasures);
// Paper start - Adventure
/**
* Creates a hover event for the given item.
*
* @param item The item
* @return A hover event
* @throws IllegalArgumentException if the {@link ItemStack#getAmount()} is not between 1 and 99
*/
@NotNull
net.kyori.adventure.text.event.HoverEvent<net.kyori.adventure.text.event.HoverEvent.ShowItem> asHoverEvent(final @NotNull ItemStack item, final @NotNull java.util.function.UnaryOperator<net.kyori.adventure.text.event.HoverEvent.ShowItem> op);
@ -223,12 +223,13 @@ public interface ItemFactory {
/**
* Get the formatted display name of the {@link ItemStack}.
*
* @apiNote this component include a {@link net.kyori.adventure.text.event.HoverEvent item hover event}.
* When used in chat, make sure to follow the ItemStack rules regarding amount, type, and other properties.
* @param itemStack the {@link ItemStack}
* @return display name of the {@link ItemStack}
*/
@NotNull
net.kyori.adventure.text.Component displayName(@NotNull ItemStack itemStack);
// Paper end - Adventure
// Paper start - add getI18NDisplayName
/**

View File

@ -9,6 +9,7 @@ import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Predicate;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.HoverEvent;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
@ -706,6 +707,13 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
return Bukkit.getItemFactory().enchantWithLevels(this, levels, keySet, random);
}
/**
* {@inheritDoc}
*
* @param op transformation on value
* @return a hover event
* @throws IllegalArgumentException if the {@link ItemStack#getAmount()} is not between 1 and 99
*/
@NotNull
@Override
public net.kyori.adventure.text.event.HoverEvent<net.kyori.adventure.text.event.HoverEvent.ShowItem> asHoverEvent(final @NotNull java.util.function.UnaryOperator<net.kyori.adventure.text.event.HoverEvent.ShowItem> op) {
@ -715,6 +723,8 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
/**
* Get the formatted display name of the {@link ItemStack}.
*
* @apiNote this component include a {@link net.kyori.adventure.text.event.HoverEvent item hover event}.
* When used in chat, make sure to follow the ItemStack rules regarding amount, type, and other properties.
* @return display name of the {@link ItemStack}
*/
public net.kyori.adventure.text.@NotNull Component displayName() {

View File

@ -214,9 +214,9 @@ public final class CraftItemFactory implements ItemFactory {
return CraftItemStack.asCraftMirror(EnchantmentHelper.enchantItem(source, craft.handle, level, registry, optional));
}
// Paper start - Adventure
@Override
public net.kyori.adventure.text.event.HoverEvent<net.kyori.adventure.text.event.HoverEvent.ShowItem> asHoverEvent(final ItemStack item, final java.util.function.UnaryOperator<net.kyori.adventure.text.event.HoverEvent.ShowItem> op) {
Preconditions.checkArgument(item.getAmount() > 1 && item.getAmount() <= 99, "ItemStack amount must be between 1 and 99 but was %s", item.getAmount());
return net.kyori.adventure.text.event.HoverEvent.showItem(op.apply(
net.kyori.adventure.text.event.HoverEvent.ShowItem.showItem(
item.getType().getKey(),
@ -229,7 +229,6 @@ public final class CraftItemFactory implements ItemFactory {
public net.kyori.adventure.text.@org.jetbrains.annotations.NotNull Component displayName(@org.jetbrains.annotations.NotNull ItemStack itemStack) {
return io.papermc.paper.adventure.PaperAdventure.asAdventure(CraftItemStack.asNMSCopy(itemStack).getDisplayName());
}
// Paper end - Adventure
// Paper start - ensure server conversions API
// TODO: DO WE NEED THIS?