ルッキーのコマンドメモ

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

(マイクラ コマンド・データパック)マイクラのブロック破壊速度を計算する。

イクラのブロック破壊速度について

今回はマイクラにおけるブロックの破壊速度について説明します。

以前に紹介したように1.20.5以降のマインクラフトではアイテムに対してブロックの破壊速度を設定できるようになりました。

ブロックの破壊速度を設定する方法については以下の記事で紹介しています。

rukky-321.hatenablog.com

この方法ではアイテムに対して採掘速度を指定できますが、実際に破壊にはどのくらいの時間がかかるかということはわからず、どのくらいの数値を指定するべきかを考えるのが難しいです。

そこで、今回はマイクラの採掘にかかる時間の計算式を説明します。

目次

基本的な計算式

まず、基本的な採掘時間の計算式を紹介します。

ブロックの破壊にかかる時間は以下の計算式で求められます。

ブロック破壊速度
<採掘時間(秒)>= \frac{<ブロックの硬度>}{<採掘効率>}

<採掘効率> = \frac{<ツールの採掘速度>}{1.5} (適正ツールの時)

<採掘効率> = \frac{<ツールの採掘速度>}{5} (適正ツールでない時)



たとえば、ダイヤツルハシで黒曜石を壊す時にかかる時間は以下のように計算できます。

ダイヤツルハシで黒曜石を壊す時
<採掘効率> = \frac{8}{1.5} = 5.333(ダイヤツルハシは黒曜石の適正ツール)

<採掘時間(秒)> = \frac{50}{5.333} = 9.38秒(黒曜石のブロック硬度は50)



このようにして、採掘には9.38秒かかることがわかります。

なお、マイクラの時間の最小単位は1tick(0.05秒)なので、実際は9.4秒かかります。

エンチャントや採掘速度エフェクトがある場合

上記の計算式は採掘速度のエフェクトや効率強化のエンチャントがなく、プレイヤが地上で足が地面についている場合の計算式です。

エンチャントがついているといった場合には以下のような式になります。

エンチャントや採掘速度エフェクトがある場合の計算式
<採掘時間(秒)>= \frac{<ブロックの硬度>}{<有効採掘効率>}

<基本採掘効率> = \frac{<ツールの採掘速度>+ (1+<効率強化のレベル>^2)}{1.5} (適正ツール時)

<基本採掘効率> = \frac{<ツールの採掘速度>}{5} (適正ツールでない時)

