【Java版】チェストの中身をランダムに決定しよう!【コマンド】

【Java版】チェストの中身をランダムに決定しよう!【コマンド】

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

マイクラでバトロワ的なゲームを作りたいマインクラフター
「バトロワみたいにチェストの中身をランダムに決定したいんだけど、どうやればいいのかな? 難しそうだけど、どんなコマンドを使うの?」

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

本記事の内容
  • チェストの中身をランダムに決めるには、ランダムな座標を参照する

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

ナツメってこんな人

今回はチェストの中身をランダムに決定する方法を解説します!
このコマンドが組めるようになると、バトロワのようにゲームごとにチェストの内容を変化させることができます。

なので、ミニゲームを作りたい向けの内容ですね。
さっそく見ていきましょう!

チェストの中身をランダムに決めるには、ランダムな座標を参照する

チェストの中身をランダムに決めたい場合、当然ではありますが用意した選択肢の中からランダムに選出されなくてはなりません。

なので、今回は「対象となる村人の位置にランダムにテレポートさせる」という方法を使います。
いきなりテレポートという単語が出てきて、どういうことなのかと疑問を抱くかもしれませんね。

端的に答えると、tpコマンドで@rを指定するのです。
(@rはランダムなプレイヤーの元にテレポートさせる)

コマンド全体の仕組みを簡単に話すと

  1. まず名前入り防具立てを用意する。
  2. 特定の名前を持つ村人を用意する。
  3. 特定の名前を持つ村人たちの中から、ランダムな村人の座標に防具立てをテレポートさせる。
  4. テレポートした座標をもとにチェストの中身を決定する。

といった感じです。

ランダムな村人の元にテレポートさせるっていうのが、やはり重要ですね。
仕組みを大まかに理解したところで、次は実際にコマンドを組んでいきましょう!

コマンドを実際に組んでみる

それでは、実際にコマンドを組んでみましょう。

①名前がある防具立てを用意する

先ほども説明したように、まずは防具立てを用意します。
この時名前入りの防具立てを用意する理由としては、他の防具立てと差別化するためです。

要するに、「防具立て」という指定だけだと、まったく関係ない防具立てまでもが対象となってしまいます。
なので、名前を付けます。

これをしておかないと、装飾目的で置いた防具立てや他のチェストの中身を決める際に使用する防具立てに、支障が出てしまうということですね。

というわけで、今回は分かりやすく「1」と名付けておきます。
この名前は自分の好きなものでOKです。

名前入りの防具立てを召喚するコマンドは

/summon minecraft:armor_stand 座標 {CustomName:'{"text":"1"}'}

となります。
防具立てはテレポートさせるので、座標はどこを指定しても大丈夫です。ただ、上手くできているか判断しやすい座標を指定すると扱いやすいですね!)

名前を変更したい場合は”1”の部分を変更してください。
「チェスト中身1」という名前にしたければ、”チェスト中身1”と変えるだけです。

この防具立てを召喚するコマンドは、バトロワのようなゲームの場合ゲーム開始時に召喚されるようにしておくと良いです。
(防具立て召喚後はリピートコマンドブロックを使用するので、ゲーム開始と同時に中身が決まる仕組みになります)

今回はコマンドブロックにボタンをつけて何度も防具立てを召喚できるようにしておきます。

②特定の名前を持つ村人たちを用意する

さて、防具立ては無事に召喚出来ました。
なので次はそれをランダムな村人の元にテレポートさせます。

今回は4人の村人を用意しておきます。

ここで用意する村人の数が、ランダムに選ばれる選択肢の数になります。

そしてこの村人たちにも、防具立てのように名前を付けておきます。

名前は自由につけてもらって構いませんが、全員に同じ名前を付けます。

この4人は全員「001」という名前

今回は名前を付けて他の村人と差別化しますが、tagを付与して、tagによる差別化でもいいと思います。

村人を召喚するコマンドは以下の通り。
村人には移動してほしくないので、NoAIによって移動できないようにさせています。

/summon minecraft:villager 座標 {CustomName:'{"text":"001"}',NoAI:1}

座標に関してはどこでも構いませんが、分かりやすくマップの邪魔にならない場所を指定しておきましょう。

③特定の名前を持つ村人の中から、ランダムな村人の位置に防具立てをテレポートさせる

これで村人の用意が出来ましたので、次は実際に防具立てをテレポートさせます。

この時、tpコマンドで@rを指定してランダムな村人の元に移動させたいのですが、@rは生憎プレイヤーのみを対象としてしまいます。

つまり、@rで指定しては上手くいかないということ。
そこでexecuteコマンドのasを使って、コマンドの実行者を変更します。

