【JEコマンド講習会】第9回、team を使った仕掛け。殺し合いのバトルロワイヤルだ!!【マインクラフト】

スポンサーリンク

ようこそ、ぷっこ村へ。ししゃもです。

(・∀・)ノ

きょうはなんのひ~ フッフ~♪はい、中の人の誕生日だよ。住所書いとくから育毛剤を1ダースずつ送るように!!これで砂漠化に怯えなくて済む快適な日常ゲットだぜ!!

ていうのは置いといて、今回はモブ同士が殺し合う殺伐とした仕掛けを作ってみましょう。

閉鎖空間でモブを殺し合わせるイカれた仕掛けを作る

今回は↑のような仕掛けを作ってみましょう。ネジが飛んでる感じがステキですね、バトルロワイヤルを映画館で観たあの日を思い出します。今回使うコマンドで初めてなのは

  • team …… チームを作り、エンティティを振り分けるコマンド
  • title …… 画面中央にでっかく文字列を表示

の2つです。後は応用なので、1つずつ見ていけば余裕なはずだよ。

team をざっくり

チームを作る、作ったチームにエンティティを振り分ける、チームの解散など、チームという入れ物を弄るコマンドです。

基本の書き方
/team <操作> <対象エンティティ>

みたいな感じです。


/team add unko
/team join unko @s
/team remove unko

1行目の add はチームを作る操作、2行目はチームにエンティティを加える join で、3行目の remove はチームの解散操作です。チームからの除名は leave です。

title をざっくり

画面中央にでっかい文字列を表示させるコマンドです。JSONに対応していて、文字色を変えたり、日本語表示させることも可能です。長ーい文字列も表示可能ですが、見切れるんで実質文字制限は、日本語で10文字程度と考えるのがいいでしょう。

↑長いと見切れる例。上下同じ文面です。

基本の使い方
/title <対象> <操作> <テキスト>

みたいな感じです。

title @a times 10 70 20
title @a subtitle {"text":"さぁ、殺し合え!!"}
title @a title {"text":"デスゲームの始まりだ"}

times は表示時間の操作で、フェードイン、ステイ、フェードアウト順で、ティック数で指定します。この例だと、10tick(0.5秒)であらわれ、70tick(3.5秒)間文字列を表示、20tick(1秒)かけて消えていきます。ちなみにこれらの値はデフォルトの値です。表示方法を変えたい時に値を変えて実行し、用が済んだらまた戻しましょう。変えた表示時間は、ワールド再起動でリセットされるはずなので、その辺は頭の片隅に置いときましょう。

subtitle が下段の文章、 title が上段の文章です。先に subtitle を実行推奨。

実際に仕掛けを作る

準備

では、実際に作っていきましょう。今回は赤石回路を使用しません。代わりにセットアップ用のタワーを1つ、駆動用のタワー{横向き(別に縦でもいい)}を2つ用意します。あとはコロシアムを適当に1つ作りましょう。

セットアップ用のタワーは4段、感圧板に繋いどきます。赤石ブロックはモブの出現位置の目印です。

横向きタワーはこのように分かれてます。くっつかないように配置しましょう。

注意点ですが、右のタワーの、4,6,8番目は……

条件付きにしておいてください、これ大事。条件付きは、前のコマブロが実行されたら自身も実行するって意味でしたね。されなかった場合はスルーして次のコマブロに行きます。

これで準備はオッケーです。

使うコマンド

ここからはコマンドをイジイジしていきます。4つの構成に分かれていますので、まずは全体を見て見ましょう↓

/team add red
/team add blue
/scoreboard objectives add summon_counter dummy
/scoreboard objectives add red_team dummy
/scoreboard objectives add blue_team dummy
/scoreboard players set #summon_counter summon_counter 0
/kill @e[team=red]
/kill @e[team=blue]
/setblock 229 74 -1092 redstone_block
/title @a times 0 100 20
/setblock 229 74 -1092 air
/execute if score #summon_counter summon_counter matches 0..4 run summon vindicator 219 75 -1087 {Team:"red",Johnny:1b,ArmorItems:[{},{},{},{id:"minecraft:stick",Count:1b,tag:{CustomModelData:549}}]}
/execute if score #summon_counter summon_counter matches 5..9 run summon vindicator 224 75 -1089 {Team:"blue",Johnny:1b,ArmorItems:[{},{},{},{id:"minecraft:carrot_on_a_stick",Count:1b,tag:{CustomModelData:5}}]}
/scoreboard players add #summon_counter summon_counter 1
/execute if score #summon_counter summon_counter matches 0..9 run setblock 229 74 -1092 redstone_block
/execute if score #summon_counter summon_counter matches 10 run title @a title {"text":"さぁ、殺し合え!!"}
/execute if score #summon_counter summon_counter matches 10 run setblock 231 74 -1092 redstone_block
/execute if score #summon_counter summon_counter matches 10 run scoreboard players set #summon_counter summon_counter 0
/execute store success score #red_team red_team run data get entity @e[team=red,limit=1]
/execute store success score #blue_team blue_team run data get entity @e[team=blue,limit=1]
/execute if score #red_team red_team matches 0 if score #blue_team blue_team matches 0 run title @a title {"text":"Oops!! Draw!!"}
/setblock 231 74 -1092 air
/execute if score #red_team red_team matches 0 unless score #blue_team blue_team matches 0 run title @a title {"text":"Blue team Win!!"}
/setblock 231 74 -1092 air
/execute if score #blue_team blue_team matches 0 unless score #red_team red_team matches 0 run title @a title {"text":"Red team Win!!"}
/setblock 231 74 -1092 air
/scoreboard players reset #red_team red_team
/scoreboard players reset #blue_team blue_team

