更新日:
1. 準備(最初に一度だけ)
/team add red "赤チーム"
/team add blue "青チーム"
/team modify red color red
/team modify blue color blue
/team modify red friendlyFire false
/team modify blue friendlyFire false
/scoreboard objectives add flags dummy "旗の数"
/scoreboard objectives add died deathCount
/scoreboard objectives setdisplay sidebar flags
/scoreboard players set 赤チーム flags 0
/scoreboard players set 青チーム flags 0
flags は持ち帰った旗の数、died は倒された回数を数えるスコアです。プレイヤーは /team join red 名前 のようにチームに入れます。チームの作り方は teamコマンドの使い方 にまとめています。作戦は /teammsg で味方だけに送れます(個人チャットのコマンド)。
2. 旗の場所に目印を置く
/summon marker ~ ~ ~ {Tags:["red_flag"]}
/summon marker ~ ~ ~ {Tags:["blue_flag"]}
赤の陣地と青の陣地のまん中に立って、それぞれ1回ずつ実行します。目印(marker)は見えないので、同じ場所に旗(バナー)のブロックを置いて飾りにしておくと分かりやすくなります。
3. 相手の旗を取る(くり返し)
ここからは赤チームが青の旗を取る場合です。青チームの分は、赤と青を入れかえて同じものを作ります。
/execute at @e[type=marker,tag=blue_flag] unless entity @a[tag=has_blue] as @a[team=red,distance=..1.5,limit=1,sort=nearest] run tag @s add take_blue
/item replace entity @a[tag=take_blue] armor.head with blue_banner
/tag @a[tag=take_blue] add has_blue
/tag @a[tag=take_blue] remove take_blue
1行目をくり返しコマンドブロック(常時実行)に入れ、残りをチェーンでつなげます。まだ誰も青の旗を持っていないときだけ、旗に一番近い赤チームの1人に take_blue タグを付けます。そのあと青い旗を頭にかぶせ、「持っている」印の has_blue タグに付けかえます。頭にかぶっていた防具は旗に置きかわるので、ヘルメットなしで遊ぶルールにしておきます。
4. 旗を持っている人を光らせる(くり返し)
/effect give @a[tag=has_blue] glowing 1 0 true
旗を持っている人が壁の向こうからも見えるので、相手チームが追いかけやすくなります。光らせ方は 発光させるコマンド も参考にしてください。
5. 自分の陣地に持ち帰ったら得点(くり返し)
/execute at @e[type=marker,tag=red_flag] as @a[tag=has_blue,distance=..2] run scoreboard players add 赤チーム flags 1
/execute at @e[type=marker,tag=red_flag] as @a[tag=has_blue,distance=..2] run tellraw @a {"text":"赤チームが旗を持ち帰った!","color":"red"}
/execute at @e[type=marker,tag=red_flag] as @a[tag=has_blue,distance=..2] run item replace entity @s armor.head with air
/execute at @e[type=marker,tag=red_flag] as @a[tag=has_blue,distance=..2] run tag @s remove has_blue
青の旗を持った人が赤の陣地の目印から2マス以内に入ったら、赤チームに1点を足し、頭の旗を外してタグも外します。タグを外すのを最後にしているのは、先に外すと残りの行が動かなくなるためです。
6. 倒されたら旗を戻す(くり返し)
/gamerule keep_inventory true
/execute as @a[scores={died=1..},tag=has_blue] run item replace entity @s armor.head with air
/tag @a[scores={died=1..}] remove has_blue
/scoreboard players reset @a[scores={died=1..}] died
1行目は最初に一度だけ実行します(1.21.10以前は keepInventory)。持ち物を残す設定にしておかないと、倒されたときに旗のアイテムが地面に落ちて拾われてしまうためです。2〜4行目はくり返しとチェーンで動かし、倒された人の頭から旗を外し、タグも外します。タグが外れると、3の条件で旗がまた取れるようになります。
7. 勝利の判定(くり返し)
/execute if score 赤チーム flags matches 3.. run title @a title {"text":"赤チームの勝ち!","color":"red"}
先に3本持ち帰ったチームの勝ちにする例です。表示したらコマンドブロックを止め、次のゲームの前に /scoreboard players set 赤チーム flags 0 で点数を0に戻します。
うまくいかないときの確認ポイント
- 旗が取れない:プレイヤーがチームに入っているか、目印から1.5マス以内まで近づいているか確認します。
- 両チームの人が同時に旗を持つ:3の1行目に
unless entity @a[tag=has_blue]が入っているか確認します。 - 得点が何回も入る:5の最後でタグを外しているか確認します。
- 倒されても旗が戻らない:
diedの基準がdeathCountになっているか確認します。
よくある質問
統合版でも作れますか?
チームの機能がないので、タグとスコアでチームを分ける必要があります。この記事の書き方はJava版向けです。
旗を持っている人の足を遅くできますか?
effect give @a[tag=has_blue] slowness 1 0 true を4に足すと、旗を持っている間だけ足が遅くなります。
試合時間を決められますか?
タイマー用のスコアを毎ティック1ずつ減らし、0になった時点で点数の多いチームを勝ちにできます。