はじめに
MinecraftのAdvancement(進捗)におけるtickトリガーをよく使うのでその使い方について書いてみました
本題
前提知識と使い方
そもそもAdvancementはそのプレイヤーが条件に当てはまるときに達成することのできるもので、達成時に経験値を付与したり、そのプレイヤーにfunctionを実行させたりできるものです。今回話す「トリガー」というものはその条件の大部分を占めます。
「tick」トリガーは、名前からそのままで、「毎tickこの進捗を達成する」というものです。言い換えると、「強制的に毎tickこの進捗を達成してしまう」という条件になります。
これだけだと、プレイヤーはワールドに入った瞬間、進捗を達成してハイ終わり。
そこで先ほど話した、「進捗は達成したプレイヤーにfunctionを実行させることができる」という話から、tickの進捗を達成したプレイヤーに、その進捗を剝奪するfunctionを実行させます。
{
"criteria": {
"requirement": {
"trigger": "minecraft:tick"
}
},
"rewards": {
"function": "minecraft:advancement_tick.mcfunction"
}
}
advancement revoke @s only minecraft:tick
こうするとどうなるかと言うと、プレイヤーは、進捗達成→function実行→進捗達成→function実行、と、毎tickこのループを繰り返します。つまり、このfunction内に書いたコマンドはすべて、プレイヤー主体で毎tick実行できる、と言うことです。
伝えたいこと
毎tick繰り返しfunctionを実行するだけなら、データパックのタグのtick.jsonにまとめればいい話なんですが、大事なのは、 プレイヤー主体 でfunctionを実行できるということです。
#アイテムを使う(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の中がごちゃごちゃになっている人は是非一度試してみてください。
あとがき
私は技術畑出身でもなければ、minecraftの隠された仕様みたいなのを日々探ってるというようなものでもないです。これじゃなきゃできない、このやり方が最高効率、といったわけではないので、データパックに興味をもった人・触り始めた人が、 「この書き方分かりやすい」「これだとやりやすい」 といったものを見つけてもらえればと思います。
、