マインクラフト統合版で鉄を千個あつめるゲーム(鉄千)のコマンド部分をつくっていく
この記事は マインクラフト統合版で鉄を千個あつめるゲーム(鉄千)の実現方法 の続き
コマンドブロックでは大文字小文字が区別されるので注意して書くこと
焼いた鉄をカウントする
カウンター用の変数とユーザを切り離す方式で実装してみる
これはユーザが変わる度にコマンドブロック内を編集するのが大変で間違いも起こりやすいと思うので
あとはユーザ毎に表示する文字色を変えたりしたいなと思うので
ほとんどのコマンドブロック内では User1、User2、User3。。。のように書いておいて、
表示する部分だけ、User?? と ゲーマータグ(名前/表示名) を関連付ける。という方式にしておきます。
まず、カウントするための変数?を scoreboard で用意する
名前は Iron にしとく
scoreboard objectives add Iron dummy
次に鉄が焼けたことを検知するための仕組みとしてこんなのを作る
・チェスト
・チェストにつながるようにホッパー
・ホッパーの上に溶鉱炉
・ホッパーの後ろにコンパレータ
・コンパレータの出力を受け取るコマンドブロック
これで溶鉱炉で焼けた鉄がホッパーに吸われてチェストに入る
ホッパーを通った時にコンパレータで検知してコマンドブロックを動かす。という仕組み
コマンドブロックの中は上で作った Scoreboard の Iron の「 User1 」 に+1しているだけ
scoreboard players add User1 Iron 1
インパルス、無条件、動力が必要
これを人数分作って、コマンドブロックの User1 部分をそれぞれ User2とかUser3とかに変えておく
もちろん、溶鉱炉を増やしてもOK。
その場合は最初のホッパーにつなげるか、それぞれの後ろにコマンドブロックを増やしておくかが必要
私は溶鉱炉を3つに増やして、カウントアップで光るようにレッドストーンランプも付けておいた
焼いた鉄を表示する
焼いた鉄の数を画面に表示する用のコマンドブロックを用意
このコマンドブロックは変数 Iron を利用するため、溶鉱炉の近くに置かなくてもOK
会場とは離れた場所、もしくは会場の地下、上空などに配置してもよいと思います
Scoreboard Iron のどの User?? を 「誰」 に表示するのか、と言う所を気をつけて
「 誰 」の部分には「ゲーマータグ(名前/表示名)」 に変更してください
(人数分このブロックを用意)
遅延は 20 を設定して、1秒毎の表示にしてます
titleraw 誰 actionbar {"rawtext": [{"text": "§e現在の鉄: "}, {"score": {"name": "User1", "objective": "Iron"}}]}
リピート、無条件、動力が必要、ティックの遅延(20)
このコマンドブロックをレバーとかで働かせると、鉄の数が表示されるようになる
鉄千クリアを検知する
こども達が1000個集めるのは大変だと思うので、クリア条件は可変にしておきます
scoreboard players set Max Iron 1000
1000の所を 500 とかに変えれば、500集めた時点でクリアと判定する
これは初期設定時点で利用
クリア検知
鉄の個数を確認する用のコマンドブロックを用意して、条件を満たしたらもう検知されないように カウンターを 9999 に設定
( User1 の部分はユーザ毎に変更。人数分このブロックを用意)
execute if score User1 Iron = Max Iron run scoreboard players set User1 Iron 9999
リピート、無条件、動力が必要、ティックの遅延(5)
その後ろにチェーンで4つコマンドブロックを連結(これも人数分用意)
サブタイトル設定
title @a subtitle §l鉄千達成!!
チェーン、条件付き、常時実効
タイトル設定
title @a title §cちょうじょちゃん
チェーン、条件付き、常時実効
※ 表示したい名前を入れておく(プレイヤーIDよりわかりやすく)
※ これは 先に判定した User1 の人の名前
※ サブタイトルを設定した後にタイトル表示にすること
コメント表示
tellraw @a {"rawtext":[{"text":"§c§lちょうじょちゃん§r 鉄千達成!!§r"}]}
チェーン、条件付き、常時実効
※ ここの名前も同じく表示したい名前を入れておく
クリア音再生
playsound random.levelup @a
チェーン、条件付き、常時実効
音はレベルアップ時の音としたけど、襲撃でもウォーデンビームでもなんでもOK
私のレイアウトはこんな感じ
(下の図はちょっと大きくなってしまうので、User1~3までにしときます)
先ほどの「焼いた鉄を表示する」の部分も変更
今のままではクリアした後もずーっと表示を続けてしまうので、クリアを検知するまでは表示という風にしておきます
execute if score User1 Iron < Max Iron run titleraw 誰 actionbar {"rawtext": [{"text": "§e現在の鉄: "}, {"score": {"name": "User1", "objective": "Iron"}}]}
制限時間で終了する
制限時間を設定しておいて、時間になったら 「鉄千終了」 と画面表示を行う。
設定は「分」で指定可能としておく。
最初から秒やTickで指定してもらえれば計算部分がなくなってコマンドブロック数が減って作る方は楽になるけど、使う方はまぁ簡単に「分」で指定できた方がいいよね。
制限時間を「 分 」 で設定
scoreboard players set Limit Iron 90
使う人はここの 90 分 部分のみを変更すればよい
子供たちは・・30分くらいにしておいた方がいいかな
分から秒への計算用の変数を準備
scoreboard players set seed Iron 60
制限時間を「 秒 」 に変換
scoreboard players operation Limit Iron *= seed Iron
これを1秒毎(20Tick毎)にカウントダウンしていって、ゼロになったらゲーム終了ということ
終了判定用の「ゼロ」を準備
scoreboard players set zero Iron 0
ここまでは初期設定として、最初に設定するだけでOK
制限時間カウントダウン
execute if score Limit Iron >= zero Iron run scoreboard players add Limit Iron -1
リピート、無条件、動力が必要、ティックの遅延(20)
まだゼロでなければ、カウントダウン
(ティックの遅延を20にしているので1秒毎にカウントダウン)
制限時間になったら?
execute if score Limit Iron = zero Iron run scoreboard players set Limit Iron -1
チェーン、条件付き、常時実効
サブタイトルとタイトルを設定して終了をお知らせ(音も)
title @a subtitle 制限時間になりました
チェーン、条件付き、常時実効
title @a title !!!鉄千終了!!!
チェーン、条件付き、常時実効
playsound block.bell.hit @a
チェーン、条件付き、常時実効
とりあえず、これだけあればゲームはできるかな
あとは会場を整えて、その他コマンドもちょっと付け足して。。
ビヘイビアーパックにまとめる、と。