ルッキーのコマンドメモ

主にマイクラのコマンドやデータパックに関することを書いていきます。

(マイクラ 自作データパック紹介) 色々な種類の雨が降るようになるデータパック

色々な雨が降るデータパック

今回は自作データパックを紹介していきます。

名前は"Custom Rain"といって、色々な種類の雨が降るデータパックです

目次

利用可能なバージョン

1.20.1での動作を確認をしています。
おそらく1.20.xであれば動くと思います。

始め方

このデータパックを遊びたいワールドのdatapacksフォルダ内に入れてゲーム内で/reloadとうてば導入することができます。
導入後は自動的に動き始めます。

データパックの内容

このデータパックを導入すると、以下のように一定時間ごとに色々な種類の雨が降るようになります。

矢の雨が降ったり

炎の雨が降ったり

モブの雨が降ったりもします

降ってくる雨の種類

このデータパックでは現在は19種類の雨が存在します。
以下に降ってくる雨の種類を書いておきます。

よく起きる天候

  1. 矢の雨: 矢の雨を降らせます。
  2. 経験値: 少量の経験値の雨を降らせます。
  3. トライデント: トライデントの雨を降らせます。
  4. 炎: 炎の雨を降らせます。

少し珍しい天候

  1. ランダムアイテム: ランダムな種類のアイテムを降らせます。
  2. ランダムモブ: ランダムな種類のモブを降らせます。(ウォーデンなどのボスモブは対象外です。)
  3. ランダムポーション: バニラで入手できるスプラッシュポーションをランダムに降らせます。
  4. ランダムブロック: ランダムな種類のブロックを降らせます。
  5. ウィザースカル: ウィザースカルの雨です。
  6. 食料: 食料の中からランダムなものを降らせます。

かなり珍しい天候

  1. 衝撃波: 衝撃波の雨を降らせます。全ての雨の中で唯一、天井を貫通します。
  2. TNT: 着火済みTNTの雨を降らせます。
  3. 雷: 雷の雨を降らせます。
  4. 黄金: 金系アイテムの雨を降らせます。
  5. 敵対モブ: プレイヤーに敵対的なモブの雨を降らせます。(ウォーデン、エンダードラゴン、ウィザーは対象外です。)

滅多に起きない天候

  1. 鍛治型: 鍛治型の雨を降らせます。
  2. 財宝: 鉱石や鉱石ブロックの雨を降らせます。
  3. 火球: ファイヤーボールの雨を降らせます。威力は通常よりも大きくなっています。
  4. ドラゴンブレス: ドラゴンブレスの雨を降らせます。

配布場所

以下の二つのサイトで配布しています。

  • Planet Minecraft

  • GitHub
    わかりにくいですが右側のReleaseというところからダウンロードできます。

(マイクラ コマンド・データパック)釣りのルートテーブル変更方法や応用例

釣りのルートテーブルを整理する

今回はマイクラの釣りのルートテーブルとその変更方法について紹介していきます

目次

デフォルトのルートテーブル

イクラの釣りのデフォルトのルートテーブルは以下のようになります(JE ver1.20.2のものです。)

fishing.json

{
  "type": "minecraft:fishing",
  "pools": [
    {
      "bonus_rolls": 0.0,
      "entries": [
        {
          "type": "minecraft:loot_table",
          "name": "minecraft:gameplay/fishing/junk",
          "quality": -2,
          "weight": 10
        },
        {
          "type": "minecraft:loot_table",
          "conditions": [
            {
              "condition": "minecraft:entity_properties",
              "entity": "this",
              "predicate": {
                "type_specific": {
                  "type": "fishing_hook",
                  "in_open_water": true
                }
              }
            }
          ],
          "name": "minecraft:gameplay/fishing/treasure",
          "quality": 2,
          "weight": 5
        },
        {
          "type": "minecraft:loot_table",
          "name": "minecraft:gameplay/fishing/fish",
          "quality": -1,
          "weight": 85
        }
      ],
      "rolls": 1.0
    }
  ],
  "random_sequence": "minecraft:gameplay/fishing"
}

何が出るかを決めているのは上から6行目の"entries"という部分の中になります。

下から5行目の"rolls"で設定された回数だけ、この"entries"の中からどれか一つが抽選されます。

"entries"の中にはジャンクアイテム(ゾンビ肉や骨などのハズレアイテム)、宝アイテム(エンチャント本など)、魚の3つの要素が入っています。

それぞれの要素が選択される確率を決めているのが"weight"と"quality"という部分です。

1回の抽選でそれぞれの要素が選択される確率は以下の計算式で表されます。

(選択される確率) = (その要素のweight) / (全要素のweightの和)

また、"quality"という部分により、プレイヤの幸運の値によってweightが変動します。

その変化量は以下の計算式で求められます。

(weightの変化量) = (その要素のquality) × (プレイヤの幸運の値)

そのため、プレイヤの幸運の値が85を超えると宝しか釣れなくなり、一方で幸運の値が-5以下になると宝は一切釣れなくなります。

