ようこそ、ぷっこ村へ。ししゃもだよ
(・∀・)ノ
ようよう、春が来るぜ、情緒が安定しないぜ(躁ぎみ)。と言うわけで、今回はRPGっぽく、イベントの進行状況によって変化する会話を作ってみましょう。
イベントの進行で変わる会話を作る
今回のお題
こんな感じで、イベントが進行するとそれに合わせて会話内容が変化いていく仕掛けを作ってみましょう。今回使うコマンドは
- tellraw
- tag
- setblock
の3つです。tellraw は初めてだったかな?
tellraw をざっくり
tellraw コマンドは、JSONで記述した文章を表示させるコマンドです。tell だとささやかれましたと出ますが、tellraw だとそういう余分な表示がなく、会話イベで使うのに便利です。どちらかと言うと、コマンドそのものの使い方より、JSONを理解する方が大事ですね。
基本の書き方
/tellraw 対象のエンティティ [{JSON}]
みたいな感じです。
例
/tellraw @s [{"text":"Sisyamo is 変態☆","color":"red","hoverEvent":{"action":"show_text","value":"押すなよ!?絶対にここは押すなよ!?"},"clickEvent":{"action":"run_command","value":"/summon cat ~ ~ ~"}}]

少々読みにくいですが、「例」のコマンドを実行すると末尾の1行のように表示されます。「押すなよ!?~」の文章は、表示された文章にカーソルを合わせると表示されます(ホバーアクションって言います)。文章をクリックすると、ゾンビが召喚されるコマンドが実行されます。
このように、文章の色、ホバーアクションなどの他に、クリックでURLを開くことも可能です。その辺はおいおい。
実際に仕掛けを作る
準備

今回は通せんぼしてる壁とおっさんを用意します。コマブロタワーは11段にして下さい。

おっさんの前に感圧板を置き、タワーに繋げておきます。イベントが完了すると鉄扉が開く仕掛けが出来上がりますよ。
使うコマンド
今回は以下のコマンドを使っていきます。
execute positioned 3809 4 809 as @p if entity @s[tag=Cleared,tag=Kaiwa2] run tellraw @s [{"text":"\nおっさんは夢中でケーキをむさぼっている……\n"}]
execute positioned 3809 4 809 as @p if entity @s[tag=!Cleared,tag=Kaiwa1] if block ~ ~1 ~-1 minecraft:cake[bites=0] run tellraw @s [{"text":"\nほほぅ、殊勝な心掛けってやつだな、よしここを通してやろう。\n"}]
execute positioned 3809 4 809 as @p if entity @s[tag=!Cleared,tag=Kaiwa1] if block ~ ~1 ~-1 minecraft:cake[bites=0] run setblock ~1 ~-2 ~-3 redstone_torch replace
execute positioned 3809 4 809 as @p if entity @s[tag=!Cleared,tag=Kaiwa1] if block ~ ~1 ~-1 minecraft:cake[bites=0] run setblock ~2 ~-2 ~-3 redstone_torch replace
execute positioned 3809 4 809 as @p if entity @s[tag=!Cleared,tag=Kaiwa1] if block ~ ~1 ~-1 minecraft:cake[bites=0] run tag @s add Cleared
execute positioned 3809 4 809 as @p if entity @s[tag=!Cleared,tag=Kaiwa1] unless block ~ ~1 ~-1 minecraft:cake[bites=0] run tellraw @s [{"text":"\nあぁー、ホールのケーキを丸かじりしたいなぁー\n"}]
execute positioned 3809 4 809 as @p if entity @s[tag=Cleared,tag=Kaiwa1] run setblock ~ ~1 ~-1 air replace
execute positioned 3809 4 809 as @p if entity @s[tag=Cleared,tag=Kaiwa1] run tag @s add Kaiwa2
execute positioned 3809 4 809 as @p if entity @s[tag=Cleared,tag=Kaiwa2] run tag @s remove Kaiwa1
execute positioned 3809 4 809 as @p if entity @s[tag=!Cleared,tag=!Kaiwa1] run tellraw @s [{"text":"\n何だお前は?ここを通りたいのか?それは無理な相談だな。\nあぁー、それにしてもケーキを丸ごとくいたいなぁ\n目の前にケーキがあらわれないかなぁー。"}]
execute positioned 3809 4 809 as @p if entity @s[tag=!Cleared,tag=!Kaiwa1] run tag @s add Kaiwa1
ゴチャゴチャしてるように見えますが、やってることは単純です。positioned は確か初めて出ましたね。これは、コマンドを実行する座標を指定するのに使います。感圧板の座標を指定しないといけないので、合わせて変えてねー。
コマンドの解説
execute ~as @p までは、指定座標の一番近くにいるプレイヤー(感圧板を踏んだプレイヤー)のことです。if ~ run まででプレイヤーの状態を判定し、状態に合わせてコマンドを実行しています。順を追って見ていきましょう。
まず、今回は「Cleared,Kaiwa1,Kaiwa2」の3つのタグを使い、イベント進行を管理します。ざっくりと進行の解説をすると、
- 初めて会話する時は何のタグもないので、最初の会話を表示し、Kaiwa1タグを付与します。
- Kaiwa1タグがある場合は面識があると判断し2回目以降の会話を表示、さらにクリアに必要な条件を満たすかも判定します。
- Kaiwa1があり、クリア条件を満たしている場合は、ClearedとKaiwa2を付与し、扉を開けてKaiwa1を消します。
- 以降、Cleared,Kaiwa2がある状態で話しかけると、クリア後の文章を表示する。
と言った流れです。以下、より詳しく解説↓
- 1行目、Cleared,Kaiwa2 の2つのタグがあるか見ています。ある場合はクリア済みで、クリア後の会話を表示します。
- 2~6行目、Clearedがなく,Kaiwa1 がある場合、2行目でなんかヒント的な会話を表示し、クリア条件(今回はおっさんの前にかじってないケーキが置かれているか)を満たしているか判定、満たしていれば、Clearedを付与
- 7~9行目、Cleared,Kaiwa1 がある場合、クリア用の会話を表示しKaiwa2を付与、後処理でKaiwa1を消してケーキも置き換え。ちょっとめんどうだけど、この処理がないと後で拡張した時にバグる可能性が残ります。
- 9から11行目、なんのタグもない場合、要は初めての会話です。イントロの会話が流れて、Kaiwa1を付与します。
実際に賄賂を贈る

では実際に、おっさんに賄賂を贈り扉を開けてもらいましょう。ケーキが欠けていると、おっさんは見向きもしませんね。欲張りは後で懲らしめられるぞ?
minecraft:cake[bites=0] で丸のままのケーキを指定できます。値を増やせば、特定の欠けを指定したりもできますよ。
まとめ
今回は tellraw コマンドを用いた仕掛けを作ってみました。条件分岐を上手く作るのに少々コツがいるのですが、できるとカッコいいよね。配布マップを作る場合は1つ2つ程度でいいので、こういった会話風イベントがあると没入感が変わってくると思います。
クリア条件はブロックだけじゃなく、前にやった額縁との連動とかでもいいですね。右手に特定の何かを持ってるかとかも楽しいですな。
それではこの辺で、お帰りの際はお気をつけて~(・∀・)ノシ
コメント