カスタムレシピのメモ書き

カスタムレシピ

いくつかのアイテムを他のアイテムに変換するための設定JSON。データパックで指定可能。

以下のレシピを好きに作れる。

  • インベントリでのクラフト
  • 作業台でのクラフト
  • かまどでの製錬
  • 燻製器での製錬
  • 溶鉱炉での製錬
  • 焚き火での製錬
  • 石切り台でのクラフト

カスタムレシピの置き場所

datapack/<データパック>/data/<パック>/recipes/<レシピ名>.json

もしもバニラの挙動を置き換える場合は、

datapack/<データパック>/data/minecraft/recipes/<置き換える対象>.json

JSONの内容

共通のプロパティ

{
    "type": "minecaraft:crafting_shaped",
    "group": "x"
}
プロパティ 説明 定義値 必須
type クラフトのタイプ。
このタイプによって他のプロパティが異なる。
- crafting_shaped : 形が固定のクラフトレシピ
- crafting_shapeless : 形が自由なクラフトレシピ
- smelting : かまどのレシピ
- smoking : 燻製器のレシピ
- blasting : 溶鉱炉のレシピ
- campfire_cooking : 焚き火のレシピ
- stonecutting : 石切り台のレシピ
string
group 複数のレシピを1つにまとめるタグ。
ここが同じ文字のレシピは、1つのレシピヘルパーとして扱われる。
(インベントリのレシピを見た時に1つにまとめられる)
string

形が固定なクラフトのプロパティ

作業台やインベントリで使える形が固定のクラフトレシピのみ。

{
    "pattern": [
        " A ",
        "BBB"
    ],
    "key": {
        "A": {
            "item": "minecraft:stone"
        },
        "B": {
            "tag": "x:stones"
        }
    },
    "result": {
        "item": "minecraft:diamond",
        "count": 2
    }
}
プロパティ 説明 定義値 必須
pattern レシピの形。
任意の1文字で種類を配置する。
空白は何も置かないという設定。
list
key patternで使った文字に割り当てるアイテム。
アイテムIDitemもしくはアイテムタグtagを指定可能。
object
result.item クラフト後のアイテム。 string
result.count クラフト後のアイテムの数。 number

形が自由なクラフト共通のプロパティ

作業台やインベントリで使える配置が決まっていないクラフトレシピのみ。

{
    "ingredients": [
        {
            "item": "minecraft:stone"
        },
        {
            "tag": "x:armors"
        }
    ],
    "result": {
        "item": "minecraft:diamond",
        "count": 2
    }
}
プロパティ 説明 定義値 必須
ingredients クラフトに使うアイテム。
アイテムIDitemもしくはアイテムタグtagを指定可能。
list
result.item クラフト後のアイテム。 string
result.count クラフト後のアイテムの数。 number

製錬のクラフト共通のプロパティ

かまど、燻製器、溶鉱炉、焚き火のクラフトレシピ。

{
    "ingredient": [
        {
            "item": "minecraft:stone"
        },
        {
            "tag": "x:armors"
        }
    ],
    "result": "minecraft:diamond",
    "experience": 0.1,
    "cookingtime": 200
}
プロパティ 説明 定義値 必須
ingredient クラフトに使うアイテム。
アイテムIDitemもしくはアイテムタグtagを指定可能。
list
result クラフト後のアイテム。 string
experience クラフト完了時に経験値を取得できる確率。
0~1の間で指定。
number
cookingtime クラフト完了までかかる時間(tick)。 number

石切りのクラフトのプロパティ

石切り台のクラフトレシピ。

{
    "ingredient": [
        {
            "item": "minecraft:stone"
        },
        {
            "tag": "x:armors"
        }
    ],
    "result": "minecraft:diamond",
    "count": 1
}
プロパティ 説明 定義値 必須
ingredient クラフトに使うアイテム。
アイテムIDitemもしくはアイテムタグtagを指定可能。
list
result クラフト後のアイテム。 string
count クラフト後のアイテムの数。 number

サンプル

時計のクラフトレシピ

{
  "type": "minecraft:crafting_shaped",
  "pattern": [
    " # ",
    "#X#",
    " # "
  ],
  "key": {
    "#": {
      "item": "minecraft:gold_ingot"
    },
    "X": {
      "item": "minecraft:redstone"
    }
  },
  "result": {
    "item": "minecraft:clock"
  }
}

金インゴットの製錬レシピ

{
  "type": "minecraft:smelting",
  "ingredient": {
    "item": "minecraft:gold_ore"
  },
  "result": "minecraft:gold_ingot",
  "experience": 1.0,
  "cookingtime": 200
}

レシピの覚え方

パック名をminecraftにして、バニラの情報を書き換える

デフォルトの挙動が変わるので注意

コマンドでレシピを覚える

## レシピを覚える
recipe give @p x:original_recipe

進捗でレシピを覚える

{
    :
    "rewards": {
        "recipes": ["x:original_recipe"]
    }
}

クラフト後のアイテムにNBTを指定する

現状、クラフト元のアイテムやクラフト後のアイテムにはNBTを指定できません。

なので、多少強引ではありますが、クラフト後のアイテムだけでもNBTを指定するために、進捗を使って強制的にアイテムの置き換えを行います。

アイテムのクラフト結果を「知識の本にする」

{
    :
    "result": {
        "item": "minecraft:knowledge_book"
    }
}

進捗で「レシピ開放」を検知してファンクションを呼び出す

{
    "criteria": {
        "placeholder": {
            "trigger": "minecraft:recipe_unlocked",
            "conditions": {
                "recipe": "x:original_recipe"
            }
        }
    },
    "rewards": {
        "function": "x:unlock_recipe"
    }
}

ファンクションで「知識の本」を取り替える

# 知識の本を消す
clear @s knowledge_book
# アイテムを渡す
give @s (アイテム)
# 再度トリガーをかけるため、進捗を取り消す
advancement revoke @s only x:advancement
# レシピも消しておく
recipe take @s x:recipe

ルートテーブルのメモ書き

ルートテーブル

以下のような時に手に入れるアイテムを設定できるJSON。データパックで指定可能。

  • ブロックを破壊した、された時
  • エンティティを倒した時
  • チェストなどを開いた時
  • 釣りをした時
  • 特定のモブからアイテムを貰う、交換する時
  • 進捗などの報酬で手に入れる時

.minecraft/versions/<バージョン>/<バージョン>.jarを7-zipなどで開いて、data/minecraft/loot_tablesからバニラのサンプルをゲットできる。

ルートテーブルの置き場所

datapacks/<データパック>/data/<パック>/loot_tables/<ルートテーブル名>.json

