更复杂的物品

在之前的章节中,我们每创建一个物品,都是直接通过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));
}

总结

在本节中,我们以速度宝石为例,创建了较复杂的物品。至此,读者应该明白了创建复杂物品的方法。

至此,我们已经学完了创建物品的方法,你已经可以编写一个很牛逼的物品了,试试吧!

results matching ""

    No results matching ""