村人に話しかけるシリーズ。
RPGを作っている時に、Mobキャラに同じセリフを話させたいときってないですか?
Mobキャラごとにコマンドブロックを用意するのも面倒なのでひとつのコマンドブロックで一括で設定する方法を考えました。
ちなみに村人に話しかける方法はこちら。
Mob村人を召喚する
Mobキャラになる村人を召喚します。Mobキャラである印として、Tagsに”mob”を設定します。あとうるさいのでSilentを設定。ついでに「ザ・Mob」という名前もつけておきます。
summon minecraft:villager ~ ~ ~ {Silent:1b,Tags:["mob"],CustomName:'{"text":"ザ・Mob"}'}
動いてほしくない場合はNoAIも設定。
summon minecraft:villager ~ ~ ~ {Silent:1b,NoAI:1b,Tags:["mob"],CustomName:'{"text":"ザ・Mob"}'}
ちなみに村人に話しかける(右クリックできる)ことができる距離をはかってみたところ5ブロックくらいみたいです。
なので、Mob村人を配置する間隔は6ブロック以上離して配置してください。でないと、話しかけていない村人も返事しちゃいます。
今回は実験のためにこんな感じで2人配置しました。
scoreboadを作成する
村人に話しかけた回数を取得するscoreboadを作成します。これは前回と同じ。前回のをそのまま使ってもいいけど一応talktomobという名前で作成します。
/scoreboard objectives add talktomob minecraft.custom:minecraft.talked_to_villager
コマンドブロックを用意する
①リピートブロック、常時実行
/execute at @e[type=minecraft:villager,tag=mob,name='ザ・Mob'] as @e[type=minecraft:villager,tag=mob,name='ザ・Mob',limit=1] if score @p[distance=..6] talktomob matches 1.. run say よそ者に話すことはない
今回は、at とasを指定します。
atを指定すると、コマンドの実行場所が、セレクターの条件に合うエンティティがいる場所になります。@e[type=minecraft:villager,tag=mob,name=’ザ・Mob’]と指定したので、村人(minecraft:villager)で、tagがmob、名前が’ザ・Mob’であるエンティティがいる場所でこのコマンドが実行されます。
今回は2人いるので、2か所でコマンドが実行されます。
asを指定すると、コマンドを実行する人を指定できます。ここにはさきほどatに指定した条件に加えてlimit=1を追加しています。しゃべるのは1人だけでいいですもんね。1人に話しかけてみんな返事したらこわい。
if score以降は前回と同じ。ただ、distance=..6が前回と違います。
②チェーンブロック、常時実行、条件付き
scoreboard players reset @a talktomob
これはscoreboadの名前を変更しただけで、前回と同じ。
実験
Mobに話しかけてみます。各々のMobに距離をとって話しかけてみたところ、ちゃんとひとりずつ返事してくれました。
ただ、2人の間に立って話しかけてみると
2人とも返事してうっさい!となるので、村人同士が密にならないように6ブロック以上離して配置すると問題なく1人ずつ話すようになると思います。
コメント