ちなみに、宝釣りによるエンチャント効果もおそらく幸運の値をレベル分上昇させるものだと考えられます。(幸運値を-85にした状態で宝釣り85レベルの釣竿で釣りをすると三種類全てのアイテムが釣れたため)

3種類のアイテムの中身

上記の釣りのルートテーブルでは釣りをするごとに1回抽選が行われ、ジャンクアイテム、宝アイテム、魚の3種類の中のどれかが出現するように設定されていました。

3種類それぞれのアイテムの中から具体的に何が釣れるのかを決めるのが以下のルートテーブルです。

ジャンクアイテム

junk.json

{
  "type": "minecraft:fishing",
  "pools": [
    {
      "bonus_rolls": 0.0,
      "entries": [
        {
          "type": "minecraft:item",
          "name": "minecraft:lily_pad",
          "weight": 17
        },
        {
          "type": "minecraft:item",
          "functions": [
            {
              "add": false,
              "damage": {
                "type": "minecraft:uniform",
                "max": 0.9,
                "min": 0.0
              },
              "function": "minecraft:set_damage"
            }
          ],
          "name": "minecraft:leather_boots",
          "weight": 10
        },
        {
          "type": "minecraft:item",
          "name": "minecraft:leather",
          "weight": 10
        },
        {
          "type": "minecraft:item",
          "name": "minecraft:bone",
          "weight": 10
        },
        {
          "type": "minecraft:item",
          "functions": [
            {
              "function": "minecraft:set_potion",
              "id": "minecraft:water"
            }
          ],
          "name": "minecraft:potion",
          "weight": 10
        },
        {
          "type": "minecraft:item",
          "name": "minecraft:string",
          "weight": 5
        },
        {
          "type": "minecraft:item",
          "functions": [
            {
              "add": false,
              "damage": {
                "type": "minecraft:uniform",
                "max": 0.9,
                "min": 0.0
              },
              "function": "minecraft:set_damage"
            }
          ],
          "name": "minecraft:fishing_rod",
          "weight": 2
        },
        {
          "type": "minecraft:item",
          "name": "minecraft:bowl",
          "weight": 10
        },
        {
          "type": "minecraft:item",
          "name": "minecraft:stick",
          "weight": 5
        },
        {
          "type": "minecraft:item",
          "functions": [
            {
              "add": false,
              "count": 10.0,
              "function": "minecraft:set_count"
            }
          ],
          "name": "minecraft:ink_sac"
        },
        {
          "type": "minecraft:item",
          "name": "minecraft:tripwire_hook",
          "weight": 10
        },
        {
          "type": "minecraft:item",
          "name": "minecraft:rotten_flesh",
          "weight": 10
        },
        {
          "type": "minecraft:item",
          "conditions": [
            {
              "condition": "minecraft:any_of",
              "terms": [
                {
                  "condition": "minecraft:location_check",
                  "predicate": {
                    "biome": "minecraft:jungle"
                  }
                },
                {
                  "condition": "minecraft:location_check",
                  "predicate": {
                    "biome": "minecraft:sparse_jungle"
                  }
                },
                {
                  "condition": "minecraft:location_check",
                  "predicate": {
                    "biome": "minecraft:bamboo_jungle"
                  }
                }
              ]
            }
          ],
          "name": "minecraft:bamboo",
          "weight": 10
        }
      ],
      "rolls": 1.0
    }
  ],
  "random_sequence": "minecraft:gameplay/fishing/junk"
}

宝アイテム

treasure.json

{
  "type": "minecraft:fishing",
  "pools": [
    {
      "bonus_rolls": 0.0,
      "entries": [
        {
          "type": "minecraft:item",
          "name": "minecraft:name_tag"
        },
        {
          "type": "minecraft:item",
          "name": "minecraft:saddle"
        },
        {
          "type": "minecraft:item",
          "functions": [
            {
              "add": false,
              "damage": {
                "type": "minecraft:uniform",
                "max": 0.25,
                "min": 0.0
              },
              "function": "minecraft:set_damage"
            },
            {
              "function": "minecraft:enchant_with_levels",
              "levels": 30.0,
              "treasure": true
            }
          ],
          "name": "minecraft:bow"
        },
        {
          "type": "minecraft:item",
          "functions": [
            {
              "add": false,
              "damage": {
                "type": "minecraft:uniform",
                "max": 0.25,
                "min": 0.0
              },
              "function": "minecraft:set_damage"
            },
            {
              "function": "minecraft:enchant_with_levels",
              "levels": 30.0,
              "treasure": true
            }
          ],
          "name": "minecraft:fishing_rod"
        },
        {
          "type": "minecraft:item",
          "functions": [
            {
              "function": "minecraft:enchant_with_levels",
              "levels": 30.0,
              "treasure": true
            }
          ],
          "name": "minecraft:book"
        },
        {
          "type": "minecraft:item",
          "name": "minecraft:nautilus_shell"
        }
      ],
      "rolls": 1.0
    }
  ],
  "random_sequence": "minecraft:gameplay/fishing/treasure"
}

fish.json

