見出し画像

AモブからBモブまでのブロック数

統合版Minecraftでコマンドを触っていると、【プレイヤー間のブロック数をスコアボード化する】という機構は一度作りたくなりますよね。
そんな人の為に、アーマースタンドを活用した、AモブからBモブまでのブロック数をスコアボード化させる機構を作ってみました。


・この記事に記載されているのは、以下の項目です。

・機構説明
・構文
・アーマースタンドの活用性について

・機構説明

僕はもともとYouTubeなどの動画を漁ってコマンド能力を身につけましたが、それとともに自分のコマンドに対してプライドもつき始めます。
そんな僕の気持ちをわかる人なら、構文そのものをコピー&ペーストするのではなく、機構を理解して自分の脳で作りたいですよね。

今回の機構のコマンド手順はこんな感じ↓

①スコアボードをリセットする
②Aモブの座標にアーマースタンド(以下、"アマスタ"とする)を召喚
③Bモブの方向に1ブロックずつ移動し続ける
④移動するごとにスコアボードを加算する
⑤Bモブの場所に着いたらアマスタをkillする

もう少し詳細に説明すると以下のようになります↓

まずはブロック数をカウントするスコアボードをリセットします。(①)
その次にAモブの座標にアマスタを召喚し、Bモブの方向に1ブロックの距離ずつ移動し続けます。(②&③)
1ブロックずつ移動するごとに、スコアボードを1づつ加算していきます。(④)
アマスタがB地点に到達したら移動を停止します。
移動が停止すると必然的にスコアボードの加算が停止します。
移動の実行が終わると、アマスタをkillします。(⑤)

誤解を生まないために少しだけ注意書き↓

・③の部分は^^^1をすごくいっぱい繰り返しています
・今回紹介した機構は1tick(一度の実行)だけで完結するものである

どうでしょうか、この説明でわかりますでしょうか。
ちなみにアドオンを用いたfunctionで作成することをオススメしますが、全然コマンドブロックを繋げるだけでも作ることは可能です。


・構文

機構解説も終わったことですし、早速構文と構文の解説に行きたいと思います。

※構文内にαやβなどの記号がありますが、構文解説に用いているだけなので、それは構文に含みません

α
scoreboard objectives add blocks dummy

scoreboard players set ブロック数 blocks 0

β
execute as @e[tag=Aモブ] at @s run summon armor_stand 距離 ~~~
execute as @e[type=armor_stand,name=距離] at @s run tp @s ~~~ facing @e[tag=Bモブ,c=1]

Σ
execute as @e[type=armor_stand,name=距離] at @s unless entity @e[tag=Bモブ,r=1] run scoreboard players add ブロック数 blocks 1
execute as @e[type=armor_stand,name=距離] at @s unless entity @e[tag=Bモブ,r=1] run tp @s ^^^1

π
execute as @e[type=armor_stand,name=距離] at @s run tp @s ~ -190000 ~
kill @e[type=armor_stand,name=距離]

scoreboard objectives remove blocks

構文は上に記載した通りです。
それでは一つずつ解説していきます。

α~β 機構解説①部分
「…add blocks dummy」でスコアボードを作成し、作成したblocksに「…set ブロック数 blocks 0」でブロック数というものに0のスコアをセットします。

β~Σ 機構解説②部分
「…summon armor_stand 距離 〜〜〜」で専用のアマスタをAモブのところに召喚します。
「…〜〜〜 facing @e[tag=Bモブ,c=1]」で召喚された専用のアマスタの方向をBモブ向けます。

Σ~π 機構解説③&④部分
「… add ブロック数 blocks 1」で、移動が可能な状態であればスコアを1加算する。
「… tp @s ^^^1」で1ブロック分の距離を移動します。

π~ 機構解説⑤
 「…tp @s ~ -190000 ~」でアマスタをkillしたときのアイテムドロップを防ぎます。
「kill @e[type=armor_stand,name=距離]」でアマスタをkillします。
「…remove blocks」で最初に作成したスコアボードを削除します。


・アーマースタンドの活用性について

前提

まず、アマスタは統合版Minecraftのコマンドにおいて、すごく重要なエンティティです。
理由は「攻撃行動を行わない」「歩行を行わない」「モブに襲われない」「自主的にパーティクルを発しない」など、コマンドではすごく汎用性が高いのです。

個人的に思うこと

例え汎用性が高いとしても、大量に召喚すればラグくはなります。
ですが、functionやコマンドブロックを用いて、"召喚"から"kill"までを一度の実行に収めれば、あまりラグくはなりません。

例1↓
※@sの真下を最大5マス分までを火のパーティクルで参照するコマンド

execute as @a at @s run summon armor_stand test ~~~
execute as @e[type=armor_stand,name=test] at @s if block ~~-0.5~ air run tp @s ~~-0.5~
execute as @e[type=armor_stand,name=test] at @s if block ~~-0.5~ air run tp @s ~~-0.5~
execute as @e[type=armor_stand,name=test] at @s if block ~~-0.5~ air run tp @s ~~-0.5~
execute as @e[type=armor_stand,name=test] at @s if block ~~-0.5~ air run tp @s ~~-0.5~
execute as @e[type=armor_stand,name=test] at @s if block ~~-0.5~ air run tp @s ~~-0.5~
execute as @e[type=armor_stand,name=test] at @s if block ~~-0.5~ air run tp @s ~~-0.5~
execute as @e[type=armor_stand,name=test] at @s if block ~~-0.5~ air run tp @s ~~-0.5~
execute as @e[type=armor_stand,name=test] at @s if block ~~-0.5~ air run tp @s ~~-0.5~
execute as @e[type=armor_stand,name=test] at @s if block ~~-0.5~ air run tp @s ~~-0.5~
execute as @e[type=armor_stand,name=test] at @s if block ~~-0.5~ air run tp @s ~~-0.5~
execute as @e[type=armor_stand,name=test] at @s run particle minecraft:basic_flame_particle ~~~
kill @e[type=armor_stand,name=test]

他にも、アマスタを召喚した座標を、一つの座標データとして使うと、汎用性の高さはもっと広くなると思います。

例2↓
※外に出れない空間(円形)を作るコマンド

effect @e[type=armor_stand,name=border] invisibility 1 255 true
execute as @e[type=armor_stand,name=border] at @s run tp @s ~~~
execute as @e[type=armor_stand,name=border] at @s as @a[r=10] at @s run titleraw @s actionbar{"rawtext":[{"text":"ここから先はいけません。"}]}
execute as @e[type=armor_stand,name=border] at @s as @a[r=10] at @s facing as @e[type=armor_stand,name=border] run tp @s ^^^1


以上で、このnoteのコマンドのお話は終了です。
もしこのnoteを読んだあなたの為になったり、ボクのことを気に入っていただいた場合は、是非ともフォローの程よろしくお願いします!

この記事が気に入ったらサポートをしてみませんか?