毒苹果
这个例子只是为了展示进度(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,比如高频等。