{
  "type": "minecraft:fishing",
  "pools": [
    {
      "bonus_rolls": 0.0,
      "entries": [
        {
          "type": "minecraft:item",
          "name": "minecraft:cod",
          "weight": 60
        },
        {
          "type": "minecraft:item",
          "name": "minecraft:salmon",
          "weight": 25
        },
        {
          "type": "minecraft:item",
          "name": "minecraft:tropical_fish",
          "weight": 2
        },
        {
          "type": "minecraft:item",
          "name": "minecraft:pufferfish",
          "weight": 13
        }
      ],
      "rolls": 1.0
    }
  ],
  "random_sequence": "minecraft:gameplay/fishing/fish"
}

釣りからモブが釣れるようにする

釣りのルートテーブルにモブと変換するためのアイテムを追加し、そのアイテムの座標にモブを召喚して、アイテムをkillすることで、擬似的に釣りによってモブが釣れるようになります。

詳しくは釣りからモブが釣れるようにする方法を参照してください。

実装方法

まずデフォルトのルートテーブルを以下のように書き換えます。

fishing.json

{
  "type": "minecraft:fishing",
  "pools": [
    {
      "bonus_rolls": 0.0,
      "entries": [
        {
          "type": "minecraft:loot_table",
          "name": "minecraft:gameplay/fishing/junk",
          "quality": -2,
          "weight": 10
        },
        {
          "type": "minecraft:loot_table",
          "conditions": [
            {
              "condition": "minecraft:entity_properties",
              "entity": "this",
              "predicate": {
                "type_specific": {
                  "type": "fishing_hook",
                  "in_open_water": true
                }
              }
            }
          ],
          "name": "minecraft:gameplay/fishing/treasure",
          "quality": 2,
          "weight": 5
        },
        {
          "type": "minecraft:loot_table",
          "name": "minecraft:gameplay/fishing/fish",
          "quality": -1,
          "weight": 85
        },
        {
          "type": "minecraft:loot_table",
          "name": "test:mobs",
          "quality": 0,
          "weight": 50
        }
      ],
      "rolls": 1.0
    }
  ],
  "random_sequence": "minecraft:gameplay/fishing"
}

これによって、釣りをした時に(特に幸運値が変化していなければ)3回に1回の確率でtest:mobsというルートテーブルが適用されるようになりました。

次に、このルートテーブルを以下のように設定します。

mobs.json

{
  "type": "minecraft:fishing",
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:item",
          "name": "minecraft:stone",
          "functions": [
            {
              "function": "minecraft:set_nbt",
              "tag": "{fishing:1}"
            }
          ]
        }
      ]
    }
  ]
}

以上の設定により、釣りをすると3回に1回{fishing:1}というタグがついた石が釣れるようになります。

あとは、以下のようにコマンドを毎tick実行してアイテムとモブを置き換えることにより、擬似的にモブが釣れるようになります。

tick.mcfunction

# ゾンビを召喚してアイテムのMotionの値を代入
execute as @e[type=item,nbt={Item:{tags:{fishing:1}}}] at @s positioned ~ ~1 ~ summon zombie run data modify entity @s Motion set from entity @e[type=item,nbt={Item:{id:"minecraft:stone"}},sort=nearest,limit=1] Motion

#釣れたアイテムをkill
kill @e[type=item,nbt={Item:{tags:{fishing:1}}}]

特定の釣竿を使った時だけ別のアイテムが釣れるようにする

特定の釣竿を使った時だけ、別のアイテムが釣れるようにする方法です。
今回は{sugoi_turizao:1}というタグがついたアイテムを使った場合だけ石が釣れるようにします。

まず、datapack内にデフォルトの釣りのルートテーブルをコピーしておきます。
今回は<data/test/loot_tables/fishing.json>にコピーしておいたものとします。

そして、以下のようにデフォルトの釣りのルートテーブルを書き換えます。

fishing.json

{
  "type": "minecraft:fishing",
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:alternatives",
          "children": [
            {
              "type": "minecraft:item",
              "name": "minecraft:stone",
              "conditions": [
                {
                  "condition": "minecraft:match_tool",
                  "predicate": {
                    "nbt": "{sugoi_turizao:1}"
                  }
                }
              ]
            },
            {
              "type": "minecraft:loot_table",
              "name": "test:fishing"
            }
          ]
        }
      ]
    }
  ]
}

"alternatives"というのは"children"の中に設定されている要素の中で上から順番に条件が当てはまるものを調べていき、一番最初に条件が当てはまったものを適用するというものになります。

今回であれば、釣りをしたプレイヤの使っていたアイテムに{sugoi_turizao:1}というタグがついていれば、石が釣れ、それ以外の場合であれば、別の場所にコピーしたデフォルトの釣りのルートテーブルを使用するようにしています。

このようにして、特定の釣竿で釣った場合だけ、別のアイテムが釣れるようにすることができます。

まとめ

このように釣りのルートテーブルを編集することで、モブが釣れるようにしたり、特定の釣竿を使った場合だけ別のアイテムを釣れるようにしたりすることができます。

(マイクラ コマンド・データパック)釣りからモブが釣れるようにする方法

釣りからモブが釣れるようにする方法

今回は釣りからモブが釣れるようにする方法を紹介します。

目次

基本的な方針

