タグでブロック・アイテムをグループ化しよう

Minecraftのコマンドを書いていると、「原木系のブロックならどれでもOK」「鉱石系のアイテムをまとめてレシピに使いたい」という場面に出くわします。そんなときに役立つのが「タグ(Tag)」です。この記事では、バニラが用意しているタグの確認方法から、DatapackでオリジナルのブロックタグとアイテムタグをJSONで作る手順まで、一から丁寧に解説します。

対応バージョン:Java Edition 1.21.11

目次

前提知識

この記事はこれまでの連載と独立して読めます。サンプルコードは新しいDatapack(my_datapack)として一から作る前提で書いています。連載を途中から読んでいる方は、既存のDatapackに組み込んでいただいてもかまいません。

タグとは何か

Minecraftには「#minecraft:logs」のように # で始まる特別なID表記があります。これが「タグ(Tag)」です。タグは複数のブロックやアイテムをひとつの名前でまとめるための仕組みです。コマンドに #minecraft:logs と書くだけで、オークの原木・シラカバの原木・マツの原木……といったすべての原木系ブロックをまとめて条件に指定できます。

タグを使わずに「原木系ブロックのどれかの上に立ったら処理する」を書こうとすると、種類の数だけ execute if block を並べる必要があります。タグにまとめれば1行で済みます。

バニラタグの確認方法 — JARファイルを解凍する

