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

【Java版】村人ごとに会話を用意しよう!【コマンド解説】

【Java版】村人ごとに会話を用意しよう!【コマンド解説】

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

村人との会話にもっと幅を利かせたいマインクラフター
「スコアボードを使って村人と会話する方法は分かったけど、どの村人に話しかけても同じ内容になっちゃうんだよね。村人ごとに会話の内容を変えたいんだけど、どうすればいいのかな?」

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

本記事の内容
  • 会話を変更するために、村人ごとに異なる点を利用する

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

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

今回は、複数の村人がいてもそれぞれ異なる内容を話すようになるコマンドの組み方を紹介していきます。

後程でも紹介しますが、【Java版】コマンドを使って村人を喋らせよう!【会話の変更方法も】でも村人と会話することはできます。

しかし、その方法ではできないことがあります。
それが今回お話する、複数人の村人が居る場合。

詳しいことは次の項目でお話しますので、さっそく見ていきましょう!

会話を変更するために、村人ごとに異なる点を利用する

先日、村人と会話する方法の記事を投稿しましたが、この記事のやり方には欠点があります。

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

それは、先述したように複数の村人を用意してそれぞれ異なる内容を喋らせたい場合です。
上記の記事のやり方では、どの村人に話しかけても同じ会話内容になってしまうのです。

そこでこの記事では村人が複数いても異なる会話内容になるコマンドを解説していきます!


まず「村人ごとに会話内容を変更する」とのことで、それぞれの村人で異なる点を見つけ、それをコマンドに利用します。

というわけで、今回は村人のいる座標を利用して会話内容を変化させようと思います。

村人をクリックする際、基本的にはクリックした村人が一番近くにいます。
つまり、話したい村人=一番近い村人と考えてもいいはず。

一番近くにいる村人の座標がいくつなのかを判別して、その座標をもとに会話の内容を表示させようというわけですね。

今回紹介するコマンドは村人の配置と自分の話しかける位置によっては割り当てたい会話とは異なるものが表示されてしまう可能性があります。
その場合、村人同士の距離を離すか建築等でクリックできる位置を調整しましょう。

実際のコマンド

それでは、実際にコマンドを組んでみましょう。
大まかな流れとしては

  1. 村人をクリックしたことを検知し、防具立てを召喚
  2. その防具立てを自分から一番近くにいる村人にテレポートさせる
  3. 村人の座標にある防具立てをキルするようにしておき、キルできた場合に会話を表示させる

となります。

それぞれの項目を見ていきましょう!

①村人をクリックしたことを検知し、防具立てを召喚

まずは防具立てを召喚します。
この防具立てが一番近い村人の元へ手レポートし、その座標によって会話内容を決めてくれます。

というわけで、はじめに村人をクリックしたことを感知するスコアボードを作成します。

scoreboard objectives add XXXX minecraft.custom:minecraft.talked_to_villager

XXXXの部分は、自分が判別しやすいものに変更して大丈夫です。
(XXXX部分に入力した文字がスコアボードの名称となります)

今回はtalk001という名称で説明していきます。

スコアボードを作った後は、村人をクリックしたことを感知して防具立てを召喚するコマンドをリピートコマンドブロックに書き込みます。
(リピート、無条件、常時実行)

そのコマンドはこちら

execute if entity @a[scores={talk001=1}] at @p[scores={talk001=1}] run summon minecraft:armor_stand ~ ~ ~ {CustomName:'{"text":"1"}'}

村人をクリックするとtalk001のスコアが1になるので、クリックしたプレイヤーのいる座標に名前付きの防具立てを召喚します。

名前を付ける理由は、他の防具立てに影響しないようにするためです。

②その防具立てを自分から一番近くにいる村人にテレポートさせる

村人をクリックすると防具立てが召喚されるようになったので、次はその防具立てを一番近くにいる村人の元にテレポートさせます。

というわけでテレポートさせるコマンドはこちらです。
(チェーン、条件付き、常時実行)

execute at @p[scores={talk001=1}] as @e[type=minecraft:villager,limit=1,sort=nearest] run tp @e[type=minecraft:armor_stand,name=1] @s

talk001のスコアが1であるプレイヤーの場所でコマンドを起動して、コマンドの実行者は一番近くにいる村人にexecuteコマンドで設定しています。

atでコマンドを実行する座標を指定。asでコマンドの実行者をしていています。

そして、肝心のテレポート部分は防具立てを実行者(一番近くにいる村人)の元にテレポートさせるものになっています。

実際のコマンドブロックは以下のように並べます。

①はリピート、無条件、常時実行。
②はチェーン、条件付き、常時実行にしておきます。

③村人の座標にある防具立てをキルするようにしておき、キルできた場合に会話を表示させる

防具立てを一番近くにいる村人の元にテレポートさせられたので、次はその村人がいる座標をもとに会話を表示させます。

というわけで、村人がいる座標を指定しつつ防具立てを消します。

防具立てを消す理由は、コマンドの成功か否かを判別するのとキルしておかないと会話する度に防具立てが増えていってしまうからです。

今回は村人のいる座標がx=0、y=60、y=0だと仮定します。
まずはリピートコマンドブロックに以下のコマンドを書き込みます。
(リピート、無条件、常時実行)

kill @e[type=minecraft:armor_stand,name=1,x=0,y=60,z=0,distance=..1]

x=0、y=60、y=0に防具立てがあると、その防具立てをキルするコマンドです。
distanceでキルする範囲を1マス以内に設定しています。

そして、これが成功したら会話を表示させるコマンド、つまりはtellrawコマンドを起動するようにします。
チェーンコマンドブロックで繋ぐということですね。
(チェーン、条件付き、常時実行)

tellraw @p[scores={talk001=1}] "表示したい会話内容"

この後にスコアをリセットします。
(このコマンドもチェーン、条件付き、常時実行でOKです)

scoreboard players reset @a talk001

実際のコマンドブロックは以下の通り。

先ほどと同じように、①はリピート、無条件、常時実行。
②③はチェーン、条件付き、常時実行にしておきます。

これで準備はすべてOKです。
あとは村人を用意する度にテレポート先の座標を異なるように打ち込み、会話内容も変化させれば村人ごとに会話を変更できます。

まとめ

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

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

今回使ったコマンド
  • 村人をクリックする度に防具立てを召喚するコマンド
execute if entity @a[scores={talk001=1}] at @p[scores={talk001=1}] run summon minecraft:armor_stand ~ ~ ~ {CustomName:'{"text":"1"}'}
  • 一番近い村人に防具立てをテレポートさせるコマンド
execute at @p[scores={talk001=1}] as @e[type=minecraft:villager,limit=1,sort=nearest] run tp @e[type=minecraft:armor_stand,name=1] @s
  • テレポートした防具立てをキルするコマンド
kill @e[type=minecraft:armor_stand,name=1,x=0,y=60,z=0,distance=..1]
  • 会話を表示するコマンド
tellraw @p[scores={talk001=1}] "表示したい会話内容"
  • スコアボードをリセットするコマンド
scoreboard players reset @a talk001
ポイント
  • 村人の座標ごとに、防具立てのテレポート先と会話内容を変更する。

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

関連記事