2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

マイクラコマンドの孫の手

Last updated at Posted at 2022-10-08

マイクラコマンドの孫の手へようこそ

記入開始日:2022-10-05 01:52:54
このページではMinecraftのコマンド・アルゴリズムについて書く。
キーの設定は環境ごとに異なる可能性があるがデフォルトを前提とする。


目次


0.目的

コマンドについてコマンドを調べるときに、そのコマンドのことしか書かれておらず難しいなぁと思ったのでやりたいことベースに逆引きが出来るようにならないかと考えてこのページを作成した。
多少コマンドについて知っている人向けではあるが、全て読んで理解するというより、必要に応じて調べてみる踏み台になると嬉しい。


1.実行の仕方(トリガーの種類)

コマンドを実行する方法は大きく6つ存在する

  • [1>]プレイヤーのチャット欄を用いる方法 (要op)
  • [2>]コマンドブロックから実行する方法
  • [3>]tellrawのclickEventを用いる方法 (要op)
  • [4>]本のclickEventを用いる方法 (要op)
  • [5>]看板のclickEventを用いる方法
  • [6>]AdvancementのRewardsを用いる方法 (要データパック)
  • [7>]#minecraft:tick/#minecraft:load (要データパック)
    Minecraft内で明確にコマンドを設定して、実行する方法はこの方法しか存在しない。

1. プレイヤーのチャット欄を用いる方法

op権限を持つプレイヤーはチャット欄からコマンドを実行出来る。
プレイヤーのチャット欄はT、もしくは/を押すことで開くことが出来る。
チャット欄ではコマンドと通常のチャットを区別するため/を1文字目に入力しなければならない(/を押して開いた場合はすでに入力されている)。
コマンドを入力しEnterを押すと実行出来る。
なお、各コマンドの機能に関してはこちらで調べればわかるので具体的には書かない。

実行結果について

・成功すればチャット欄に白文字で結果が出力される。このとき、結果に数値を含むものだった場合はかならず数値が出力される。
・失敗するとチャット欄に赤文字で結果が出力される。
e.g.:

/summon tnt
    Summoned new Primed TNT

2. コマンドブロックから実行する方法

コマンドブロックを用いてコマンドを実行出来る。
コマンドブロックは、opを持つ者のgiveコマンドで手に入れることが出来る。
・コマンドブロックを設置し入力することで準備出来る。
・入力後、何らかの方法でRS入力をすればopがなくともコマンドの実行が可能。
出力結果欄はプレイヤーのチャット欄の実行結果についてを参照
なお、過去の結果を遡ることはできない。

3. tellrawのclickEventを用いる方法

tellrawコマンドは、厳密なJSON形式を用いて好きな文字列をチャット欄に表示させられるコマンドである。(余談だが、これ以外の/say等の表示コマンドは非推奨となっている)
作り方はこちら等ツールを使うと良い。
これは、基本的に実行時コマンドを打っているのと代わりはないため、op権限が必須である。
それ以外は1.を参照。

clickEventについて

詳しい書き方はツール等を用いると良い。
JSON形式内に/コマンドを書くことによって表示テキストをクリックするだけでコマンドを実行することが出来る機能である。

4. 本のclickEventを用いる方法

厳密なJSON形式を用いて好きな文字列を本に書き込むことができる。
作り方はこちら等ツールを使うと良い。
これは、基本的に実行時にコマンドを打っているのと代わりはないため、op権限が必須である。
詳しくはclickEventについてを参照。
それ以外は1.を参照。

5. 看板のclickEventを用いる方法

厳密なJSON形式を用いて好きな文字列を看板に書き込むことができる。
作り方はこちら等ツールを使うと良い。
これは、プレイヤーが実行者となるが、その他のものとは違いopが必要ない。
詳しくはclickEventについてを参照。

6. AdvancementのRewardsを用いる方法

データパック内、名前領域/advancements/xxx.jsonのファイルを作成することで進捗ファイルを作成出来る。
書くならこちらを使うと良い。
関数を実行できるので、これをトリガーとして特定の進捗を取った時にコマンドの実行が出来る。

Rewards

進捗ファイルには報酬という機能があり、

  • 経験値を与える
  • LootTableを与える
  • レシピを与える
  • 関数を実行する
    ことが出来る。

7. #minecraft:tick/#minecraft:load

