【マイクラコマンド】簡易版宝探し!設置済みのチェストにランダムでアイテムを隠すコマンド(コマンド編)

#ふつーのひとのマイクラコマンド教室

この記事ではマイクラのfunction機能を使って使用できるふつーのひとお手製のコマンドシステムの解説をします。
※functionの使い方はコチラをチェック!

作成済みの建物内にアイテムを隠したい!

こちらの記事は【マイクラコマンド】簡易版宝探し!設置済みのチェストにランダムでアイテムを隠すコマンド(解説編)の続きとなります。
今回からコマンドの中身について解説していきますね。
さて、こちらのコマンドについておさらいしておくと、「すでに設置してあるチェストのからランダムで1つを選択し、そのチェストの中に"模範解答"という名前の紙を隠す」コマンドでしたね。

↓ こちらのゲームでプレイヤー(教師側・生徒側)にわからないように模範解答の紙を隠すために本記事のコマンドを使用しております。

使用するコマンド

お待たせしました!ようやくコマンドそのものの解説に入ります!
前回記事でも説明しましたが、こちらのコマンドは「アーマースタンドを平面上に敷き詰めて、スキャナーのように移動させていきチェストの位置をスキャンしていく」といったイメージのコマンドとなります。

① アーマースタンドを敷き詰める。

さて、まずはアーマースタンドを平面上に敷き詰めて、スキャン面を作成していきます。こちらの動作はarmor_summon.mcfunction内に記述されています。mcfunctionファイルの中身は下記のようになっており、単純に32×32マスの範囲に1つずつアーマースタンドを召還しています。(summonコマンドが32×32の1024個あるということですね。)

ポイント
・Tags:[scan] により、「scan」タグを付与する。
・Marker:true により、アーマースタンドのあたり判定をなくす。
・Invisible:true により、アーマースタンドを見えなくする。
(MarkerとInvisibleを忘れると処理がめちゃくちゃ重くなります...)

# armor_summon.mcfunction

summon minecraft:armor_stand ~ ~ ~ {Tags:[scan],NoGravity:true,Marker:true,Invisible:false}
summon minecraft:armor_stand ~1 ~ ~ {Tags:[scan],NoGravity:true,Marker:true,Invisible:true}
summon minecraft:armor_stand ~2 ~ ~ {Tags:[scan],NoGravity:true,Marker:true,Invisible:true}
#長いのでここより下は割愛

scan概要2

② 「scan」タグのついたアーマースタンドと同じマス目にチェストがあった場合、そのマスに「Chest」タグが付いたアーマースタンドを召還する。

次に、スキャン平面内にチェストがあった場合に、後ほどその座標でコマンドを実行するために、目印として「Chest」タグについたアーマースタンドをおいておきます。こちらの動作はarmor_scan.mcfunction内に記述されています。
(模範解答の隠し場所となる収納すべてに対して同様の処理を行っています。)

ポイント
・execute at @e[tag=scan] で「scan」タグのついたアーマースタンドがいる座標でコマンドが実行される。
・execute if block ~ ~ ~ minecraft:chest でコマンドが実行された座標(=「scan」タグのついたアーマースタンドがいる座標)にチェストがあるかどうかを判定する。

# armor_scan.mcfunction
# 隠し場所にtag=Chestのアーマースタンドを設置
# チェスト
execute at @e[tag=scan] run execute if block ~ ~ ~ minecraft:chest run summon minecraft:armor_stand ~ ~ ~ {Tags:[Chest],NoGravity:true,Marker:true,Invisible:true}
# シェルカーボックス(白)
execute at @e[tag=scan] run execute if block ~ ~ ~ minecraft:white_shulker_box run summon minecraft:armor_stand ~ ~ ~ {Tags:[Chest],NoGravity:true,Marker:true,Invisible:true}
# シェルカーボックス(薄灰色)
execute at @e[tag=scan] run execute if block ~ ~ ~ minecraft:light_gray_shulker_box run summon minecraft:armor_stand ~ ~ ~ {Tags:[Chest],NoGravity:true,Marker:true,Invisible:true}
# シェルカーボックス(黄緑)
execute at @e[tag=scan] run execute if block ~ ~ ~ minecraft:lime_shulker_box run summon minecraft:armor_stand ~ ~ ~ {Tags:[Chest],NoGravity:true,Marker:true,Invisible:true}
# ホッパー
execute at @e[tag=scan] run execute if block ~ ~ ~ minecraft:hopper run summon minecraft:armor_stand ~ ~ ~ {Tags:[Chest],NoGravity:true,Marker:true,Invisible:true}
# たる
execute at @e[tag=scan] run execute if block ~ ~ ~ minecraft:barrel run summon minecraft:armor_stand ~ ~ ~ {Tags:[Chest],NoGravity:true,Marker:true,Invisible:true}

