llllon_888のコマンドメモ帳

minecraft歴は長いけどコマンド歴は短い男のコマンド作成で気に留めておこうと思ったことまとめ場所。要は備忘録。偶然誰かの役に立ったらいいなって感じでわりと適当に書いてる。

minecraftで会話するコマンドを作りたい!

軽い前置き

RPG系で必須な会話コマンド。
話す内容を全部一つにまとめてsayコマンド使うのもまあ悪くはないだろう。
でも、さすがにそれじゃあ読みづらいしよくないよね?
だから、時差アリで表示する会話コマンドを使いたい!
でも、scheduleコマンドとかを使うとたくさんのfunctionが必要になるし、すさまじくダルい。
ということで一つのfunction内で時差あり会話をするコマンドを作っていこう!

ちなみにこの話はデータパック使う人限定の話で、使わずコマンドブロックでやる人はふつうにレッドストーンリピーターとか使えばいいと思うよ。

どんな仕組みか

まず最初にどんな仕組みで動くのかざっくり説明しよう

データパックにはtick.jsonで指定したfunctionを毎tick実行し続けるというものがあります。ここにtalkで使うfunctionを入れておく。
そして、その中身は

talk1というタグを持ったプレイヤーに毎tick、talk1というファンクションを実行させる。

というような感じ。
そして次に、talk1というファンクションの中身は

スコアボード[timer]を1増加させる
timerが1になったとき[台詞1]を表示
timerが40になったとき[台詞2]を表示
timerが80になったとき[台詞3]を表示
timerが80になったときタグtalk1を削除
timerが80になったときtimerを0にする

というような内容のコマンドを使う。
これが毎tick実行されてるので、1tick経つたびにtimerが増える。(ちなみに1秒につき20tick経過する)
そしてtimerが少しずつ増えていくので少しずつ台詞が表示される。
最後に台詞が終わったときに、タグを消して、timerもリセットすれば元通りになって会話が終了する

というような仕組みです

こういうようなコマンドを使うことで、会話を発生させたいタイミングでタグをつけるだけで会話をさせることができるお手軽コマンドが実装できます。
コピーしてタグの名前とファンクションの名前を変更するだけで新しい会話を作れるので会話を増やすのも簡単です。

事前準備

データパックを用意しましょう
timer というダミーのスコアを用意しておきましょう

実演

構造を理解した上で実際に書いていこう

リピート実行コマンド

execute as @a[tag=talk1] run function (データパックの名前):talk1

talk1のfunctionの中身

scoreboard players add @s timer 1
execute if score @s timer matches 1 run tellraw @a {"text":"台詞"}
execute if score @s timer matches 40 run tellraw @a {"text":"台詞"}
execute if score @s timer matches 80 run tellraw @a {"text":"台詞"}
execute if score @s timer 80 matches run tag @s remove talk1
execute if score @s timer 80 matches run scoreboard players set @s timer 0

これでタグtalk1を持ったプレイヤーが居たら40tick(2秒)に一回台詞を表示して元通りになるコマンドになる
特定の人だけに表示したいときはtellrawをいじって対象を選んであげてください

注意点

たくさんの会話を作るときに、中身をコピーして量産するけどそのとき書き換える必要のある物を忘れないで!
書き換える物は
timer matches ~の時差を制御する部分
tag remove talk~の最後に削除するタグの名前

まとめ

タグを与えるだけで会話コマンドを起動できる簡単な会話コマンドの紹介でした。
今回使ったスコアボードでタイマーを制御する構造はmobを移動させるときに使ったりすることもあるらしいので、覚えておくととっても便利かもだから頭の片隅においておこう。