もしもバニラの挙動を置き換える場合は、

datapacks/<データパック>/data/minecraft/loot_tables/<置き換える対象>.json

JSONの内容

ルート

{
    "type": "minecraft:empty",
    "pools": [
        { (ルートテーブル情報) }
    ]
}
プロパティ 説明 定義値
type ルートテーブルの種類
- empty : なし
- entity : エンティティのドロップ
- block : ブロックのドロップ
- chest : チェストの中身
- fishing : 釣りの結果
- gift : 猫や村人からのギフト
- advancement_reward : 進捗達成時
- generic : その他
string
pools ドロップ情報のリスト。上から順番に適用される。 list

ルートテーブル情報

{
    "conditions": [
        { (動作条件) }
    ],
    "rolls": 1,
    "bonus_rolls": 1,
    "entries": [
        { (アイテムの候補) }
    ]
}
プロパティ 説明 定義値 必須
conditions ルートテーブルを動作させる条件。 list
rolls entriesの中からいくつ動作させるか。
{ "min": 1, "max": 3 } という書き方もできる。
この場合はentriesから1~3個動作させる。
バニラは、基本的に1しか無い。ほぼ固定値で良い。
number / object
bonus_rolls rollsに加えて、Luckの効果がついていた場合に、追加でrollsを実行させる。( rolls + bonus_rolls の回数だけentriesを実行 )
こちらも { "min": 1, "max": 3 }という書き方ができる。
バニラは、基本的に設定されてない。過去の遺物?
number / object
entries アイテムの候補。 list

動作条件

{
    "condition": "minecraft:survives_explosion",
    (conditionで設定した条件のサブパラメータ)
}
プロパティ 説明 定義値 必須
condition ルートテーブルの動作させる条件のタイプ。
ここのタイプはpredicateと一緒なため、predicateについて書いたブログを参照。
string
サブパラメータ conditionで設定した条件のサブパラメータ。
ここもpredicateを参照。
-

ちなみにブロック壊した系は、基本minecraft:survives_explosion。サブパラなし。

エンティティ倒した系は、基本minecraft:killed_by_player。サブパラなし。

他は基本的にconditionsが設定されていない。

アイテムの候補

{
    "type": "minecraft:item",
    "name": "minecraft:diamond",
    "weight": 10,
    "quality": 20,
    "conditions": [
        { (動作条件) }
    ],
    "functions": [
        { (追加機能) }
    ],
    "children": [
        { (アイテムのサブ候補) }
    ],
    "expand": false,
}
プロパティ 説明 定義値 必須
type アイテム候補のタイプ。
- item : アイテムを取得する
- tag : アイテムのタグ(data packのtags)で指定する
- loot_table : コピー元のルートテーブルを指定する
- group : childrenを使って複数候補を返す(後述)
- alternatives : childrenを使って最初の候補を返す(後述)
- sequence : childrenを使って失敗するまでの候補を返す(後述)
- dynamic : ブロック固有の情報付きで返す
- empty : 何も生成しない(アイテムを取得しない)
string
name - typeitemならば、アイテムID。
- typetagならば、アイテムのタグ。
- typeloot_tableならば、ルートテーブル。
- typedynamicならば、contentsもしくはself
 contentsはブロックエンティティの中身。(シュルカー)
 selfは旗やモブの頭に使われる。
string
weight アイテム候補が複数ある場合に、選ばれやすさ。
面倒だったら、全部足した時に100にしておくと、そのまま%になる。
number
quality プレイヤーのLuckの効果によって、weightを書き換える値。 number
conditions アイテム候補を実行する条件。
内容は動作条件と同じ。
list
functions アイテムを取得する時に、アイテムに付与するオプション機能。 list
children typegroup, alternatives, sequecneの時にだけ指定する。
指定可能な内容は、アイテムの候補と同じ。効果は複雑なので、後述。
string
expand typetagの時にだけ指定する。
- trueなら、nameで指定したタグのアイテムを1つ取得する。
- falseなら、nameで指定したタグのアイテムを全部取得する。
bool

アイテムのサブ候補

まず、childrenの内容は、アイテムの候補と全く同じ。ただし、typeに指定した内容によって効果が変わる。

group

{
    "type": "minecraft:group",
    "children": [
        { (アイテムのサブ候補1) },
        { (アイテムのサブ候補2) },
        { (アイテムのサブ候補3) }
    ]
}

groupはアイテムのサブ候補を全部(1~3)を全部実行します。

これがある理由は、アイテムのサブ候補全部にconditionsを書くのを省略するため。

現在、バニラでは使われていない。

alternatives

{
    "type": "minecraft:alternatives",
    "children": [
        { (アイテムのサブ候補1) },
        { (アイテムのサブ候補2) },
        { (アイテムのサブ候補3) }
    ]
}

alternativesはアイテムのサブ候補を1(上)から順番にチェックしていって、最初にチェックに引っかかったアイテム候補だけ実行します。

要するに、1は失敗。2は成功。ならば、アイテムのサブ候補2だけが実行されます。

例えば、シルクタッチで破壊するとサブ候補1だけど、そうじゃなかったらサブ候補2みたいな書き方がバニラではメジャーです。

sequence

{
    "type": "minecraft:sequence",
    "children": [
        { (アイテムのサブ候補1) },
        { (アイテムのサブ候補2) },
        { (アイテムのサブ候補3) }
    ]
}

sequencegroupと似たようなものです。

ただし、groupは途中で失敗するサブ候補があっても、全部チェックしてくれますが、sequenceは1(上)から順番にチェックしていって、失敗したらそこまでのサブ候補しか実行されません。

現在、バニラでは使われていません。

追加機能

{
    "function": "minecraft:copy_name",
    (functionで設定した機能のサブパラメータ),
    "conditions": [
        { (動作条件) }
    ]
}
プロパティ 説明 定義値 必須
function アイテムに追加する機能のタイプ。
一覧は後述。
string
サブパラメータ functionで設定したサブパラメータ。
こちらも後述。
-
conditions 追加機能を実行する条件。
内容は動作条件と同じ。
list

追加機能の例