scan概要3

④ 「scan」タグのついたアーマースタンドを高さ方向に1つ上のマスに移動させる。

現在のスキャン平面上にチェストがあるかどうかを確認したら、ひとつ上の平面にアーマースタンドを移動させます。アーマースタンド全体を制御するのは難しいので、ここはアーマースタンド君に自力で動いてもらいましょう。こちらの動作もarmor_scan.mcfunction内に記述されています。

ポイント
・execute as @e[tag=scan] で 「scan」タグのついたアーマースタンドにコマンドを実行させる。
・execute at @s で コマンドの実行者(=「scan」タグのついたアーマースタンド)のいる場所でコマンドを実行する。
・tp @s ~ ~1 ~ でコマンドの実行者(=「scan」タグのついたアーマースタンド)をコマンドの実行場所(=「scan」タグのついたアーマースタンドのいる場所)から1マス上にテレポートさせる。

# 上に移動(アーマースタンドにやらせる)
execute as @e[tag=scan] run execute at @s run tp @s ~ ~1 ~

scan概要4

⑤ ③,④を指定した回数繰り返す。

上記の処理を建物全体がカバーされるまで繰り返します。ここまでで、建物内に設置されたすべてのチェストの場所に「Chest」タグのついたアーマースタンドが設置されたことになります。

ポイント
・schedule function school_war:scan/scan/armor_scan 1t で自分自身を実行して処理を繰り返す。

# スキャンが終わっていなければ(i>0)繰り返す
execute unless entity @e[tag=DummyPlayer,scores={i=..0}] run schedule function school_war:scan/scan/armor_scan 1t

⑥ 設置された「Chest」タグが付いたアーマースタンドの中から1体を選択し、そのアーマースタンドの位置にあるチェストに模範解答を入れる。

最後に模範解答を隠すチェストを選び、その中に実際に「模範解答」と書かれた紙をしまいます。⑤までですべてのチェストの場所に「Chest」タグのついたアーマースタンドが設置されたので、それらのアーマースタンドの中から1体、ランダムで選んであげることで、模範解答の隠し場所となるチェストをランダムに1か所決めることができます。模範解答を入れるチェストが決まったらあとはテストをチェストの中に入れてあげればよいですね。

ポイント
・execute at @e[tag=Chest,sort=random,limit=1] で「Chest」タグのついたアーマースタンドをランダムに順番付けし、一番若い番号のついたアーマースタンドの場所でコマンドを実行する。
・tag:{display:{Name:"{\"text\": \"模範解答\"}" }} で「模範解答」と名付ける。

# tag=Chestのアーマースタンドからランダムで1体選んでその場所にあるチェストに模範解答を入れる
execute at @e[tag=Chest,sort=random,limit=1] run data merge block ~ ~ ~ {Items:[{Slot:0b, id: "minecraft:paper", Count: 1b, tag:{display:{Name:"{\"text\": \"模範解答\"}" }} }]}

以上です!ぜひみなさんも好きな建物にお宝を隠して遊んでみてください~
ちなみにこの記事ではコマンドの汎用性の高い部分をポイントとして紹介しています。ほかの仕掛けを作る際にも役に立つので、機会があれば別の記事で紹介しますね~

関連記事

↓RAGのTwitterとかYoutubeとか
Twitter:@redastergardens

↓ ふつーのひととか
Twitter:@HNohito



この記事が気に入ったらサポートをしてみませんか?