【Minecraft】特殊な本や看板で使う『JSON』をマスターしよう!その②

みなさん、こんにちは!
赤石大好き!赤石愛です。

その① JSON・text・基本装飾・真偽値 →ar857358
その② clickEvent・オブジェクト・数字と数値・エスケープシーケンス →このページ
その③ hoverEvent・selector・score →ar923855
その④ リスト・extra・translate →ar923861
その⑤ エスケープシーケンス(改行・Unicode) →ar924533
おまけ 本や看板での使用例 →ar924964
その⑥ keybind・nbt・NBTパス →ar1905986


それでは続きをやっていきましょう。


クリック時の動作

クリックした時の動作を設定する特殊な装飾があります。
tellrawや本では左クリック、看板では右クリックで動作します。

clickEvent(クリックイベント)

/tellraw @p {"text":"押してみて!","clickEvent":{"action":"run_command","value":"/say ぽちっ!"}}

さて今度は、『clickEvent』というキーと『{"action":"run_command","value":"/say ぽちっ!"}』という値のペアが指定されています。
この{}で囲われた値は一体何なんでしょう?見たことがありませんね?
…いや、そうでしょうか。

/tellraw @p {"text":"こんにちは","color":"red"}

今まで指定してきたJSON自体、{}で囲われていましたね。
この{}で囲われたものを『オブジェクト』といい、データのまとまりを表しています。
『テキスト(text)は「こんにちは」です』
『色(color)は赤(red)です』
そして、この2つが{}で囲われているので、『これらで1まとまりです』という意味だったわけです。

clickEventにもオブジェクト(データのまとまり)を指定するのですが、どういうオブジェクトを指定するのかというと、『動作の種類(action)』と『動作の内容(value)』です。

{"action":"run_command","value":"/say ぽちっ!"}

先ほどのclickEventに指定されたこのオブジェクトは
『動作の種類(action)はコマンド実行(run_command)です』
『動作の内容(value)は「/say ぽちっ!」です』
という2つをまとめたものです。
つまり、これら1まとまりで【「/say ぽちっ!」という「コマンドを実行」】というデータになっているわけですね。

/tellraw @p {"text":"押してみて!","clickEvent":{"action":"run_command","value":"/say ぽちっ!"}}

従って、先ほどのこのJSON
『テキスト(text)は「押してみて!」です』
『クリック時の動作(clickEvent)は【「/say ぽちっ!」という「コマンドを実行」】です』
というデータになります。
このコマンドを実行すると「押してみて!」と表示されましたね。
そしてその「押してみて!」をクリックすると、「[あなたの名前] ぽちっ!」と表示されたはずです。
クリックした時、あなたは「/say ぽちっ!」というコマンドを実行したことになったわけです。

どうでしょうか。少し難しかったかもしれませんが、
『{}はデータ1まとまり(オブジェクト)を表している』
『clickEventはオブジェクトを指定する』
この2点を押さえた上で、clickEventに指定できる動作の種類を見ていきましょう。

clickEventの種類

clickEventの動作の種類action(アクション)には以下の4つの中から1つを指定します。
actionによって動作の内容value(バリュー)に指定するものも変化します。

run_command(ランコマンド)
コマンドを実行します。valueにはコマンドを指定します。

/tellraw @p {"text":"◆","clickEvent":{"action":"run_command","value":"/give @p minecraft:diamond"}}

『テキスト(text)は「◆」です』
『クリック時の動作(clickEvent)は【「/give @p minecraft:diamond」という「コマンドを実行」】です』
というデータになります。
実行すると「◆」と表示され、クリックするとダイヤモンドが1つ貰えましたでしょうか。

TIPS
clickEventのrun_commandによる実行では、tellrawや本の場合と看板の場合で動作が異なります。

・tellrawや本の場合

チャット入力欄にコマンドを打ち込んだような動作をするため、valueにコマンド以外を指定した場合や、コマンドの先頭に/をつけていなかった場合は、そのまま発言となります。
また、そのコマンドの実行権限がない場合は失敗します。
チャット入力欄の文字数をオーバーしていた場合、正常に実行されません。

・看板の場合(但しバニラの場合に限る)

コマンドブロックのように動作するため、valueにコマンド以外を指定した場合は失敗し、コマンドの先頭に/をつけていなくてもコマンドは実行されます。
また、(/stop等コマンドブロックで実行不可能なものを除いて)コマンドの実行権限がなくても成功します。
文字数制限も実質ありません。


suggest_command(サジェストコマンド)
コマンドを提案します。valueにはコマンドを指定します。
というのが本来の使い方ですが、コマンド以外を指定しても問題ありません。

/tellraw @p {"text":"報酬","clickEvent":{"action":"suggest_command","value":"/give プレイヤー minecraft:diamond"}}

