毒苹果

这个例子只是为了展示进度(Advancement)的其中一个用处:事件检测。

阅读此例子前需要先学习进度

假设我们要弄一个特殊的毒苹果,玩家吃了就会死,我们要怎样弄呢?

其中一个思路就是,检测玩家手上的物品,然后当玩家吃掉苹果之前1gt还是拿着那毒苹果的话,就给予中毒效果。这的确可行,然而这太麻烦了,而且得依赖高频。我们可以通过进度更方便的做到。

进度文件

假设那毒苹果的显示名称为毒苹果,我们要检测玩家吃掉这个苹果,我们可以使用进度中的minecraft:consume_item判据。

由于我们不希望显示这个进度,所以我们不需要设定任何和显示、父进度有关的属性。(其实就是从例子里复制的)
获得了这个进度后我们就需要执行命令函数,因此我们需要rewards

进度example:ate_apple

{
    "criteria": {
        "ate_poison_apple": {
            "trigger": "minecraft:consume_item",
            "conditions": {
                "item": "minecraft:apple",
                "nbt": "{display:{Name:\"毒苹果\"}}"
            }
        }
    },
    "rewards": {
        "function": "example:poison_apple"
    }
}

命令函数文件

由于进度只能获得一次,因此获得进度之后我们需要为玩家移除那进度,让他们能够再次获得(检测)那进度。
然后我们就需要给予玩家那个效果,我们会使用effect命令。

# example:poison_apple
advancement revoke @s only example:ate_apple
effect @s minecraft:poison 10 0

通过进度进行事件检测,可以减少高频需要的检测数量,减少需要的记分板数量,减少那些复杂的逻辑。十分方便。

不过需要注意,由于MC-118841的缘故,如果判据和玩家背包的物品改变有关(无论是inventory_changed还是consume_item等等),就不能马上对其进行有关物品操作,比如give或者clear物品都会导致所谓的幽灵物品(Ghost item)出现。请使用一些方法延迟1gt,比如高频等。

results matching ""

    No results matching ""