特殊な関数タグは、決まったタイミングで関数を実行させることが出来る。
これらのファイルは名前領域/tags/functions/xxx.jsonという形で保存する。
また、実行環境についての情報が存在しない。
作り方はこちらを見ると良い。

#minecraft:tick

このファイルのリストに書いたファンクションファイルはワールドを開いている間毎tick実行され続ける。

#minecraft:load

このファイルのリストに書いたファンクションファイルはワールドを開いた最初に実行される。


2. データパックについて

データパックとは、Minecraftのバニラに存在する拡張機能である。拡張出来る要素は多岐にわたる。

  • advancements(進捗)
  • functions(関数)
  • item_modifiers(アイテム修飾子)
  • loot_tables(ルートテーブル)
  • predicates(プレディケート)
  • recipes(レシピ)
  • structures(構造物)
  • tags(アイテムタグ)
  • dimension_type(ディメンション)
    ...

ここで全てを記すことは出来ないが、次項に関わるため、functions(関数)のみ紹介する。

functions

関数とは、Minecraft内に存在するコマンドを順番に実行するシステムである。
データパック内にファイルを保存することで利用することが出来る。
作り方、使い方等は調べればいくらでも出てくるので、wikiを置いておく。多少教科書的に書かれているので様々調べながら作成すると良い。

大事なこと

  • 関数ファイルは、.mcfunctionutf-8nで保存しなければならない。最近のテキスト保存形式であれば大抵問題ないが、作業の利便性などからVSコードを利用することをおすすめする。
  • シングル環境でも出来るが、ログの確認などはサーバー環境のほうが何かと楽なためマルチサーバーを立てると良い。→サーバーの立て方サーバー起動時にもし構文エラー等があれば出力される。編集した後は必ず/reloadを忘れずに。
  • /は書かない。また、#でコメントアウトが出来る。あまり知られていないがRubyのようにインデントは無視されるため、コマンドの前にTABインデントやスペースなどを自由に挿入出来る。

3.データパックから見るアルゴリズム

アルゴリズムとは、処理の順番のことである。アルゴリズムの基本は順序処理/分岐処理/再帰処理の3種類で成り立っている。
なお、最大処理数はgamerule maxCommandChainLengthに依存する。たとえ処理が終わっていなくとも、最大に達した時点で中断する。

functionコマンドは処理数2使うらしい?https://twitter.com/Cres333/status/1256079714306781186?s=20&t=8RFa3e_gmFVDZqin9Lsm4Q

順序処理

関数ファイル内では上から下に順番に実行されることが基本である。
コマンドブロックの場合はインパルス>チェインと繋げることで複数のコマンドを繋げることが出来る。
関数ファイル内で別の関数を呼び出す場合は、関数処理を終えてから戻ってくる。

分岐処理

Minecraftの関数内ではexecute if .. run およびexecute unless .. run でのみ条件分岐が可能である。
いくつかの条件を組み合わせる場合、全てandとして扱われる。そのためorの処理を行いたい場合は別のコマンドとして記述する必要がある。
同じ条件で複数のコマンドを実行したい場合はfunctionとして纏め、それを条件付きで実行すると見やすくなる。

再帰処理

再帰処理とは繰り返しの処理である。Minecraftのコマンドでは繰り返しの処理はいくつか方法がある。

  • tickファイルを用いて毎tick実行する。これは厳密にはアルゴリズム上の再帰処理とは異なるためここで紹介する。
  • 関数から自身の関数を実行させる。
    関数内でfunction (this)と実行することでmaxCommandChainLengthに届くまでコマンドを実行する。

4.実行環境について

実行環境とは、実行者、実行座標(基点)など、コマンドがどのような状況で実行されるかで、内で代入できる変数としての役割を持つものもある。
ほとんどすべて/executeで変更可能である。よって、/executeコマンドの説明と重なる部分が多い。以下、本ページでの呼び方、意味、変更出来るコマンドを記する。なお、それぞれのコマンドの説明はしないがいくつか仕様を書く。

実行環境と編集の仕方

項目 説明 コマンド内での使われ方 変更コマンド
実行者 コマンドを実行するエンティティ @sに代入される /execute as
基点 コマンドを実行している場所 ~ ~ ~に代入、@s[distance=..]などの検知 /execute at,/execute positioned ,/execute anchored
方向 コマンドを実行するエンティティの向き ^ ^ ^に代入される、@s[x_rotation=..]等の検知 /execute at,/execute facing,/execute rotated
ディメンジョン コマンドを実行するディメンジョン ~ ~ ~の前提ディメンジョン execute in
時間 いつコマンドを実行するか 多分ない /schedule(※関数必須)
  • ※/scheduleは実行時に座標0 0 0、実行者はサーバーに固定されるため注意。