モブが釣れるようにするための基本的な方針としては、釣れたアイテムの座標にモブを出現させ、釣れたアイテムはkillすることになります。

例えば、以下のようなコマンドを毎tick実行すれば、鮭が釣れた時に代わりにゾンビが出現するようになります。

execute as @e[type=item,nbt={Item:{id:"minecraft:salmon"}}] at @s run summon zombie
kill @e[type=item,nbt={Item:{id:"minecraft:salmon"}}]

釣れた時にプレイヤの方へ飛んでくるようにしたい場合

基本的な方針で紹介したコマンドのままでは、釣れた瞬間に釣り竿の針があったところにモブが出現するだけになります。

アイテムを釣り上げた時と同じようにプレイヤの方へ飛んでくるようにしたい場合には、以下のように釣れたアイテムのMotionを代入する必要があります。

# ゾンビを召喚してアイテムのMotionの値を代入
execute as @e[type=item,nbt={Item:{id:"minecraft:salmon"}}] at @s positioned ~ ~1 ~ summon zombie run data modify entity @s Motion set from entity @e[type=item,nbt={Item:{id:"minecraft:stone"}},sort=nearest,limit=1] Motion
#釣れたアイテムをkill
kill @e[type=item,nbt={Item:{id:"minecraft:salmon"}}]

他のアイテムを消さずにモブを釣れるようにする

これまで紹介したコマンドでは、モブの召喚用に設定したアイテムはすべて消されてモブに変換されてしまうため、モブを1種類追加するごとにアイテムが一つ入手できなくなってしまいます。

そこで、釣りから釣れるアイテムにモブと変換するためだけのアイテムを追加で設定してやることにより、元々の釣りのアイテムを維持したままモブも釣れるようにできます。

デフォルトの釣りのルートテーブル

まず、通常の状態の釣りのルートテーブルを紹介します。

少し長いですがこのようになっています。

{
  "type": "minecraft:fishing",
  "pools": [
    {
      "bonus_rolls": 0.0,
      "entries": [
        {
          "type": "minecraft:loot_table",
          "name": "minecraft:gameplay/fishing/junk",
          "quality": -2,
          "weight": 10
        },
        {
          "type": "minecraft:loot_table",
          "conditions": [
            {
              "condition": "minecraft:entity_properties",
              "entity": "this",
              "predicate": {
                "type_specific": {
                  "type": "fishing_hook",
                  "in_open_water": true
                }
              }
            }
          ],
          "name": "minecraft:gameplay/fishing/treasure",
          "quality": 2,
          "weight": 5
        },
        {
          "type": "minecraft:loot_table",
          "name": "minecraft:gameplay/fishing/fish",
          "quality": -1,
          "weight": 85
        }
      ],
      "rolls": 1.0
    }
  ],
  "random_sequence": "minecraft:gameplay/fishing"
}

内容を簡単に説明します。

  • 1回釣りを行うごとに上記のルートテーブルから一回抽選が行われます。

  • 抽選によってジャンクアイテム、宝アイテム、魚のどれか一つのルートテーブルを選択する

    このルートテーブルではランダムにジャンクアイテム、宝アイテム、魚のどれかが釣れるように設定されています。
    それぞれが釣れる確率に10、5、85という確率の重みがつけられていて、これを重みの合計で割った値がそれぞれのアイテムが釣れる確率になります。

    今回の場合は重みの合計が100なのでそれぞれ10%、5%、85%という確率になります。

    なお、この重みの値はweightという部分に記載されていますが、(プレイヤの幸運の値)×(qualityの値)だけ変動します。

  • 選択されたルートテーブルからアイテムを出現させる。

    選択された、ジャンクアイテム、宝アイテム、魚のどれかのルートテーブルからアイテムを出現させます。

デフォルトのルートテーブルの書き換え方

デフォルトの釣りのルートテーブルを書き変えるには

データパックのdata/minecraft/loot_tables/gameplayfishing.jsonという名前でファイルを作る必要があります。

例えば、以下のように書き換えます

fishing.json

{
  "type": "minecraft:fishing",
  "pools": [
    {
      "bonus_rolls": 0.0,
      "entries": [
        {
          "type": "minecraft:loot_table",
          "name": "minecraft:gameplay/fishing/junk",
          "quality": -2,
          "weight": 10
        },
        {
          "type": "minecraft:loot_table",
          "conditions": [
            {
              "condition": "minecraft:entity_properties",
              "entity": "this",
              "predicate": {
                "type_specific": {
                  "type": "fishing_hook",
                  "in_open_water": true
                }
              }
            }
          ],
          "name": "minecraft:gameplay/fishing/treasure",
          "quality": 2,
          "weight": 5
        },
        {
          "type": "minecraft:loot_table",
          "name": "minecraft:gameplay/fishing/fish",
          "quality": -1,
          "weight": 85
        },
        {
          "type": "minecraft:loot_table",
          "name": "test:mobs",
          "quality": 0,
          "weight": 50
        }
      ],
      "rolls": 1.0
    }
  ],
  "random_sequence": "minecraft:gameplay/fishing"
}

ルートテーブルの下の方に新しく5行ほど追加されているのがわかると思います。