Minecraftがあらかじめ用意しているタグ(バニラタグ)は、ゲーム本体のJARファイルの中に入っています。以下の手順で中身を確認できます。

  1. .minecraft フォルダを開き、versions フォルダの中にある確認したいバージョンのフォルダを開く(例:versions/1.21/1.21.jar
  2. JARファイルは中身がZIPと同じ形式なので、拡張子を .zip に変えるか、7-ZipやThe Unarchiver などの解凍ソフトで展開する
  3. 展開したフォルダの data/minecraft/tags/ の中に block/item/ フォルダがある
  4. たとえば data/minecraft/tags/block/logs.json を開くと、#minecraft:logs に含まれるブロックの一覧が確認できる
.minecraftのversionsフォルダを開き、バージョンのJARファイルが並んでいる状態のエクスプローラー画面のスクリーンショット
JARを解凍してdata/minecraft/tags/block/ フォルダの中にlogs.jsonなどが並んでいる状態のスクリーンショット

確認したいバニラタグがあるときはこのフォルダを直接参照するのが一番確実です。バージョンごとにタグの内容が変わることもあるので、使っているバージョンのJARを見る習慣をつけましょう。

対応したバージョンのフォルダが生成される条件として一度公式ランチャーから欲しいバージョンを起動する必要があります

フォルダ構成:tags/block と tags/item の使い分け

自分でタグを作るときは、Datapack内の tags/block/ または tags/item/ にJSONファイルを置きます。今回作るDatapackの構成はこうなります。

my_datapack/
├── pack.mcmeta
└── data/
    └── my_datapack/
        ├── function/
        │   ├── load.mcfunction
        │   └── tick.mcfunction
        └── tags/
            ├── block/
            │   └── my_floor.json       ← ブロックタグ
            └── item/
                └── my_ores.json        ← アイテムタグ
  • tags/block/:ワールドに設置されているブロックを条件にするとき。execute if block と一緒に使う
  • tags/item/:インベントリの中のアイテムを条件にするとき。レシピやアドバンスメントで使う

原木のように「ブロックとしてもアイテムとしても存在するもの」はバニラでも tags/block/logs.jsontags/item/logs.json の両方が用意されています。用途が違うので別フォルダで管理されている点を覚えておきましょう。

ステップ1:ブロックタグを作る

「特別な床材」として使いたいブロックをまとめた my_floor タグを作ります。data/my_datapack/tags/block/my_floor.json というファイルを新規作成し、以下の内容を書きます。

{
  "values": [
    "minecraft:gold_block",
    "minecraft:diamond_block",
    "minecraft:emerald_block"
  ]
}

values の配列にまとめたいブロックのIDを並べるだけです。別のタグを入れ子にすることもでき、その場合は # をつけて書きます。たとえばバニラタグをそのまま取り込むことができます。

{
  "values": [
    "minecraft:gold_block",
    "minecraft:diamond_block",
    "#minecraft:logs"
  ]
}

このように #minecraft:logs を入れると、金ブロック・ダイヤモンドブロック・すべての原木、という組み合わせのタグが1つのファイルで作れます。

VS Codeでdata/my_datapack/tags/block/my_floor.jsonを開いている画面のスクリーンショット

ステップ2:ブロックタグを execute if block で使う

作ったブロックタグはコマンドで #my_datapack:my_floor と書いて使います。# に続けて「ネームスペース:タグ名」の形式です。

プレイヤーの足元が my_floor タグのいずれかのブロックだったときに速度ボーナスを与えるには、以下のように書きます。

# tick.mcfunction
# プレイヤーの1ブロック下が my_floor タグのブロックなら速度ボーナスを与える
execute as @a at @s if block ~ ~-1 ~ #my_datapack:my_floor run effect give @s minecraft:speed 5 1 false

~ ~-1 ~ は「プレイヤーの足元1ブロック下」の座標です。エフェクトの秒数を短め(5秒程度)にしておくと、ブロックから離れたときに自然に効果が切れるため自然な挙動になります。

ダイヤモンドブロック・金ブロック・エメラルドブロックの上に乗ると速度エフェクトが付き、石の上では付かないようすのGIF。GIF推奨

ステップ3:アイテムタグを作る

アイテムタグの書き方はブロックタグとまったく同じです。違いは置き場所が tags/item/ になる点だけです。

data/my_datapack/tags/item/my_ores.json を新規作成し、以下を書きます。

{
  "values": [
    "minecraft:iron_ingot",
    "minecraft:gold_ingot",
    "minecraft:diamond",
    "minecraft:emerald"
  ]
}

アイテムタグはレシピやアドバンスメントで活躍しますが、コマンドでも使えます。execute if items という構文を使うと、プレイヤーの特定のスロットにタグに含まれるアイテムがあるかを条件にできます。

# メインハンドに my_ores タグのアイテムを持っているプレイヤーにメッセージを送る
execute as @a if items entity @s weapon.mainhand #my_datapack:my_ores run tellraw @s [{"text":"その素材、いいものを持ってますね!","color":"gold"}]

if items entity @s weapon.mainhand でプレイヤーのメインハンドスロットを指定し、その後にアイテムIDまたはアイテムタグを書きます。スロットの指定は他にも weapon.offhand(オフハンド)や container.0(インベントリ0番目)なども使えます。ブロックタグと同じく # をつけるのを忘れないようにしましょう。

今後のアドバンスメント・レシピの記事でもアイテムタグは登場するので、形を覚えておきましょう。

動作確認の手順

  1. /reload でDatapackを反映させる。エラーが出たらJSONのカンマ・括弧の閉じ忘れを確認する
  2. minecraft:gold_blockminecraft:diamond_blockminecraft:emerald_block を地面に設置する
  3. 各ブロックの上に乗って速度エフェクト(矢印の粒子エフェクト)が表示されるか確認する
  4. minecraft:stone など、タグに含まれていないブロックの上では効果が出ないことを確認する
  5. 試しに my_floor.json"minecraft:netherite_block" を追加して /reload し、ネザライトブロックでも効果が出るか確認する

まとめ

  • タグは複数のブロックやアイテムを # 付きのひとつの名前にまとめる仕組みで、コマンドやレシピを簡潔に書けるようになる
  • バニラタグは .minecraft/versions/バージョン名/バージョン名.jar を解凍した data/minecraft/tags/ フォルダの中で確認できる
  • tags/block/ はワールドに設置されたブロック向け、tags/item/ はインベントリ内のアイテム向けで用途が異なる
  • JSONの values 配列にIDを並べるだけで自作タグが作れる。#namespace:tagname で別のタグを入れ子にすることも可能
  • コマンドで使うときは #my_datapack:my_floor のように #ネームスペース:タグ名 の形で指定する

次の記事「カスタムクラフトレシピを追加しよう」では、recipe JSONの書き方を解説します。形状ありの作業台レシピから無形レシピ・かまどレシピまで、今回作ったアイテムタグを素材に使う実践的なレシピを一緒に実装しましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次