反復コマンドがしっかり動作しないなら1本にまとめればいいじゃない【第4回応用コマンド講座】

どうも、執筆担当のとれんさーです。
突然ですが、皆さんはこんなことを思ったことがありませんか?

「プレイヤーの名前や経験値レベルを使わずにマルチ対応をしたい!」
「不具合のない安定したコマンドを書きたい!」

コマンドを使った配布ワールドの制作をしたりマルチサーバーを作ったりしたことがある方は、一度はそう思ったことがあると思います。
これらの悩みを解決するためには、チェーン一本でコマンドを作ることが必要条件となってきます(例外もありますが)。
ということで、今回はそんなコマンドの安定・不安定について説明していこうと思います。

前回の記事はこちら!

なぜ1本にまとめるのか・使用例

先程チェーン一本でコマンドを作ることが重要とお伝えしましたが、逆になぜ複数の場所にコマンドを置くことが不安定になるのかを説明していきます。

今回は、実際の使用例として

トロッコがプレイヤーの向く方向に飛び、トロッコ同士がぶつかると互いに壊れる

というコマンドを作っていきます。
※毎度のことながら需要のない例ですが、理由を説明しやすいものを採用しておりますのでご了承ください。

まず、今回作っていくものはプレイヤーの向きにトロッコが飛ぶコマンドとトロッコ同士がぶつかったときに2つのトロッコが壊れるコマンドの2つに分けられます。

詳しくは第2回・第3回の講座↓



で解説をしたので説明はしませんが、
前者(プレイヤーの向きにトロッコが飛ぶコマンド)は、

/execute @e[type=minecart] ~~~ execute @p[r=1] ~~~ tp @e[type=minecart,c=1] ^^^0.5 facing ^^^100

後者(トロッコ同士がぶつかると壊れるコマンド)は、

/execute @e[type=minecart] ~~~ execute @e[type=minecart,r=1.5,rm=0.01,c=1] ~~~ kill @e[type=minecart,c=2]

で、この2つを反復常時実行チェーンで繋げることでできます。


↑こんな感じ

しかし、もしこの2コマンドを別々の反復コマンドとして設置した場合、これらは正常に動作しません。なぜなら、2つ以上反復コマンドがある場合、1tick間にどちらも動作しますが
どちらが先に動作するかは毎tickランダムに変わってしまうからです。

例えば、もし図2のように3tick目の①の/tpが実行されたときにトロッコ同士がぶつかった場合、4tick目で2つのうち①の/tpが先に実行されてしまったら②の/killが実行される前にトロッコが通り過ぎてしまい、トロッコがぶつかっても壊れなくなってしまうということが起こり得てしまうのです。それではこのコマンドは成功と言えません。

でも、この2つをしっかりチェーンで組むと、

このように①の/tpと②の/killが必ず交互に動作するため、トロッコがぶつかった後も通り過ぎてしまうことのない安定したコマンドになるのです。

まとめ

いかがでしたか?ものすごく(?)分かりにくかったかと思いますが、簡単にいうと

とりあえず反復がいくつもあったら、チェーンで繋げて一本のコマンドにした方が安定する

ということです。また、これは反復だけでなく、同タイミングで複数実行させるインパルスコマンドでも、ここまで解説してきたことと同じことが言えます。覚えておくといいでしょう。
まあ例外もあるにはあるのですが、マルチ対応のコマンドならレッドストーンは使わず一本にまとめるべきだと思います。
以上のことを踏まえ、安定したコマンド制作に役立ててくださいね!

それでは、今回はこれで終わりとなります。次回は、レッドストーンを使わない遅延 について解説したいと思います。お疲れさまでした。


前回(第3回応用コマンド講座)↓

次回(第5回応用コマンド講座)↓