内容としては、重みが50でqualityが0の確率でtestという名前空間内のmobsというルートテーブルを適用するというものです。

重みが50であるので重みの合計値が150になり、3回に一回の確率でmobsというルートテーブルが適用されることになります。

あとは、以下のようにルートテーブルを作成して、このアイテムに対して今まで紹介したようなコマンドを動かすだけです。

mobs.json

{
  "type": "minecraft:fishing",
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:item",
          "name": "minecraft:stone",
          "functions": [
            {
              "function": "minecraft:set_nbt",
              "tag": "{fishing:1}"
            }
          ]
        }
      ]
    }
  ]
}

tick.mcfunction

# ゾンビを召喚してアイテムのMotionの値を代入
execute as @e[type=item,nbt={Item:{tags:{fishing:1}}}] at @s positioned ~ ~1 ~ summon zombie run data modify entity @s Motion set from entity @e[type=item,nbt={Item:{id:"minecraft:stone"}},sort=nearest,limit=1] Motion
#釣れたアイテムをkill
kill @e[type=item,nbt={Item:{tags:{fishing:1}}}]

mobs.jsonでは必ず、{fishing:1}というタグのついた石が出現するようになっています。

そのため、tick.mcfunction内でこのタグがついたアイテムをモブにするように設定することで、釣りからモブが出現するようになります。

まとめ

釣れたアイテムの座標にモブを召喚してアイテムは消すことにより、擬似的にモブが釣れるようにすることができます。

通常の釣りから釣れるアイテムを消したくない場合には、デフォルトの釣りのルートテーブルを変更して、モブとかきかえるためだけのアイテムを釣れるようにする必要があります。

(マイクラ コマンド・データパック ) プレイヤがチェストや樽を開けたことを調べる方法

プレイヤがチェストや樽を開けたことを調べる方法

今回はプレイヤがチェストを開けたことを調べる方法を紹介します

目次

スコアを使ってプレイヤがチェストを開いたことを検知する

以下のようにチェストや樽を開けた回数を記録するスコアを利用することにより、プレイヤがチェストを開けたかを調べることができます。

#チェストを開けた回数を記録するスコア

scoreboard objectives add open minecraft.custom:minecraft.open_chest

あとは、スコアが1以上のプレイヤに対して操作を実行すれば、チェストを開けたプレイヤに対して操作を行えます。

# チェストを開けたプレイヤにopenとチャットに表示させる
execute as @a if score @s open matches 1.. run say open

# スコアをリセット
scoreboard players reset @a open

特定の位置にある樽が開かれているかを調べる

チェストには開かれていることを検知するためのnbtやblockstateがないので特定の地点にあるチェストが開かれているかを厳密に検知することはできません。

一方、樽はblockstateを利用して開かれていることを調べられるため、特定の位置の樽が開かれているかを調べられます。

以下のように、execute コマンドを利用することで調べられます。

#コマンドの実行地点にあるブロックが開いている樽であればopenと表示する
execute if block ~ ~ ~ barrel[open=true] run say open

これはblockstateのopenを利用しています。

特定の樽が閉じられたことを調べる

逆に特定の樽が閉じられたことを調べる方法を紹介します

以下のような樽を毎tick実行します

# 樽が開かれたらtestスコアを1に設定
execute if score @s test matches 0 if block ~ ~ ~ barrel[open=true] run scoreboard players set @s test 1

# testスコアが1で樽が閉じられていたらcloseとチャットに表示
execute if score @s test matches 1 if block ~ ~ ~ barrel[open=false] run say close
# testスコアを0にする
execute if score @s test matches 1 if block ~ ~ ~ barrel[open=false] run scoreboard players set @s test 0

これは、以下のような流れで樽が閉じられたことを検知しています

  • testスコアが1の時に樽が開かれればtestスコアを1にする

  • testスコアが1の時に樽が閉じられているならばこの瞬間タルが閉じられたとみなし、チャットに表示する

  • testスコアが1の時に樽が閉じられていればtestスコアを0に戻す

今回はコマンドの実行地点にある樽を調べましたが、例えば樽の座標に特定のタグをつけた防具立てを置いておけば、以下のようにして一度に複数の樽が閉じられたかを調べることもできます。

# testというタグがついた防具たての座標にある樽が空いているかを調べ、空いていればtestスコアを1に
execute as @e[type=armor_stand,tag=test] at @s if score @s test matches 0 if block ~ ~ ~ barrel[open=true] run scoreboard players set @s test 1

# 各防具立ての地点でtestスコアが1で樽が閉じられていたらチャットに表示
execute as @e[type=armor_stand,tag=test] at @s if score @s test matches 1 if block ~ ~ ~ barrel[open=false] run say close

# testスコアを0に
execute as @e[type=armor_stand,tag=test] at @s if score @s test matches 1 if block ~ ~ ~ barrel[open=false] run scoreboard players set @s test 0

まとめ

スコアボードのcustom:open_chestやcustom:open_barrelを利用してチェストや樽を開いたプレイヤに対しコマンドを実行することができます。

また、樽限定にはなりますがblockstateのopenを利用することにより、特定の位置の樽が開かれているかを調べることもできます。

