关于Advancement进度的触发器,从执行者为@s的@ a处执行毕业
首先
我经常在Minecraft的进度系统中使用tick触发器,所以我写了一篇关于如何使用它的文章。
这个问题
前提知識和用法
首先,进阶是玩家在满足特定条件时可以达成的成就。达成成就时可以获得经验值,同时也可以让玩家执行某个功能。而今天要讨论的”触发器”就占据了达成条件的大部分。
「tick」触发器是根据其名称直接定义的,意为「每个tick都要达成此进度」。换句话说,它是指强制性地在每个tick都要达成此进度的条件。
只有这样,在玩家进入游戏世界的瞬间,就能完成进度并结束。
因此,根据之前提到的“进度达到的玩家可以执行功能”的讨论,我们会在达到tick进度的玩家身上执行剥夺进度的功能。
{
"criteria": {
"requirement": {
"trigger": "minecraft:tick"
}
},
"rewards": {
"function": "minecraft:advancement_tick.mcfunction"
}
}
advancement revoke @s only minecraft:tick
这样做会发生什么呢?玩家会按照进度达成→执行功能→进度达成→执行功能的方式,每tick循环重复这个过程。换句话说,这个函数内写的命令都能够以玩家为中心,每tick执行。
我想要传达的信息
如果只是需要每个tick重复执行函数,那么只需要把函数放在数据包的tick.json标签中就可以了。但是最重要的是,能够以玩家为主体来执行函数。
#アイテムを使う(useのスコアが1以上になっている)とタイマー(playerのtimeのスコア)を進める
execute if score @s use matches 1.. run scoreboard players add @s time 1
#タイマーが200tickを超えるとスコアをリセットする
execute if score @s time matches 200.. run scoreboard players reset @s use
execute if score @s time matches 200.. run scoreboard players reset @s time
如果在每个命令的开头加上「execute as @a at @s」,则可以轻松给玩家的物品设置冷却时间。
另外,作为副作用,我们可以将想要每个tick由玩家发起的行动(如给玩家发出粒子效果或重置玩家的分数等),以及想要每个tick由世界发起的行动(如计算时间限制的分数等)分开,因此可以创建一个整洁明晰(易于后期调试)的数据包。整理非常重要!←这是我想要传达的主要内容。
最后
我开始接触数据包后只使用mcfunction,不可避免地大量使用了“execute as @a at @s”,所以我为这样的人写了这篇文章。如果你是处于相同情况的人,或者tick.json的内容杂乱无章,请务必尝试一次。
附言 (Fu Yan)
我并非技术领域出身,也不是每天探索类似隐藏在Minecraft中的功能。这不是唯一的选择也不是最高效的方法,所以我希望对那些对数据包感兴趣并开始接触的人,可以找到一些类似于“这种写法容易理解”或者“这样做更方便”的方法。