
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を読んだあなたの為になったり、ボクのことを気に入っていただいた場合は、是非ともフォローの程よろしくお願いします!