機能 説明 バニラでの使用例
apply_bonus エフェクトによってボーナスを受ける。 ダイヤ鉱石を幸運状態で採掘したらアイテム増える。
copy_name 破壊されたブロックの名前をコピーする。 旗を壊したら旗についてた名前をコピー。
copy_nbt NBTを一部コピーする。
壊した、倒した相手のNBTも可能。
旗を壊したら旗の柄をコピー。
copy_state ブロックのBlockStateTagをコピーする。
(ブロックを見た時にF3の右に出てくるブロック情報)
ミツバチの巣をシルクタッチで壊したら巣のレベルをコピー。
enchant_randomly ランダムにエンチャントを付ける。
エンチャントリストを指定することもOK。
ピラミッドのチェストにある革装備にランダムエンチャントをつける。
enchant_with_levels エンチャントのレベルを指定する。 エンドシティのチェストの本にレベル30のエンチャントをつける。
exploration_map 何も書かれていないマップに近くの建造物付近を描く。 海底遺跡のチェストの地図を宝の地図にする。
explosion_decay ブロックが爆発で壊された場合に、一定数アイテムが減る。 草が爆破された場合に小麦の種を一定数減らす。
furnace_smelt かまどで精錬した後のアイテムになるようにする。 鶏が燃えて死んだ場合に、焼き鳥になる。
fill_player_head モブの頭を壊した、殺したプレイヤーやモブの頭にする。 -
limit_count set_countで指定したアイテム数に制限をかける。 グロウストーンが普通に壊された場合に、1~4個、グロウストーンダストを落とす。
looting_enchant ドロップ増加のエンチャントによってアイテム数を増減させる。 鶏を倒した場合に0~1個、追加で羽を落とす。
set_attributes アイテムにAttributeを付与する。 -
set_contents コンテナの中身を保持する。 シュルカーボックスを破壊した時に中身を保持する。
set_count アイテム数を設定する。
ランダムで数値を決定することも可能。
本棚を壊した場合に、本を3個落とす。
set_damage ツール系アイテムの耐久値を設定する。 釣りで手に入れた釣り竿の耐久値を減らす。
set_lore アイテムに説明文を設定する。 -
set_name アイテムの名前を設定する。 -
set_nbt アイテムにNBTを設定する。 釣りで手に入れたポーションの効果をただの水にする。
set_stew_effect 怪しげなシチューを飲んだ時に発生するステータス効果を設定する。
怪しげなシチューはクリエイティブのインベントリからは取得できない。(ただし、サバイバルで作れる)
怪しげなシチューを飲むと、エフェクトを一定時間付ける。

その他、細かいところは英語Wiki参照。

Loot table – Official Minecraft Wiki

サンプル

石を壊した時のルートテーブル

{
  "type": "minecraft:block", // ブロックを破壊した時
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:alternatives", // 上から順番に見ていって最初のやつだけ実行
          "children": [
            { // サブ候補その1
              "type": "minecraft:item", // アイテムを取得
              "conditions": [
                {
                  "condition": "minecraft:match_tool", // ツールが一致していれば
                  "predicate": {
                    "enchantments": [
                      {
                        "enchantment": "minecraft:silk_touch", // シルクタッチLv1以上
                        "levels": {
                          "min": 1
                        }
                      }
                    ]
                  }
                }
              ],
              "name": "minecraft:stone" // 石を取得
            },
            { // サブ候補その2
              "type": "minecraft:item", // アイテムを取得
              "conditions": [
                {
                  "condition": "minecraft:survives_explosion" // 普通に破壊した時
                }
              ],
              "name": "minecraft:cobblestone" // 丸石を取得
            }
          ]
        }
      ]
    }
  ]
}

旗を壊した時のルートテーブル

{
  "type": "minecraft:block", // ブロックを破壊した時
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:item", // アイテムを取得
          "functions": [ // 追加機能を付与
            {
              "function": "minecraft:copy_name", // ブロック自身の名前をコピー
              "source": "block_entity"
            },
            {
              "function": "minecraft:copy_nbt", // ブロック自身のNBTをコピー
              "source": "block_entity",
              "ops": [
                {
                  "source": "Patterns", // 絵柄だけ置き換え
                  "target": "BlockEntityTag.Patterns",
                  "op": "replace"
                }
              ]
            }
          ],
          "name": "minecraft:black_banner" // 黒の旗を取得
        }
      ],
      "conditions": [
        {
          "condition": "minecraft:survives_explosion" // 普通に破壊した時
        }
      ]
    }
  ]
}

鶏を倒した時のルートテーブル

{
  "type": "minecraft:entity", // エンティティを倒した時
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:item", // アイテムを取得
          "functions": [
            {
              "function": "minecraft:set_count", // 0~2個落とす
              "count": {
                "min": 0.0,
                "max": 2.0,
                "type": "minecraft:uniform"
              }
            },
            {
              "function": "minecraft:looting_enchant", // ドロップ増加がついてたら追加で0~1個
              "count": {
                "min": 0.0,
                "max": 1.0
              }
            }
          ],
          "name": "minecraft:feather" // 羽を取得
        }
      ]
    },
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:item", // アイテムを取得
          "functions": [
            {
              "function": "minecraft:furnace_smelt", // 精錬した結果を取得
              "conditions": [
                {
                  "condition": "minecraft:entity_properties", // エンティティ自身が燃えていた場合
                  "predicate": {
                    "flags": {
                      "is_on_fire": true
                    }
                  },
                  "entity": "this"
                }
              ]
            },
            {
              "function": "minecraft:looting_enchant", // ドロップ増加がついてたら追加で0~1個
              "count": {
                "min": 0.0,
                "max": 1.0
              }
            }
          ],
          "name": "minecraft:chicken" // 鶏肉を取得
        }
      ]
    }
  ]
}

クリーパーを倒した時のルートテーブル

{
  "type": "minecraft:entity", // エンティティを倒した時
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:item", // アイテムを取得
          "functions": [
            {
              "function": "minecraft:set_count", // 0~2個落とす
              "count": {
                "min": 0.0,
                "max": 2.0,
                "type": "minecraft:uniform"
              }
            },
            {
              "function": "minecraft:looting_enchant", // ドロップ増加だと0~1個追加で落とす
              "count": {
                "min": 0.0,
                "max": 1.0
              }
            }
          ],
          "name": "minecraft:gunpowder" // 火薬を取得
        }
      ]
    },
    {
      "rolls": 1.0,
      "entries": [
        {
          "type": "minecraft:tag", // アイテムタグを取得
          "name": "minecraft:music_discs", // レコードのタグ
          "expand": true // タグの中のどれか1つを落とす
        }
      ],
      "conditions": [
        {
          "condition": "minecraft:entity_properties", // スケルトン系を倒した時
          "predicate": {
            "type": "#minecraft:skeletons"
          },
          "entity": "killer"
        }
      ]
    }
  ]
}

武器屋のチェストを開いた時のルートテーブル

