にほたもるのブログ

にほたもるがゲームなどについて気ままに書くブログです。

コマンドでTNT Run作ってみた

どうも、にほたもるです。今回は、コマンドでTNT Runを作ってみたので紹介します。

 

そもそもTNT Runとは何かというと、TNTの上に砂が乗った足場が何層かあるフィールドで、歩くと消える足場を乗り継いで落ちないように耐久するゲーム。PVPサーバーのhypixel等にあるゲームです。

 

このゲームを再現するには、接地しているプレイヤーの真下が砂である(二つ下のブロックがTNTである)ことを検知して、その足場を消すことが必要です。

 

それではまず接地判定から考えていきましょう。

接地しているかどうかは、YesNoの2択なので、スコアボードタグを使うとよさそうです。

/scoreboard players tag @a[tag=!onGround] add onGround {OnGround:1b}

/scoreboard players tag @a[tag=onGround] remove onGround {OnGround:0b}

スコアボードコマンドでは、NBTタグを用いて検知できるので、上のようなコマンドにしてみました。タグを持っているプレイヤーにタグをつけてもしょうがないので、タグを持っていないプレイヤーにのみタグをつけるようにしました。逆も同様です。

 

次にブロックを消す下準備です。

足場が砂だったら消せばいいのですが、それだけだと走る早さよりも早くブロックが消えてしまい、ゲームになりません。なので足場を踏んでから消えるまで若干のラグが必要です。そのラグは、エンティティの落下時間を利用します。

/execute @a[tag=onGround] ~ ~ ~ detect ~ ~-1 ~ sand 0 summon armor_stand ~ ~3 ~ {Invisible:1b,Tags:["tnt"]}

足場が砂だったら、3マス上空に透明なアーマースタンドを召喚します。

このままだとブロックの上に滞在している間ずっと召喚され続けて負荷になるので、足場のブロックを別のブロックに置き換えます。

/execute @a[tag=onGround] ~ ~ ~ detect ~ ~-1 ~ sand 0 setblock ~ ~-1 ~ sand 1 replace

このブロックは何でもいいですが、TNTを着火しないブロックにしてください。大変なことになります。

 

最後に、実際に足場を消す処理です。

まず、アーマースタンドが落下して来たら処理をするためのタグを新たにつけます。

/execute @e[tag=tnt] ~ ~ ~ detect ~ ~-1 ~ sand -1 scoreboard players tag @s add tntkill

次に、そのタグのエンティティから足場を消去します。

/execute @e[tag=tntkill] ~ ~ ~ fill ~ ~-1 ~ ~ ~-1 ~ air 0 replace sand 1
/execute @e[tag=tntkill] ~ ~ ~ fill ~ ~-2 ~ ~ ~-2 ~ air 0 replace tnt -1

これで足場が消去できました。このままだとアーマースタンドが残り続けるうえ、下の層があったらさらに落下して下の層まで足場を消してしまうので、不要になったアーマースタンドをキルします。

/kill @e[tag=tntkill]

 

これらの8つのコマンドを常時実行することで、TNT Runを再現することができます。ただし、このコマンド群はあくまで簡易版であり、問題点が多々あるのでご注意ください。これ以上は若干難しい内容ですので、余裕があれば解説したいと思います。