Minecraft BE(統合版)のscoreboardコマンドを使用して、あるスコアの値を比較して順位付けを行う方法です。
前提となるscoreboard及びexecuteコマンドの使い方はこちらから確認してください。
▶/scoreboardコマンドの使い方
▶/executeコマンドの使い方
/scoreboardと/executeコマンドで値を参照して順位を付ける
まずは前提となる状況やスコアを仮に定義します。
実際には環境に合わせてカスタムして下さい。
ここでは対象となるエンティティとして『armor_stand』を3体用意し、それぞれに『point』スコアをランダム(1~10)で付与、このpointの値が大きい順に『rank』スコアを1→2→3と付けるコマンドとします。
※pointスコアの作成、値の付与に関する構文は割愛します。
順位の判断基準となるスコア名 | point |
順位スコア名 | rank |
作業用スコア | count |
順位付けのルール | pointが大きい順 |
順位を付けるための/scoreboardと/executeコマンド
1,/scoreboardコマンドの準備
①/scoreboard objectives add rank dummy
スコアボード「rank」を作成する。
②/scoreboard players set @e[type=armor_stand] rank 0
全てのアーマースタンドのrankを0に設定する。
③scoreboard objectives add count dummy
スコアボード「count」を作成する。
④scoreboard players set system count 1
system(仮エンティティ)のcountスコアを1に設定する。
※アーマースタンド3体にはそれぞれ、すでにpointの値が付与されているものとする。
2,/scoreboardと/executeコマンドで順位を付ける
⑤反復
/scoreboard players operation system point > @e[type=armor_stand,scores={rank=0}] point
systemのpointスコアをrankの値が0のアーマースタンドのpointスコアのうち最も大きい値に書き換える
⑥チェーン:条件付き
/execute as @e[type=armor_stand] if score @s point = system point run scoreboard players operation @s rank = system count
実行者をアーマースタンドとして実行者のpointの値がsystemのpointの値と等しいときに実行者のrankをsystemのcountと等しい値に書き換える。
⑦チェーン:条件付き
/scoreboard players add system count 1
systemのcountの値に1を足す
⑧チェーン:条件付き
/scoreboard players set system point 0
systemのpointの値を0にする
※順位付けが終わってrank=0(順位計算前の対象)がいなくなれば自動的にそれ以降のコマンドもすべて無効となる。
systemとは…
scoreboardコマンドの付与や参照の対象として、エンティティとしては存在しない空ネームを指定することが出来ます。
ここではsystemという空ネームを用いてスコアの値を保存や比較することに用いています。
値を参照して順位を付けるコマンドの解説
②では全てのアーマースタンドのrankの値をあらかじめ0にセットします。
これは、その後のrank付けの際に
・『rank=0』は未だ順位が決まっていないアーマースタンド
・『rank=1or2or3』は既に順位が確定したアーマースタンド
として指定するための準備です。
⑤では『rank=0のアーマースタンド』をまとめて指定してオペレーションの比較対象としています。
こうすることで system point > @e の比較対象は自動的に『rank=0のアーマースタンド』のうち最も値が大きいものが参照されsystemの値を書き換えることが出来ます。
⑥ではsystemのpointの値と同じ値(rank=0のうち最大の値)を持つアーマースタンドにrankの値を付与しています。
rankの値はsystemのcountの値を参照してコピーされます。
⑦では順位付けが進むたびにsystemのcountに1足すことで、次の順位の準備となります。
⑧次のpoint比較のためにsystemのpoint値を0(どのアーマースタンドよりも小さい値)としています。
今回はアーマースタンドのpointの値が1~10の間に収まるようにしているので0としていますが、値の最小値が不明の場合は
/scoreboard players reset system point
としてsystemのpoint値を消してしまってもOKです。
※上記の構成でも最初の一回目はsystemのpoint値が“無し”の状態で正常に実行されています。