少しややこしいので、初めにコマンドを載せます。
その後から解説を入れていきます。

  • 「1」という名前の防具立てを、「001」という名前の村人(ランダムに選出)の位置にテレポートさせるコマンド
    (リピート、無条件、常時実行にコマンドブロックを設定)
execute as @e[type=minecraft:villager,limit=1,sort=random,name=001] run tp @e[type=minecraft:armor_stand,name=1] @s

まず、as @e[type=minecraft:villager,limit=1,sort=random,name=001]の部分について。

executeコマンドでasを選ぶと、その後の対象がコマンドを実行することになります。

@eは「すべてのエンティティ」という意味です。
村人や防具立て、mobなどですね。

なので、このままではすべてのエンティティが実行者になってしまいます。
それでは可笑しなことになってしまいますので、そのエンティティがどんなエンティティなのかを指定していきます。

そこで、[type=minecraft:villager,limit=1,sort=random,name=001]の部分です。

項目役割
type=エンティティの種類を指定。今回は村人なのでvillager
limit=対象とする数。今回は村人は4人いるけど1人までということ。
sort=どのように対象を決めるか。当然randomを指定。
name=そのエンティティが持つ名前。今回は「001」

というわけで、コマンドの実行者は『「001」という名前を持つ村人の中から、ランダムに選ばれた1人』となります。

これが理解できれば残りはtpコマンドを見ていくだけです。

run tp @e[type=minecraft:armor_stand,name=1] @sとありますので、@e[type=minecraft:armor_stand,name=1]をコマンドの実行者の元にテレポートさせることになります。

コマンドの実行者は先ほど解説したように、『「001」という名前を持つ村人の中から、ランダムに選ばれた1人』と指定しています。

そして、@e[type=minecraft:armor_stand,name=1]は「名前が1の防具立て」を指定しているので、防具立てがランダムな位置の村人の元へテレポートされるということです。

④防具立てのある座標をもとに、チェストの中身を補充する

防具立てがランダムな位置にテレポートしましたので、次はテレポートした座標をもとにチェストの中身を補充します。

まずリピートコマンドブロックに以下のコマンドを打ちこみます。
(リピート、無条件、常時実行のリピートコマンドブロック)

kill @e[type=minecraft:armor_stand,name=1,x=0,y=62,z=0,dx=0,dy=0,dz=0]

このコマンドはテレポートした防具立てをキルするコマンドです。
(テレポート先の村人のいる座標がx=0,y=62,z=0の場合)

x,y,zの値は村人のいる座標と同じにしましょう。dx,dy,dzの値は0のままでOKです。

そして上記のコマンドが成功したのを機に、アイテムを補充するコマンドを起動させます。
(チェーン、条件付き、常時実行で繋ぐ)

item replace block -1 62 -1 container.13 with diamond 1

アイテムを補充するコマンドは1.17からitemコマンドに変更されました。
(それ以前はreplaceitemコマンドで補充していました)

itemコマンドの見方としては

item replace block チェストなどのアイテムを入れるブロックの座標 収納する場所 with 何のアイテムか 個数

となります。
なので、上記のコマンドではx=-1,y=62,z=-1にあるチェストの中心にダイヤモンドを3つ収納するコマンドになります。

チェストのどの位置に収納されるかを知りたい人は【Java版】コマンドを使って、チェストにアイテムを補充しよう!【解説】を参考にしてください。
replaceitemコマンドは使えなくなってしまいましたが、収納場所を指定するcontairなどは変わっていません。

ここまでくれば同じことの繰り返しです。
テレポート先である村人の数だけコマンドブロック群を用意して、その内容を少し変更するだけです。
(座標や補充するアイテムを変更する)

まとめ

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

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

今回使ったコマンド
  • 防具立てを召喚するコマンド
/summon minecraft:armor_stand 座標 {CustomName:'{"text":"1"}'}
  • 動かない村人を召喚するコマンド
/summon minecraft:villager 座標 {CustomName:'{"text":"001"}',NoAI:1}
  • 防具立てをランダムな村人の元にテレポートさせるコマンド
execute as @e[type=minecraft:villager,limit=1,sort=random,name=001] run tp @e[type=minecraft:armor_stand,name=1] @s
  • 防具立てを消しつつ、チェストにアイテムを補充するコマンド
    (上段のXはテレポした先の座標を入力)
kill @e[type=minecraft:armor_stand,name=1,x=X,y=X,z=X,dx=0,dy=0,dz=0]
item replace block チェストなどのアイテムを入れるブロックの座標 収納する場所 with 何のアイテムか 個数
ポイント
  • 補充したいチェストごとに、防具立てと村人の名前を変えると幾つも作成できます!

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







関連記事

この記事を共有!