(マイクラ コマンド・データパック) clearコマンドの使い方とその利用例

clearコマンドの使い方・応用例

今回はclearコマンドの使い方について紹介していきます。

このコマンドをうまく使えば、プレイヤのインベントリから特定のnbtを持ったアイテムだけを消したり、プレイヤが特定のアイテムを持っているかを検知したりと、データパックを作る上でのかなり有用な操作ができるようになります。

目次

clearコマンドの基本的な使い方

まず、clearコマンドの基本的な使い方を説明しておきます。

このコマンドの構文は以下のようになります。

clear <対象> <消したいアイテム> <最大個数>

例えば、プレイヤのインベントリにある石を全て消したいのであればこのような構文になります。

# プレイヤから石だけを消す
clear @p stone

また、アイテムの欄で、tagを指定することもできます。

# ダメージ増加1のエンチャントがついたダイヤの剣を1つだけ消す
clear @p diamond_sword{Enchantments:[{id:"minecraft:sharpness",lvl:1s}]} 1

さらに、アイテム欄にはアイテムタグを指定することもできます。

# #arrowsタグ、つまり光の矢と効果付きの矢と普通の矢を全て消す
clear @p #arrows

そして、アイテムを消す最大の個数を0に設定すれば、単純にプレイヤがアイテムを持っているかどうかを調べられます。

# プレイヤが#arrowsタグのアイテムを持っていたらyesと表示
execute store success score @p test run clear @p #arrows 0
execute if score @p test matches 1 run say yes

これはアイテムの個数を0に設定するとexecute store successでアイテムを持っていた場合に1、持っていなければ0の値が入ることを利用しています。

clearコマンドの利点

clearコマンドを使う利点は以下の2つが挙げられると思います。

プレイヤのインベントリのアイテムを消せる

まずはプレイヤのインベントリから簡単にアイテムを消せるという点が挙げられます

プレイヤのnbtデータは読み取り専用で編集不可能なので、clearコマンドを使わずにプレイヤのインベントリからアイテムを消そうとするとかなり面倒な操作が必要になります。
(プレイヤのnbtから該当するアイテムのスロット番号を取得、そのスロット番号のアイテムをitemコマンドにより消すという操作になります)

しかし、このコマンドを使えばたったの1コマンドだけでこの操作を行えます。この点はとても重要な点だと言えると思います。

アイテムタグを利用して操作を行える

個人的にはこちらの方が重要な点だと思うのですが、アイテムタグを指定してアイテムをけせるという点がこのコマンドの強みだと思っています。

clearコマンドの基本的な使い方の最後のコマンドでは、#arrowsというアイテムタグのアイテムを持っているかを検知していました。

これを利用すると、まず、このようなアイテムタグをデータパックのdata/<名前空間>/tags/itemsに以下のような形で作成して、

iron_armor.json

{
  "values": [
    "minecraft:iron_boots",
    "minecraft:iron_leggings",
    "minecraft:iron_chestplate",
    "minecraft:iron_helmet"
  ]
}

以下のようなコマンドを打つことで、作成したアイテムタグ内に指定したアイテム、つまり今回であれば全ての鉄装備を消すことができます。

# 鉄装備を全て消す
clear @p #<名前空間>:iron_armor

clearコマンドの応用例

clearコマンドの応用例を紹介します

プレイヤのインベントリから特定のタグがついたアイテムのみを消す

例えば、配布マップなどで、チェストの装飾用や表示用のアイテムとして、プレイヤがインベントリに入れた場合にすぐに消すアイテムを作りたいとします。

しかし、表示用のアイテム一つ一つにclearコマンドを指定して毎tickコマンドを実行するのは処理がとても重くなりますし、書くのが面倒です。

そこで、そのようなアイテムに対して例えば{display_item:1}というような形でカスタムタグをつけておき、表示用に使うアイテム全てを書いたアイテムタグを作成しておけば、

このようなコマンド1つで全てのアイテムを消すことができます。

clear @p #<名前空間>:<作ったアイテムタグの名前>{display_item:1} 

まとめ

clearコマンドを使うことで、プレイヤのインベントリから特定のアイテムを消すことができます。

さらにアイテム名の指定部分でアイテムタグを指定することもでき、あらかじめ自分でアイテムタグを作っておけば、指定したアイテム全てを1コマンドだけで消すこともできます。

(マイクラ 自作データパック紹介) モブの装備をワンクリックで編集できる便利ツールを追加するデータパック「Dress-up Rod」

プレイヤやモブの装備をワンクリックで変えられるデータパック

今回は半年前くらいに作ったデータパックを紹介していきたいと思います。

データパック名は"Dressup Rod"というもので、モブやプレイヤの装備を簡単に変えられる便利系ツールを追加するデータパックです。

目次

利用可能なバージョン

1.20.1と、1.20.2で動作を確認しています。
1.20より前のバージョンでは機能しません。
マルチプレイでも利用できるように作ったはずですが動作が未確認なのでおそらくバグがあると思われます。

アイテムの取得方法

このデータパックを導入した上で以下のコマンドを実行することでDress-up Rodというアイテムを入手できます。

/function dressup_rod:give