では、順番に解説。

コマンドの解説

全体の流れですが、

  • チーム、スコアボードを事前に準備しておく
  • 各チームに選手を割り振りつつ召喚
  • 戦ってる間状況を監視
  • 結果が出たら後処理

と言った流れになってます。この流れを意識しつつ順番に見ていきましょう。

1つ目のくくり、前準備

/team add red
/team add blue
/scoreboard objectives add summon_counter dummy
/scoreboard objectives add red_team dummy
/scoreboard objectives add blue_team dummy
/scoreboard players set #summon_counter summon_counter 0

これらは前準備用で、チャット欄に入力して実行します。1,2行目でチーム red,blue を作成しておきます。3行目~5行目は必要なスコアボードです。

6行目なのですが、エンティティの指定部分が #summon_counter となってますね 。スコアボードはエンティティとして存在しない対象を扱うことができ、「#」を付けることで、エンティティとして存在してないよって明示する暗黙ルールみたいなのが(海外の方で)ありますさらにスコアボードを表示しても値が表示されないので、隠し変数として使えます。ここテストに出すよー。

2つ目のくくり、セットアップ

/kill @e[team=red]
/kill @e[team=blue]
/setblock 229 74 -1092 redstone_block
/title @a times 0 100 20

これらは、感圧板を踏んだ時に最初に起動するタワーのコマンドです。座標はもちろん作る位置に合わせて変えて下さい。

  • 最初に kill コマンドがあるのは、2死合目以降のクリーンアップ用です。生き残りを皆殺しにしたのち、生贄を召喚するためにあります。
  • 3行目は次のくくりを実行するために赤石ブロックを置いてます。
  • 4行目はタイトルの表示時間を変えてます。これは好みで変えるなりなくすなり。

3つ目のくくり、選手の召喚

/setblock 229 74 -1092 air
/execute if score #summon_counter summon_counter matches 0..4 run summon vindicator 219 75 -1087 {Team:"red",Johnny:1b,ArmorItems:[{},{},{},{id:"minecraft:stick",Count:1b,tag:{CustomModelData:549}}]}
/execute if score #summon_counter summon_counter matches 5..9 run summon vindicator 224 75 -1089 {Team:"blue",Johnny:1b,ArmorItems:[{},{},{},{id:"minecraft:carrot_on_a_stick",Count:1b,tag:{CustomModelData:5}}]}
/scoreboard players add #summon_counter summon_counter 1
/execute if score #summon_counter summon_counter matches 0..9 run setblock 229 74 -1092 redstone_block
/execute if score #summon_counter summon_counter matches 10 run title @a title {"text":"さぁ、殺し合え!!"}
/execute if score #summon_counter summon_counter matches 10 run setblock 231 74 -1092 redstone_block
/execute if score #summon_counter summon_counter matches 10 run scoreboard players set #summon_counter summon_counter 0

