Minecraft BEのコマンドの使い方を備忘録としてまとめています。
本稿ではscoreboardコマンドで人数を数える方法について。
scoreboardコマンドで人数を数える
コマンドでプレイヤーやエンティティの人数を数える方法はおそらく複数あると思いますが、ここでは2つ。
なお例として、数えた人数を反映するスコアを”number”とし、NPC3体を用意して人数を数えます。
準備
数えた人数を反映するスコア”number”を作成、表示します。
/scoreboard objective add number dummy
→スコアボード”number”を作成する。
/scoreboard objective setdisplay number sidebar
→”number”をサイドバーに表示する。
スコアを書き換えた回数をカウントする
数えたいエンティティ(ここではNPC)のnumberスコアを”0”にセットし、1体ずつnumberスコアを”1”に書き換え、書き換えが成功した回数=人数としてresult(結果反映用の空ネーム)に加算します。
①【衝撃】
/scoreboard players set @e[types=npc] number 0
→数えたいNPCのnumberスコアを”0”にセット。
∟【チェーン】
/scoreboard players set result number 0
→result(結果反映用の空ネーム)のnumberスコアを”0”にセット。
※初回は必要ありませんが、2回目以降の数え直しに必要です。

②【反復】
/scoreboard players set @e[scores={number=0},c=1] number 1
→numberスコア”0”のエンティティのうち最も近い1体のnumberスコアを”1”にセット。
∟【チェーン:条件付き】
/scoreboard players add result number 1
→前のコマンドが成功した場合のみ、resultのnumberスコアに1を加算。

解説
①は人数を数えるための準備となる初期値を設定しています。
例えば①でnpcのnumber初期値を0とせずに空のままで、③の段階でターゲットセレクターを
@e[scores={number=!1},c=1]
とすることも一見可能そうに見えますが、!1(1以外)の条件は”1以外の数値を持っている場合”にしか発動しないため”0”を変換対象としてセットしている点に注意してください。
②は人数の最大数を限定しないように反復で実行し、c=1を加えることで1度の実行で書き換える人数を1体に限定しています。
(対象がプレイヤーの場合は@pを使用すればc=1は不要になります。)
コマンドが成功した場合(number”0”から”1”への書き換えに成功した場合)のみresultに1を加算し、全てのnumber”0”の書き換えを終えたらコマンドは失敗扱いになりresultの値は増えないため、resultの値が人数となります。
数えなおす場合は①を実行すれば②は反復なので自動的に反応します。
スコア反映用の空ネームとは…
例で使用した”result”には実体はなく、名前だけの存在です。
scoreboardコマンドのターゲットに架空の名前を入力すると、実体のない空ネームにスコアを反映することが出来ます。
setdisplayでは空ネームとスコアの値が表示されます。
testforで拾った信号強度をスコアに反映する
別の方法として、testforで検知した人数(信号強度)をスコアに反映する方法もあります。
簡単なコマンドとレッドストーン回路を使用するため構造はシンプルですが、信号強度を利用しているため数えられる最大数が”15”に限定されます。
①【衝撃】
/scoreboard players set result number 0
→result(結果反映用の空ネーム)のnumberスコアを”0”にセット。
※初回は必要ありませんが、2回目以降の数え直しに必要です。
∟【チェーン】
/testfor @e[type=npc]
→npcの人数を数える。
∟【チェーン】
/setblock 0 0 0 gold_block
→信号を接続するための不透過ブロックをセット。
不透過ブロックならゴールドブロックである必要は無い。
座標はtestforのコンパレーターから信号を受け取る位置。
∟【チェーン:遅延1】
/setblock 0 0 0 glass
→動力はコンパレーター後の不透過ブロック。
testforから取り出した信号をカットするため不透過ブロックを透過ブロックに置き換える。
透過ブロックならガラスである必要は無い。
★コンパレーター
∟不透過/透過ブロック
∟レッドストーンパウダー
→コンパレーターはtestforのコマンドブロックから信号を取り出す。
ブロックは前述のsetblockによって配置される。
パウダーは信号強度を反映する。
②【衝撃】
/scoreboard players add result number 1
→このコマンドをレッドストーンパウダーに沿って最大15個並べる。
動力はレッドストーンパウダー。
レッドストーン信号が届いた場合にresultのnumberスコアに1加算する。

解説
①はまず、結果を反映するためのresult(空ネーム)のnumberスコアを”0”にセットします。
次のtestforは本来の意味通り対象の数を検知するために用います。
その後のsetblockは、testforから取り出した信号を一時的にレッドストーンパウダーに流し、すぐに断ち切るために使用しています。
(testforコマンドブロックは前回の実行結果を保持しているので信号が出続けてしまい、次回の実行時に信号が切れないためその後の衝撃コマンドブロックが動作しないことがある。)
レッドストーン回路部は、まずコンパレーターでtestforの結果を信号強度に変換します。
コンパレーター後のブロックは前述のとおり、testforの結果となる信号を毎回断ち切るために使用します。
レッドストーンパウダーの信号は各ターゲットブロックに流れ、各scoreboardコマンドブロックを作動させます。
レッドストーン信号の強度に応じた数のscoreboardコマンドが実行されるため、resultのnumber値がtestforで検知した人数と一致します。
例として2つの方法をあげましたが、他にもいろいろな手段で人数を数えることが出来るはずです。
使用するシチュエーションや用途によって最適な方法を選択しましょう。
▶『コマンドの使い方』カテゴリTOPへ