実行結果。Dressup Rodというブレイズロッドが手に入る

基本的な使い方

このアイテムの基本的な使い方は以下のようなものになります。

使用するキー 操作内容
左クリック 現在の設定を視線先のエンティティに反映する
スニーク + 左クリック 利用する機能を変更する
右クリック 現在の機能の設定を変更する
スニーク + 右クリック 設定を適用する部位を変更する
アイテムを捨てる 現在の設定をプレイヤに反映する
スニーク + アイテムを捨てる 直前の操作を元に戻す

どの操作もこのアイテムをメインハンドに持って行う必要があります。

左クリックによる操作の対象になるエンティティには以下のように発光エフェクトがつきます。

発光がついたエンティティが左クリックで編集される

それぞれの機能

それぞれの機能について紹介していきます

好きな防具を着せるArmor

modeの部分をArmor.materialに設定すると対象としたモブの装備の材質を自由に変えることができます。例えば全身をダイヤ装備にするとか、頭だけかわ装備にするといった感じです。

このような感じで装備を変えられます。

防具たての全身装備を変えてみた

防具の装飾を変えるTrim.patternとTrim.material

1.20から追加された防具の装飾を変更できる機能です。

Trim.patternとTrim.materialの2つのモードがありますがどちらも設定しないと見た目に反映されません。

防具の装飾変更結果

革装備の色を変えるColor

かわ装備の色を自由に変えられる機能です。

指定できる色は16種類あります。

このように色を自由に変えられる

エンチャントの光を付与できるGlint

エンチャントの光をつけることができる機能です

このエンチャントは見た目だけで効果は特にありません

とてもわかりにくいですが一応光ってます

装備の内容を保存して他のモブに反映できるSave&Load

Saveモードで対象としたモブの現在の装備設定をストレージに保存でき、Loadモードで保存したストレージの装備内容を反映させることもできます。

大量に同じ装備のモブや防具立てを作りたいときに便利です。

SaveとLoad機能を使ってプレイヤや他の対象に装備をコピーできる

配布場所

以下の二つのサイトで配布しています。

  • Planet Minecraft

  • GitHub
    わかりにくいですが右側のReleaseというところからダウンロードできます。

最後に

このデータパックはダウンロードして遊ぶなり、解体して自分のデータパックに取り込むなり自由に使っていただいて大丈夫です。

個人的に気に入っているデータパックなので遊んでいただけると幸いです。

(マイクラ コマンド・データパック) セレクタ引数dx,dy,dzの使い方

セレクタ引数のdx,dy,dzの使い方

今回はセレクタ引数のdx,dy,dzの使い方や、似たような引数であるdistance引数との違い、応用例などについて紹介していきます。

目次

dx,dy,dz引数とは

dx,dy,dzといった引数は基準点からの立方体型の範囲を指定してその範囲内に当たり判定があるエンティティを対象とするというセレクタです。

特徴的な点として、エンティティの座標ではなく、当たり判定があるかどうかで対象を取るかを決めるという点があります。

そのため、魔法や銃のようなアイテムを作る場合のhit判定を取るためにこのセレクタが使われることが多いです。

distance引数との違い

以上で挙げたように、dx,dy,dzでは当たり判定を基準とするという点でエンティティの座標を基準とするdistance引数とは大きく異なります。

また、dx,dy,dzは立方体型の範囲を選択するのに対して、distance引数は球形の範囲を選択するという特徴もあります。

dx,dy,dzのつまずきやすい仕様

このdx,dy,dzという引数は上記に挙げたような特徴から、それなりに使う場面がある引数です。

しかし、この引数は少し面倒な仕様を持っていて何も考えずに使ってしまうと思い通りに動いてくれないことがよくあります。

実際にコマンドを実行しながら解説していきます。

1辺が1より小さい範囲を指定できない

特につまずきやすい仕様が、1辺が1より小さい範囲が指定できないという点です。

このセレクタ引数の使おうと思ったとき、よく以下のようなコマンドを使うことが思い浮かびます

# bulletというタグがついたエンティティに触れているエンティティを発光させる
execute as @e[tag=bullet] at @s run effect give @e[tag=!bullet,dx=0.01,dy=0.01,dz=0.01] glowing 1 1

これは銃を作る場合を想定して、銃の玉として扱うエンティティにbulletというタグをつけ、これに触れたエンティティを発光させるというコマンドの失敗例となります。

一見、bulletというタグがついたエンティティがいる座標から一辺が0.01の立方体の中にいるエンティティを対象ととるというコマンドになっているように見えます。

しかし、実行してみるとこのような結果になります。

実行結果。なぜか一部の防具立てが反応する

真ん中の白いエフェクトがbulletというタグのついたエンティティがいる場所になります。

本来ならどの防具立ても中心の白いエフェクトには触れていないので、どの防具立ても発行しないはずです。

しかし、一部の防具立ては発光してしまいます。

これは、dx,dy,dzという引数を指定した場合、最小でも必ず1辺が1の立方体を指定してしまうという使用によるものです。

これを覚えていないと、なぜか思った通りの挙動をしてくれず、原因もわからないため混乱することになります。

