物品
在这一章,我将以R6MS的破片手榴弹为例,向你讲述如何编写一个物品,顺带介绍其他基本内容。
在R6MS重制版发布之前,暂时留空。R6MS旧版本的手榴弹实现需要改进。
奇奇怪怪的注意事项
Item与ItemStack
你需要注意这两者的区别。如图所示,这是一个最常见的物品栏:
在通常的语境中,我们极易把Item
与ItemStack
相混淆:你所见的这一个一个小格子是ItemStack
,其中装着某个Item
。
请注意,装有相同Item
的不同ItemStack
中的Item
是相同对象!也就是说,这一个草方块和一组草方块两个ItemStack
,其共同含有一个草方块实例。这意味着,你不能在你的Item
中保存独有的对象。比如,你不应该这样写:
public abstract class WrongItem extends Item {
private int id;
...
你如果在inventoryTick(ItemStack pStack,...)
中尝试输出id
和pStack
,就会发现pStack
不同而id
相同。
如果你需要为某种Item
保存独有的数据,你的首选是使用tag。当然也可以使用mixin,甚至可以自己造一个用于保存这个数据的轮子。
物品的耐久消耗
当你以某些方法修改(一般是减少)物品耐久时,请考虑在修改之前先判定物品是否能被损坏:
// 自然而直接地,你可能会这样写
public void damage(ItemStack stack){
stack.setDamageValue(stack.getDamageValue() + 1);
}
// 但是我更推荐这样做
public void damage(ItemStack stack){
if (stack.isDamageableItem()){
stack.setDamageValue(stack.getDamageValue() + 1);
}
}
这样做的目的是支持Unbreakable
标签。好处是,不但使玩家在创造模式下能够按需获得无限耐久的物品,也可以让玩家在生存模式下的某些特殊情况也能按需获得无限耐久的物品。