マルチプレイなら『シン・VPS』がおすすめ!

【Java版】コマンドを使って村人を喋らせよう!【会話の変更方法も】

【Java版】コマンドを使って村人を喋らせよう!【会話の変更方法も】

この記事では、Minecraft Java Edition(バージョン1.17)の情報をもとに執筆しています。
そのほかのバージョンや機種などでの動作は保証できません。

コマンド初心者なマインクラフター
「配布マップで村人と会話するシーンを作りたい!村人をクリックしたら会話が始まるようにしたい! どうやったら出来る? 交易画面を開かないようにできる?」

こんな疑問を解決します!

本記事の内容
  • 村人をクリックしたことはコマンドで感知できる
  • スコアとtellrawコマンドを繋ぐ
  • 会話を変更したい場合

こんにちは! マインクラフターのナツメ(@natsume_717b)です。

ナツメってこんな人
  • 脱出マップを配布・制作しています!
    →配布マップ・ダウンロードページ

今回は村人が話しているかのように表現できるコマンドの組み方を紹介していきます。
配布マップなどで、RPGのように村人と会話ができるということですね。

やや長めの記事となっていますが、わかりやすいように説明していった結果ですので、ぜひ最後まで読んでもらえると嬉しいです。

その代わりこの記事を理解すれば、村人と会話するコマンドについてはおおむね理解できるかと思います。

というわけで、さっそく解説していきます!



村人をクリックしたことはコマンドで感知できる

村人をクリックしたことは、スコアボードで感知することができます。
なので、Scoreboardコマンドを使えばOKということが分かります。

具体的には

minecraft.custom:minecraft.talked_to_villager

というScoreboardコマンドの項目を利用します。
これが村人と会話した回数を数えるものになります。

この項目は交易画面を開いた回数と考えてもいいと思います。
(交易画面を開かなくする方法は後述しています)

なので、村人をクリックした分だけカウントが増えていくということです。

それでは、さっそくスコアボードを作成してみましょう。
以下のコマンドで今回使うスコアボードを作成できます。

scoreboard objectives add XXXX minecraft.custom:minecraft.talked_to_villager

XXXXの部分は好きな文字列で大丈夫です。
分かりやすいように「kaiwa」や「talk」と名付けておくと分かりやすくて、後々楽になります。

また、村人をクリックすると交易画面が開いてしまいます。
今回は交易はしないことを前提に話を進めるので、以下のコマンドで村人を用意します。

/summon minecraft:villager 87.60 63.00 -171.62 {NoAI:1}

これで交易画面の開かない村人を用意できます。

NoAIの部分が、交易できるかどうかを判断する箇所になります。

また、向いている方角を変更する場合はRotationを差し込めばいいので{}内の内容が

{NoAI:1,Rotation:[-90f,0f]} 

となります。
(-90が方角、0が視点の上下を示しています。これらの数字は【tpコマンド】向きを指定するには追記するだけ【マイクラJava版】にて解説しています)

というわけで、村人をクリックしたことを感知できるようになりました。
次はクリックしたことと会話を表示するコマンドを繋げます。

スコアとtellrawコマンドを繋ぐ

村人をクリックすることで、カウントが進むスコアボードが作れました。
なので、そのスコアの値を参考にしつつ、メッセージを表示するコマンドであるtellrawコマンドと組み合わせます。

「スコアの値が○のエンティティがいる時~」と条件を考えると、executeコマンドと組み合わせると良さそうです。
というわけで、コマンドに起こしてみましょう。

村人がクリックされたことをカウントするスコアボードの名称は、talkとします。

/execute if entity @p[scores={talk=1}] run tellraw @a "こんにちは"

このコマンドは常時実行のリピートコマンドブロックに入れておきます。
これだけで、村人にクリックすると「こんにちは」とメッセージが流れ続けます。

スコアが1であり続ける以上、メッセージが流れてしまいます。

もう一度話しかけたとしても、スコアは2になるので上記のコマンドではメッセージが停止してくれるものの、二度と反応しなくなってしまいます。
(スコアが1の時だけに反応するため)

これらの問題を解消するためにも、チェーンコマンドブロックに以下のようなコマンドを打ちこみます。

/scoreboard players reset @a talk

これで会話(クリック)するたびにスコアが0に戻るので、スコアは1と0を繰り返すことになります。
このギミックが優秀なのは、会話を変更したいときにも使えることです。
(詳しくは次の項目で解説します)

実際のコマンドブロックとしては以下のようになります。