必ず正の方向に0から1の範囲は対象になる

上記のように、dx,dy,dzという引数は1辺が1より小さい範囲を指定できないという面倒な仕様があります。

では、次にこのようなコマンドを実行することを考えてみます。

# bulletというタグがついたエンティティからz方向に0から5,x方向に0から-2の範囲に触れているエンティティを発光させる
execute as @e[tag=bullet] at @s run effect give @e[tag=!bullet,dx=-2,dz=5] glowing 1 1

コマンド上ではz軸方向に0から5,x方向に-2から0の範囲に当たり判定があるエンティティが発光するはずです。

しかし、実行結果は以下のようになります。(左がx軸正方向、上がz軸正方向です。)

実行結果。 なぜかx方向で1の座標にある防具立ても反応する

x軸の正方向は指定していないはずですが、x座標が1のところにある防具立ても反応しています。

このように、たとえ負の値を引数に入れたとしても、必ず正方向に0から1の範囲が指定されてしまうという仕様があります。

当たり判定のないエンティティを指定できない

これは、仕様というよりは当たり前のことなのですが、たまにつまずくので一応紹介します。

dx,dy,dzは当たり判定があるかで検知を行うため、そもそも当たり判定がないエンティティは検知することができません。

全ての防具立てに対してMarkerというnbtを1にして、必ず正の方向に0から1の範囲は対象になるで使用したコマンドをもう一度実行してみます。

結果は以下のようになります。

実行結果。範囲内に存在するはずの防具立ても反応しない

先ほどは反応していたはずの防具立ても反応しません。

これは防具立てのMarkerというnbtを1にすると、当たり判定がなくなるため、dx,dy,dzでは検知できなくなるからです。

使用例

このdx,dy,dzといった引数の使用例を紹介します。

実行者の視線先にいるエンティティを発光させる

視線の先にいるモブやエンティティを調べるで紹介したコマンドと全く同じものです。

再帰呼び出しを利用して、プレイヤの視線の方向にmarkerを飛ばし、markerに当たり判定が触れたエンティティを対象に発光させています。

check.mcfunction

# 検知用にタグのついたmarkerを召喚する
execute at @s anchored eyes run summon marker ~ ~ ~ {Tags:["marker"]}

# マーカーの向きを実行者の視線の方向にする
execute at @s anchored eyes run data modify entity @e[tag=marker,sort=nearest,limit=1] Rotation set from entity @s Rotation

# ループ用のカウントを設定する
scoreboard players set count test 0
scoreboard players set loop test 50

#実行者を検知してしまわないようにtagをつけておく
tag @s add executer

# 再帰呼び出しにより視線先のエンティティを探す
execute at @s anchored eyes positioned ^ ^ ^ as @e[tag=marker,sort=nearest,limit=1] if score count test < loop test run function <名前空間>:check_loop

# 検知用のmarkerをkill
kill @e[type=marker,tag=marker]

# つけたtagを消す
tag @e[tag=executer] remove executer

# 検知したエンティティに発光エフェクトをつける
effect give @e[tag=detected] glowing 1 1

# 検知したエンティティからタグを消去する
tag @e[tag=detected] remove detected

# スコアをリセットする
scoreboard players reset count test
scoreboard players reset loop test

check_loop.mcfunction

# 検知用エンティティを視線先に0.1ブロックtpさせる
tp @s ^ ^ ^0.1

# 検知用エンティティを中心とした0.01×0.01×0.01の立方体の中に当たり判定があるエンティティにdetectedタグをつける
execute at @s positioned ~0 ~0 ~0 as @e[tag=!marker,tag=!executer,dx=0] positioned ~-0.99 ~-0.99 ~-0.99 if entity @s[dx=0] run tag @s add detected

# ループ処理。 detectedタグがついたエンティティがいなければ継続する
scoreboard players add count test 1
execute unless entity @e[tag=detected] at @s if score count test < loop test run function <名前空間>:check_loop

特に重要なのがこのコマンドです。

execute at @s positioned ~0 ~0 ~0 as @e[tag=!marker,tag=!executer,dx=0] positioned ~-0.99 ~-0.99 ~-0.99 if entity @s[dx=0] run tag @s add detected

このコマンドはdx,dy,dzの使用を利用して、markerにエンティティが触れたかを検知している部分になります。

1辺が1より小さい範囲を指定できないという仕様からdx=0という指定は、正方向に1辺1の立方体の範囲を指定することになります。

これで検知されたエンティティのうち、さらに各方向に-0.99ずつした座標から正方向に1辺1の立方体の範囲でも検知できるエンティティを指定することにより、実質的に1辺が0.01の立方体に触れているエンティティを対象としています。

今回は見つけたエンティティを発光させるだけですが、これをdamageコマンドにしたり、ループ時にmarkerにパーティクルを出したりすることで、魔法や銃の球を作ることができます。

まとめ

dx,dy,dzという引数は指定した範囲内に当たり判定があるエンティティを対象としてコマンドを実行することができます。

この当たり判定があるかを対象とするという使用から、視線の先にいるエンティティの検知や、銃や魔法のhit判定を調べるのにこの引数を応用することができます。