個人的には、どうして/scheduleコマンドはexecuteの一部に入らないのか謎である
なお、時間をのぞくすべての内容はpredicateを用いて判定することが出来る。


5. データ処理

データの保存

Minecraft内には大きく2種類のデータの保存方法がある。

  1. Scoreboard:プレイヤーごとに数値の保存をすることが出来る
  2. Storage:あるエンティティのNBTデータ等の保存が出来る

scoreboardとstorageの使い分け

Minecraftにある保存する仕組み、それぞれ特徴があるのでまとめました。

項目 scoreboard storage
個人の特定 ◎容易 ×多少工夫が必要(基本は出来ない)
データ型 △intのみ ◎すべての情報が格納で可能
数値計算 ◎加減乗除などが可能 加算減算とデータ同士の乗除は不可。データの定数倍のみ可

ただし、それぞれ代入してデータを移動させることが可能なので必要に応じて使い分けると良い。
簡単に言い分けるのであれば保存用にstorage、計算用にscoreboardを使うと良い

明確な根拠はないがscoreのほうが重い気がする

Scoreboard

scoreboardとは、得点板のようにエンティティごとに数値が割り当てられる仕組み。ここでは、比例尺度として数値を用いる場合のみを考える。名義尺度として用いる場合はこちら
なお、scoreboardの使い方はこちらを見ると良い。
メリット:

  • 計算する仕組みがデフォルトで備わっている。四則演算が出来る。
  • Minecraftで決められたトリガーを用いて自動でカウントする機能がある。
    デメリット:
  • int(整数値)以外のデータを保存できない。
  • 1エンティティに必ず1つの数しか割り当てられない。

Storage

storageとは、intスコアだけではなくfloat、stringなどの情報をJSON形式として保存することが出来る仕組み。
なお、詳しい使い方はケイヅキ氏の記事が非常に分かりやすいのでこちらを見ると良い。
メリット:

  • ブロックエンティティやエンティティの情報を編集することができるが、直接編集すると編集するたびにエンティティの全nbtを読み込み直すため重い。
  • ゲーム等の設定項目など長い間変更することのないデータに関してはファイルとして保存しておいた方がなにかと軽くすむ。
    デメリット:
  • 個人を特定できる仕組みがない。
  • 計算する機能はない

6.データの参照

実行結果についての項で一部のコマンドについて実行結果に数値を含むものが存在することを記した。
ここでは、そのようなデータの参照方法について書く。

データの取得

ほぼすべての数値データはgetのオプションが存在する。※数値データ出ない場合は、だいたいデータの個数を返す。

  • /scoreboard players get ...:そのエンティティがもつスコアを取得出来る。
  • /data get ...: その対象がもつnbtデータを参照することが出来る。チャット欄に実行結果が出る。
  • /bossbar get ... :ボスバーの数値を取得出来る。
  • /xp get ...:経験値量を取得できる。

どこかにデータを格納する場合は/execute store result ... run *** getを用いることで指定のストレージ、スコアに取得した情報を格納できる。
/execute store success ... run data ** ...は成否を1/0で保存できる。出力結果の詳細は各コマンドのwikiに書かれているので、調べてみると良い。

※なお、nbtデータは数値のみしか参照できないため、nbtデータ→nbtデータの移動をしたい場合は/data modify ...を使うことを推奨する。

NBTとは

NBT(NamedBinaryTag)とは、すべてのエンティティと、一部のブロックエンティティの設定データである。基本的にはデータの取得をするものであるが、プレイヤー以外であれば変更することも出来るものもある。
細かい内容は莫大な量があるが、正直このリンクを読み解くのも少々困難である。覚える必要は全くないので、必要に応じて調べながら作る。JSON形式について知らないと苦労すると思うので先に見方を調べておくと良い。
参考→JSONについて知りたい
また、/dataコマンドは、NBTを編集できるコマンドである。コマンドの説明はコマンドページや、ケイヅキ氏の記事が非常にわかりやすいのでここでは細かくは記さない。ただ、nbtデータを用いた便利な利用法や注意点をここに書く。
限定的にではあるものの、数値の計算は execute storeを使って積を求められる。

