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

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

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


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


リスト

複数のテキストを一緒に使うには、リストを使います。

/tellraw @p [{"text":"赤巻紙","color":"red"},{"text":"青巻紙","color":"blue"},{"text":"黄巻紙","color":"yellow"}]
このように、「,」を挟んで並べて、で囲みます。
この
はリストや配列と呼ばれ、同じタイプのものが並んだものです。
マインクラフトのJSONテキストではオブジェクト({}で囲んだデータのまとまり)が並んだリストしか出てきません。
このコマンドを実行すると、「赤巻紙青巻紙黄巻紙」と表示されましたね。

/tellraw @p [{"text":"赤巻紙","color":"red"},{"text":"と"},{"text":"青巻紙","color":"blue"},{"text":"と"},{"text":"黄巻紙","color":"yellow"}]
このコマンドはどうでしょうか。
実行すると……「赤巻紙と青巻紙黄巻紙」と表示されましたね。
「と」の部分には装飾をつけていませんが、その場合は最初のテキストの装飾が引き継がれます。(ただし、最初のテキストがselectorでも、selectorによって自動設定された装飾は引き継がれません。)

では「と」の部分の装飾をなくすためには…
最初の装飾が引き継がれるわけなので…
/tellraw @p [{"text":""},{"text":"赤巻紙","color":"red"},{"text":"と"},{"text":"青巻紙","color":"blue"},{"text":"と"},{"text":"黄巻紙","color":"yellow"}]
このように、最初に装飾のないテキストを足せば良いですね。
このコマンドを実行すると、「赤巻紙青巻紙黄巻紙」と表示されます。

このコマンドは、意味は全く同じの別の書き方もあります。

extra(エクストラ)
/tellraw @p {"text":"","extra":[{"text":"赤巻紙","color":"red"},{"text":"と"},{"text":"青巻紙","color":"blue"},{"text":"と"},{"text":"黄巻紙","color":"yellow"}]}
extraはリストとペアになります。
エクストラのリストの中のテキストは、リストの外のテキストの装飾を引き継ぎます。
つまり先程のコマンドと全く同じで、このコマンドは「赤巻紙青巻紙黄巻紙」と表示されます。
括弧が多くなって分かりにくくなるので、extraを使うことはないと思いますが、使われていることはあるので、一応覚えておいて下さい。


では、前回の最後に、「プレイヤー名とスコアを一緒に表示したくなりますね」と言いました。
どのように書けばいいでしょうか?
たとえば、tellrawコマンドを実行する地点から一番近いプレイヤーが、Pointというスコアボードにスコアを持っているとすると、
/tellraw @a [{"selector":"@p"},{"text":"さんのポイントは"},{"score":{"name":"@p","objective":"Point"},"color":"aqua","bold":true},{"text":"点です!"}]
このように書けば良いですね。



複数のテキストを一緒に使う方法、実はもう1つあるのですが、少し変わり者です。
そして、マインクラフトのJSONで使われるキーは、それで最後となります。
では見てきましょう。


翻訳

翻訳機能のあるテキストがあります。
ただ、翻訳と言っても何でも訳せるわけではなく、マインクラフトの言語ファイルに入っているものだけです。

TIPS
言語ファイルは以下の手順で見つけられます。
.minecraft\assets\indexes\バージョン.json(1.9なら1.9.json)をメモ帳などで開いて、「minecraft/lang/ja_JP.lang」と書かれている部分を探して下さい。
その部分の「hash」というところに、数字とアルファベットが並んでいるので、それをメモします。
そして、.minecraft\assets\objectsを開くと、数字かアルファベット2桁のフォルダが沢山並んでいるので、先程のhashの最初2桁と同じフォルダを開きます。
hashと同じ名前のファイルがあるはずです。それが日本語の言語ファイルです。
メモ帳などで開くと中身を見ることが出来ます。他の言語の場合も同じように探して下さい。
また、Realms用の言語ファイルが別にあります。「realms/lang/ja_JP.lang」で同じように探すと見つかります。

translate(トランスレート)
翻訳機能のあるテキストの名前はズバリ『translate』、分かりやすいですね。
どのように翻訳されるのか実際に試してみましょう。
/tellraw @p [{"text":"あなたの今の言語設定は"},{"translate":"language.name","bold":true},{"text":"です!"}]
このコマンドを実行すると…

言語設定が日本語の時は上のように、言語設定が英語の時は下のように表示されます。
日本語の言語ファイルに「language.name=日本語」とありますので、translateの「language.name」の部分が「日本語」に置き換わりました。