{
  "type": "minecraft:chest", // チェストを開いた時
  "pools": [
    {
      "rolls": { // アイテム候補を1~5個実行する
        "min": 1.0,
        "max": 5.0,
        "type": "minecraft:uniform"
      },
      "entries": [
        {
          "type": "minecraft:item", // アイテムを取得
          "weight": 2, // 2/8 (2/2+4+1+1) の確率で実行する
          "functions": [
            {
              "function": "minecraft:set_count", // アイテム数を1~3個にする
              "count": {
                "min": 1.0,
                "max": 3.0,
                "type": "minecraft:uniform"
              }
            }
          ],
          "name": "minecraft:iron_ingot" // 鉄インゴットを取得
        },
        {
          "type": "minecraft:item", // アイテムを取得
          "weight": 4, // 4/8 (4/2+4+1+1) の確率で実行する
          "functions": [
            {
              "function": "minecraft:set_count", // アイテム数を1~4個にする
              "count": {
                "min": 1.0,
                "max": 4.0,
                "type": "minecraft:uniform"
              }
            }
          ],
          "name": "minecraft:bread" // パンを取得
        },
        { // 何も書いてない場合は、weightは1、set_countも1
          "type": "minecraft:item", // アイテムを取得
          "name": "minecraft:iron_helmet" // 鉄ヘルメットを取得
        },
        {
          "type": "minecraft:item", // アイテムを取得
          "name": "minecraft:emerald" // エメラルドを取得
        }
      ]
    }
  ]
}

ルートテーブルを設定する方法

パック名をminecraftにして、バニラの情報を書き換える

全てに反映されてしまうので、注意。

コマンドでルートテーブルを上書きする

# コンテナ系はsetblockでLootTableをNBTに書いて設定
setblock 0 60 0 minecraft:chest{LootTable:"x:original_chest"}

# エンティティ系はsummonでDeathLootTableをNBTに書いて設定
summon minecraft:creeper 0 60 0 {DeathLootTable:"x:original_creeper"}

# ルートテーブルの設定をminecraft:emptyで消す
summon minecraft:creeper 0 60 0 {LootTable:"minecraft:empty"}

進捗でルートテーブルを設定する

{
    :
    "rewards": {
        "loot": ["x:original_advance"]
    }
}

こんな感じで進捗達成時にルートテーブルで報酬が書ける。

データパックのタグ付け備忘録

タグ付けとは

コマンドの/tagではなく、データパック内に作ることができるタグの備忘録です。

簡潔に言うと、複数のブロック、アイテム、エンティティ、ファンクションなどを1つにまとめてしまおうという機能です。

例えばブロックだと、下のようなチェックが

# 0 60 0にあるブロックが石か砂か土ならtestという
execute if block 0 60 0 stone run say test
execute if block 0 60 0 sand run say test
execute if block 0 60 0 dirt run say test

こういうふうにできます。

execute if block 0 60 0 #x:test run say test

どうやってタグ付けするの?

データパック内にフォルダを作る

まずは以下のようにフォルダを作りましょう。

<セーブデータ>/datapacks/data/<パック名>/tags

もちろんデータパックなので、pack.mcmetaも用意しておいてくださいね。

種類でフォルダを分ける

次にtagsの下に何のタグを付けるか決めます。

種類によってフォルダ名が決まっているので注意しましょう。

# ブロックをタグ付けする
<セーブデータ>/datapacks/data/<パック名>/tags/blocks/<タグ>.json

# アイテムをタグ付けする
<セーブデータ>/datapacks/data/<パック名>/tags/items/<タグ>.json

# ファンクションをタグ付けする
<セーブデータ>/datapacks/data/<パック名>/tags/functions/<タグ>.json

# エンティティをタグ付けする
<セーブデータ>/datapacks/data/<パック名>/tags/entity_types/<タグ>.json

タグをつけたい項目を入れていく

それでは、<タグ>.jsonの中身を書いていきましょう。例えば上で説明したブロックのタグ付ならばこんな感じになります。

{
    "values": [
        "minecraft:stone",
        "minecraft:sand",
        "minecraft:dirt"
    ]
}

構造はシンプル!ただ並べるだけ!

他のアイテムやファンクション、エンティティも同じかんじでタグ付けできます。

どうやって使うの?

タグ付けしたものは、#<パック名>:<タグ>という形で指定できます。

例えば、

<セーブデータ>/datapacks/data/x/tags/blocks/test.json

とならば、

execute if block 0 60 0 #x:test run say test

という感じで使えるようになります。

使えるコマンドは限られている

基本的にタグ付けで使えるコマンドはチェックする対象を調べる時がほとんどです。

ブロックなら上でも説明したような感じですね。

エンティティならば、こんな感じでエンティティのtypeに指定できます。