このコマンド群は戦う選手の召喚をします。再帰処理を意識して作っていて、ちょっとこんがらがるかもしれないので、ねっとりと見ていきましょう。ポイントは、このコマンド群は条件が合う限り何回も繰り返し実行されるってとこです。

  • 1行目、まず2つ目のくくりで置かれた赤石ブロックを消します。こうすることで、このくくり自体を再度実行するための準備をしています。
  • 2行目、#summon_counter の summon_counter というスコアボードの値が 0~4 なら赤チームのヴィンディケータ―を召喚します。ヴィンディケーターは{Johnny:1b}を付けることで、自チーム以外を見境なく攻撃するようになります。また、{Team:チーム名}とすることで、teamコマンド無しで割り振りできます
  • 3行目、#summon_counter の summon_counter というスコアボードの値が 5~9 なら青チームのヴィンディケータ―を召喚します。
  • 4行目、#summon_counter の summon_counter に 1 加えます。
  • 5行目、#summon_counter の summon_counter が 0~9 までの間なら、1行目で消した赤石ブロックの位置に再度赤石ブロックを置きます。こうすることで、召喚とスコアボードの値加算を繰り返します。
  • 6行目~、以降#summon_counter の summon_counter が10に達した場合の処理です。タイトルとして「さぁ、殺し合え!!」と表示し、4つ目のくくりが実行されるように赤石ブロックを設置し、summon_counter の summon_counter を 0 にして後処理しておきます。以降、このくくりは何もしません。

何かメンドクサイことをしてるようですが、このような形態をとっておくと何が幸せなのか?いつも言ってる修正が楽、拡張性がある、ってことです。今回は 5 vs 5 ですが、急に 10 vs 10 にしたくなったら?matches の後の値をいじればあっという間に変更できます。できれば後のことも考えて組めるといいよねー。

4つ目のくくり、監視用

/execute store success score #red_team red_team run data get entity @e[team=red,limit=1]
/execute store success score #blue_team blue_team run data get entity @e[team=blue,limit=1]
/execute if score #red_team red_team matches 0 if score #blue_team blue_team matches 0 run title @a title {"text":"Oops!! Draw!!"}
/setblock 231 74 -1092 air
/execute if score #red_team red_team matches 0 unless score #blue_team blue_team matches 0 run title @a title {"text":"Blue team Win!!"}
/setblock 231 74 -1092 air
/execute if score #blue_team blue_team matches 0 unless score #red_team red_team matches 0 run title @a title {"text":"Red team Win!!"}
/setblock 231 74 -1092 air
/scoreboard players reset #red_team red_team
/scoreboard players reset #blue_team blue_team

さて、最後のくくりです。ポイントは、このコマンド群はリピートでループしており、両チームに生き残りがいる間毎tick全て実行されます。そこを意識しながら見ていきましょう。尚、前にどこかで store success は使わんから覚えんでいいと言ったな、アレは嘘だ!!と言うか嘘にするためにあえて使った。反省はしていない。

success は run 以降のコマンドが成功すれば 1 を返し、成功しなければ 0 を返すんでしたね。

  • 1行目、store success score #red_team red_team の部分ですが、run 以降のコマンドが成功すれば #red_team の red_team に 1 を代入、成功しなければ 0 を代入します。どういうことかというと、赤チームの生き残りがいれば、1 いなければ 0 を代入するってことです。
  • 2行目、同じように青チームに生き残りがいれば 1 いなければ 0 を #blue_team の blue_teamに代入。
  • 3行目、1、2行目の結果をもとに、両チームが同時にいなくなった場合(両スコアボードの値が 0 )、引き分け表示をします。
  • 4行目、コマブロを条件付きにしたところにいれるコマンドです。3行目が実行(引き分けた場合)された場合、このループを終わらせるために赤石を消すコマンドです。
  • 5行目、赤チームがおらず(0) 青チームが残った場合(0以外=1)の場合です。青チームの勝利表示をします。
  • 6行目、4行目と同じ。
  • 7行目、5行目の逆、赤チームだけになった場合の処理です。
  • 8行目、4ぎょu……。
  • 9、10行目、生き残り判定用のスコアボードを一旦リセットします。store success だと値が上書きされないのでリセットします。上書きされればいいのに!!

これで実行すれば殺し合いの始まりだぜ!!

まとめ

今回はバトロワを作って、皆さんには殺し合いをしてもらったわけですが、案外簡単だったんじゃないかなと思います。難しい処理はほぼなかったですからね。

仕掛けを作るにあたって、色々試したんだけど、1.18でかなり仕様が変わってる?雪玉方でゾンビ同士が同士討ちしないよね?ヴィンディケータ―とゾンビの混成チーム作っても、ゾンビだけになると同士討ちしないし……。ゾンビ自体が同士討ちしないよね。スケルトンチームと争わせようとしても無視だし。なんかAI変わってるっぽいね。僕の考えた最高のマイクラを押し付けてくる開発死ねって本気で思った。

なんか1.18になってマイクラ壊れたよね。地形とかどうでもいいからちゃんと動くようにしろよ。今のところ、同士討ちさせるには別の工夫が要りそうですね。

というわけで、誕生日に殺意の波動に目覚めたししゃもでした。それではこの辺で、お帰りの際はお気を付けて~(・∀・)ノシ

コメント