/execute if entity @p[scores={talk=1}] run tellraw @a "こんにちは"
このコマンドは常時実行のリピートコマンドブロックに入れておきます。
/scoreboard players reset @a talk
これらの問題を解消するためにも、チェーンコマンドブロックに以下のようなコマンドを打ちこみます。

というわけで、スコアと会話のコマンドを繋げる方法でした。

会話を変更したい場合

さて、スコアボードを作成してコマンドブロックに会話なども仕込みました。
これで完成でもいいのですが、会話が変化する場合も実装したいはず。

要するに、初めは「探し物をしてくれ」という言葉だったのが特定のアイテムを持っていくと「ありがとう」と感謝を述べられるようになれば、非常にゲームっぽさが演出できます

というわけで、最後に会話を変更する場合のやり方をお教えします。
これから紹介するギミックは実際に私の作った配布マップでも取り入れているものですので、実用性は高いと思います。

実際に取り入れているマップ

「探し物を見つけて」→「ありがとう」の場合

「探し物を見つけてほしい」というセリフから、特定のアイテムを持って行った際に「ありがとう」というセリフに変更したい場合、考えとしては以下のようになります。

  1. 「探し物を見つけてほしい」と表示させるコマンドはそのままにする。
  2. その代わり、探してほしいと言われたアイテムを手に入れた時にスコアボードを別の数字に設定する。
  3. その設定した数値+1を条件に「ありがとう」と表示させる

詳しく見ていきましょう。
①に関しては、先述しているコマンドの内容を「探し物を見つけてほしい」というセリフに変えるだけですので割愛します。

キーアイテム入手時にスコアボードの数字を設定する

②などは人によって若干やり方を変更させることも可能です。
ですが、今回は筆者のやり方を紹介します。

まずは土を手に入れて欲しいという依頼だと仮定しましょう。

で、アイテムを持っているかどうかを判定するのによく使うコマンドは、アイテムを消すClearコマンドですね。

「0個消す」と指定すると該当アイテムを持っている時は横にあるチェーンコマンドブロックは起動して、該当アイテムを持っていないときは起動しなくなります。

0個消すことを指示されたコマンドブロックは指定したアイテムを持っている場合、0個消すという行動をし続けています。

この仕組みを村人をクリックするとカウントするスコアボードと組み合わせます。
というわけで、以下のようなコマンドを組みます。

リピートコマンドブロックに書く内容

clear @a dirt 0

チェーンコマンドブロックに書く内容

setblock 座標 minecraft:redstone_block

この座標と書いてある部分は、スコアボードの数値をいじるコマンドブロックと隣接する座標を書けばOKです。

例えば、X=20、Y=20、Z=20の位置に

scoreboard players set @a talk 1000

というコマンドブロックがあれば、X=20、Y=21、Z=20を指定すればOKということです。
(コマンドブロック自体は「インパルス、無条件、動力が必要」という設定にしておきます)

これで土を手に入れると、talkのスコアが1000になります。

わざわざsetblockでレッドストーンブロックを置いてスコアボードの数値を変更させるのは、変更される回数を1回に抑えるため。(誤作動防止)
繰り返し利用したい場合は、setblockでレッドストーンブロックを空気に置き換えると楽だと思います。

「ありがとう」と表示させる

ここからは簡単です。
先ほど土を手に入れたらtalkのスコアが1000になるようにしたので、村人をクリックすると1001という値になります。

なので、「ありがとう」というメッセージはtalkのスコアが1001の時に起動すると設定してあげればいいわけです。

1番初めに解説した「こんにちは」と表示させるコマンドのスコアの部分を1001にして、チェーンコマンドブロックで会話後にtalkのスコアをリセットするようにコマンドブロックを組みましょう。

execute if entity @p[scores={talk=1001}] run tellraw @a "ありがとう"

チェーンコマンドブロックの内容(チェーン、条件付き、常時実行)

scoreboard players reset @a talk

これでOKです。

また、この時土をClearコマンドで消すようにしておくのも大事です。
手元から消すことで村人に渡しているという表現ができます!

途中でアイテム(探し物)を捨てた場合

というわけで、会話の変更方法でした。

まとめ

というわけで、今回のまとめです。

今回使ったコマンドはこちら。

今回使ったコマンド
  • 村人をクリックしたことを感知する、スコアボードを作るコマンド
scoreboard objectives add XXXX minecraft.custom:minecraft.talked_to_villager
  • 会話を表示させるコマンド
/execute if entity @p[scores={talk=1}] run tellraw @a "こんにちは"
/scoreboard players reset @a talk
ポイント
  • 会話を変更したい場合は、条件を満たした時にスコアボードの値を変更すると内容を変更できます。

この記事は以上になります。