よくある?勘違い

独断と偏見でよくありそうな引っかかりやすいところを記す。

プレイヤーのnbtは編集できない

プレイヤーのnbtは直接編集できない。
これを回避するために様々なコマンドが用意されている。

  • /item,/loot:インベントリの操作が出来る。
  • /attribute:アトリビュート(元の移動速度等)の操作が出来る。
  • /effect:エフェクトを掛けることが出来る。

チェストはSlotが大事

チェスト等インベントリがあるブロック共通nbtItemsは配列がある。
e.g.

[
    {Slot: 0b, id: "minecraft:oak_log", Count: 1b},
    {Slot: 1b, id: "minecraft:stone", Count: 1b},
    {Slot: 2b, id: "minecraft:carrot", Count: 1b},
    {Slot: 3b, id: "minecraft:potato", Count: 1b},
    {Slot: 4b, id: "minecraft:oak_slab", Count: 1b},
    {Slot: 5b, id: "minecraft:melon", Count: 1b},
    {Slot: 6b, id: "minecraft:grass_block", Count: 1b},
    {Slot: 7b, id: "minecraft:wooden_sword", Count: 1b, tag: {Damage: 0}},
    {Slot: 8b, id: "minecraft:cobblestone", Count: 1b}
]

この時、丁度右上から順番に配列にアイテムが置いてあるが、特に配列の順番は関係なく、何番目にアイテムがあるかはSlotの番号によって決められている。

アイテムにはカスタムデータが作れる

通常、エンティティには上記の決められたnbt以外を書き込むと即座に更新されて削除されてしまう。
しかし、アイテムのtagの中身は自由にnbtを設定することができる。

"厳密な"JSON形式

テキスト装飾を含む厳密なJSON形式はほぼ文字列であるため非常に限定的にしか編集できないので注意。
書き方は赤石愛氏がまとめてくれているものを参考にこちら

よくある例をまとめておきます。

  • 看板は、一行につき1テキストが割り当てられる。
  • は、1テキストにつき1ページの配列が用いられている。
    ただし、現在このようなバグがあるため、opないと本に記述したターゲットセレクターがバグを起こします。

7.二次トリガーと判定

二次トリガー?

※この項はトリガーの種類の項条件分岐繰り返しの項を理解している前提
本来、Minecraftで取れる判定はトリガーの種類の項のみだが、execute if .. runを使うと、該当条件の時のみ実行され、条件外の時は無視される。(execute asでも出来るが、処理が重いので非推奨)
これを利用して

  1. 一次トリガーを実行
  2. execute if .. runを用いて条件をif内に記述する。
    とすると、条件を満たし次第コマンドを実行する。→ 見かけ上は条件そのものがコマンドを実行しているように見える ため、筆者は二次的トリガーと呼んでいる。

判定まとめ

判定の手段は本当に多岐にわたるが、基本的にはif **にあるものしか判定が出来ない。
・execute if のオプション

  1. entity @:エンティティがいれば
  2. predicate:プレディケートがTrueになったら
  3. score:スコアが一致していれば
  4. data:NBTもしくはstorageデータが一致していたら
  5. block:特定の座標にブロックがあれば
  6. blocks:ブロックの配置が一致していれば
    逆に言えば、これにさえ入っていれば判定することが出来るので特に1~3の三つはさらにそれらから調べられることが多くある。
    そのため、以下はその3種類に絞って紹介する。

ターゲットセレクター

execute if entity ..には@sなどといったターゲットセレクターを置く。
ターゲットセレクターは幾つか種類があるが、基本的にプレイヤー以外を指定するとき場合は@e(全てのエンティティ)から引数を使って絞ることになる。
絞れる内容(一部)

  1. 視点、座標
  2. nbtデータ(インベントリや手持ちアイテム)
  3. スコア
  4. チーム
  5. タグ
    これら以外にも様々あるが、判定をとるときは基本これを使う。

プレディケート

プレディケートはターゲットセレクター引数をさらに拡張して様々なプレイヤーの絞り込みを可能とするものである。
例:

  • スニークしているかどうか
  • 走っているかどうか
    単に拡張するだけではなく、実際にはターゲットセレクター引数を圧縮し、わかりやすくする目的でも利用できる。
    詳細はケイヅキ氏の記事を参照
    また、作るならジェネレータを使うと良い

Scoreboard

使い方

