【Minecraft】コマンドを実行した時点で状態を共有してコマンドが取り扱いを良くする方法を考える

【Minecraft】コマンドを実行した時点で状態を共有してコマンドが取り扱いを良くする方法を考える

Minecraftで実行したコマンドはその後でTagとかScoreで色々条件付けをしていく事ができますが、コマンドを常時実行して毎回条件を追加する方法ではサーバーの負荷が大きくなりすぎます。このようなやり方では最終的にはサーバーの遅延が起きるほどに負荷が増えていく原因になったりします。

【Minecraft】コマンドを実行した時点で状態を共有してコマンドが取り扱いを良くする方法を考える
【Minecraft】コマンドを実行した時点で状態を共有してコマンドが取り扱いを良くする方法を考える

なので今回は実行者の位置で召喚した直後に近くのエンティティにスコアを付与する際に

/execute as @p[scores={wol=1}] positioned ^ ^ ^1 run summon minecraft:zombie ~ ~ ~
/execute as @p[scores={wol=1}] positioned ^ ^ ^1 run scoreboard players set @e[type=minecraft:zombie,sort=nearest,limit=1] wol 1

のように実行するのをなるべく複数プレイヤーで使う時に分かりやすくしつつ、実行コマンドを極力減らす方法を考えていきます。

そして今回はなるべくデータパックでの実行を前提としたコマンドを考えます。

今回例として作りたいコマンドは複数プレイヤーが一緒にプレイするゲームの中で、仮に1人の位置でコマンドを実行した際に、そこに召喚したエンティティに実行者のプレイヤーと同じ条件を与えて、他のプレイヤーと区別をつけたいというものです。

無論、真っ先に考えるのはスコア1のプレイヤーから召喚されたエンティティに印をつけることです。
ただしスコアはexecuteのサブコマンドでは渡せませんし、summonのnbt構文でも渡せません。
よってタグを付与して印をつけるのが現状スマートでしょう。

今回はデータパックを使用することを前程としていますので、functionを用意します。

sample01.mcfunction
data merge entity @s {Tags:["Z1"]}
scoreboard players set @e[tag=Z1] wol 1

そのうえでscores={wol=1}のプレイヤーの位置で次のコマンドを実行します。

execute as @p[scores={wol=1}] positioned ^ ^ ^1 summon minecraft:zombie run function wol:sample01

すると以下のようにプレイヤーと同じスコアを持つエンティティを最小コマンドでスマートに行うことが出来ます。

プレイヤーと同じスコアを持つエンティティを最小コマンドでスマートに行うことが出来ます。

あとは複数プレイヤーになったら共通するsummonのnbtを別のfunctionで用意してプレイヤーのスコアに応じてタグを実行し、タグごとにプレーヤーと同じスコアを与えるようにします。

データパックはこのように共通のコマンドを複数のプレイヤーに応じて実行することが出来るので、最小コマンドでスマートに作りたいときには色々応用したほうがいいと思います。

さらにはサーバーの負荷軽減として、常時実行ではなく、なにかアイテムを使用した際に使用したプレイヤーだけがコマンドを実行して処理を行うようにしましょう。

なるべくリピーターコマンドのように常時実行するコマンドはサーバーの負荷軽減を考えた場合とても重要です。

Related Posts Plugin for WordPress, Blogger...