更复杂的物品
在之前的章节中,我们每创建一个物品,都是直接通过new Item()
来实现的,但是这只能用来创建简单的物品。如果我们要想创建具有复杂功能的物品,就必须为这些物品写一个独立的类。
这一节,我们将以“速度宝石”为例,编写一个更复杂的物品。
物品功能的设定
我们这个物品非常简单,当玩家拿着该物品右键的时候,会消耗6点(三格)饥饿值,同时给予玩家速度II效果,持续15秒。
物品的类
新建一个类,直接继承Item
即可。它会要求读者编写一个构造函数,直接按要求编写即可。注意:类名要仿照Minecraft的写法,即XxxItem
。
src/main/java/xyz/bzstudio/modderguide/item/SpeedGemItem.java (部分)
:
public class SpeedGemItem extends Item {
public SpeedGemItem() {
super(new Properties().group(MGItemGroup.MODDERGUIDE));
}
}
然后就是最重要的了:右键消耗饥饿值并给予玩家速度效果。
在Item
中有一个方法,即onItemRightClick()
,在玩家右键时将会执行此方法。因此,我们需要覆写此方法。
在覆写此方法后,我们可以看到方法需要返回一个ActionResult
,有关ActionResult
,请读者自己按住Ctrl
查看。由于赋予玩家效果、消耗饥饿值等不是本章的重点,因此就直接放出代码,你自己看看吧。
src/main/java/com/github/vvvbbbcz/modderguide/item/SpeedGemItem.java (部分)
:
@Override
public ActionResult<ItemStack> onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) {
if (!worldIn.isRemote) { // 由于这是逻辑部分,因此需要确保这是在服务端
if (playerIn.getFoodStats().getFoodLevel() >= 6) { // 确保玩家的饥饿值高于6
// 添加药水效果,300表示时间为300tick(1tick等于0.05秒),1表示等级为2
playerIn.addPotionEffect(new EffectInstance(Effects.SPEED, 300, 1));
playerIn.getFoodStats().addStats(-6, 0); // 使玩家减少6点饥饿值
return ActionResult.resultSuccess(playerIn.getHeldItem(handIn)); // 表示动作成功完成
}
}
return ActionResult.resultFail(playerIn.getHeldItem(handIn));
}
总结
在本节中,我们以速度宝石为例,创建了较复杂的物品。至此,读者应该明白了创建复杂物品的方法。
至此,我们已经学完了创建物品的方法,你已经可以编写一个很牛逼的物品了,试试吧!