scoreboardの値を判定として用いる。比例尺度としてだけではなく名義尺度のように扱うことも出来る。
エンティティのスコアを用いる場合は、execute if entity @s[scores={obj=1}]と、ターゲットセレクターを使う形でも書けるが、execute if scoreのかたちを取ると大小関係の比較判定が出来る。(execute if score @s obj = 1)。

統計情報

Scoreboardは、統計情報を記録する仕組みがある。
詳細はこちらのwikiに書いてあるが、体力や死んだ回数等統計情報を新しく記録することが出来る。

trigger

/triggerとはscoreboardのコマンド類はop権限がなければ使うことが出来ないが、非常に限定的な状況下で使えるようにする仕組み
一次トリガーの、opが必要なものでもこの仕組みと組み合わせることで使えるように出来る。
詳しい使い方はケイヅキ氏のtriggerコマンドの記事を見ると良い。


8.ブロック操作について

ここまでの通り、基本的に座標のチェックができるのはエンティティからの相対座標か、リテラルに書いた座標のみである。
ブロックの操作とは、ここではブロックの設置/破壊が出来るコマンドのことを指す。

  • /setblock:1ブロックを設置、破壊
  • /fill:範囲内を1種類のブロックで設置、特定のブロックで置換
  • /clone:特定の範囲から別の地点にブロックの配置をコピー
  • /place特定のストラクチャを生成

いずれの場合も、行使したあと元に戻すことは出来ない場合が多いので、行使には注意が必要。


9. ワールドの設定

ワールドの設定は基本/gamerule ***で決められる。そのため、設定項目で困ったことがあれば基本的にそれを調べよう。
ここではそれ以外の項目で特にマルチプレイヤー設定のように扱えそうなものを紹介する。

  • server.properties:サーバーの設定、ポートの番号や、起動時の設定、エンティティが沸くかどうかなどの多岐にわたる設定
  • /team: エンティティの当たり判定、ネームプレートの可視化などの設定
  • /difficulty:難易度の設定

10.オマケ

た・・タグ・・?

Minecraftに存在するタグという言葉。指すものが多い気がする。

  • NBTデータタグ:NBTと呼ぶ人が多いが、"タグ"と呼ぶ場合もあるだろう
  • /Tag:エンティティを区別するための独自のタグ。各エンティティのTagsというnbtにリストとして保存される。
  • データパックの#タグ:データパックの要素にある、アイテムやブロックなどをひとまとめにする機能。

便利な開発者向けソフト・モジュール

ここでは、データパック開発に便利なソフトや、モジュール、サイトを紹介する。
なお、既に紹介済みのものもあるが、リンク集として活用してほしいのでこちらにも置く。

種別 作成者(敬称略) 名前 説明 URL
ソフトウェア Microsoft VisualStudioCode データパック開発に便利なテキストエディタ リンク
VS拡張機能 SPGoding DatapackHelperPlus データパック作成に特化したもの。NBT等を補完してくれる。 VSコード右の拡張機能欄から/リンク
VS拡張機能 Chen MCDatapackUtility データパックを作成するテンプレートを持つ拡張機能 VSコード右の拡張機能欄から/リンク
VS拡張機能 Misode NBTViewer NBTを開ける用にする、ストラクチャを開けて見られる。 VSコード右の拡張機能欄から/リンク
ツールサイト MCStacker MCStacker 非常に多くのコマンドに対応したコマンドジェネレータ リンク
ツールサイト MinecraftTools MinecraftTools 視覚化されたコマンドジェネレータ。ただし文字を入力するとunicodeになってしまうので注意 リンク
ツールサイト DatapackGenerators DatapackGenerators 主にデータパック向けのサイト。predicate等が触れる。 リンク
ツールサイト Chen ShapeGenerator パーティクルの配置を生成してくれるツール。 リンク
データパック AiAkaishi AiMath 数学モジュール sin/cos/tan/乱数等、基本的な数学の計算をしてくれるDTP リンク
データパック Lit-to ExpressionXpbar 経験値バーを割合表示するツール リンク
データパック Ai-Akaishi ScoreToHealth プレイヤーの体力設定ツール リンク
データパック Chen ScoreDamage プレイヤーの攻撃設定ツール リンク

その他出典

wiki
MinecraftJapanWiki

ミス等があればりっとーまでご連絡ください。
DMはいつでも構いません、また質問などもご自由にどうぞ!
記載終了日:2022-10-08 23:37:16

2
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?