『テキスト(text)は「報酬」です』
『クリック時の動作(clickEvent)は【「/give プレイヤー minecraft:diamond」という「コマンドを提案」】です』
というデータになります。
実行すると「報酬」と表示され、クリックするとチャット入力欄に「/give プレイヤー minecraft:diamond」と表示されましたね。
プレイヤーの部分を誰かの名前に変えて実行すると、そのプレイヤーにダイヤモンドが1個渡されます。
run_commandとは違い、指定したコマンドがすぐ実行されるわけではないので、このように一部修正して実行したい場合に向いています。
また、insertionとも異なり、カーソル位置に挿入ではなく、チャット入力欄の文字全てが置き換わります。
なお、チャット入力欄を書き換える性質上、tellrawにしか効果はありません。

copy_to_clipboard1.15+(コピートゥークリップボード)
クリップボードに文字列をコピーします。valueには文字列を指定します。

/tellraw @p {"text":"ルイズ","clickEvent":{"action":"copy_to_clipboard","value":"ルイズぅぅうううわぁああああああああああああああああああああああん!!!"}}

『テキスト(text)は「ルイズ」です』
『クリック時の動作(clickEvent)は【「ルイズぅぅうううわぁああああああああああああああああああああああん!!!」という「文字列をクリップボードにコピー」】です』
というデータになります。
実行すると「ルイズ」と表示され、クリックしてからCtrl+Vすると、チャット入力欄に「ルイズぅぅうううわぁああああああああああああああああああああああん!!!」と表示されましたね。
insertionやsuggest_commandのようにチャット入力欄を書き換えるわけではないので、本にも有効ですが、残念ながら看板には効果がありません。

open_url(オープンユーアールエル)
URLを開きます。valueにはURLを指定します。

/tellraw @p {"text":"ツイッターを見る","clickEvent":{"action":"open_url","value":"https://twitter.com/AiAkaishi"}}

『テキスト(text)は「ツイッターを見る」です』
『クリック時の動作(clickEvent)は【「https://twitter.com/AiAkaishi」という「URLを開く」】です』
というデータになります。
実行すると「ツイッターを見る」と表示され、クリックすると確認画面が表示されましたね。

「はい」を選ぶと規定のウェブブラウザでそのサイトを開きます。
クリップボードにコピー」を選ぶとURLがクリップボードにコピーされます。
「いいえ」を選ぶと何もせずにゲーム画面に戻ります。

/tellraw @p {"text":"つぶやく","clickEvent":{"action":"open_url","value":"http://twitter.com/share?url=https://ai-akaishi.hatenablog.jp/entry/ar857358&text=【マイクラJSONのお勉強なう"}}

こちらは実行すると「つぶやく」と表示され、クリックして確認画面で「はい」を選ぶと

ツイッターを使っている人にはお馴染みの(?)画面が開く、といった事にも使えます。
なお、残念ながら看板には効果がありません。

change_page(チェインジページ)
ページを変えます。valueにはページ番号を指定します。
本のページを変更するものなので、本以外に使っても効果はありません。
いきなり本を作るのは難しいので、tellrawで解説してから本を作ります。

/tellraw @p {"text":"3ページを開く","clickEvent":{"action":"change_page","value":3}}

『テキスト(text)は「3ページを開く」です』
『クリック時の動作(clickEvent)は【「3つめ」の「ページに変える」】です』
というデータになります。
記述は合っていますが、本ではないので実行してクリックしても動きません。
さてここで、valueに指定されている「3」が""で囲われていないことにお気づきでしょうか?
change_pageの場合、valueには「数字」ではなく「数値」を指定します。
「数字」?「数値」?どう違うのでしょうか。
普段私たちは「数値」と「数字」を無意識に区別して使っています。

(* >ω<)=3ヘックチュ!

たとえば、このアスキーアートに使われている「3」は、何かが3つという「数値」としての意味はなく、「数字(文字)」として風や勢いを意味していますね。
このように、人間は数として意味のある「数値」なのか、文字としての「数字」なのかをパッと見ただけで判断出来るのですが、コンピューターには少し難しいので、違いが分かるように書いてあげないといけません。

/tellraw @p {"text":"12","clickEvent":{"action":"change_page","value":12}}

『テキスト(text)は「12(という文字列)」です』
『クリック時の動作(clickEvent)は【「12ページ目(=ページ番号のが12)」の「ページに変える」】です』
というデータになります。
""で囲われていると文字として、""で囲われていないととして認識してくれます。

では実際に、change_page機能を入れた本のコマンドをお見せしますが…

/give @p minecraft:written_book 1 0 {author:スティーブ,title:テスト本,
pages:[
"{\"text\":\"3ページに飛ぶ\",\"clickEvent\":{\"action\":\"change_page\",\"value\":3}}",
"2ページ目だよ",
"{\"text\":\"3ページ目です\",\"bold\":true}"
]
}

