基本用法

物品通过 ItemStack 作为其表现形式。一个 ItemStack 相当于一个物品槽中的物品,其中包含物品的数量,物品的类型以及额外数据(如耐久)等信息。一个 Item 本身是一个 ItemStack 作为一个实体的图形表现形式。请注意,你将总是获得一个副本,而 不是 实际的 ItemStack 。因此,如有需要,请再次将其设置回物品槽中。

检查物品类型

Checking the type of the item is very simple. You just need to call the ItemStack#type() method.

import org.spongepowered.api.item.ItemType;
import org.spongepowered.api.item.ItemTypes;
import org.spongepowered.api.item.inventory.ItemStack;

public boolean isStick(ItemStack stack) {
    ItemType type = stack.type();
    return type.equals(ItemTypes.STICK.get());
}

看看这是不是很简单?因为木棍是可堆叠的,所以我们还可以找出木棍的数量有多少。

Getting the number of items in an ItemStack is relatively easy. The ItemStack#quantity() method will handle this for us.

修改物品(ItemStack)的数据

操作物品的数据,诸如物品的耐久、或者物品的提示文本(Lore),可以直接通过使用数据键(Key)来解决。你只需指定需要改变的数据对应的数据键:

import org.spongepowered.api.data.key.Keys;

public void setUnbreakable(ItemStack stack) {
    stack.offer(Keys.UNBREAKABLE, true);
}

在这里,我们选取了一个数据键叫做 Keys#UNBREAKABLE ,然后将其对应的数据值设置成了 true 以意味着该物品将永远不会损坏。所有的这一切我们都只使用了 ItemStackoffer() 方法。

不同键根据其作用需要的值不同,例如为了修改物品的描述(Lore),我们需要提供一个 ComponentList 而不是布尔值或其他。同样很重要的一点是,我们还需要检查是否可以将数据值设置回给定物品。例如,一些物品不存在耐久,一些物品可能已有描述。

import net.kyori.adventure.text.Component;

import java.util.List;

public void setLore(ItemStack stack, List<Component> itemLore) {
    if (stack.get(Keys.ITEM_LORE).isPresent()) {
        stack.offer(Keys.ITEM_LORE, itemLore);
    }
}

备注

几乎所有返回 ItemStack 的方法都只返回一个副本,所以直接修改并不会对实际物品产生任何影响。你必须显式调用相关方法以使得更改生效。

物品属性

Certain items may hold specific properties. For example, certain items can mine specific blocks, such as a diamond pickaxe to obsidian. Properties are used for determining if an item can cause an action without actually checking up the type of the item. We can check if an item can mine obsidian by using the Keys#CAN_HARVEST of that item.

import org.spongepowered.api.block.BlockTypes;

public boolean canMineObsidian(ItemStack stack) {
    List<BlockType> canHarvest =
        stack.get(Keys.CAN_HARVEST).orElse(Collections.emptyList());
    return canHarvest.contains(BlockTypes.OBSIDIAN.get());
}

This code will check to see if the item has a assigned key of CAN_HARVEST, such as a pickaxe, if it doesn’t then it uses an empty array. It will then return if obsidian is contained within the list of blocks the item can harvest. This is useful in the event that a mod or a Minecraft update adds a new tool with the capabilities of mining obsidian.

比较两个物品

ItemStack 类包含一个用于比较两个 ItemStack 的简洁方法。通过使用 ItemStack#equalTo(ItemStack) 方法,并传入一个已有的 ItemStack ,我们就可以看到这两个 ItemStack 是否“相等”。也就是说,它们有着相同的物品数量、 ItemType 、以及数据。下面是一个示例:

public boolean isEqual(ItemStack stack1, ItemStack stack2) {
    return stack1.equalTo(stack2);
}