コマンド備忘録
コマンドに関する技術をまとめています。基本的なコマンドの構文についてはwiki等を参照してください。
NBT操作基礎
Minecraftのコマンドにおいて必須ともいえる「NBT操作」について、一から丁寧に解説をしています。
ぜひこれからのコマンド制作やマップ作成にご活用ください!
※1.20.X以降のアップデートにより、この解説の内容は今後使えなくなる可能性があります。
〇スコアボードに関する技術
最大値・最小値の取得
Ⅰ.複数エンティティ(tag名:tamago)の持つスコアボード(scoreboard名:maguro)内での最大値を取得。
execute as @e[tag=tamago] run scoreboard players operation $MAX maguro > @s maguro
Ⅱ.最小値を取得。
execute as @e[tag=tamago] run scoreboard players operation $MIN maguro < @s maguro
*文中の「$MAX」「$MIN」はダミープレイヤー。スコアボードコマンド内の<targets>には割とどんな文字列でも入れることが可能。
「#」から始めるとsidebarに表示されない。
scoreboard players reset $MAX
で消去する。
scoreboardによるエンティティの紐づけ
Ⅰ.実行者と同じスコアボード(scoreboard名:maguro)の値を持つエンティティ(tag名:tamago)を検知。
その後、そのエンティティに「へいらっしゃい!」と言わせる。
なおこの場合、スコアボードの破損が起こる。
(もともと持っていたスコアボードの値を保存できていない)
scoreboard players operation @e[tag=tamago] maguro -= @s maguro
execute as @e[tag=tamago,scores={maguro=0}] run say へいらっしゃい!
Ⅱ.最後に元のスコアボード(scoreboard名:maguro)を戻して破損を防ぐ。
ただし、この場合は実行者が対象に含まれてはいけない。
(tag名:tamagoを持っていてはいけない)
scoreboard players operation @e[tag=tamago] maguro -= @s maguro
execute as @e[tag=tamago,scores={maguro=0}] run say へいらっしゃい!
scoreboard players operation @e[tag=tamago] maguro += @s maguro
Ⅲ.または、別のスコアボード(scoreboard名:tyutoro)を用意して、操作するスコアボード移すことでスコアボードの破損を防ぐ。
execute as @e[tag=tamago] run scoreboard players operation @s tyutoro = @s maguro
scoreboard players operation @e[tag=tamago] tyutoro -= @s maguro
execute as @e[tag=tamago,scores={tyutoro=0}] run say へいらっしゃい!
*この技術は主に「紐づけ」に使用される。
実行者が生成したエンティティ(tag名:tamago)に対して
scoreboard players operation @e[tag=tamago] maguro = @s maguro
を実行し、予め実行者とエンティティのスコアボード(scoreboard名:maguro)と同じにしておく。
任意のタイミングで上の紐づけ操作を行うことで複数の実行者がいる環境(マルチプレイ時など)において実行者専用のエンティティへコマンドを実行できる。
最大値を持つエンティティの検出
「最大値取得」と「紐づけ」を組み合わせて、複数エンティティ(tag名:tamago)内でスコアボード(scoreboard名:maguro)の最大値を持つエンティティに「へいらっしゃい!」と言わせる。
$MAXはtag名:tamagoを持っていないため、Ⅱ.の方法でスコアが破損することはない。
execute as @e[tag=tamago] run scoreboard players operation $MAX maguro > @s maguro
scoreboard players operation @e[tag=tamago] maguro -= $MAX maguro
execute as @e[tag=tamago,scores={maguro=0}] run say へいらっしゃい!
scoreboard players operation @e[tag=tamago] maguro += $MAX maguro
scoreboard players reset $MAX
スコアボードによるシャッフル
複数エンティティ(tag名:tamago)に対して、スコアボード(scoreboard名:maguro)の値をランダムに1から昇順に与える。
scoreboard players set $shuffle maguro 0
execute as @e[tag=tamago,sort=random] store result score @s maguro run scoreboard players add $shuffle maguro 1
scoreboard players reset $shuffle
エンティティの数をスコアボードに代入
複数エンティティ(tag名:tamago)の数を、スコアボード(scoreboard名:maguro)の$COUNTに代入。
Ⅰ.execute store を用いる。
execute store result score $COUNT maguro if entity @e[tag=tamago]
Ⅱ.execute as を用いる。
execute as @e[tag=tamago] run scoreboard players add $COUNT maguro 1
*.どちらを使うかはお好みで。Ⅱ.の方は最後の数値を2,3,…,nとすることで2,3,…,n倍できる。
〇executeに関する技術
execute on によるエンティティの紐づけ
ただし、プレイヤー(および非対応のエンティティ)を除く。(scoreboardによる紐づけはプレイヤーも可能)
execute onで主に使用するのは以下の三つのサブコマンド。
サブコマンド | 挙動 | 解釈 |
on passengers | 実行者”に”乗っているエンティティを実行者とする | 子エンティティを実行者とする |
on vehicle | 実行者”が”乗っているエンティティを実行者とする | 親エンティティを実行者とする |
on origin | OwnerのUUIDを持つエンティティを実行者とする | 紐づけたエンティティを実行者とする |
Ⅰ.2体のエンティティ(tag名:ebiとtag名:hamachi)を紐づける。
1.各エンティティに専用のarea_effect_cloudを乗せる。
#ebi
summon minecraft:area_effect_cloud ~ ~ ~ {Tags:[ebi_aec],Duration:2147483647}
ride @e[tag=ebi_aec,limit=1] mount @e[tag=ebi,limit=1]
#hamachi
summon minecraft:area_effect_cloud ~ ~ ~ {Tags:[hamachi_aec],Duration:2147483647}
ride @e[tag=hamachi_aec,limit=1] mount @e[tag=hamachi,limit=1]
2.area_effect_cloundのOwnerを相方のエンティティに設定する。
data modify entity @e[tag=ebi_aec,limit=1] Owner set from entity @e[tag=hamachi,limit=1] UUID
data modify entity @e[tag=hamachi_aec,limit=1] Owner set from entity @e[tag=ebi,limit=1] UUID
3.紐づけは完了したので、execute onで適宜紐づけを利用する。
紐づけ先へアクセスする際は、on passengersでAECに寄り、そのAECのoriginを訪ねることで到達できる。
図解。向かいたいところの矢印を目で追い、近くに書いてあるサブコマンドを記述すると到達できる。
例① 実行者はtag名:ebiで、tag名:hamachiのscore名:scoreが1以上なら、tag名:hamachiがsuccessという
execute as @e[tag=ebi] at @s on passengers on origin if score @s score matches 1.. run say success
例② 実行者はtag名:ebiで、tag名:hamachiのscore名:scoreが1以上なら、tag名:ebiがsuccessという
execute as @e[tag=ebi] at @s on passengers on origin if score @s score matches 1.. on passengers on origin run say success
Ⅱ.3体以上のエンティティを紐づける。ここでは、以下のコマンドで生成された4体のエンティティを紐づける。
summon armor_stand ~ ~ ~ {Tags:["sushi","tamago"]}
summon armor_stand ~ ~ ~ {Tags:["sushi","maguro","sakana"]}
summon creeper ~ ~ ~ {Tags:["sushi","sakana"]}
summon bat ~ ~ ~ {Tags:["sushi"]}
統括エンティティを1体用意すると便利。
1.統括エンティティを生成。
summon armor_stand ~ ~ ~ {Tags:[sushi_master]}
2.各エンティティに専用のarea_effect_cloudを乗せ、それぞれOwnerをtag名:sushi_masterに設定する。統括エンティティにもAECを乗せ、Ownerは各エンティティに対応させる。共通処理のため、functionを使用する。
execute as @e[tag=sushi] run function himoduke:
「(データパック名)\data\himoduke\functions\.mcfunction」の中身
#各エンティティが乗せるAEC
summon area_effect_cloud ~ ~ ~ {Tags:["sushi_aec","sushi_aec_temp"],Duration:2147483647}
ride @e[tag=sushi_aec_temp,limit=1] mount @s
data modify entity @e[tag=sushi_aec_temp,limit=1] Owner set from entity @e[tag=sushi_master,limit=1] UUID
tag @e[tag=sushi_aec_temp] remove sushi_aec_temp
#統括エンティティが乗せるAEC
summon area_effect_cloud ~ ~ ~ {Tags:["sushi_master_aec","sushi_aec_temp"],Duration:2147483647}
ride @e[tag=sushi_aec_temp,limit=1] mount @e[tag=sushi_master,limit=1]
data modify entity @e[tag=sushi_aec_temp,limit=1] Owner set from entity @s UUID
tag @e[tag=sushi_aec_temp] remove sushi_aec_temp
3.紐づけは完了したので、execute onで適宜紐づけを利用する。
紐づけ先へアクセスする際は、on passengersでAECに寄り、そのAECのoriginを訪ねると統括エンティティにたどり着く。さらにそこからon passengersで統括エンティティのすべてのAECに寄るのでon originで紐づけ先へたどり着く。
図解。実行者が統括エンティティ(今回の場合だとtag名:sushi_master)に移った際のon passengers on originは、紐づけされているすべてのエンティティが実行者となる。
例③ 実行者はtype名:batで、自身の紐づけ内部にいるtype名:creeperにdamageを与える。damageコマンド内の攻撃者は、座標を用いて最初の実行者(type名:bat)によるものにする。
execute as @e[type=bat] at @s on passengers on origin on passengers on origin run damage @s[type=creeper] 1.0 mob_attack by @e[distance=..0.01,limit=1,sort=nearest]
例④ 実行者はtag名:tamagoで、自身の紐づけ内部にいるtag名:sakanaがいるすべての位置に村人を生成する。
execute as @e[tag=tamago] at @s on passengers on origin on passengers on origin if entity @s[tag=sakana] at @s run summon villager
※注意:area_effect_cloudのOwnerの設定後に、Ownerを変更してもon originで対象となるのは初回に設定したエンティティとなるが、ワールドを再読み込みすると対象が移動する。
area_effect_cloudではなくsnowballを用いると再読み込みせずとも対象を移動させることができるが、雪玉が見えてしまう。
〇データパックに関する技術
.mcfunctionの命名
function名には何も記入しなくてもよい。
ファイル名を「.mcfunction」とすることでコマンドの短縮化ができる。
フォルダ構成を「(データパック名)\data\tamago\functions\maguro\.mcfunction」としたときのファンクションの実行コマンドは
function tamago:maguro/
〇ストレージに関する技術
重複する要素の除去
data modify storage sushi: neta set value ["玉子","まぐろ","サーモン","中トロ","玉子","サーモン"]
によって定義されたストレージから重複する要素(玉子、サーモン)を取り除く。
summon marker ~ ~ ~ {CustomName:'{"text":"sushi_temp"}'}
data modify entity @e[name="sushi_temp",limit=1] Tags append from storage sushi: neta[]
data modify storage sushi: neta set value []
data modify storage sushi: neta append from entity @e[name="sushi_temp",limit=1] Tags[]
kill @e[name="sushi_temp"]
Tagsは重複してつけられないことを用いる。
(ゲームの仕様を突く挙動のため多用は非推奨)
〇playsoundに関する技術
block.note_block. で始まる音源はピッチを指定することでソ♭(ピッチ0.5)から2オクターブ次のソ#(ピッチ2.0)の音程を鳴らすことができる。
以下は代表的な音程のピッチ一覧。(https://minecraft.fandom.com/ja/wiki/%E9%9F%B3%E7%AC%A6%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF より引用)
音程(1オクターブ目) | ピッチ(クリックでコピー) | 音程(2オクターブ目) | ピッチ(クリックでコピー) |
F♯/G♭- ファ♯/ソ♭ | 0.5 | F♯/G♭- ファ♭/ソ♯ | 1.0 |
G – ソ 1オクターブ目 | 0.529732 | G – ソ | 1.059463 |
G♯/A♭- ソ♭/ラ♯ | 0.561231 | G♯/A♭- ソ♭/ラ♯ | 1.122462 |
A – ラ | 0.594604 | A – ラ | 1.189207 |
A♯/B♭- ラ♭/シ♯ | 0.629961 | A♯/B♭- ラ♭/シ♯ | 1.259921 |
B – シ | 0.667420 | B – シ | 1.334840 |
C – ド | 0.707107 | C – ド | 1.414214 |
C♯/D♭- ド♭/レ♯ | 0.749154 | C♯/D♭- ド♭/レ♯ | 1.498307 |
D – レ | 0.793701 | D – レ | 1.587401 |
D♯/E♭- レ♭/ミ♯ | 0.840896 | D♯/E♭- レ♭/ミ♯ | 1.681793 |
E – ミ | 0.890899 | E – ミ | 1.781797 |
F – ファ | 0.943874 | F – ファ | 1.887749 |
F♯/G♭- ファ♯/ソ♭ | 1.0 | F♯/G♭- ファ♯/ソ♭ | 2.0 |