では今度は、言語ファイルの「chat.type.achievement=%s は %s の実績を取得した」を使ってみましょう。
/tellraw @p {"translate":"chat.type.achievement"}
このコマンドを実行すると…「 は の実績を取得した」と表示されましたね。
あれ?「%s」はどこに行っちゃったんでしょうか。
次はそれを解説します。

with(ウィズ)
translateと一緒に用いるwithというキーがあります。
withはリストとペアになります。
/tellraw @p {"translate":"chat.type.achievement","with":[{"selector":"@p"},{"translate":"achievement.killEnemy"}]}
このコマンドを実行すると、

のように表示されましたね。
このようにwithは、translateに%sが含まれていた場合、それと置き換わるものを指定できます。
1つめの%sはwithの中の1つめと、2つめの%sはwithの中の2つめと、……
というように置き換わります。
つまり「chat.type.achievement」は「(1つめ) は (2つめ) の実績を取得した」となるわけです。
withの中の1つめは(オレンジのチームに入っている私の場合)「AiAkaishi」であり、2つめは「achievement.killEnemy」が翻訳された「モンスターハンター」というテキストですね。
なので、「AiAkaishi は モンスターハンター の実績を取得した」となりました。
ちなみにwithのリストの中のオブジェクトは、extraの時と同じように、withの外のテキスト、つまりtranslateの装飾を引き継ぎます。

もう1つ見てみましょう。
言語ファイルの「commands.effect.failure.notActive=%2$s は %1$s という効果を受けていないので除去することができませんでした」という訳を使ってみます。
/tellraw @p {"translate":"commands.effect.failure.notActive"}
これだけで実行すると、「 は という効果を受けていないので除去することができませんでした」と表示されますね。

プレイヤー名とポーション効果名が入るようなので、withにそれらを指定しましょう。
1つめがプレイヤー名、2つめはポーション効果名、っと…
/tellraw @p {"translate":"commands.effect.failure.notActive","with":[{"selector":"@p"},{"translate":"potion.nightVision"}]}
よし、これで実行してみましょう。

あれ、おかしな日本語ですね。プレイヤー名とポーション効果名が逆になってしまいました。

言語ファイルをもう一度よく見てみましょう。

commands.effect.failure.notActive=%2$s は %1$s という効果を受けていないので除去することができませんでした

「%s」ではなく、「%2$sや%1$s」と書かれています。
このように「%s」の間に「(数値)$」を入れることで、withの中の「(数値)番目と置き換える」という意味にできます。
つまり、「commands.effect.failure.notActive」は「(2つめ) は (1つめ) という効果を受けていないので除去することができませんでした」だったのです。

プレイヤー名は2つめ、ポーション効果名は1つめに指定しないといけないので、

/tellraw @p {"translate":"commands.effect.failure.notActive","with":[{"translate":"potion.nightVision"},{"selector":"@p"}]}

こうして実行すると…

自然な翻訳になりました。


さて、ここまで、translateの本来の使い方を解説してきましたが、実はtranslateには言語ファイルに載っていないものを指定することもでき…
なんとその場合も、「%s」や「%(数値)$s」を使うことが出来ます!

以下のようにtranslateのテキストの中に直接「%s」や「%(数値)$s」を使います。

/tellraw @a {"translate":"%sさんのポイントは%sです!","with":[{"selector":"@p"},{"score":{"name":"@p","objective":"Point"},"color":"aqua","bold":true}]}

このコマンドを実行すると、たとえば

のように表示されます。
リストの時に試した

/tellraw @a [{"selector":"@p"},{"text":"さんのポイントは"},{"score":{"name":"@p","objective":"Point"},"color":"aqua","bold":true},{"text":"点です!"}]

の別の書き方になっているわけですね。

では、もっと複雑な場合を試してみましょう。
「一番近くにいた A さんと一番遠くにいた B さんにはボーナス点Xポイントが入ります! A さんのポイントはY点に、 B さんのポイントはZ点になりました!」
たとえばこのように表示をしたい時には、どのように書けばいいでしょうか。

PointというスコアボードにAさんとBさんのスコアが、そしてBonusという名前でもスコアが記録されているとすると、

/tellraw @a {"translate":"一番近くにいた %s さんと一番遠くにいた %s さんにはボーナス点%sポイントが入ります! %1$s さんのポイントは%s点に、 %2$s さんのポイントは%s点になりました!","with":[{"selector":"@p"},{"selector":"@p[c=-1]"},{"score":{"name":"Bonus","objective":"Point"},"color":"blue","bold":true},{"score":{"name":"@p","objective":"Point"},"color":"blue","bold":true},{"score":{"name":"@p[c=-1]","objective":"Point"},"color":"blue","bold":true}]}