textやclickEventなどの見慣れた部分に\マークが沢山ついていますね。
まずはこの\マークの意味を解説します。

TIPS
イクラ内では\は∖と表示されますが、見た目が違うだけで同じものです。


「文字は""で囲んであげます」と表示されるtellrawを作ってみましょう。

/tellraw @p {"text":"文字は""で囲んであげます"}

これを実行すると…あれ?エラーが出ましたね?
それもそのはず、このデータは文字列の途中に"が入っているので、
『テキスト(text)は「文字は」です』
『あれ、後ろに「"で囲んであげます"」って残ってるけど…何これ?』
と思っちゃうんですね。
人間なら『テキスト(text)は「文字は""で囲んであげます」です』だね、とパッと見で判断できるのですが……
なので、『この「"」は文字列を囲んでいる"ではなくてただの「"」って文字だよ』と教えてあげないといけません。
そのためには「"」の前に「\」をつけた、「\"」と書きます。
このように、そのままでは使えない文字(ここでは")を使うために用意されている組み合わせ(ここでは\")を『エスケープシーケンス』といいます。

/tellraw @p {"text":"文字は\"\"で囲んであげます"}

これなら、
『テキスト(text)は「文字は""で囲んであげます」です』
と認識されます。
実行すると、「文字は""で囲んであげます」と表示されましたね。

では今度は「文字列の中の"は前に\をつけて\"にしましょう」と表示されるtellrawを作ってみましょう。

/tellraw @p {"text":"文字列の中の\"は前に\をつけて\\"にしましょう"}

あれ、またエラーになりましたね?
"はそのままでは「文字列の最初(または最後)です」という意味になったように、\もそのままでは「エスケープシーケンスの始まりです」という意味になるため、単なる文字としては認識されません。
上のコマンドは
『テキスト(text)は「文字列の中の"は前にをつけて\」です』
『あれ、後ろに「にしましょう"」って残ってるけど…何これ?』
と思っちゃってエラーになったのです。
「\」の前にも「\」をつけて「\\」とすることで初めて、単に「\」という文字と認識してくれます。

/tellraw @p {"text":"文字列の中の\"は前に\\をつけて\\\"にしましょう"}

これを実行すると、ちゃんと「文字列の中の"は前に\をつけて\"にしましょう」と表示されましたね。

この「\」の役割はとっても大事なので、しっかり意識しながら、もう一度本のコマンドを見てみましょう。

/give @p minecraft:written_book 1 0 {author:スティーブ,title:テスト本,
pages:[
"{\"text\":\"3ページに飛ぶ\",\"clickEvent\":{\"action\":\"change_page\",\"value\":3}}",
"2ページ目だよ",
"{\"text\":\"3ページ目です\",\"bold\":true}"
]
}

本のページの内容はpages:[]の中に書き、文字列(""で囲んだもの)1つで1ページ分の内容を表しています。そして「,」で区切って文字列を並べることで、それぞれの文字列が1ページ目の内容、2ページ目の内容……となります。
ページの内容となる文字列には2ページ目のようにただのテキストも指定できますが、装飾等を施したテキストを指定したい場合は、JSONを""で囲って文字列として指定します。
例えば1ページ目には

{"text":"3ページに飛ぶ","clickEvent":{"action":"change_page","value":3}}

というJSONを指定したいのですが、このJSONを""で囲むことになるので、「"」には「\」を付けて「"があるけどまだ文字列の終わりじゃ無いよ」と分かるように、

"{\"text\":\"3ページに飛ぶ\",\"clickEvent\":{\"action\":\"change_page\",\"value\":3}}"

このように1ページ目に指定することになります。
では4ページ目に「文字列の中の"は前に\をつけて\"にしましょう」を追加するにはどうすればいいでしょうか?

{"text":"文字列の中の\"は前に\\をつけて\\\"にしましょう"}

指定したいJSONはこれなので、これを""で囲むということは…
「"」や「\」には「\」をつけて…

"{\"text\":\"文字列の中の\\\"は前に\\\\をつけて\\\\\\\"にしましょう\"}"

となるので、本のコマンドは

/give @p minecraft:written_book 1 0 {author:スティーブ,title:テスト本,
pages:[
"{\"text\":\"3ページに飛ぶ\",\"clickEvent\":{\"action\":\"change_page\",\"value\":3}}",
"2ページ目だよ",
"{\"text\":\"3ページ目です\",\"bold\":true}",
"{\"text\":\"文字列の中の\\\"は前に\\\\をつけて\\\\\\\"にしましょう\"}"
]
}

となります。
\がいっぱいで一見ややこしいですが、"で囲む前の状態から順に作っていけば、\がいくつになるものでも作れるようになります。



今回は少し長くなったのでここまでにします。次回はもう一つの特殊な装飾から解説します。

→その③へ進む