基本用法

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

检查物品类型

检查物品的类型十分简单。你只需要调用 ItemStack#getItem() 方法。

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.getItem();
    return type.equals(ItemTypes.STICK);
}

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

获取一个物品的数量也很简单。方法 ItemStack#getQuantity() 就是做这个的。

修改物品(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),那么我们需要提供一个 Text 的列表而不是单纯的布尔值或是其他的什么。当然,同样很重要的一点是,我们还需要检查是否可以将数据值设置回给定物品。例如,一些物品不存在耐久,一些物品可能已经有提示文本了。

import org.spongepowered.api.text.Text;

import java.util.List;

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

物品属性

某些物品可能有着特定的属性。例如,有的物品可以挖掘特定的方块,比如一把钻石镐可以挖掘黑曜石。属性可以用于在不实际检查物品类型的情况下确定一个物品是否可以引起操作。我们可以通过 HarvestingProperty 检查一个物品是否可以挖掘黑曜石。

import org.spongepowered.api.block.BlockTypes;
import org.spongepowered.api.data.property.item.HarvestingProperty;

import java.util.Optional;

public boolean canMineObsidian(ItemStack stack) {
    Optional<HarvestingProperty> optional =
        stack.getProperty(HarvestingProperty.class);

    if (optional.isPresent()) {
        HarvestingProperty property = optional.get();
        return property.getValue().contains(BlockTypes.OBSIDIAN);
    }
    return false;
}

这段代码将检查物品是否具有 HarvestingProperty ,比如镐。如果存在,它将返回这个物品是否可以把黑曜石挖掘下来。这里我们根本没有检查物品的类型,因为当一个 mod 或者 Minecraft 更新添加了一个拥有挖掘黑曜石能力的新的工具时,这么做是很有意义的。

比较两个物品

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

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