このようになります。
「%s」や「%(数値)$s」は合わせて7つ出てきていますが、withの中には5つしかオブジェクトがありません。
AさんとBさんの名前が2回出てきていますが、同じものだからです。
「%(数値)$s」で指定することで、withの中のテキストを何度でも表示することができるのです。
「%(数値)$s」は「%s」が何番目と置き換わるかには影響しません。
「%s」が何番目と置き換わるかが分かりにくければ、

/tellraw @a {"translate":"一番近くにいた %1$s さんと一番遠くにいた %2$s さんにはボーナス点%3$sポイントが入ります! %1$s さんのポイントは%4$s点に、 %2$s さんのポイントは%5$s点になりました!","with":[{"selector":"@p"},{"selector":"@p[c=-1]"},{"score":{"name":"Bonus","objective":"Point"},"color":"blue","bold":true},{"score":{"name":"@p","objective":"Point"},"color":"blue","bold":true},{"score":{"name":"@p[c=-1]","objective":"Point"},"color":"blue","bold":true}]}

このように全て「%(数値)$s」で書いても問題ありません。

このコマンドを実行すると、

たとえばこのように表示されます。(シングルなのでAさんもBさんも私になっています)

このコマンドをリストやextraで書いた場合と比較してみましょう。
リストの場合

/tellraw @a [{"text":"一番近くにいた "},{"selector":"@p"},{"text":" さんと一番遠くにいた "},{"selector":"@p[c=-1]"},{"text":" さんにはボーナス点"},{"score":{"name":"Bonus","objective":"Point"},"color":"blue","bold":true},{"text":"ポイントが入ります! "},{"selector":"@p"},{"text":" さんのポイントは"},{"score":{"name":"@p","objective":"Point"},"color":"blue","bold":true},{"text":"点に、 "},{"selector":"@p[c=-1]"},{"text":" さんのポイントは"},{"score":{"name":"@p[c=-1]","objective":"Point"},"color":"blue","bold":true},{"text":"点になりました!"}]

extraの場合

/tellraw @a {"text":"一番近くにいた ","extra":[{"selector":"@p"},{"text":" さんと一番遠くにいた "},{"selector":"@p[c=-1]"},{"text":" さんにはボーナス点"},{"score":{"name":"Bonus","objective":"Point"},"color":"blue","bold":true},{"text":"ポイントが入ります! "},{"selector":"@p"},{"text":" さんのポイントは"},{"score":{"name":"@p","objective":"Point"},"color":"blue","bold":true},{"text":"点に、 "},{"selector":"@p[c=-1]"},{"text":" さんのポイントは"},{"score":{"name":"@p[c=-1]","objective":"Point"},"color":"blue","bold":true},{"text":"点になりました!"}]}

translateの場合

/tellraw @a {"translate":"一番近くにいた %s さんと一番遠くにいた %s さんにはボーナス点%sポイントが入ります! %1$s さんのポイントは%s点に、 %2$s さんのポイントは%s点になりました!","with":[{"selector":"@p"},{"selector":"@p[c=-1]"},{"score":{"name":"Bonus","objective":"Point"},"color":"blue","bold":true},{"score":{"name":"@p","objective":"Point"},"color":"blue","bold":true},{"score":{"name":"@p[c=-1]","objective":"Point"},"color":"blue","bold":true}]}


いかかでしょう。
リストやextraでは同じものであってもその度に書かないといけません。
また、リストやextraではテキストが細切れになってしまい、実行した時にどういったものが表示されるのか分かりにくいですが、translateであればtranslateとペアになっている文字列を見るだけで、どういった表示になるかが大体分かります。

このように、複数のテキストを一緒に使いたい場合は「もうtranslateだけでいいんじゃないかな…」というぐらいtranslateは便利です。

ただし、translateを使う場合に1つだけ気をつけないといけない点があります。
それは「%」自体を表示したい場合です。

/tellraw @p {"translate":"%s%完了しました。","with":[{"score":{"name":"Now","objective":"Shinchoku"}}]}

このコマンドは成功しません。
というのも、translateの中では「%」そのままでは「置き換わる部分の最初」という意味と認識されてしまうからです。
置き換えに使う「%」ではなく、単なる文字として「%」を使う場合は「%%」と書きます。

/tellraw @p {"translate":"%s%%完了しました。","with":[{"score":{"name":"Now","objective":"Shinchoku"}}]}




さて、複雑で長いテキストも指定できるようになりましたが、長いテキストになると途中で改行したくなりませんか?
次は改行等の特殊な文字の指定方法を解説します。

→その⑤へ進む