<有効採掘効率> =<基本採掘効率>\times \\
{(1 + (0.2 \times {<採掘速度上昇レベル>)}} \times {0.3^{\,\, min(<採掘速度低下レベル>,4)}}



注意点として、エンチャントの効果は適正ブロックに対してしか発動しません。

たとえば、丸石をツルハシで破壊する時には効率強化のエンチャント効果が発動しますが、斧で破壊する時には発動しません。

また、プレイヤが水中にいる場合には破壊に5倍の時間がかかります。

プレイヤの足が地面についていない場合にも5倍の時間がかかります。

ツールごとの採掘速度

ツールごとの採掘速度は以下の表のようになっています。

ツールの素材 採掘速度
なし 1
2
4
6
ダイヤ 8
ネザライト 9
12

計算例

実際に採掘時間の計算例を紹介します

素手で土を壊す時

最も簡単な例として、素手で土を壊す時の計算です。

土のブロック硬度は0.5で、素手なのでツールの採掘速度は1になります。

基本的な計算式から、以下のように計算できます。

土を素手で壊す時
<採掘効率> = \frac{1}{1.5} = 0.666(土の適正ツールは全て)

<採掘時間(秒)> = \frac{0.5}{0.666} = 0.75秒(土のブロック硬度は0.5)



よって、計算結果は0.75秒となります。

効率強化5の金のシャベルで土を壊す時

次に効率強化5の金のシャベルで土を壊す時です。

金なのでツールの採掘速度は12です。

エンチャントや採掘速度エフェクトがある場合から、以下のように計算できます。

土を素手で壊す時
<基本採掘効率> = \frac{12 + (1 + 5^2)}{1.5} = 25.333(シャベルは土の適正ツール)

<有効採掘効率> = 208\times 1 \times 1 = 25.333(エフェクトがないので変わらない)

<採掘時間(秒)> = \frac{0.5}{208} = 0.020秒(土のブロック硬度は0.5)



よって計算結果は0.020秒となります。これはマイクラの時間の最小単位である0.05秒より小さい値なので、ワンクリックで破壊することができます。

採掘速度低下1、上昇2で効率強化3のダイヤツルハシで黒曜石を壊す時

ダイヤなので採掘速度は8、黒曜石のブロック硬度は50です。

エンチャントや採掘速度エフェクトがある場合から、以下のように計算できます。

採掘速度低下1、上昇2で効率強化3のダイヤツルハシで黒曜石を壊す時
<基本採掘効率> = \frac{8 + (1 + 3^2)}{1.5} = 12(ダイヤツルハシは黒曜石の適正ツール)

<有効採掘効率> = 12 \times (1+(0.2\times2)) \times 0.3^{\,\,1} = 5.04

<採掘時間(秒)> = \frac{50}{5.04} = 9.92秒(黒曜石のブロック硬度は50)



よって10秒ほどで壊せることになります。

(マイクラ コマンド・データパック)ツールのブロック破壊速度を変更する方法

componentの使い方 tool編

今回はアイテムに対してブロックの破壊速度や適性ブロックを設定することができるtoolコンポーネントの使い方を紹介します。

このコンポーネントを利用することでほとんどのアイテムを一瞬で破壊するツールを作ったり、反対に特定のブロックしか破壊できないツールを作ったりすることができます。

目次

そもそもcomponentとは

toolコンポーネントについて説明する前に、まずcomponentとは何かについて説明します。

componentはminecraft1.20.5以降で導入されたコマンドの形式です。

いきなりcomponentと言われるとわからなくなってしまいますが、要は今まで使っていたアイテムの名前の変更やエンチャントの付与といったコマンドの書き方が変わっただけです。

たとえば1.20.4以前であればこのようなgiveコマンドで取得できたアイテムがあります。

# 伝説の剣という名前のダメージ増加255のエンチャントがついた剣を出す
/give @p diamond{display:{Name:'{"text":"伝説の剣"}'},Enchantments:[{id:"minecraft:sharpness",lvl:255}]} 1

このアイテムは1.20.5以降ではこのようなコマンドで入手することができます。

# 伝説の剣という名前のダメージ増加255のエンチャントがついた剣を出す
/give @p diamond_sword[custom_name='"伝説の剣"',enchantments={levels:{"minecraft:sharpness":255}}] 1

正直、大した違いはないです。 1.20.5以降ではコマンドの書き方が変わったんだなあというくらいの認識でいいと思います。

ただ、1.20.5以降、様々な種類のコンポーネントが追加されたため、以前ではできなかったブロックの破壊速度の変更のような、新しい設定を行うことができるようになりました。

toolコンポーネントの基本的な構文

では、toolコンポーネントについて説明します。 toolコンポーネントはそのアイテムが破壊できるブロックを指定したり、その速度を指定したりできるコンポーネントです。

基本的なtoolコンポーネントの構文は以下のようになります。

アイテム名[tool={default_mining_speed:<数値>,damage_per_block:<数値>,rules:{speed:<数値>,correct_for_drops:<true/false>,blocks:<単一のblock名/blockのリスト>}}]

たとえばこのようなコマンドにすると、鉄ブロックを一瞬で破壊できる鉄の剣を作れます。

# 斬鉄剣という名前の鉄ブロックに対して通常の10000倍の採掘速度になる鉄の剣を入手する
/give @p iron_sword[custom_name='"斬鉄剣"',tool={rules:[{speed:10000,blocks:["iron_block"]}]}] 1

このように一瞬で鉄ブロックを破壊できます。

それぞれのパラメータについて

以降ではtoolコンポーネントのそれぞれのパラメータについて詳しく解説していきます。

default_mining_speed (通常の採掘速度)

default_mining_speedはそのアイテムのデフォルトの採掘速度です。
何も設定していない時、この数値は1です。

これを2にすれば全てのブロックを通常の2倍の速度で破壊することができます。

ツルハシに対して設定しても土が早く壊せてしまうというように全てのブロック対して影響してしまうので少し扱いが難しいかもしれません。

これはなんでも通常の1000倍の速度で破壊できるダイヤツルハシのコマンドです。

# なんでも100倍の速度で破壊できるツルハシを入手
/give @p diamond_pickaxe[tool={default_mining_speed:1000,rules:[]}] 1

damage_per_block (使用時の耐久減少量)

damage_per_blockを設定するとアイテム使用時の耐久減少量を設定することができます。

たとえばこのようにdamage_per_blockを10000にすれば1回使うと壊れるツルハシを作れます。

# 1回使うと壊れるツルハシを入手
/give @p diamond_pickaxe[tool={damage_per_block:10000,rules:[]}] 1

rules (特定のブロックに対する条件設定)

rulesパラメータを利用すれば、ブロックごとの破壊速度を指定したり破壊時にアイテムをドロップするかを設定することができます。

ruleはリスト形式で複数作成することができ、対象となるブロックが複数回出現した場合には先に書かれているルールが優先されます。

rulesパラメータは以下の3つで構成されています。

toolコンポーネントの基本的な構文で紹介した鉄ブロックを一瞬で破壊できる剣もrulesを設定しています。

先ほど紹介したコマンドでは鉄ブロックをアイテム化することができませんでしたが、以下のようにcorrect_for_dropsを設定することでアイテム化するようになります。

# 鉄ブロックを一瞬でアイテム化できる鉄の剣を入手する
/give @p iron_sword[custom_name='"斬鉄剣"',tool={rules:[{speed:10000,correct_for_drops:true,blocks:["iron_block"]}]}] 1

rulesのそれぞれのパラメータについては以下で詳しく説明します。

speed

特定のブロックに対する破壊速度です。default_mining_speedを上書きします。

correct_for_drops

この設定は本来そのアイテムが適正ツールではない場合にその設定を上書きして適正ツールとして扱うかを指定できます。

たとえば、本来黒曜石をアイテム化できるのはダイヤ以上のツルハシですが、この設定をtrueにしたruleを作成すれば黒曜石を木や金のツルハシでもアイテム化させることができます。(もちろんツルハシでなく、リンゴのようなアイテムであったとしてもアイテム化させることができます。)

また、マイクラの仕様として適正ツールであれば壊す速度が早くなるという副次的な効果もあります。

なお、たとえfalseにしたとしてもそのアイテムが元々適正ツールであれば適正ツールとなります。(例: ビーコンを破壊する場合はfalseに設定しても適正ツールとなり、アイテム化する。)

注意点として、ここでtrueを選択したとしても、そもそもモンスタースポナーのようにアイテムとしてドロップさせる手段がゲーム中に存在しない(ルートテーブルが設定されていない)アイテムを設定した場合にはドロップしません。

blocks

指定したルールを適用するブロック設定します。 ブロック名かブロックタグを利用することができます。

まとめ

今回はコンポーネントのうち、toolコンポーネントについて説明しました。

toolコンポーネントではアイテムに対して特定のブロックに対する適正を設定したり、ブロックの破壊速度を変更することができます。

この設定を利用すれば斧、ツルハシ、シャベルの全ての機能を持ったツールを作ったり、一度使うと壊れるがなんでも一瞬で壊せるツールを作ったりと、様々なツールを作成することができます。

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

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

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

名前は"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コマンドだけで消すこともできます。