replaceitem entity @e[type=#x:mob] armor.head stone

アイテムならば、Predicateで下みたいに書くとそのアイテムのどれかを右手で持っていたらってことができます。

{
    "condition": "minecraft:entity_properties",
    "entity": "this",
    "predicate": {
        "equipment": {
            "mainhand": {
                "tag": "x:super_items"
            }
        }
    }
}

(PredicateやLoot Tableなどの上記の場合は、#は不要です)

ちなみに、クリエイティブのインベントリの検索欄にもタグは使えます。

ファンクションのタグ付けの呼び出しルール

ファンクションは単純にこういう形で呼び出せます。

{
    "values": [
        "x:aaa",
        "x:bbb",
        "x:ccc"
    ]
}
function #x:call

さて、この場合は、x:aaa x:bbb x:cccはどういう順番で呼び出されるのか。

実は上から順番に1回ずつ呼び出されます。前後関係が重要な場合など使えるかもですね。

特殊なタグ付け

<パック名>をデフォルトのminecraftにすることで、ちょっと特殊なタグを付けることができます。

minecraft/tags/functions/load.json

ここに同じようにタグを付けると、ゲームのロード時やサーバーのリロード時に、ここでタグ付けされたファンクションが必ず呼び出されるようになります。

データパック配布する人とかは常用しているのでは?

minecraft/tags/functions/tick.json

ここに同じようにタグを付けると、1tickごと、tick開始時に、ここでタグ付けされたファンクションが必ず呼び出されるようになります。

常時実行しておきたいコマンドとかはここでタグ付けしておくと便利ですね。

タグ付けのタグ付け

さて、ここまでタグ付け方法などを書いてきましたが、実はタグ付けしたものを更にタグ付けできます。

{
    "values": [
        "#x:test",
        "minecraft:glass"
    ]
}

こんな感じですね。

デフォルトでも結構、タグが多く登録されているので、使えるものは使っちゃいましょう。

サブフォルダ内に置くこともできる

タグはフォルダの階層をさらに掘ることができます。例えば、

<セーブデータ>/datapacks/data/x/tags/blocks/aaa/bbb/ccc/test.json

という感じであれば、

#x:aaa/bbb/ccc/test

というふうに利用することができます。

マイクラのワールドの設定を整理してみた

最初にやること

配布マップを作る時には、まず最初にワールドを生成したら、すぐさまこれを私はやります。

gamerule doDaylightCycle false

別にこれからやらなくても良いんですけど、なぜかやってしまうんです。太陽が動くことがまず気になってしまって…

その後は、ひたすらgameruleを設定していくわけですが、これがまあ面倒くさい!

ここまでやったけど、アレ飛ばしたっけな?とか、これなんだったけな?って言うのがしょっちゅうあります。

でも最近はそういう事がなくなりました。なぜかと言うと、ワールド設定を全部一つのfunctionファイルに押し込んだから

ワールド設定

本題です。ようは、下のやつを毎回呼び出しているわけです。

これさえあれば、あなたも快適なマップ作成のスタートを切れますよ!たぶん!

注意:
下の設定はすごく便利ですが、私のよく設定してある内容になっています。
いきなり反映させたら、ワールド内のモブが消えたとか言う可能性もあるので、
製作中のワールドに反映させる際には、必ず1つずつ項目チェックしてください。

# Minecraft の Gamerule 設定一覧 (v1.16)

# チェインコマンドが何個まで一度に実行されるか (functionファイル内のコマンド数含む)
## 場合によっては、小さな値に設定されている可能性があるため、最初に実行
## 初期値:65536
gamerule maxCommandChainLength 65536

# チャット欄で進捗を開放した時に、テキストチャットにメッセージを出すかどうか (右上の通知は消せない)
## 初期値:true
gamerule announceAdvancements false

# コマンドブロックを実行したときのログを表示するかどうか
## 初期値:true
gamerule commandBlockOutput false

# サーバーでエリトラで飛んでいるプレイヤーの速度をチェックするかどうか
## 初期値:false
gamerule disableElytraMovementCheck false

# 村の襲撃イベントを無効にするかどうか
## 初期値:false
gamerule disableRaids true

# 時間(太陽と月の動き)が進むかどうか
## 初期値:true
gamerule doDaylightCycle false

# モブ以外のエンティティを壊した時にアイテムを落とすかどうか
## falseの場合、額縁からアイテムが外せなくなる
## 初期値:true
gamerule doEntityDrops false

# 炎が燃え広がり、自然に火が消えるかどうか
## 初期値:true
gamerule doFireTick false

# 死亡画面を出さずに、すぐにリスポーンさせるかどうか
## 初期値:false
gamerule doImmediateRespawn true

# 夜にファントムがスポーンするかどうか
## ファントムは夜などに、3日間以上ベッドに入っていないプレイヤーの上にスポーンする
## 初期値:true
gamerule doInsomnia false

# アンロックしたレシピだけをクラフトできるようにするかどうか
## 初期値:false
gamerule doLimitedCrafting true

# モブがアイテムを落とすかどうか
## 初期値:true
gamerule doMobLoot false

# モブが自然にスポーンするかどうか
## 初期値:true
gamerule doMobSpawning false

# 略奪隊がスポーンするかどうか
## 略奪隊はヴィンディケーターとピリジャーで構成された集団
## 初期値:true
gamerule doPatrolSpawning false

# ブロックを壊した時にアイテムを落とすかどうか
## falseでもチェストなどは中身のアイテムだけ落とす(シュルカーボックスは中身ごと消える)
## 初期値:true
gamerule doTileDrops false

# 行商人がスポーンするかどうか
## 初期値:true
gamerule doTraderSpawning false

# 天候(晴れ、雨、雷雨)が自然に変化するかどうか
## 初期値:true
gamerule doWeatherCycle false

# プレイヤーが溺れたときにダメージを受けるかどうか
## 酸素ゲージは減っていく
## 初期値:true
gamerule drowningDamage false

# プレイヤーが落下ダメージを受けるかどうか
## 初期値:true
gamerule fallDamage false

# プレイヤーが炎によるダメージを受けるかどうか
## 初期値:true
gamerule fireDamage false

# 中立モブが怒っている状態で対象のプレイヤーが倒れると怒らなくなるかどうか
## 初期値:true
gamerule forgiveDeadPlayers true

# プレイヤーが死んでもインベントリのアイテムや経験値を残すかどうか
## 体力と空腹値は回復する
## 初期値:false
gamerule keepInventory true

# 管理者コマンドをサーバーに記録するかどうか
## 初期値:true
gamerule logAdminCommands false

# モブやプレイヤーが1ブロック以内に何体いたら窒息ダメージを受けるか
## 0にすると何体いても窒息ダメージを受けない
## 初期値:24
gamerule maxEntityCramming 0

# モブが行動することでブロックを変更、アイテムを拾うかどうか
## 村人の繁殖も同じくこの設定
## 畑を荒らされることもなくなる(プレイヤーは荒らせる)
## 初期値:true
gamerule mobGriefing false

# 空腹度が満たされている時に、自然に体力を回復するかどうか
## 初期値:true
gamerule naturalRegeneration true

# 何Tickごとにランダムで植物の成長させるか
## 0Tickだと成長させない
## 初期値:3
gamerule randomTickSpeed 0

# デバッグ画面(F3)にすべての情報を表示するかどうか
## 座標や方角など見せたくない場合はfalse推奨
## ヒットボックス表示(F3+B)やチャンク境界標示(F3+G)も含む
## 初期値:false
# gamerule reducedDebugInfo true

# プレイヤーが実行したコマンドをテキストチャットに表示するかどうか
## 初期値:true
gamerule sendCommandFeedback false

# プレイヤーが死んだ時にテキストチャットにメッセージを表示するかどうか
## 初期値:true
gamerule showDeathMessages false

# マルチでのワールドログイン時や、スポーンポイントが設定されていないプレイヤーが
## ワールドスポーン地点でスポーンする範囲
## 0だとワールドスポーン地点のジャストその場所
## 初期値:10
gamerule spawnRadius 0

# スペクテイターモードのプレイヤーがチャンクを生成できるかどうか
## 初期値:true
gamerule spectatorsGenerateChunks true

# 怒っている中立モブが、怒っている対象付近のプレイヤーにも攻撃するかどうか
## 初期値:false
gamerule universalAnger false

# 難易度を何にするか
# 値:peaceful | easy | normal | hard
# difficulty peaceful

# マルチでログイン時にプレイヤーのゲームモードを何にするか
# 値:survival | creative | adventure | spectator
defaultgamemode adventure

# 全プレイヤーのゲームモードを変更する
# gamemode adventure @a

# ワールドのスポーン地点を設定する
# setworldspawn 0 60 0

# 全プレイヤーのスポーン地点を設定する
# spawnpoint @a 0 60 0

# 現在の時刻を設定する
## 値:day | noon | night | midnight | tick数
## 6000(tick)は太陽が真上に来る時間
time set 6000

# 現在の天候を設定する
## 値:clear | rain | thunder
weather clear

# ワールドの境界を設定する
# worldborder center 0 0
# worldborder set 10000
# worldborder damage amount 0

# 強制的に読み込ませるチャンクを設定する
## あまりにも量を増やすと重くなるので注意
## モブの行動や光源処理が走るところに使うと重くなるので注意
# forceload remove all
# forceload add 0 0 48 48

ゲームルール以外の設定

ゲームルールやそれに追随する設定は全部終わりました。

その次は何をやるのか。私は一気に下のやつも初期設定します。

  • 基本的な名前のスコアボード
  • デバッグ用のtellrawもしくは本の作成
  • チームの作成

まあ、ここに関しては、後はご自由にって感じですね。

座標について

私の場合は、ワールドに入ったら、速攻でxが0、zが0の座標にTPします。

そして建物は基本的に+の方向にしか立てていきません。

理由としてはコマンドを組む時に座標を書くことがありますが、

setblock -10051 13 -3049 stone

みたいに長く書くのが嫌じゃないですか。マイナスとか面倒じゃないですか。

そんなしょうもないけど、私にとっては大事なルールです。

triggerコマンドについて使い道を考える

triggerコマンドとは

スコアボードの値を「OP権限」を持たないプレイヤーが変更できるコマンドです。

tellrawなどのクリックイベントで使われることがほとんどですね。

triggerコマンドはどうやって使うの?

オブジェクトを作る

まずはオブジェクトを用意しましょう。

scoreboard objectives add SAMPLE trigger "サンプル"

実はトリガーで変更できるスコアボードはtriggerタイプのオブジェクトじゃないと使えません。

トリガー有効化

次に、トリガーを引けるようにするために有効化する必要があります。

有効化されていない場合は、トリガーコマンドは失敗します。

scoreboard players enable @p SAMPLE

@pの部分はトリガーを引かせたいプレイヤーを指定します。

トリガーを引く

# プレイヤーの値を1にする
trigger SAMPLE set 1

# プレイヤーの値を1つ足す
trigger SAMPLE add 1

上のような感じで、コマンドを実行すればプレイヤーの値を変更できます。

ただし、普通はプレイヤーがトリガーコマンドを直接実行することはないでしょう。

値を変更するのはスコアボードコマンドでもOK

スコアボードを変更したいだけなら、普通のスコアボードと同じように使えます。

scoreboard players set @p SAMPLE 10

テキストチャットから使う

さて、トリガーを引かせる主な方法はテキストチャットなどで、プレイヤーがクリックさせて実行させます。

tellraw @p {"text":"クリック","clickEvent":{"action":"run_command","value":"/trigger SAMPLE add 1"}}

ちょっと読みにくいので、整形しますね。

tellraw @p 
{
  "text": "クリック",
  "clickEvent": {
    "action": "run_command",
    "value": "/trigger SAMPLE add 1"
  }
}

clickEventでactionvalueを指定しています。

さらにactionではrun_command(コマンドを実行する)、

valueでは/trigger SAMPLE add 1(クリックした時に実行するコマンド)、

をそれぞれ指定します。

これを実行すると、「クリック」とテキストチャットに表示されるので、それをクリックすると/trigger SAMPLE add 1が実行されます。

run_commandで指定するコマンドはスラッシュが必要

functionファイルとかでは/が先頭に無しでコマンドが実行できます。ですが、run_commandのvalueでは必ず/が先頭に必要です。

よく忘れてしまうので注意しましょう。

トリガーコマンドは1回しか実行されない

ここで、トリガーコマンドの特徴です。

トリガーコマンドは有効化された後1回だけしか実行できません。

つまり、一回トリガーを引いたら戻せない。これがトリガーコマンドで最も便利な部分です。

テキストチャットなどは一度表示しちゃうと何度でも、チャットを開いてクリックできちゃいますから、それを防ぐための処理が全部なくなるわけです。

再度、トリガーを引かせる場合は、有効化をもう一度やればOKです。

1度、有効化したトリガーは戻せない?

トリガーを有効化してしまったら、無効化することはできないようです。

どうしても無効化したい場合は、以下でなかったことにしましょう。

execute as @p run trigger SAMPLE add 0

まとめ

トリガーコマンドは、

  • triggerコマンド専用のスコアボードが必要
  • 有効化しないと使えない
  • 有効化したら1度だけ実行できる

という特徴があります。

プレイヤーにテキストなどで選択させたい場合で、一度決めさせたら一定期間はロックしたいときに使うといいでしょう。

ArmorStandのNBTでよく使うものをジャンルで整理してみる

ArmorStand

ArmorStand(minecraft:armor_stand。アーマースタンド。以下、アマスタ)っていろんな場面で使うじゃないですか。例えば。

  • 防具立て
  • マーカー(位置指定)
  • 3Dモデル配置用
  • 一時的なスコアボード保管用
  • パーティクル表示の基準

などなど。そういう時に、いざアマスタを召喚しようとしたら、

「このNBTってどうやって書くんだったかなあ…」

ってよくなります。ということで私がよく使うやつだけ整理してみる。

基本セット(当たり判定・透明化・落下防止)

# 当たり判定を消す
{Marker:true}

# 透明化する
{Invisible:true}

# 落下防止する
{NoGravity:true}

# 3つ合わせて
{Marker:true,Invisible:true,NoGravity:true}

上の3つは大体のやつに設定している気がする。特に理由もなく。

※ 宗教上の理由から0b, 1bではなく、false, trueで書いてます。

名前関係

# 名前をつける
{CustomName:'{"text":"名前"}'}

# 名前を表示する
{CustomNameVisible:true}

# 2つ合わせて
{CustomName:'{"text":"名前"}',CustomNameVisible:true}

やっぱり、名前をつけるのはやるよね。普通のモブに対してもやるからね。

判別用途関係

# 最初からタグをつける
{Tags:["aaa","bbb"]}

# 最初からチームに含める
{Team:"red"}

# 2つ合わせて
{Tags:["aaa","bbb"],Team:"red"}

タグとかチームはセレクター指定するときに楽になるから、ついつい使っちゃう。

見た目関係

# 小型化
{Small:true}

# 手あり
{ShowArms:true}

# 下の台なし
{NoBasePlate:true}

全部をあわせて使うことはあまりないけど、見た目をいじるなら、これは設定しておきたいよね。

姿勢関係

# 召喚時の向き
## 1つ目はアマスタの体の方向(-180:北、-90:東、0:南、90:西)
## 2つ目はアマスタの頭の方向(0:正面、90:真上、-90:真下)
Rotation:[0.0f,0.0f]

# 頭、体、左手、右手、左足、右足の角度(別サイトで設定することを推奨)
Pose:{Body:[...],LeftArm:[...],RightArm:[...],LeftLeg:[...],RightLeg:[...],Head:[...]}

いよいよもって使わなくなってきたけど、アマスタの姿勢調整用。

各パーツはこちらで設定することをおすすめするよ。

haselkern.com

アイテム装備関係

# 最初から右手、左手に装備する
## 1つ目は右手
## 2つ目は左手
{HandItems:[{id:"minecraft:stone",Count:1b},{}]}

# 最初から防具を装備する:インベントリとは逆順に装備するって覚えればいけそうだね
## 1つ目は足装備
## 2つ目は腰装備
## 3つ目は体装備
## 4つ目は頭装備
{ArmorItems:[{},{},{},{id:"minecraft:stone",Count:1b}]}

# 装備を付けられる、はずれるの設定
## この値の詳細は後述
{DisableSlots:31}

アマスタの装備関係。最初から装備させなくていいなら、replaceitemでやった方がシンプルだと思う。

装備の付け外し設定

まずは、こちらの表をご確認あれ。

設定 パーツ 数値
装備させない、はずさせない 右手 1
装備させない、はずさせない 2
装備させない、はずさせない 4
装備させない、はずさせない 8
装備させない、はずさせない 16
装備させない、はずさせない 左手 32
装備をはずさせない (装備できる) 右手 256
装備をはずさせない (装備できる) 512
装備をはずさせない (装備できる) 1024
装備をはずさせない (装備できる) 2048
装備をはずさせない (装備できる) 4096
装備をはずさせない (装備できる) 左手 8192
装備させない (はずせる) 右手 65536
装備させない (はずせる) 131072
装備させない (はずせる) 262144
装備させない (はずせる) 524288
装備させない (はずせる) 1048576
装備させない (はずせる) 左手 2097152

全部の値の意味はこんな感じなんだけど、複数指定したい場合はどうするのか。

全部足します。

つまり、両手、足、腰、体は「装備させない、はずさせない」だけど、頭は「装備させない、けどはずせる」ようにしたいのであれば

  • 右手の「装備させない、はずさせない」は、1
  • 左手の「装備させない、はずさせない」は、32
  • 足の「装備させない、はずさせない」は、2
  • 腰の「装備させない、はずさせない」は、4
  • 体の「装備させない、はずさせない」は、8
  • 頭の「装備させない、けどはずせる」は、1048576 (表の最後のやつ)

になるので、「1 + 32 + 2 + 4 + 8 + 1048576」の結果、「1048623」をDisableSlotsに指定すればOK。

面倒ならば、MC Stackerとか使ったほうが良いと思います。

mcstacker.net

ちなみに、全部「装備させない、はずさせない」、アマスタを破壊もできないで良いならばMarkerを使ったほうが楽です。

デバッグ目的

# 光らせる
{Glowing:true}

実際の使い方は、もちろん光らせるためにあるんですけど、私はデバッグ用途で使ってます。

なんのデバッグかって?

透明化したアマスタがどこにいるのか見えるようにするため!

光らせてしまえば、壁の向こう側でも見えますからね。便利です。

最後に

まだ指定できるNBTはいっぱいあるんですが、私はそこまで残りのやつは使わないです。

世の中にはUUIDとか指定してアレコレする人やAttributeでアレコレする人がいるそうですね。

世界は広いですね。

マイクラのexecuteについて備忘録

executeとは?

なにやら複雑で初見さんバイバイのexecuteコマンド。そんなexecuteも覚えてしまえば、あっちにもこっちにもexecute、どこを見てもexecute。そんな沼のようなコマンドです。

具体的に表現するのならば、コマンドに条件をつけるコマンドです。もっと雑に言うのであれば、ほぼすべてのコマンドに指定できるオプションです。

特に、mcfunctionファイルを使うのであれば必須級のコマンドです。

executeはどうやって使うの?

execute <ほにゃらら> run <コマンド>

上みたいな感じで、<ほにゃらら>部分に条件を書いた上でコマンドを実行するんですね。

基本的には、<ほにゃらら>の部分が結構多いので、私が使う頻度の高いものだけをサクっと説明しちゃいます。

execute <ほにゃらら> の一覧

  • [★★★] 必ず使うレベル
    • as : 誰が実行する
    • at : 誰の場所で実行する
    • if : もしも~だったら実行する
  • [★★] 結構使うレベル
    • unless : もしも~じゃなかったら実行する
    • store : 実行した結果を入れる
  • [★] 使うときは使うレベル
    • positioned : どこで実行する
    • facing : どこを向いて実行する
  • まず使わないレベル
    • anchored : 目/足を向いて実行する
    • align : 座標の小数点を無視して実行する
    • rotated : どこを向いて実行する
    • in : どの世界で実行する

基本はこんな感じです。まず使わないレベルは、本当に使わないので、そういうのがあるんだぁ程度に頭の片隅に置いといてください。まじで私は使わないので

この記事では、★★★~★までのオプションについて、ほんの少しずつ感覚的説明をします。

必ず使うレベル

as : 誰が実行する

まずは、どういうふうに使うか。

# 「プレイヤー全員が」testって言っちゃうコマンド
execute as @a run say test

# 「モブも含めて全員が」testって言っちゃうコマンド
execute as @e run say test

asというのは、エンティティを指定して、そのエンティティがコマンドを使うってオプションです。

@s について

エンティティの指定方法に@p(最も近いプレイヤー)、@a(全プレイヤー)、@r(ランダムに選択されたプレイヤー)、@e(全エンティティ)という種類があるじゃないですか。

その中の一つに@sというものが存在するんですね。

これ、何かというとasで指定したエンティティ(一人でも複数でも)が@sに割り当てられるのです。例えばこういう風に書くのは嫌じゃないですか。

# 普通はtpから後だけ書くけど、簡単な例として。
execute as @e[type=zombie,team=red,tag=aaa] run tp @e[type=zombie,team=red,tag=aaa] 10 60 10

それをこういうふうにかけちゃうんです。

# @sがasで指定した@e[type=zombie,team=red,tag=aaa]と同じ意味になる
execute as @e[type=zombie,team=red,tag=aaa] run tp @s 10 60 10

at : 誰の場所で実行する

まずは、どういうふうに使うか。

# 「全プレイヤーの場所に」石を設置する
execute at @a run setblock ~ ~ ~ stone

# 「ランダムなプレイヤーの場所に」クリーパーを召喚する
execute at @r run summon creeper ~ ~ ~

atというのは、エンティティを指定して、そのエンティティの場所を基準にコマンドを使うってオプションです。さらに、as@sと組み合わせると、もっと複雑なことができます。

# 全プレイヤーを、「とあるモブの場所に」移動させる
execute as @e[tag=point] at @s run tp @a ~ ~ ~

asで「とあるモブ」を指定して、atで「そのモブの場所」を指定すると、こんな感じで書けます。

ちなみに、テキストチャットでexecute無しのコマンドを打つと以下と同じようなことをやっていることになります。

# プレイヤーがその場所でsay test
execute as @p at @s run say test

if : もしも~だったら実行する

まずは、どういうふうに使うか。

execute if entity @p[gamemode=creative] run say "誰かがクリエになっている!"
    
execute if block 10 60 10 stone run say "10 60 10のブロックが石だ!"

execute if score @p SCORE matches 10 run say "誰かのSCOREというscoreboardの値が10だ!"

execute if score @p SCORE matches 1..8 run say "誰かのSCOREという値が1~8だ!"

ifというのは、何かが一致(もしくは存在)していたらコマンドを実行するってオプションです。

こいつがかなり種類が多いのです。つまり、なんでも「もしも」の条件が作れてしまうのです。

  • execute if entity:エンティティがいたら
  • execute if block:ブロックがあったら
  • execute if blocks:とある場所のブロックと一致していたら
  • execute if score:スコアボードの条件が一致していたら
  • execute if data:NBTやストレージが一致していたら
  • execute if predicate:predicateの条件が一致していたら

しかもそれぞれで、かなり深い所まで掘り下げられます。が、実際使うのは上で書いたサンプルがほとんどです。ストレージやpredicateは私は結構使うけど、その辺は過去のブログを参考にしてね。

keiduki.hatenablog.com keiduki.hatenablog.com

結構使うレベル

unless : もしも~じゃなかったら実行する

結論だけ先に書きます。ifの反対です。

ifが成功したら実行だったのに対し、unlessは失敗したら実行です。

execute unless entity @p[gamemode=creative] run say "誰もクリエじゃない!"
    
execute unless block 10 60 10 stone run say "10 60 10のブロックが石じゃない!"

execute unless score @p SCORE matches 10 run say "誰かのSCOREというscoreboardの値が10じゃない!"

execute unless score @p SCORE matches 1..8 run say "誰かのSCOREという値が1~8じゃない!"

ifが使えたら、unlessも使えるようになる。素晴らしいですね。

store : 実行した結果を入れる

まずは、どういうふうに使うか。

# say testって言えたら@pのSCOREに1をいれる。そうじゃなかったら0をいれる。
execute store success score @p SCORE run say test

# SCORE2の@pの値をSCOREの@pにコピーする
execute store result score @p SCORE run scoreboard players get @p SCORE2

# ボスの体力をボスバーに反映する
execute store result bossbar zombie-boss value run data get entity @e[tag=boss,limit=1] Health

storeは実行した結果を取得できる、他のオプションとは少し違うオプションです。

successはコマンドに成功した回数をいれます。ifとよく組み合わせて使いますね。

resultはコマンドで取得した結果をいれます。どちらかと言うと、resultの方がよく使うかも?

しかもこれらの結果はいろんなものに適用できるので、使い方を覚えれば結構、使えますよ。ただし、数値しか入れられないのが惜しいところ。

  • execute store <success|result> block:ブロックのNBTに値を入れる
  • execute store <success|result> bossbar:ボスバーの最大値もしくは現在値に入れる
  • execute store <success|result> entity:エンティティのNBTに値を入れる(プレイヤーは不可)
  • execute store <success|result> score:スコアボードに値を入れる
  • execute store <success|result> storage:ストレージに値を入れる

使うときは使うレベル

positioned : どこで実行する

まずは、どういうふうに使うか。

# 10 60 10の場所に石を置く
execute positioned 10 60 10 run setblock ~ ~ ~ stone

# 「ランダムなプレイヤーの場所に」クリーパーを召喚する
execute positioned as @r run summon creeper ~ ~ ~

positionedは、エンティティだろうが座標だろうが、どこでコマンドを実行するか決められるオプションです。見て分かる通り、positioned asはまさかのatとほとんど同じ意味です。つまり使いません。

座標指定で、好きな場所で実行できるのは嬉しいですね。特にcloneする時とかは。

facing : どこを向いて実行する

まずは、どういうふうに使うか。

# とあるモブが徐々にプレイヤーに近寄ってくる
execute as @e[tag=point] at @s facing entity @p feet run tp @s ^ ^ ^0.2

# 常に10 60 10の方角にパーティクルが出続ける(向こうにラピュタが…)
execute as @a at @s facing 10 60 10 run particle effect ^ ^1 ^2

facingは向いていたとして、その方向に対してコマンドを実行します。

だから、基本的には~ ~ ~ではなく^ ^ ^の向いている方向に対しての座標を指定します。

種類としては、以下があります。

  • execute facing entity <エンティティ> <eyes|feet>:エンティティの足元か頭を見る
  • execute facing <座標>:座標の方を見る

~ ~ ~ の座標と ^ ^ ^ の座標

~ ~ ~は言うまでもなく、それぞれx y zを表しています。

F3キーを押した時に中心に出てくる赤(x)と緑(y)と青(z)の線がこれですね。

# x方向に+1
~1 ~ ~

# y方向に+1
~ ~1 ~

# z方向に+1
~ ~ ~1

それに対して^ ^ ^は頭が向いている方向になります。

# 頭の左に+1
^1 ^ ^

# 頭の上に+1
^ ^1 ^

# 頭の正面に+1
^ ^ ^1

頭なので、視線です。視線なので、動きます。

なれるまでは時間がかかりますが、向いている方向に対してなにかする場合は、避けては通れない道です。

executeコマンドでfunctionコマンドを呼び出す

executeコマンドはあらゆるコマンドのオプションを付けられます。その中でも最も特殊なのが、functionコマンドを呼び出したときの挙動です。例えばこういうふうに呼び出したとしましょう。

execute as @a[team=red] at @s run function x:test

そしてfunctionの中でこういうふうに書くと。

tellraw @s {"text":"こんにちは!"}
tellraw @s {"text":"きょうもいい天気ですね!"}
summon ~ ~10 ~ creeper

なんと、executeのasatが、functionの中の全ての@sや座標に反映されるんです!

同じようなコマンドをいっぱい並べてた人は、executeでfunctionの時代ですよ!!