2024のコマンド関連新要素のみまとめ (1.20.3~1.21.4)

この記事は、[Minecraft Command Advent Calendar 2024](https://qiita.com/advent-calendar/2024/mccmd) 24日目の記事です。:santa:
その予定でした！！が、転じて**203**日目の記事です。

# はじめに

ここ最近のマイクラアプデにおける、**コマンド関連要素の追加／変更で新たに出来るようになった主なこと**をバージョン別にまとめて大雑把に紹介します。あくまでも主要なものを主観で並べているので、全要素を網羅できていない点は大目に見ていただけると...。

私自身も1.20.3以降がっつりは追えていなかったので、自分用でもあったりします。ぜひこの機会に最新バージョンでの開発をご検討ください！！

:::note warn
Java版 Minecraft ver 1.21.4 時点の情報となります。
:::

# 1.20.3 <font color="#A0A0A0">(1.20.4)</font>
[<img width="1170" src="https://www.minecraft.net/content/dam/minecraftnet/games/minecraft/screenshots/1.20.3_header.jpg">](https://www.minecraft.net/en-us/article/minecraft-java-edition-1-20-3)
<font color="#888888">Minecraft Java Edition 1.20.3 | Minecraft</font>

2023年12月5日にリリースされたマイナーアップデートです。**新コマンドやfunction周りの機能、自由度の高いスコアボード表示などが導入されました。** 1.20.4についてはその2日後にリリースされたバージョンであり、1.20.3における致命的なバグへの対応として緊急的にリリースされたバージョンとなっています。

参考:
[Technical News in Minecraft 1.20.3](https://www.youtube.com/watch?v=fl4zWZ_uBXU) - slicedlime氏の動画
[New Minecraft Release: 1.20.3](https://www.minecraft.net/en-us/article/minecraft-java-edition-1-20-3), [New Minecraft Release: 1.20.4](https://www.minecraft.net/en-us/article/minecraft-java-edition-1-20-4) - 公式リリース記事

## コマンド <font color="#ffffff">─────────────</font>

### /tick🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#tick)

ワールドのtick処理の頻度を操作することで、世界の時間をスローモーションや早送りにしたり、完全に止めたりすることができるようになりました。

:::note warn
**基本的に**チャット欄でのみ実行可、functionやコマンドブロックでは実行不可です。
:::

**`/tick query`** - 現在のtick処理頻度とパフォーマンスの取得をする
**`/tick rate`<font color="#1992d7">`<rate>`</font>** - tick速度を<font color="#1992d7">`<rate>`</font>tick／秒に変更する

**`/tick freeze`** - プレイヤー以外の全ての処理を停止する
**`/tick step`<font color="#1992d7">`<time>`</font>** - freeze中、処理を<font color="#1992d7">`<time>`</font>tickだけ進める
**`/tick step stop`** - tick stepの処理を中断する
**`/tick unfreeze`** - freeze状態を解除し、処理を再開する

**`/tick sprint`<font color="#1992d7">`<time>`</font>** - ゲームを<font color="#1992d7">`<time>`</font>tick分高速で実行する
**`/tick sprint stop`** - sprintの高速処理を中断する

![1203-tick.gif](https://drive.google.com/uc?id=1swl2qz1sHT95F5lurywu0OaagrcbEquQ)
<font color="#888888">停止させていたTNTの爆発処理を/tick unfreezeで再開</font>

------------------------------------------------------------------------------------------

### /return🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#return)
1.19.4で初登場し、1.20ですぐ削除されていましたが、バグ修正を経て完全復活しました。function内でのみ有効で、スコアやストレージに成功回数／値を返す (returnする) という機能を持っています。値を返しながらfunctionの実行を中断できるので、複数の条件検知のための場合分け手段や、負荷軽減の意図として用いることが多いです。

**`/return`<font color="#1992d7">`<value>`</font>** - functionの実行を中断 (成功) し、値<font color="#1992d7">`<value>`</font>を返す。
**`/return fail`** - functionの実行を中断 (失敗) し、値`0`を返す。
**`/return run`<font color="#1992d7">`<command>`</font>** - functionの実行を中断し、コマンド<font color="#1992d7">`<command>`</font>の実行結果を返す。

``` nim:<font color="#C3CAD5">例) 視点先のブロックに応じて値を返す (function)</font>
## チャットでの呼び出し例 → /execute anchored eyes positioned ^ ^ ^1 run function test:a

# ブロックに応じて値を返す
  execute if block ~ ~ ~ iron_block run return 1
  execute if block ~ ~ ~ gold_block run return 2
  execute if block ~ ~ ~ diamond_block run return 3
  
# プレイヤーのリーチ限界まで再帰
  execute unless entity @s[distance=..5] positioned ^ ^ ^1 run function test:a
```

------------------------------------------------------------------------------------------

### /execute if function🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#execute-if-function)
/returnと同様、バグ修正を経て復活しました。functionを実行し、そのfunctionの戻り値に応じて成功／失敗判定を出します。複数の条件分岐処理をまとめることで、大元のexecute側の記述を圧縮することができます。

**`/execute`<font color="#1992d7">`[if|unless]`</font>`function`<font color="#1992d7">`<function>`</font>`...`** - 
関数<font color="#1992d7">`<function>`</font>の実行が<font color="#1992d7"> [ 成功 | 失敗 ]</font> の場合、以降のコマンドを継続

``` nim:<font color="#C3CAD5">例) 視点先5ブロック以内の草ブロック検知 (function)</font>
## チャットでの呼び出し例 → /execute anchored eyes if function test:b run say 草ブロック！

# 草ブロックがあれば1を返し、それ以外の場合は0を返す
  execute unless entity @s[distance=..5] run return fail
  execute if block ^ ^ ^ grass_block run return 1

# 実行位置を1ブロック先に進めて再帰
  execute positioned ^ ^ ^1 run return run function test:b
```

------------------------------------------------------------------------------------------

### /scoreboard
scoreboard表示の自由度が上がり、スコアホルダー名やスコア部分の記述を操作できるようになりました。スコアの値を太字にしたり、色を変更したりするほか、値の非表示や固定テキストの表示も可能です。つまりは何でも出来るというわけで。

**`/scoreboard players display name`<font color="#1992d7">`<target> <objective> <text>`</font>** -
スコアホルダー<font color="#1992d7">`<target>`</font>の<font color="#1992d7">`<objective>`</font>のスコア表示をテキスト<font color="#1992d7">`<text>`</font>に置き換える

**`/scoreboard players display numberformat`<font color="#1992d7">`<target> <objective> <format>`</font>** -
スコアホルダー<font color="#1992d7">`<target>`</font>の<font color="#1992d7">`<objective>`</font>のスコアフォーマットを<font color="#1992d7">`<format>`</font>に変更する
**`/scoreboard objectives modify`<font color="#1992d7">`<objective>`</font>`numberformat`<font color="#1992d7">`<format>`</font>** -
オブジェクト<font color="#1992d7">`<objective>`</font>のデフォルトのスコアフォーマットを<font color="#1992d7">`<format>`</font>に設定する

**`scoreboard objectives modify`<font color="#1992d7">`<scoreboard>`</font>`displayautoupdate`<font color="#1992d7">`[true|false]`</font>** -
オブジェクト<font color="#1992d7">`<objective>`</font>の表示の自動更新を<font color="#1992d7"> [ 有効 | 無効 ] </font>化する

``` nim:<font color="#C3CAD5">例) 任意のスコア (test) の表示をいじる</font>
# Xのスコア: 名前部分を"あ"、数字部分を"い"に変更
/scoreboard players display name X test "あ"
/scoreboard players display numberformat X test fixed "い"
# Yのスコア: 名前部分をカスタムフォント、数字部分を空白に変更
/scoreboard players display name Y test "\uE000"
/scoreboard players display numberformat Y test blank 
# Zのスコア: 名前部分を空白、数字部分のフォーマットを緑太字に変更
/scoreboard players display name Z test ""
/scoreboard players display numberformat Z styled {"color":"green","bold":true}
```

![1203-scoreboard.png](https://drive.google.com/uc?id=15O8FCJYvWDBfJ2x1Izw38AQjBBo_NbwM)
<font color="#888888">sidebarへの任意テキスト表示。カスタムフォントも表示可能。</font>

## ジグソーブロック <font color="#ffffff">─────────</font>
ジグソーブロックの最大レベル数が **`7`** → **`20`** に増えました。ジグソーブロックとは、ランダム生成の構造物 (例:トライアルチャンバー) を構成するピースをジグソーパズルのように接続する役割を持ったブロックです。レベルは「ジグソーブロックから連続的に実行される接続処理の最大回数」のことを指しているので、んまあとりあえずデカいのです！

![1203-jigsaw.png](https://drive.google.com/uc?id=1ixcW8qC8tYtFCs8wKAnlC3o7wzZx6Nuz)
<font color="#888888">通路も一つのピースとすることが多いため、こんなにも違いが。</font>

### Selection／Placement Priority🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#selectionplacement-priority)

構造物を構成するピース1つに複数のジグソーブロックを含めた場合、その構成ピースのどのジグソーから優先的に接続処理を行うかを設定できるようになりました。Selectionが生成元のジグソーの優先度、Placementが生成元のジグソーの優先度となっています。

... 初めての方はこれだけではイメージが湧くはずないと思うので、**無いものとしてもらって良い**と思います。一応記事を書く際参考にした、個人的にわかりやすいと感じた人様の動画の一節があったので紹介しておきます。

[I Made the Trial Chambers MASSIVE](https://youtu.be/VNaGXvpE0Nw?feature=shared&t=612) - CodeNeon氏の動画

### Pool Aliases🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#pool-aliases)

指定したtemplateのpoolを別のpoolに置き換えできる要素が追加されました。**これも無いものとして良いでしょう**...！！雰囲気的には自動生成のダンジョン生成において、木造のものを途中から石造のダンジョンに変えていくような使い方ができそうなのですが、どうでしょうか、黒民さん。

https://note.com/noir_kokumin/n/nfc7f6c350a78

## ゲームルール <font color="#ffffff">───────────</font>

### playersNetherPortalCreativeDelay🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#playersnetherportalcreativedelay)

プレイヤーがネザーゲートに入った後、ネザーに移動するまでの待機時間を変更できるようになりました。CreativeDelayはクリエイティブモードのプレイヤーの待機時間となっており、デフォルト値は`0`(tick)。これを大きな値にすることで、プレイヤーのネザー入退場を無効化することが可能です。

![1203-nether.png](https://drive.google.com/uc?id=1jfPil0QgGMT1scvJf_w4ubSY2bXeFjEe)
<font color="#888888">クリエイティブモードにおけるネザーポータルの無効化</font>

### playersNetherPortalDefaultDelay🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#playersnetherportaldefaultdelay)

先述のCreativeDelay同様、ネザーに移動するまでの待機時間を変更します。ただDefaultDelayはクリエイティブモード以外のプレイヤーの待機時間となっていて、デフォルト値は`80`(tick)。これを`0`にすることで、瞬時にディメンションの切り替えが行われます。

------------------------------------------------------------------------------------------

### projectilesCanBreakBlocks🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#projectilescanbreakblocks)

投射物によって破壊可能なブロックが実際破壊可能かどうかを操作できます。これらのブロックには鍾乳石、コーラスフラワーや飾り壺が含まれます。他には何かあったか。

![1203-projectile.gif](https://drive.google.com/uc?id=1rcX1qNP_9m2FBLHB2pPtxAtrhp6Qonid)
<font color="#888888">破壊可能(true)か、破壊不能(false)か</font>

------------------------------------------------------------------------------------------

### maxCommandForkCount🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#maxcommandforkcount)

1tick間に実行されるコマンドの最大実行文脈数を操作できます。デフォルト値は`65536`。例えばチャット欄で **`/execute as @e ...`** と実行した際はワールド内の全てのエンティティとして処理が実行されますが、この**各エンティティごとに分岐する処理それぞれ**が実行文脈となります。とは言ったものの、普通に生活していたら触ることはないと思います。

<font color="#888888">あくまでも **`/execute as @e as @e as @e`** など誤って実行文脈数を爆発させてしまった時のための設計 (の上限をいじれるようになった) という認識で合っているか...？</font>

### maxCommandChainLength

1tick間に実行されるコマンドの最大チェーン数に少し変更があったみたいです。デフォルト値は`65536`。と言われましても！という感じですが。こちらも普通に生活していてここを触ることはないと思うので詳しくは割愛します。

## その他の小ネタ <font color="#ffffff">────────</font>

### 偽TNT (block_state)🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#偽tnt-block_state)

TNTエンティティの見た目を変更できるようになり、任意のブロックの見た目に擬態したTNTを召喚できるようになりました。加えて、TNTの爆発するまでの時間を操作するデータ **`Fuse`** が小文字 **`fuse`** に変換されました。

``` nim:<font color="#C3CAD5">例) 4秒で爆発するダイヤモンドブロックを召喚</font>
/summon tnt ~ ~ ~ {fuse:80s,block_state:{Name:"diamond_block"}}
```

![1203-tnt.png](https://drive.google.com/uc?id=1fczRN06SjKqm5KchARfWcdeicUr0i8jh)
<font color="#888888">爆発する偽ダイヤモンドブロック</font>

------------------------------------------------------------------------------------------

### エンティティのCustomName表示

チェストトロッコ (chest_minecart) やリードの繋ぎ目 (leash_knot) などnon-livingエンティティに名前がついている場合、村人 (villager) などのlivingエンティティと同じように、視点を合わせることで名前が表示されるようになりました。`CustomNameVisible`を設定した場合は常時名前が上に表示されます。

![1203-projectile.gif](https://drive.google.com/uc?id=1EgLi1RQIaKxpMIq0euhsvc7Ph_uvCoDe)
<font color="#888888">この要素、無くても良いんじゃあないかー！？</font>

------------------------------------------------------------------------------------------

### 水中呼吸モブタグ

entity_typeタグにて水中呼吸可能タグ (**`can_breathe_under_water.json`**) が追加され、これによって任意のエンティティの水による窒息ダメージを防止できるようになりました。

``` nim:<font color="#C3CAD5">例) オオカミと猫を溺れないようにする </font>
{
    "values": [
        "wolf",
        "cat",
    ]
}
```

------------------------------------------------------------------------------------------

### 地面に刺さった矢のデータ

放たれた矢にデータタグ **`item`** が追加され、名前やエフェクト効果などのデータを保存するようになりました。これにより、拾うと別のアイテムが得られるといった不可思議な矢が作れるようになりました。

``` nim:<font color="#C3CAD5">例) 拾うとダイヤモンドになる謎の矢の召喚</font>
/summon arrow ~ ~ ~ {pickup:1b,item:{id:"diamond",count:1}}
```

------------------------------------------------------------------------------------------

### short_grass 改名草

草 (grass) が、背の低い草 (short_grass) に改名されました。このような破壊的変更は珍しいですが、これだけで壊れるデータパックも少なくないはず。そこで、こんな実装をご紹介。

``` diff_nim:<font color="#C3CAD5">例) ブロックタグのjsonファイルがエラーを吐かないようにする "required":false</font>
{
    "values": [
-       "minecraft:grass",
-       "minecraft:short_grass"
+       {"required":false,"id":"minecraft:grass"},
+       {"required":false,"id":"minecraft:short_grass"}
    ]
}
```

**`required`** は指定したブロックIDがブロックタグ全体のロードのために必要であるかを操作し、デフォルトでは`true`となっているため、今回のような改名があるとブロックタグがエラーを吐いてしまいます。こうすることで、まぁ無くてもいいよ！と、タグに伝えられるのです。

参考: [What's the {"required"} tag do in item tags found in ...](https://www.reddit.com/r/MinecraftCommands/comments/1dx3v5f/whats_the_required_tag_do_in_item_tags_found_in/) - Volcan4698氏のReddit記事


# 1.20.5 <font color="#A0A0A0">(1.20.6)</font>
[<img width="1170" src="https://www.minecraft.net/content/dam/minecraftnet/games/minecraft/screenshots/1.20.5_1170x500.jpg">](https://www.minecraft.net/en-us/article/minecraft-java-edition-1-20-5)
<font color="#888888">Minecraft Java Edition 1.20.5 | Minecraft</font>

2024年4月23日にリリースされたマイナーアップデートです。**アイテムデータに<font color="#a00000">破壊的変更</font>がなされた代わりに不可能だったことが可能になったことも多く**、これからのコマンドに希望が見えたアップデートとなりました。1.20.6については1.20.4同様、特定のバグへの対応として緊急的にリリースされたバージョンとなっています。

参考:
[Data Pack News in Minecraft 1.20.5](https://www.youtube.com/watch?v=A2mphZA1Gho) - slicedlime氏の動画
[New Minecraft Release: 1.20.5](https://www.minecraft.net/en-us/article/minecraft-java-edition-1-20-5), [New Minecraft Release: 1.20.6](https://www.minecraft.net/en-us/article/minecraft-java-edition-1-20-6) - 公式リリース記事
[マイクラ1.20.5の技術的要素まとめ(自分用)](https://qiita.com/Hirobao1/items/ec8e08aaf187965a8100) - ひろばおさんの記事

## コンポーネント <font color="#ffffff">──────────</font>

アイテムのデータフォーマットがNBTタグからコンポーネントと呼ばれるものに変更されました。基本的な概念は変わりませんが、この大きな変更 (改善) によってパフォーマンス面や将来の開発面で良いことがあるようです。

実際、以前は想像できなかったような新技術がこのバージョン以降で続々と実装されており、んまあ破壊的変更も甘んじて受け入れるか～！という気分です。

``` diff_nim:<font color="#C3CAD5">例) 名前＋エンチャント付きの剣 (1.20.3→1.20.5)</font>
- /give @s iron_sword{display:{Name:'"強い剣"'},Enchantments:[{id:"sharpness",lvl:5s}]}
+ /give @s iron_sword[custom_name='"強い剣"',enchantments={"sharpness":5}]
```

現在コンポーネントには65種類あり、元々NBTタグだったものの移植に加え、全く新しいものも多く存在します。あまりにも沢山あるため、新しいもの＋紹介があると嬉しいものを主観と偏見で順に紹介していきます。

------------------------------------------------------------------------------------------

### enchantment_glint_override🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#enchantment_glint_override)

アイテムのエンチャントの輝きの有無の設定ができます。以前は空のエンチャントを付けることやリソースパックでしか操作できなかったので、かなり良いものです。

``` diff_nim:<font color="#C3CAD5">例) 輝くダイヤモンド (1.20.3→1.20.5)</font>
- /give @s diamond{Enchantments:[{}]}
+ /give @s diamond[enchantment_glint_override=true]
```
``` nim:<font color="#C3CAD5">例) 輝かない金リンゴ</font>
/give @s enchanted_golden_apple[enchantment_glint_override=false]
```

------------------------------------------------------------------------------------------

### fire_resistant🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#fire_resistant)

アイテムが炎上ダメージに耐性があるかを設定できます。元々ネザライト系のアイテムが持っていた性質を、そのままどのアイテムにも付与できます。また、loot function (/item modify等で用いるヤツ) で**性質を剥奪する**こともでき、燃えうるネザライトを作れたりも。

:::note warn
1.21.2にて<font color="#a00000">削除</font>され、[damage_resistant](#damage_resistant-new)に機能が統合されます。
:::

``` nim:<font color="#C3CAD5">例) 燃えない木の棒</font>
/give @s stick[fire_resistant={}]
```
``` nim:<font color="#C3CAD5">例) 手に持ったアイテムの炎上耐性を剥奪</font>
/item modify entity @s weapon.mainhand {"function":"set_components","components":{"!fire_resistant":{}}}
```

------------------------------------------------------------------------------------------

### food🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#food)

アイテムを食べられるかどうかを設定できます。満腹度の回復値の設定のほか、食べるのにかかる時間や満腹でも食べられるかどうかなど設定が可能です。自由度がすごい。

:::note warn
1.21にて変更があり、**`using_converts_to`** 機能が追加されます。また、
1.21.2にも変更があり、[consumable](#consumable), [use_remainder](#use_remainder)に一部機能が移植されます。
:::

**`nutrition`** - 満腹度の回復値 (0以上の整数)
**`saturation`** - 隠し満腹度の回復値 (負の値も可)
**`can_always_eat`** - 満腹でも食べられるか

**`eat_seconds`** (1.21.2にて<font color="#a00000">削除</font>) - 食べるのにかかる時間
**`effects`** (1.21.2にて<font color="#a00000">削除</font>) - 消費時に付与されるエフェクト効果


``` nim:<font color="#C3CAD5">例) 満腹でも食べられる草ブロック (50%で盲目エフェクト効果)</font>
/give @s grass_block[food={nutrition:1,saturation:-1.5,can_always_eat:true,eat_seconds:0.2,effects:[{effect:{id:"blindness",amplifier:0,duration:20},probability:0.5}]}]
```

------------------------------------------------------------------------------------------

### hide_tooltip🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#hide_tooltip)

アイテムのツールチップを非表示にするかを設定できます。以前はアイテムの名前を空にすることが限界でしたが、一切の表示を無くすことができるようになりました。助かる。

![1203-tooltip.png](https://drive.google.com/uc?id=16YBWLI1bR1nHqzav7__JyP8_obZx50Di)
<font color="#888888">アイテム名を空にしても、空のツールチップが生まれてしまっていました。</font>

``` nim:<font color="#C3CAD5">例) ツールチップを非表示にしたアイテム</font>
/give @s netherite_ingot[hide_tooltip={}]
```

------------------------------------------------------------------------------------------

### intangible_projectile🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#intangible_projectile)

投射後のアイテムが拾えなくなるかどうかが設定できます。つまりはこのコンポーネントのついたアイテムを放ち、それが地面に刺さった場合、近づいても (クリエイティブモード以外では) 拾うことができません。トライデントにも有効のようで、面白い。

``` nim:<font color="#C3CAD5">例) 使い切りの矢</font>
/give @s arrow[intangible_projectile={}]
```
``` nim:<font color="#C3CAD5">例) 使い切りのトライデント</font>
/give @s trident[intangible_projectile={}]
```

------------------------------------------------------------------------------------------

### item_name🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#item_name)

アイテムのデフォルト名を設定できます。アイテム名の変更というわけではなく、その**アイテムの大元の名前**を変更することができます。デフォルト名と同じ扱いになるため、金床などで編集可能である後述の[custom_name](#custom_name)に上書きされます。

``` nim:<font color="#C3CAD5">例) エメラルドの剣 (鉄の剣)</font>
/give @s iron_sword[item_name='"エメラルドの剣"']
```

------------------------------------------------------------------------------------------

### max_damage🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#max_damage)

アイテムの最大耐久値を設定できます。後述の[tool](#tool-new)と一緒に用いることで、あらゆるアイテムを耐久値のあるツールとして使用できるようになります。... 単に最大耐久値を変更するという用途でも嬉しい要素です。

:::note warn
[max_stack_size](#max_stack_size-new)と同時に使用することはできません。
:::

``` nim:<font color="#C3CAD5">例) すぐ壊れる、耐久値10の木のツルハシ</font>
/give @s wooden_pickaxe[max_damage=10]
```


------------------------------------------------------------------------------------------

### max_stack_size🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#max_stack_size)

アイテムの最大スタックサイズを設定できます。値の範囲は **`1`~`99`**。**`99`**...？

:::note warn
[max_damage](#max_damage-new)と同時に使用することはできません。
:::

``` nim:<font color="#C3CAD5">例) 16個までしかスタックしないダイヤモンド</font>
/give @s diamond[max_stack_size=16]
```


------------------------------------------------------------------------------------------

### tool🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#tool)

アイテムのツールとしての振る舞いを設定できます。後述の[can_break](#can_break)と比べて、「特定のブロックごとに異なる破壊速度を設定できる」といった部分で差別化されます。

<details open><summary><b><code>rules</code></b> - ブロック破壊に関する各設定</summary>

├ **`blocks`** - 設定を適用する対象のブロック
├ **`speed`** - 指定したブロックの破壊速度
└ **`correct_for_drops`** - ブロックに対して「適正ツール」とするか
</details>

**`default_mining_speed`** - デフォルトのブロック破壊速度
**`damage_per_block`** - ブロック破壊毎に消耗する耐久値の量

``` nim:<font color="#C3CAD5">例) ツルハシの性質を持つアメジストの欠片</font>
/give @s amethyst_shard[tool={default_mining_speed:3,damage_per_block:1,rules:[{blocks:"#mineable/pickaxe",correct_for_drops:true}]},max_stack_size=1,max_damage=50,damage=0]
```

------------------------------------------------------------------------------------------

### attribute_modifiers
**`AttributeModifiers`** タグを置き換える形で登場。一点、NBTタグの頃と比べて、**新たなスロット指定方法 `hand` `armor` `body`** が追加されました。attributeの **`uuid`** 指定部分が昔からずっと煩わしいですが、1.21でようやく廃止されます。よかったよかった。

:::note warn
1.21にて変更があり、**`name`**, **`uuid`** の設定が任意の **`id`** に置き換わります。また、
1.21.2にも変更があり、**`generic.` `player.` `zombie.`** のprefixが<font color="#a00000">削除</font>されます。
:::

``` diff_nim:<font color="#C3CAD5">例) 足に装備すると足の速さが+50%される革の靴 (1.20.3→1.20.5)</font>
- /give @s leather_boots{AttributeModifiers:[{AttributeName:"generic.movement_speed",Name:"example_speed",Amount:0.05,Operation:0,UUID:[I;0,0,0,0],Slot:"feet"}]}
+ /give @s leather_boots[attribute_modifiers=[{type:"generic.movement_speed",name:"example_speed",amount:0.05,operation:"add_value",uuid:[I;0,0,0,0],slot:"feet"}]]
```
``` nim:<font color="#C3CAD5">例) どちらかの手に持つと体の大きさが3倍になる不思議な遺物</font>
/give @s nautilus_shell[attribute_modifiers=[{type:"generic.scale",name:"example_scale",amount:3,operation:"add_multiplied_base",uuid:[I;0,0,0,1],slot:"hand"}]]
```

------------------------------------------------------------------------------------------

### can_break
**`CanDestroy`** タグを置き換える形で登場。一点、**ブロックステート`state`の条件も検知可能**になりました。つまりは特定の方角を向いたチェストや、レバーがパワーONの時のみ破壊可能にすることができるというわけです。

``` diff_nim:<font color="#C3CAD5">例) アドベンチャーモードで「丸石」のみ破壊できる鉄ツルハシ (1.20.3→1.20.5)</font>
- give @s iron_pickaxe{CanDestroy:["cobblestone"]}
+ give @s iron_pickaxe[can_break={blocks:"cobblestone"}]
```
``` nim:<font color="#C3CAD5">例) アドベンチャーモードで「重なった石ハーフ」や「育ち切った植物2種」を破壊できる棒</font>
/give @s stick[can_break={predicates:[{blocks:"stone_slab",state:{type:"double"}},{blocks:["carrots","potatoes"],state:{age:"7"}}]}]
```

------------------------------------------------------------------------------------------

### can_place_on
**`CanPlaceOn`** タグを置き換える形で登場。こちらもブロックステート条件の検知が可能です。

``` nim:<font color="#C3CAD5">例) アドベンチャーモードで「湿った耕地」にのみ配置できる小麦の種</font>
/give @s wheat_seeds[can_place_on={blocks:"farmland",state:{moisture:"7"}}]
```

------------------------------------------------------------------------------------------

### charged_projectiles

**`Charged`**, **`ChargedProjectiles`** タグを置き換える形で登場。以前は要素数の上限が`3`でしたが、**この数を超えて要素を設定可能**になりました。つまりは一度にめちゃくちゃな数の投射物を放つクロスボウが存在できるわけで。

``` diff_nim:<font color="#C3CAD5">例) 一度にいくつかの花火を放つクロスボウ (1.20.3→1.20.5)</font>
- /give @s crossbow{Charged:1b,ChargedProjectiles:[{id:"firework_rocket",Count:1b},{id:"firework_rocket",Count:1b},{id:"firework_rocket",Count:1b}]}
+ /give @s crossbow[charged_projectiles=[{id:"firework_rocket",count:1},{id:"firework_rocket",count:1},{id:"firework_rocket",count:1},{id:"firework_rocket",count:1},{id:"firework_rocket",count:1},{id:"firework_rocket",count:1},{id:"firework_rocket",count:1},{id:"firework_rocket",count:1},{id:"firework_rocket",count:1},{id:"firework_rocket",count:1}]]
```

![1203-tooltip.png](https://drive.google.com/uc?id=1S4gBr7dVcnUuK2RQyUcXg479Lr5Wj_RN)
<font color="#888888">バラけさせるには拡散エンチャントが必要。→ enchantments={"multishot":3}</font>

------------------------------------------------------------------------------------------

### container

**`BlockEntityTag.Items`** タグを置き換える形で登場。チェストや樽などの収納系ブロックの中身を設定した状態をアイテムに持たせることができます。

``` diff_nim:<font color="#C3CAD5">例) 樽の入ったチェストが入った樽 (1.20.3→1.20.5)</font>
- /give @s barrel{BlockEntityTag:{Items:[{Slot:0b,id:"chest",Count:1b,tag:{BlockEntityTag:{Items:[{Slot:0b,id:"barrel",Count:1b}]}}}]}}
+ /give @s barrel[container=[{slot:0,item:{id:"chest",count:1,components:{"container":[{slot:0,item:{id:"barrel",count:1}}]}}}]]
```

------------------------------------------------------------------------------------------

### container_loot

**`BlockEntityTag.LootTable`**, **`BlockEntityTag.LootTableSeed`** タグを置き換える形で登場。収納系ブロックのルートテーブルの設定ができます。また、**`seed`** を指定することでルートテーブルのシード値の固定ができたりもします。

``` nim:<font color="#C3CAD5">例) ピラミッドの報酬loot_table入りチェスト (シード値:10)</font>
/give @s chest[container_loot={loot_table:"chests/desert_pyramid",seed:10}]
```

------------------------------------------------------------------------------------------

### custom_data

アイテムの **`tag`** 内に入れていたカスタムタグの保管場所がここへ移行されました。この影響で、データ操作系のコマンドが冗長になってしまったのは気に食わんなあと思っています。

``` diff_nim:<font color="#C3CAD5">例) カスタムデータ付きのニンジン付きの棒 (1.20.3→1.20.5)</font>
- /give @s carrot_on_a_stick{magic_id:1}
+ /give @s carrot_on_a_stick[custom_data={magic_id:1}]
```
``` diff_nim:<font color="#C3CAD5">例) 手に持ったアイテムのカスタムデータ取得 (1.20.3→1.20.5)</font>
- /data get entity @s SelectedItem.tag.magic_id
+ /data get entity @s SelectedItem.components.minecraft:custom_data.magic_id
```

------------------------------------------------------------------------------------------

### custom_model_data

**`CustomModelData`** タグを置き換える形で登場。1つのアイテムに複数のテクスチャ (アイテムモデル) を紐づけするための値の設定をします。

:::note warn
1.21.4にて**大規模な改修**があり、できることが大幅に増えます。
:::

``` diff_nim:<font color="#C3CAD5">例) カスタムモデルデータを持たせた鉄の剣 (1.20.3→1.20.5)</font>
- /give @s iron_sword{CustomModelData:1}
+ /give @s iron_sword[custom_model_data=1]
```

------------------------------------------------------------------------------------------

### custom_name

**`display.Name`** タグを置き換える形で登場。[item_name](#item_name)と一緒に使用された場合、custom_nameで設定したアイテム名が優先されます。

``` diff_nim:<font color="#C3CAD5">例) ニンジン付きの棒「魔法の杖」 (1.20.3→1.20.5)</font>
- /give @s carrot_on_a_stick{display:{Name:'{"text":"魔法の杖","color":"#8547FF","bold":true}'}}
+ /give @s carrot_on_a_stick[custom_name='{"text":"魔法の杖","color":"#8547FF","bold":true}']
```

------------------------------------------------------------------------------------------

### enchantments
**`Enchantments`** タグを置き換える形で登場。

``` diff_nim:<font color="#C3CAD5">例) ドロップ増加Ｘダメージ増加Ｘの鉄の剣 (1.20.3→1.20.5)</font>
- /give @s iron_sword{Enchantments:[{id:"looting",lvl:10s},{id:"sharpness",lvl:10s}]} 
+ /give @s iron_sword[enchantments={"looting":10,"sharpness":10}]
```

------------------------------------------------------------------------------------------

### hide_additional_tooltip
**`HideFlags`** タグの$2^{5}$の位を置き換える形で登場。元々 **`HideFlags`** はツールチップで表示させない情報を統合的に指定するビットフィールドでしたが、分離され、$2^{5}$の位が担当していた「様々な他の情報」を非表示にする機能のみがこのコンポーネントに当てられました。

その他の$2^{0}$~$2^{4}$, $2^{6}$, $2^{7}$の位が担当していたエンチャントの内容などはそれぞれのコンポーネント内で **`show_in_tooltip:false`** と記述することで非表示にできるようになりました。

<font color="#888888">... わかりにくい！歴史の話は止めだ</font>

``` diff_nim:<font color="#C3CAD5">例) 不可壊＋破壊可能ブロックのツールチップ非表示 (1.20.3→1.20.5)</font>
- /give @s iron_pickaxe{Unbreakable:1b,CanDestroy:["stone"],HideFlags:12} 
+ /give @s iron_pickaxe[unbreakable={show_in_tooltip:false},can_break={blocks:"stone",show_in_tooltip:false}]
```
``` diff_nim:<font color="#C3CAD5">例) 革防具の色＋エンチャントのツールチップ非表示 (1.20.3→1.20.5)</font>
- /give @s leather_helmet{display:{color:10795537},Enchantments:[{id:"protection",lvl:3s}],HideFlags:65} 
+ /give @s leather_helmet[dyed_color={rgb:10795537,show_in_tooltip:false},enchantments={levels:{"protection":3},show_in_tooltip:false}]
```

------------------------------------------------------------------------------------------

### lock
**`BlockEntityTag.Lock`** タグを置き換える形で登場。収納系ブロックに鍵をかけ、指定した文字列に一致するアイテムでしか開けられないようにすることができます。

:::note warn
1.21.2にて変更があり、鍵にあたるアイテムの自由度が高くなりました。
**指定したコンポーネントに一致するアイテム**でロックできるようになります。
:::

``` diff_nim:<font color="#C3CAD5">例) 名前が「かまどの鍵」のアイテムでしか開けられないかまど (1.20.3→1.20.5)</font>
- /give @s furnace{BlockEntityTag:{Lock:"かまどの鍵"}}
+ /give @s furnace[lock="かまどの鍵"]
```

------------------------------------------------------------------------------------------

### lore
**`display.Lore`** タグを置き換える形で登場。

``` diff_nim:<font color="#C3CAD5">例) かまどの鍵！ (1.20.3→1.20.5)</font>
- /give @s tripwire_hook{display:{Name:'"かまどの鍵"',Lore:['"かまどを開けることができる。"']}}
+ /give @s tripwire_hook[custom_name='"かまどの鍵"',lore=['"かまどを開けることができる。"']]
```

loot function (/item modify等で用いるヤツ) の **`set_lore`** にて新たに**置き換え方法**を選ぶことができるようになり、アイテムlore編集がかなりやりやすくなりました。

| 置き換え方法 `mode` | 機能 |
| - | - |
| append | loreの追加 (以前の`replace:false`の動作) |
| insert | `offset`行目へのloreの挿入 [<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#lore) |
| replace_all | loreの全置換 (以前の`replace:true`の動作) |
| replace_section | `offset`行目 (から`size`行分) の部分置換 [<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#lore) |

``` nim:<font color="#C3CAD5">例) 手に持ったアイテムの1行目にloreを追加 (prepend)</font>
/item modify entity @s weapon.mainhand {"lore":["石でできた、歪で大きな鍵。"],"function":"set_lore","entity":"this","mode":"insert","offset":0}
```

------------------------------------------------------------------------------------------

### profile

**`SkullOwner`** タグを置き換える形で登場。ヘッド用のスキンを設定する、ただそれだけ。

``` diff_nim:<font color="#C3CAD5">例) 特定のプレイヤーのヘッド (1.20.3→1.20.5)</font>
- /give @s player_head{SkullOwner:"Hama_SH"}
+ /give @s player_head[profile={name:"Hama_SH"}]
```

------------------------------------------------------------------------------------------

### written_book_content

**`pages`**, **`title`**, **`author`** タグなどを置き換える形で登場。新loot function **`set_written_book_pages`** を利用して本を編集することができるようになり、本編集に大革命が起きました。loreと同様に置き換え方法を選ぶことができ、本当に便利です。震える。

| 置き換え方法 `mode` | 機能 |
| - | - |
| append | ページの追加 [<img src=https://drive.google.com/uc?id=1PeD5yT4cPKkoS2_XMzKUkkTXi1AQKSnw style="border:none;">](#written_book_content) |
| insert | `offset`行目へのページの挿入 [<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#written_book_content) |
| replace_all | ページの全置換 (以前は`set_nbt` `copy_nbt`などで辛うじて可能)|
| replace_section | `offset`ページ目 (から`size`ページ分) の部分置換 [<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#written_book_content) |

``` nim:<font color="#C3CAD5">例) 手に持った本の2~3ページ目の内容を置換 (存在しない場合は失敗)</font>
/item modify entity @s weapon.mainhand {"pages":[{"raw":"ああ"}],"function":"set_written_book_pages","mode":"replace_section","offset":1,"size":2}
```

![1205-fish.gif](https://drive.google.com/uc?id=1Ub1RfMSqhP_CE7ctsr0iwBGSflNVOlPD)
<font color="#888888">本を手に持った瞬間、/item modifyで最新の内容に更新するなど。</font>

------------------------------------------------------------------------------------------

### その他コンポーネント
**`banner_patterns` `base_color` `bees` `block_entity_data` `block_state` `bucket_entity_data` `bundle_contents` `damage` `debug_stick_state` `dyed_color` `entity_data` `firework_explosion` `fireworks` `instrument` `jukebox_playable` `lodestone_tracker` `map_color` `map_decorations` `map_id` `note_block_sound` `ominous_bottle_amplifier` `pot_decorations` `potion_contents` `rarity` `recipes` `repair_cost` `suspicious_stew_effects` `stored_enchantments` `trim` `unbreakable` `writable_book_content`**

詳細やコマンド実行例は[公式Wiki](https://minecraft.wiki/w/Data_component_format)を参照してください。

## attributes <font color="#ffffff">────────────</font>
エンティティの能力値を指すattributeが新しく9つ追加されました。どれも新しさがあり、製作の幅が大きく広がる要素となっています。

``` nim:<font color="#C3CAD5">例) プレイヤーの大きさを4倍にする</font>
/attribute @s generic.scale base set 4
```
``` nim:<font color="#C3CAD5">例) プレイヤーにかかる重力をデフォルトの0.5倍にするmodifier</font>
/attribute @s generic.gravity modifier add 0-0-0-0-2 example_gravity -0.5 add_multiplied_base
```

:::note warn
1.21にて変更があり、**`name`**, **`uuid`** の設定が任意の **`id`** に置き換わります。また、
1.21.2にも変更があり、**`generic.` `player.` `zombie.`** のprefixが<font color="#a00000">削除</font>されます。
:::

------------------------------------------------------------------------------------------

### (generic.)scale🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#genericscale)
エンティティサイズを制御します。これにより、あらゆるモブやプレイヤーの大きさの変更ができるようになりました。範囲は **`0.0625`~`16.0`** 倍まで自由に設定でき、当たり判定もサイズに伴い調整されます。

![1205-scale.png](https://drive.google.com/uc?id=14-JnPG_I7KYDnE-xujzF68_sBFGJU7NB)
<font color="#888888">デカい .....................！</font>

------------------------------------------------------------------------------------------

### (player.)block_interaction_range🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#playerblock_interaction_range)
ブロックに対するプレイヤーのリーチの長さを制御します。範囲は **`0.0`~`64.0`** ブロック。値が`0`の場合、ブロックへの作用 (右クリック) と破壊 (左クリック) が一切できなくなります。

### (player.)entity_interaction_range🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#playerentity_interaction_range)
エンティティに対するプレイヤーのリーチの長さを制御します。範囲は **`0.0`~`64.0`** ブロック。村人と交易を行える範囲やモブへの攻撃リーチを伸ばしたり、無効化したりできます。

![1205-range.gif](https://drive.google.com/uc?id=1JhrjuFi3pV5fU1wS_epUQ5ieWQAZfz5F)
<font color="#888888">あんなに遠くの村人と交易できちゃう...！</font>

------------------------------------------------------------------------------------------

### (generic.)step_height🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#genericstep_height)
ジャンプすることなく乗り越えられる段差の高さを制御します。範囲は **`0.0`~`10.0`** ブロック。デフォルトでは`0.6`ブロックしか乗り越えられないため、[scale](#genericscale)を用いる場合、同じタイミングで比例するように設定していくと自然です。

------------------------------------------------------------------------------------------

### (generic.)gravity🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#genericgravity)
エンティティにかかる重力の強さを制御します。範囲は **`-1.0`~`1.0`**。マイナスの値にすると、あろうことか重力が逆方向に働きます。なかなか面白い。

![1205-range.gif](https://drive.google.com/uc?id=1IK0UA-Ke8Ne62IzDzCHNjUmAJZ-KgrNh)
<font color="#888888">2023年のエイプリルフールの一要素でした。1年越し！</font>

------------------------------------------------------------------------------------------

### (generic.)safe_fall_distance🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#genericsafe_fall_distance)
落下ダメージを受けない限界の落下距離を制御します。範囲は **`-1024.0`~`1024.0`**。ダメージ計算式は **`落下距離`-`指定値`** となっているので、マイナスの値では着地動作をするだけでダメージを受ける状況を生み出します。[jump_strength](#genericjump_strength)と一緒に用いることが多いです。

------------------------------------------------------------------------------------------

### (generic.)fall_damage_multiplier🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#genericfall_damage_multiplier)
落下ダメージ補正値を制御します。範囲は **`0.0`~`100.0`**。値は純粋に落下ダメージが何倍になるかを示します。... ただそれだけ。使いどころはあまりないかもしれません。

------------------------------------------------------------------------------------------

### (generic.)jump_strength🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#genericjump_strength)
元々馬用に存在していたジャンプ力 **`horse.jump_strength`** が生まれ変わり、あらゆるエンティティのジャンプ力の制御ができるようになりました。

<font color="#888888">ところで、ネガティブエフェクトと言われていたものが**削除**されました。以前は128レベル以上の一部エフェクトに奇妙な仕様があり、説明は省きますが、これを悪用することでジャンプの無効化や重力の強化などができてしまっていました。... これが修正された末に、仕様が1.20.5のattributeに落とし込まれたんだぜ、そんなよもやま話でした。</font>

``` diff_nim:<font color="#C3CAD5">例) 指定したエンティティのジャンプを無効化する (1.20.3→1.20.5)</font>
- /effect give @s jump_boost infinite 128 true
+ /attribute @s generic.jump_strength base set 0.0
```
``` diff_nim:<font color="#C3CAD5">例) 指定したエンティティの重力を0にする (1.20.3→1.20.5)</font>
- /effect give @s levitation infinite 255 true
+ /attribute @s generic.gravity base set 0.0
```

------------------------------------------------------------------------------------------

### (player.)block_break_speed🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#playerblock_break_speed)
プレイヤーのブロック破壊速度を制御します。範囲は **`0.0`~`1024.0`**。値は倍率を表します。

## advancements <font color="#ffffff">───────────</font>

### any_block_use🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#any_block_use)

**`item_used_on_block`** の機能がこちらに移植されました。あらゆるブロックへのインタラクト(右クリック)をトリガーとします。Conditionの`match_tool`でインタラクト時の手持ちのアイテム、`location_check`でインタラクト先のブロックに条件をつけることができます。

``` nim:<font color="#C3CAD5">例) パンを手に持った状態でチェストを開けることの検知 </font>
{
    "criteria": {
        "criteria": {
            "trigger": "any_block_use",
            "conditions": {
                "location": [
                    {
                        "condition": "match_tool",
                        "predicate": {
                            "items": "bread"
                        }
                    },
                    {
                        "condition": "location_check",
                        "predicate": {
                            "block": {
                                "blocks": "chest"
                            }
                        }
                    }
                ]
            }
        }
    }
}
```

**`item_used_on_block`** については機能が見直され、ちゃんと**item**の**block**への**use**が成功しないと条件が通らなくなりました。<font color="#888888">デフォで条件`match_tool`がついているイメージ。多分</font>

### default_block_use🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#default_block_use)

制限付きの[any_block_use](#any_block_use)です。チェストを開けるだとか、デフォのブロックへのインタラクトをトリガーとする、とされています。<font color="#888888">デフォで条件`location_check`のイメージ。多分</font>

------------------------------------------------------------------------------------------

### crafter_recipe_crafted🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#crafter_recipe_crafted)

近く(8ブロック以内)のクラフターがアイテムをクラフトしたことをトリガーとします。

### fall_after_explosion🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#fall_after_explosion)

プレイヤーが爆発やウィンドバーストで打ち上げられた後、落下し始めたタイミングをトリガーとします。[crafter_recipe_crafted](#crafter_recipe_crafted)と同様、コマンド製作では使わなそう！

## コマンド <font color="#ffffff">─────────────</font>

### /transfer🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#transfer)
プレイヤーを別のサーバーに転送することができます。以前はPluginなどが必要でしたが、コマンドでできるようになったことで便利 ...... なのか？なのでしょう。

**`/transfer`<font color="#1992d7">`<hostname> <port> <players>`</font>** - 
プレイヤー<font color="#1992d7">`<player>`</font>をホスト名<font color="#1992d7">`<hostname>`</font>のサーバーに転送する

------------------------------------------------------------------------------------------

### /execute if items🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#execute-if-items)
特定のスロットのアイテムを条件とする、/execute ( if／unless ) itemsサブコマンドが追加されました。以前アイテムの検知には /execute if data を用いる必要があり若干難易度の壁がありましたが、より直感的にｺﾄを行えるようになりました。

**`/execute`<font color="#1992d7">`[if|unless]`</font>`items`<font color="#1992d7">`<source> <slots> <item_predicate>`</font>`...`** - 
指定エンティティやブロック<font color="#1992d7">`<source>`</font>のスロット<font color="#1992d7">`<slots>`</font>に存在するアイテムの性質が<font color="#1992d7">`<item_predicate>`</font>と<font color="#1992d7"> [ 一致 | 不一致 ] </font> の場合、以降のコマンドを継続

``` diff_nim:<font color="#C3CAD5">例) オフハンドのアイテムの検知</font>
- /execute if data entity @s Inventory[{Slot:-106b,id:"minecraft:book",components:{"minecraft:custom_data":{"magic_id":10}}}]
+ /execute if items entity @s weapon.offhand book[custom_data={"magic_id":10}]
```

また、この登場により、条件に一致するアイテムの検知／個数を取得する、**アイテムを0個 /clearするコマンド**の役目が終わりました。裏技的な存在でずっと居座っていたアイツ。

``` diff_nim:<font color="#C3CAD5">例) 指定したアイテムの検知／個数の取得 (1.20.3→1.20.5)</font>
- /clear @s diamond 0
+ /execute if items entity @s inventory.* diamond
```

------------------------------------------------------------------------------------------

### /item
スロット指定方法がいくつか追加されました。/itemに限らず使えますが、ここで紹介。

**`player.cursor`** - プレイヤーがカーソルで保持しているアイテム
**`player.crafting.0`~`player.crafting.3`** - インベントリ内のクラフトスロット
**`contents`** - 単一のアイテムを持つエンティティ (額縁、アイテムディスプレイなど)

``` nim:<font color="#C3CAD5">例) クラフトスロットをゴミ箱とする (function)</font>
## 常時実行 → execute as @a if items entity @s player.crafting.* * run function test:c

# スロットにアイテムが存在する場合それを空気に置換
  execute if items entity @s player.crafting.0 * run item replace entity @s player.crafting.0 with air
  execute if items entity @s player.crafting.1 * run item replace entity @s player.crafting.1 with air
  execute if items entity @s player.crafting.2 * run item replace entity @s player.crafting.2 with air
  execute if items entity @s player.crafting.3 * run item replace entity @s player.crafting.3 with air
```

また、ワイルドカード → **`*`** が追加され、指定スロットの範囲が拡大されました。

| ワイルドカード | 指定範囲 |
| - | - |
| **`player.crafting.*`** | `player.crafting.0` ~ `player.crafting.3` |
| **`container.*`** | `container.0` ~ `container.53` |
| **`hotbar.*`** | `hotbar.0` ~ `container.8` |
| **`inventory.*`** | `inventory.0` ~ `inventory.26` |
| **`enderchest.*`** | `enderchest.0` ~ `enderchest.26` |
| **`villager.*`** | `villager.0` ~ `villager.7` |
| **`horse.*`** | `horse.0` ~ `horse.14` |
| **`weapon.*`** | `weapon.mainhand`, `weapon.offhand` |
| **`armor.*`** | `armor.head`, `armor.chest`, `armor.legs`, `armor.feet`, `armor.body` |

``` nim:<font color="#C3CAD5">例) ホットバーのいずれのスロットにダイヤがあればkill</font>
/execute if items entity @s hotbar.* diamond run kill @s
```

``` nim:<font color="#C3CAD5">例) ホットバーのいずれのスロットにダイヤがあるかを検知する (predicate)</font>
{
    "condition": "entity_properties",
    "entity": "this",
    "predicate": {
        "slots": {
            "hotbar.*": {
                "items": "diamond"
            }
        }
    }
}
```

------------------------------------------------------------------------------------------

### /clear
アイテムの指定にもワイルドカード → **`*`** が使えるようになりました。/clearに限らず使えますが、ここで。また、/clearするアイテムの性質を指定する部分の自由度が上がりました。

``` nim:<font color="#C3CAD5">例) 耐久値が残り30以下のアイテムのclear</font>
/clear @s *[damage~{durability:{max:30}}]
```
``` nim:<font color="#C3CAD5">例) ホットバーのいずれのスロットに "名前付き" ダイヤがあればkill</font>
/execute if items entity @s hotbar.* diamond[custom_name="宝"] run kill @s
```

アイテムの性質を **`,`(かつ) や `|`(または)** で繋げたり、アイテムの特定の性質の値が**◯以上**といった指定なども可能であり、組み合わせ次第で細かく絞りこむことが可能です。

``` nim:<font color="#C3CAD5">例) foodコンポーネント持ち、またはスタック数が7以上のアイテムをclear</font>
/clear @s *[food|count~{min:7}]
```

![1205-clear.gif](https://drive.google.com/uc?id=1Hu8fVUiDbQf4YoECeALFp5UkR5GkNlPN)
<font color="#888888">食べ物＋スタック数7以上のアイテムのみ消去！</font>

最後に、コンポーネントの影響で`custom_data`持ちのアイテム指定にも変更がありました。

``` diff_nim:<font color="#C3CAD5">例) カスタムデータ持ちのアイテムのclear (1.20.3→1.20.5)</font>
- /clear @s carrot_on_a_stick{magic_id:2}
+ /clear @s carrot_on_a_stick[custom_data~{magic_id:2}]
```

------------------------------------------------------------------------------------------

### /particle

**`dust`系**、**`block`系**、**`item`** のパーティクルの記述方法に変更がありました。この影響で、RGBの値に1より大きい値を設定した際に出力できていた綺麗なdustが意図せず？<font color="#a00000">削除</font>されてしまいました。惜しいヤツを失った。

``` diff_nim:<font color="#C3CAD5">例) パーティクル (1.20.3→1.20.5)</font>
- /particle dust 1.0 0.0 0.0 1 ~ ~ ~ 0 0 0 0.1 10 force
+ /particle dust{color:[1.0,0.0,0.0],scale:1} ~ ~ ~ 0 0 0 0.1 10 force

- /particle dust_color_transition 0.0 0.0 1.0 2 1.0 1.0 1.0 ~ ~ ~ 0 0 0 0.1 10 force
+ /particle dust_color_transition{from_color:[0.0,0.0,1.0],scale:1,to_color:[1.0,1.0,1.0]} ~ ~ ~ 0 0 0 0.1 10 force

- /particle item ender_pearl ~ ~ ~ 0 0 0 0.1 10 force
+ /particle item{item:"ender_pearl"} ~ ~ ~ 0 0 0 0.1 10 force

- /particle block diamond_block ~ ~ ~ 0 0 0 0.1 10 force
+ /particle block{block_state:"diamond_block"} ~ ~ ~ 0 0 0 0.1 10 force
```

![1205-particle.png](https://drive.google.com/uc?id=15n3oAWeIDjuvLk1-kS4Jdc7G6U_EQeJe)
<font color="#888888">左からRGB (100000000 1 1)、(1 100000000 1)、(1 1 100000000)。見納め</font>

------------------------------------------------------------------------------------------

### /playsound

プレイヤー、ミキサーを指定しなくても実行できるようになりました。それだけだ！

``` diff_nim:<font color="#C3CAD5">例) 本当にそれだけ！ (1.20.3→1.20.5)</font>
- /playsound entity.player.levelup master @s
+ /playsound entity.player.levelup
```

------------------------------------------------------------------------------------------

### /attribute

attributeのmodifier operationの名称が変更されました。

| 変更前 | 変更後 (1.20.5~) | 操作 |
| - | - | - |
| `add` | **`add_value`** | **$Base$ + $値_{1}$+$値_{2}$+ ...** |
| `multiply_base` | **`add_multiplied_base`** | **$Base$ × ( $値_{1}$+$値_{2}$+ ... )** |
| `multiply` | **`add_multiplied_total`** | **$Base$ × ( 1+$値_{1}$ ) × ( 1+$値_{2}$ ) × ...** |

## ゲームルール <font color="#ffffff">───────────</font>

### spawnChunkRadius🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#spawnchunkradius)

スポーンチャンクの広さを設定します。範囲は **`0`~`32`**。実際のチャンクの広さはこの値を用いて **`指定値×2-1`** チャンク四方と計算されます。デフォルト値は`2`となっているので、標準では3×3チャンクがスポーンチャンクとして絶えずロード状態になっています。

:::note warn
初期チャンクは元々19×19でしたが、今回のバージョンから3×3に縮小されました。
:::

## リソースパック <font color="#ffffff">──────────</font>

### カスタムオオカミテクスチャ🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#カスタムオオカミテクスチャ)

リソースパックを用いて、オオカミのテクスチャを自由に追加できるようになりました。まず、**`assets/<namespace>/textures/entity/wolf`** に以下3種のテクスチャを配置します。

| テクスチャ名 | 説明 |
| - | - |
| **`wolf_◯◯.png`** | variant名◯◯のオオカミの通常時のテクスチャ。 |
| **`wolf_◯◯_angry.png`** | オオカミの敵対時のテクスチャ。 |
| **`wolf_◯◯_tame.png`** | オオカミの友好時のテクスチャ。 |

続けてデータパックで **`data/<namespace>/wolf_variant/◇◇.json`** を作成すれば設定完了。<font color="#888888">**`<namespace>`** にはファイルの場所に応じ、minecraftの他、任意の名前空間を設定します。</font>

``` nim:<font color="#C3CAD5">例) オオカミの設定用jsonファイルテンプレート</font>
{
    "wild_texture": "<namespace>:entity/wolf/wolf_◯◯",
    "angry_texture": "<namespace>:entity/wolf/wolf_◯◯_angry",
    "tame_texture": "<namespace>:entity/wolf/wolf_◯◯_tame",
    "biomes": "the_void"
}
```

``` nim:<font color="#C3CAD5">例) variant名 "minecraft:black" のオオカミの召喚</font>
# /summon wolf ~ ~ ~ {variant:"<namespace>:◇◇"}
/summon wolf ~ ~ ~ {variant:"minecraft:black"}
```

![1205-wolf.png](https://drive.google.com/uc?id=1TmwkDTeFoO3NArL90IjG3ogJcy_SF-LY)
<font color="#888888">まあその、テクスチャがちゃんと描けないと意味は無いわけですが。</font>

### カスタムバナーパターン🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#カスタムバナーパターン)

オオカミと同様、バナーのテクスチャを自由に設定できるようになりました。**`assets/<namespace>/textures/entity/banner`** フォルダや **`assets/<namespace>/textures/entity/shield`** フォルダにテクスチャ **`◯◯.png`** を配置し、データパックの **`data/<namespace>/banner_pattern/◇◇.json`** でファイルを参照することで、自作の模様を持ったバナーや盾を作成できます。

``` nim:<font color="#C3CAD5">例) 模様の設定用jsonファイルテンプレート</font>
{
    "asset_id": "<namespace>:〇〇",
    "translation_key": ""
}
```

``` nim:<font color="#C3CAD5">例) 模様ID "minecraft:creeper" の装飾がなされた盾</font>
# /give @s shield[banner_patterns=[{pattern:"<namespace>:◇◇",color:"white"}]]
/give @s shield[banner_patterns=[{pattern:"minecraft:creeper",color:"lime"}]]
```

## その他の小ネタ <font color="#ffffff">────────</font>

### loot function の埋め込み記述

**`predicate`** **`loot_table`** **`item_modifier`** やら、データパックで別途ファイルを生成する必要があった要素について、コマンド内に埋め込めるようになりました。

``` nim:<font color="#C3CAD5">例) 天気が雨であるかの検知 (predicate埋め込み)</font>
/execute if predicate {"condition":"weather_check","raining":true}
```

つまりはコマンドマクロをこれらに適用することができるようになり、やりたい放題です。

``` nim:<font color="#C3CAD5">例) 金ブロックをX回rollする (loot_table埋め込み)</font>
/loot give @s loot {"pools":[{"rolls":$(roll),"entries":[{"type":"item","name":"gold_block"}]}]}
```

------------------------------------------------------------------------------------------

### カスタムクラフト (惜しい)

レシピの結果にコンポーネントを自由に設定できるようになりました。以前は判定用のアイテムをクラフト→検知→カスタムアイテムをgiveといった流れでしたが、自然にカスタムアイテムのクラフトができるように。ただ、素材にはコンポーネントは指定できません。惜し。

``` nim:<font color="#C3CAD5">例)【裏技】エメラルドの剣のレシピ！</font>
{
    "type": "minecraft:crafting_shaped",
    "pattern": [
        "|",
        "|",
        "T"
    ],
    "key": {
        "|": {
            "item": "emerald"
        },
        "T": {
            "item": "stick"
        }
    },
    "result": {
        "id": "minecraft:iron_sword",
        "components": {
            "minecraft:custom_name": "\"エメラルドの剣\"",
            "minecraft:custom_model_data": 1
        },
        "count": 1
    }
}
```

------------------------------------------------------------------------------------------

### マルチショット弓

**`infinity`** **`multishot`** **`piercing`** これらのエンチャントが弓／クロスボウどちらにも付与できるようになりました。この影響で無限に打てるクロスボウだったり、マルチショット弓が可能に。

![1205-wolf.png](https://drive.google.com/uc?id=1aO3qrEyy4zPgj5HEJ1fcYqtPC7jBRAEH)
<font color="#888888">消費する矢は1本。動的に消費するデータパックを作ったっていい。</font>

------------------------------------------------------------------------------------------

### 動物繁殖用アイテムタグ

**`tags/item/◯◯_food.json`** にて動物を繁殖できるアイテムを設定できるようになりました。

``` nim:<font color="#C3CAD5">例) ブタの誘惑アイテムを無くす (ニンジン付きの棒は反応する...)</font>
{
    "replace": true,
    "values": [
    ]
}
```

謎にストライダーには **`strider_tempt_items`** というタグがあり、これを空にすると歪んだキノコ付きの棒にストライダーが反応しなくなります。右クリック検知的にはこっちの方がいいか？

------------------------------------------------------------------------------------------

### 反射可能な投擲物タグ

**`tags/entity_type/redirectable_projectile.json`** にて、反射できる投擲物を定義できるようになりました。タイミングをうまく合わせれば、トライデントや矢だって反射できます。

``` nim:<font color="#C3CAD5">例) トライデントと矢を反射可能に</font>
{
    "values": [
        "spectral_arrow",
        "trident"
    ]
}
```

![1205-wolf.png](https://drive.google.com/uc?id=1GoIPawze2L9GfdeiH3jItEpOVuDYKvnG)
<font color="#888888">上手くやれば羽根突きとかも作れそうですが、どうですか？</font>

------------------------------------------------------------------------------------------

### エンチャントの表示順変更

**`tags/enchantment/tooltip_order.json`** で、アイテムのツールチップに表示されるエンチャントの順番を自由に入れ替えられるようになりました。ちょっと便利。

# 1.21 <font color="#A0A0A0">(1.21.1)</font>
[<img width="1170" src="https://www.minecraft.net/content/dam/minecraftnet/games/minecraft/screenshots/1.21-1170x500.jpg">](https://www.minecraft.net/en-us/article/minecraft-java-edition-1-21)
<font color="#888888">Minecraft Java Edition 1.21 | Minecraft</font>

2024年6月13日にリリースされたメジャーアップデートです。**既存エンチャントの要素がハードコードからデータパックで活用できるようになり**、大幅にできることが増えた革新的なアップデートとなりました。

参考:
[Data Pack News in Minecraft 1.21](https://www.youtube.com/watch?v=x1rT4o7Q1dY) - slicedlime氏の動画
[New Minecraft Release: 1.21](https://www.minecraft.net/en-us/article/minecraft-java-edition-1-21), [New Minecraft Release: 1.21.1](https://www.minecraft.net/en-us/article/minecraft-java-edition-1-21-1) - 公式リリース記事
[マイクラ1.21のカスタムエンチャントまとめ](https://qiita.com/Hirobao1/items/c6c307cdbad0589d43a3) - ひろばおさんの記事

## ディレクトリ名変更 <font color="#ffffff">────────</font>
データパックのdataフォルダ内の各ディレクトリ名が見直され、1.21以降、単数形に統一されました。この変更により1.21に移行した途端データパックが動かなくなり、大焦りしたコマンド勢がいたとかいなかったとか。tagsフォルダの名前のみ**変更がない**点に注意です。

| 1.20.5以前| 1.21以降|
| - | - |
| structure<font color="#d12828">s</font> | structure |
| advancement<font color="#d12828">s</font> | advancement |
| recipe<font color="#d12828">s</font> | recipe |
| loot_table<font color="#d12828">s</font> | loot_table |
| predicate<font color="#d12828">s</font> | predicate |
| item_modifier<font color="#d12828">s</font> | item_modifier |
| function<font color="#d12828">s</font> | function |
| tags/function<font color="#d12828">s</font> | tags/function |
| tags/item<font color="#d12828">s</font> | tags/item |
| tags/block<font color="#d12828">s</font> | tags/block |
| tags/entity_type<font color="#d12828">s</font> | tags/entity_type |
| tags/fluid<font color="#d12828">s</font> | tags/fluid |
| tags/game_event<font color="#d12828">s</font> | tags/game_event |

## エンチャント <font color="#ffffff">───────────</font>

エンチャントの要素がデータドリブンになったおかげでデータパックで活用できるようになり、**(Ａの条件下で)ＢしたときＣ** などといった組み合わせが無数に追加されました。

例えば **`infinity`** は矢消費を無くす弓／クロスボウのエンチャントですが、実装を読み解くと **(arrowに一致する)アイテムを消費(ammo_use)したとき、その消費数を0.0に(set)する**。このような流れになっていることがわかります。

``` nim:<font color="#C3CAD5">例) infinity「無限」エンチャントのコア(Effect)部分</font>
{

    # ---------- 前略 ---------- #
    
    "slots": [
        "mainhand"
    ],
    "effects": {
        "minecraft:ammo_use": [     # B ... アイテムを消費
            {
                "effect": {
                    "type": "minecraft:set",     # Ｃ ... 数値の設定
                    "value": 0.0
                },
                "requirements": {
                    "condition": "minecraft:match_tool",     # A ... アイテムの一致
                    "predicate": {
                        "items": "minecraft:arrow"
                    }
                }
            }
        ]
    }
}
```

| - | 役割 | 名前 |
| - | - | - |
| Ａ | 追加条件 | Condition |
| Ｂ | 効果(+トリガー) | Effect Component (効果コンポーネント) |
| Ｃ | 効果／設定 | Effect Type (効果タイプ) |

20のCondition、30の効果コンポーネント、13の効果タイプを組み合わせられて、何なら **`run_function`** なんて効果タイプもあるので、その自由度の高さが想像できるはずです。

<font color="#888888">ただ構造が多岐に渡るので解説し辛い… 本当に！Effect Component単体で効果を示すものもあれば、Effect Componentがトリガーの役割をしてEffect Typeで具体的な効果を指定するものも。便宜上正確な解説になってないところはすんません...。</font>

------------------------------------------------------------------------------------------

また、エンチャントの定義は **`data/<namespace>/enchantment/◇◇.json`** にて行います。

``` nim:<font color="#C3CAD5">例) カスタムエンチャントの全体図 (空のテンプレート)</font>
{
    "description": "",
    "exclusive_set": "",
    "supported_items": "#minecraft:enchantable/durability",
    "primary_items": "",
    "weight": 1,
    "max_level": 1,
    "min_cost": {
        "base": 0,
        "per_level_above_first": 0
    },
    "max_cost": {
        "base": 0,
        "per_level_above_first": 0
    },
    "anvil_cost": 0,
    "slots": [
        "any"
    ],
    "effects": {}
}
```

**`description`** - エンチャント名
**`exclusive_set`** - このエンチャントと共存不可能なエンチャント **(省略可能)**
**`supported_items`** - このエンチャントが付与可能なアイテムの一覧
**`primary_items`** - エンチャントテーブルや村人との取引において、このエンチャントが出現しうるアイテム **(省略可能)**。省略した場合`supported_items`と中身同じの扱い。ここに記されなかった、supportedだけどprimaryでないアイテムは金床でのみエンチャント付与可能。

**`weight`** - エンチャントの出現確率
**`max_level`** - エンチャントの最大レベル ( 範囲 **`1`~`255`** )
**`min_cost`** - エンチャントするために必要なコストの**最小値**
**`max_cost`** - エンチャントするために必要なコストの**最大値**
**`anvil_cost`** - 金床使用のエンチャント付与に必要なレベル
<details><summary><b><code>slots</code></b> - このエンチャントの効果が発揮できるスロット</summary>

├ **`any`** - 下記いずれのスロット
├ **`hand`** - mainhand + offhand
├ **`mainhand`** - メインハンド
├ **`offhand`** - オフハンド
├ **`armor`** - いずれの装備スロット
├ **`head`** - 頭装備
├ **`chest`** - 胴装備
├ **`legs`** - 脚装備
├ **`feet`** - 足装備
└ **`body`** - 動物の鎧スロット
</details>

**`effects`** - エンチャントの効果 **(コア処理の部分！)**

:::note warn
カスタムエンチャントのデータパックの更新には **`/reload`** ではなく、
**ワールドの入り直し**が必要であることには注意が必要です。
:::

``` nim:<font color="#C3CAD5">例) エンチャントが追加できているかの確認</font>
# /enchant @s <namespace>:◇◇
/enchant @s minecraft:test_enchant
```

新エンチャントを作る！よりはコマンド的な使い方をするといった場合、基本的には **`supported_items` `slots` `effects`** あたりをいじるだけでOKです。逆にエンチャントテーブルで新しく剣に付与するようなエンチャントが作りたい場合は、他も掘り下げる必要アリ。

------------------------------------------------------------------------------------------

... さて、効果コンポーネントと効果タイプを見ていきましょう。**ひろばおさんの記事でな！！！** 少しの事前知識があれば、さほど詰まることなく読み進められると思います。

https://qiita.com/Hirobao1/items/c6c307cdbad0589d43a3

## コンポーネント <font color="#ffffff">──────────</font>

コマンド **`/give` `/item` `/loot`** において、**`!`** を用いることでコンポーネントの削除 (性質の剥奪) が可能になりました。元々はitem modifierにしか無かった機能ですが、より手軽に。

``` nim:<font color="#C3CAD5">例) 燃える (炎上耐性の無い) ネザライトインゴット</font>
/give @s netherite_ingot[!fire_resistant={}]
```

------------------------------------------------------------------------------------------

### food

**`using_converts_to`** が追加されました。food持ちアイテムを消費したのち、そのアイテムを置き換える対象のアイテムを設定できます。food持ちアイテムのスタック数が0より多ければインベントリの他スロットに加えられ、インベントリが満杯であれば地面に吐き出します。

:::note warn
1.21.2にて変更があり、[consumable](#consumable), [use_remainder](#use_remainder)に一部機能が移植されます。
:::

**`nutrition`** - 満腹度の回復値 (0以上の整数)
**`saturation`** - 隠し満腹度の回復値 (負の値も可)
**`can_always_eat`** - 満腹でも食べられるか

**`eat_seconds`** (1.21.2にて<font color="#a00000">削除</font>) - 食べるのにかかる時間
**`effects`** (1.21.2にて<font color="#a00000">削除</font>) - 消費時に付与されるエフェクト効果
**`using_converts_to`** (1.21.2にて<font color="#a00000">削除</font>) - 消費時に与えられるアイテム

``` nim:<font color="#C3CAD5">例) 消費時ヘタが残るリンゴ</font>
/give @s apple[food={nutrition:4,saturation:2.4,using_converts_to:{id:"stick",count:1}}]
```

## attributes <font color="#ffffff">────────────</font>

かなり煩わしかった **`name`**, **`uuid`** の設定が任意の **`id`** に置き換わりました。やった！あと、**プレイヤーリスポーン時やディメンション移動時のattributeリセットが無くなりました**。

:::note warn
1.21.2にて変更があり、**`generic.` `player.` `zombie.`** のprefixが<font color="#a00000">削除</font>されます。
:::

``` diff_nim:<font color="#C3CAD5">例) 足に装備すると足の速さが+50%される革の靴 (1.20.3→1.20.5→1.21)</font>
- /give @s leather_boots{AttributeModifiers:[{AttributeName:"generic.movement_speed",Name:"example_speed",Amount:0.05,Operation:0,UUID:[I;0,0,0,0],Slot:"feet"}]}
- /give @s leather_boots[attribute_modifiers=[{type:"generic.movement_speed",name:"example_speed",amount:0.05,operation:"add_value",uuid:[I;0,0,0,0],slot:"feet"}]]
+ /give @s leather_boots[attribute_modifiers=[{type:"generic.movement_speed",id:"example_speed",amount:0.05,operation:"add_value",slot:"feet"}]]
```

------------------------------------------------------------------------------------------

### (generic.)attack_knockback🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#genericattack_knockback)

攻撃のノックバックの強さを制御します。範囲は **`0.0`~`5.0`**。まさに武器のノックバックエンチャントそのもののイメージ。物理攻撃のみに適用されることは注意が必要です。

------------------------------------------------------------------------------------------

### (generic.)burning_time🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#genericburning_time)

炎上状態になってから火が消えるまでの時間。範囲は **`0.0`~`1024.0`**。デフォルトは`1`倍で、この値を`0`にすることで炎上状態になること自体を無効化することができます。

------------------------------------------------------------------------------------------

### (generic.)explosion_knockback_resistance🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#genericexplosion_knockback_resistance)

爆発・ノックバック・耐性。範囲は **`0.0`~`1.0`**。`1`で爆風を完全に無効化します。

------------------------------------------------------------------------------------------

### (player.)mining_efficiency🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#genericmining_efficiency)

ブロックを採掘する際の効率を強化します。範囲は **`0.0`~`1024.0`**。ブロックを正しいツールで採掘した場合のみに適用され、その速度は **`指定値+1`** 倍となります。

------------------------------------------------------------------------------------------

### (generic.)movement_efficiency🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#genericmovement_efficiency)

移動速度低下効果のあるブロック (=ソウルサンド) の上を歩く際の速度低下効果を制御します。範囲は **`0.0`~`1.0`**。`1`で速度低下効果を完全に無効化します。

<font color="#888888">日本語のWikiにはクモの巣など... とありましたが、試したところダメでした。これもできたら便利だったのに。恐らくは**ソウルスピード**エンチャの効果が分離されただけであって。</font>

------------------------------------------------------------------------------------------

### (generic.)oxygen_bonus🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#genericoxygen_bonus)

毎tick、酸素値 **`Air`** が減少する確率を制御します。範囲は **`0.0`~`1024.0`**。`Air`タグは`200`固定なので、通常10秒以上水中に居るとダメージを受けることになりますが、この値が **`1/(指定値+1)`** の確率で減るように変更できるため、結果長い間水中に居られるようになります。

------------------------------------------------------------------------------------------

### (player.)sneaking_speed🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#genericsneaking_speed)

スニーク中の速度低下効果を制御します。範囲は **`0.0`~`1.0`**。`1`で歩きと同じ速さでの移動が可能になります。**ダッシュ中のスニークもできるように**なります。

------------------------------------------------------------------------------------------

### (player.)submerged_mining_speed🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#genericsubmerged_mining_speed)

水中での採掘速度を制御します。範囲は **`0.0`~`20.0`**。値は陸上での採掘速度との比となっており、デフォルトの`0.2`は水中での採掘が陸上と比べて1/5の速度であることを意味します。

------------------------------------------------------------------------------------------

### (player.)sweeping_damage_ratio🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#genericsweeping_damage_ratio)

薙ぎ払い攻撃のダメージを制御します。範囲は **`0.0`~`1.0`**。`1`で薙ぎ払いによる2体目のターゲットへのダメージが減衰せず、完全に伝播します。

------------------------------------------------------------------------------------------

### (generic.)water_movement_efficiency🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#genericwater_movement_efficiency)

水中における速度低下効果を制御します。範囲は **`0.0`~`1.0`**。`1`で完全に無効化します。

## predicates <font color="#ffffff">────────────</font>

### is_on_ground🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#is_on_ground)

エンティティが地面に接しているかに条件を付けることができます。エンティティのデータとして存在した **`OnGround`** がpredicateで指定できるようになった形で、扱いやすくなりました。

``` diff_nim:<font color="#C3CAD5">例) コマンド実行者が地面に接しているか検知 (1.20.5→1.21)</font>
- /execute if data entity @s {OnGround:1b}
+ /execute if predicate {"condition":"entity_properties","entity":"this","predicate":{"flags":{"is_on_ground":true}}}
```

------------------------------------------------------------------------------------------

### is_flying🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#is_flying)

プレイヤーが飛んでいるか (エリトラ飛行／クリエイティブ空中移動) に条件を付けることができます。<font color="#888888">ファントムやニワトリ、エリトラを付けたモブなどには効果無しでした。残念だ</font>
``` nim:<font color="#C3CAD5">例) 飛行移動を検知するpredicate </font>
{
    "condition": "entity_properties",
    "entity": "this",
    "predicate": {
        "flags": {
            "is_flying": true
        }
    }
}
```

------------------------------------------------------------------------------------------

### can_see_sky🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#can_see_sky)

空からの光源値が最大の **`15`** であるかどうかに条件を付けることができます。locationの一要素となっていて、地表において頭上に光を妨げるものが何も無いことを検知できます。

``` nim:<font color="#C3CAD5">例) 頭上に空があるか検知するpredicate </font>
{
    "condition": "entity_properties",
    "entity": "this",
    "predicate": {
        "location": {
            "can_see_sky": true
        }
    }
}
```

過去にはゴリ押しで検知する方法もありましたが、今ではこれで一撃。
[How to Detect Skylight in Minecraft [1.13-1.20.4]](https://www.youtube.com/watch?v=FmcoixQOrS4) - Cloud Wolf氏の動画

------------------------------------------------------------------------------------------

### movement🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#movement)

エンティティの速度や動きに条件を付けることができます。速度の単位は **`ブロック／秒`**。どれも min/max を指定することができて、例えば... 何に使えます？<font color="#888888"> 【募】使用用途</font>

**`x` `y` `z`**, **`speed`** - 各軸 xyz 方向へ分解した速度と、純粋な速度
**`horizontal_speed`**, **`vertical_speed`** - 水平、垂直方向の速度
**`fall_distance`** - 落下距離

### movement_affected_by🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#movement_affected_by)

エンティティの動作に影響を与えているブロック (最大0.5ブロック下まで) に条件を付けることができます。氷やソウルサンドなどがこれにあたります。特別使う場面は少ないかも。

------------------------------------------------------------------------------------------

### periodic_ticks🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#periodic_ticks)

指定したtickごとに真になるといった条件を付けることができます。これを使えば、数秒ごとに○○するなどといった処理を簡単に作ることができ、/scheduleループの代用としても。

``` nim:<font color="#C3CAD5">例) 1.5秒ごとに報酬functionを呼び出すadvancement </font>
{
    "criteria": {
        "requirement": {
            "trigger": "tick",
            "conditions": {
                "player": {
                    "periodic_tick": 30
                }
            }
        }
    },
    "rewards": {
        "function": "advent:reward"
    }
}
```

------------------------------------------------------------------------------------------

### is_direct🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#is_direct)

与えたダメージが直接的 (direct) か間接的 (indirect) かに条件を付けることができます。**`Source Entity`** と **`Direct Entity`** が一致しているかを検知することができて、例えば弓を用いた攻撃の場合、実際に攻撃を与える **`Direct Entity`** は「矢」であるため、偽になります。

``` nim:<font color="#C3CAD5">例) 間接的にモブを倒した時のみダイヤを落とすloot_table </font>
{
    "pools": [
        {
            "rolls": 1,
            "entries": [
                {
                    "type": "item",
                    "name": "diamond",
                    "conditions": [
                        {
                            "condition": "damage_source_properties",
                            "predicate": {
                                "is_direct": false
                            }
                        }
                    ]
                }
            ]
        }
    ]
}
```

## リソースパック <font color="#ffffff">──────────</font>

### カスタム絵画テクスチャ🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#カスタム絵画テクスチャ)

前バージョンの流れで、絵画のテクスチャを自由に設定できるようになりました。**`asset/<namespace>/textures/painting/◯◯.png`** にテクスチャを配置し、 **`data/<namespace>/painting_variant/◇◇.json`** で参照することで自作ができます。

``` nim:<font color="#C3CAD5">例) 1ブロック×1ブロック (16x16) の絵画の設定用jsonファイル</font>
{
    "asset_id": "<namespace>:〇〇",
    "height": 1,
    "width": 1
}
```

``` nim
/give @s painting[entity_data={id:"painting",variant:"<namespace>:◇◇"}]
```

------------------------------------------------------------------------------------------

### カスタム音源 (Jukebox Songs)🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#カスタム音源-jukebox-songs)
加えて、ジュークボックスに流すことのできる音源も自由に追加できるようになりました。

① リソースパックに追加したい音を配置 **`assets/<namespace>/sounds/◯◯.ogg`**
② リソースパックの **`assets/<namespace>/sounds.json`** にて音を定義
``` nim:<font color="#C3CAD5">例) test.oggをmusic_disc.testとして参照できるよう定義 </font>
{
    "music_disc.test": {
        "sounds": [
            {
                "name": "test"
            }
        ]
    }
}
```

③ データパックで音源を定義 **`data/<namespace>/jukebox_song/◯◯.json`**
**`comparator_output`** はこの音源をジュークボックスが再生中に **`length_in_seconds`** 秒間発生させるレッドストーン信号の強さなので、これらはカスタム音源においては気にせずOK。

``` nim:<font color="#C3CAD5">例) test.oggをmusic_disc.testとして参照できるよう定義 </font>
{
    "comparator_output": 0,
    "description": "テスト用音源",
    "length_in_seconds": 1.0,
    "sound_event": {
        "sound_id" : "music_disc.test"
    }
}
```

④ 音源を設定した任意のアイテムをジュークボックスへ
``` nim
/give @s emerald[jukebox_playable={song:"<namespace>:test"}]
```

## その他の小ネタ <font color="#ffffff">────────</font>

### セレクター@n🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#セレクターn-)

コマンド実行位置から一番近いエンティティを指すセレクター **`@n`** が追加されました。**`@e[sort=nearest,limit=1]`** と同じ機能を持ちます。コマンドがすっきりして素敵だ。

------------------------------------------------------------------------------------------

### 矢を必要としない弓 (ｴﾝﾁｬﾝﾄ)

インベントリに矢を入れていなくても弓が打てるようになる技術！効果コンポーネント **`ammo_use`** を用いて、矢の発射時に消費する弾の数を0としています。

```nim:<font color="#C3CAD5">例) 使用する弾の消費数を0にするカスタムエンチャント "no_ammo"</font>
{
    "description": "",
    "supported_items": "bow",
    "weight": 1,
    "max_level": 1,
    "min_cost": {
        "base": 0,
        "per_level_above_first": 0
    },
    "max_cost": {
        "base": 0,
        "per_level_above_first": 0
    },
    "anvil_cost": 0,
    "slots": [
        "any"
    ],
    "effects": {
        "ammo_use": [
            {
                "effect": {
                    "type": "set",
                    "value": 0
                }
            }
        ]
    }
}
```

続いて **`data/minecraft/tags/item/arrows.json`** をこのように記述します。弓の弾として弓自身を消費するように設定することで、矢が無くても弓を引き絞ることができるように。

```nim:<font color="#C3CAD5">例) 弓の弾として「弓」を使うようにするアイテムタグ</font>
{
    "values": [
        "bow"
    ]
}
```

```nim
/give @s bow[enchantments={"advent:no_ammo":1}]
```

------------------------------------------------------------------------------------------

### 矢の着弾地点のブロックを爆発！(ｴﾝﾁｬﾝﾄ)

効果コンポーネント **`hit_block`** を用いて、矢の着弾地点から簡単にコマンド (function) の実行ができるようになりました。ここでは着弾地点のブロックをTNT ([そのブロックの見た目](#偽tnt-block_state)) に変換して爆発させる、そんなものを作ってみることとします。

``` nim:<font color="#C3CAD5">例) 着弾地点をTNTにするカスタムエンチャント "explosive"</font>
{
    "description": "",
    "supported_items": "bow",
    "weight": 1,
    "max_level": 1,
    "min_cost": {
        "base": 0,
        "per_level_above_first": 0
    },
    "max_cost": {
        "base": 0,
        "per_level_above_first": 0
    },
    "anvil_cost": 0,
    "slots": [],
    "effects": {
        "hit_block": [
            {
                "effect": {
                    "type": "run_function",
                    "function": "advent:tnt/arrow"
                }
            }
        ]
    }
}
```

効果エフェクト **`run_function`** で以下の2つのfunctionが実行されます。

```nim:<font color="#C3CAD5">例) function advent:tnt/arrow</font>
# functionの実行者が矢である時だけ、矢の着弾地点のブロックの見た目をしたTNT召喚
    execute if entity @s[type=arrow] run function advent:tnt/summon with entity @s inBlockState
```

`execute if` を挟まないと、弓を手にもって左クリック (**`hit_block`**) した際も (プレイヤーが実行者として) 以降の処理が実行されてしまうため、少し不便ですが必要な操作になります。

続けて矢の「刺さったブロック」のデータ (**`inBlockState`**) を取得し、マクロで **`block_state`** を設定したTNTをそのブロックの座標に召喚していきます。

```nim:<font color="#C3CAD5">例) ②function advent:tnt/summon</font>
# マクロでブロックの見た目のTNTを召喚
    $execute align xyz positioned ~0.5 ~ ~0.5 run summon tnt ~ ~ ~ {fuse:80,block_state:{Name:"$(Name)"}}
    playsound entity.tnt.primed master @a ~ ~ ~ 0.8 1

# 後処理 (矢が残り続けると刺さったブロックを次々とTNTにしてしまう)
    setblock ~ ~ ~ air
    kill @s
```

```nim
/give @s bow[enchantments={"advent:explosive":1}]
```

![1212-explosive.gif](https://drive.google.com/uc?id=1yZhUH3tlWgNMImevjC6nPiRIUD_Hpmb8)
<font color="#888888">数コマンドでここまでできるようになったかと思うと感慨深い。</font>

------------------------------------------------------------------------------------------

### 理論値最速の釣り竿 (ｴﾝﾁｬﾝﾄ)

効果コンポーネント **`fishing_time_reduction`** を用いて、既存の **`入れ食いIII`** エンチャント以上に釣り待機時間を大幅に短縮することが可能になります。結論は下の通り！

``` nim:<font color="#C3CAD5">例) 理論値最速で釣れるエンチャント "ultra_lure"</font>
{
    "description": "",
    "supported_items": "fishing_rod",
    "weight": 1,
    "max_level": 1,
    "min_cost": {
        "base": 0,
        "per_level_above_first": 0
    },
    "max_cost": {
        "base": 0,
        "per_level_above_first": 0
    },
    "anvil_cost": 0,
    "slots": [
        "any"
    ],
    "effects": {
        "fishing_time_reduction": [
            {
                "effect": {
                    "type": "add",
                    "value": 28.4
                }
            }
        ]
    }
}
```

基本 5~30秒 (100~600tick) である釣り時間はエンチャントによって短縮が可能ですが、最小／最大値だけを狙って操作することはできず、例えば **`入れ食いII`** の場合だと最小／最大値の**両方**から`200`tickずつ短縮されます。結果として釣り時間は **ﾏｲﾅｽ** 5秒~20秒 (-100~400tick)。

マイナスの釣り時間が抽選された場合、次tickで正の値が選択されるまで再抽選が行われるため、時間を短縮しすぎることによってかえって釣り時間が長くなってしまうことも。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589374/c6526d89-2881-4940-b3af-d69ad698df76.png)
<font color="#888888">600tick以上短縮させた場合は永遠に再抽選が繰り返され、釣れなくなります。</font>

色々加味して調べた結果、釣り時間を **`568`** tick短縮させた場合が理論値で、この場合平均約1.6秒 (32tick) で魚影が現れます。あくまでも理論値ですが、そんな感じです。

```nim
/give @s bow[enchantments={"advent:ultra_lure":1}]
```

# 1.21.2 <font color="#A0A0A0">(1.21.3)</font>
[<img width="1170" src="https://www.minecraft.net/content/dam/minecraftnet/games/minecraft/screenshots/1.21.2%201170x500.jpg">](https://www.minecraft.net/en-us/article/minecraft-java-edition-1-21-2)
<font color="#888888">Minecraft Java Edition 1.21.2 | Minecraft</font>

2024年10月22日にリリースされたマイナーアップデートです。**コンポーネントやpredicateの追加によりできることが更に増え、またも革新的なアップデートとなりました。**

参考:
[Data & Resource Pack News in Minecraft 1.21.2!](https://www.youtube.com/watch?v=-n7DOa_Obek) - slicedlime氏の動画
[New Minecraft Release: 1.21.2](https://www.minecraft.net/en-us/article/minecraft-java-edition-1-21-2), [New Minecraft Release: 1.21.3](https://www.minecraft.net/en-us/article/minecraft-java-edition-1-21-3) - 公式リリース記事

## エンチャント <font color="#ffffff">───────────</font>

### change_item_damage🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#change_item_damage)

効果タイプ **`damage_item`** が **`change_item_damage`** に改名され、武器／ツールの耐久値を減らすだけでなく**増やす**こともできるように。マイナスの値で耐久値の回復ができます。

``` nim:<font color="#C3CAD5">例) 走ると耐久値が回復するカスタムエンチャント "running_mend"</font>
{

    # ---------- 前略 ---------- #

    "effects": {
        "tick": [
            {
                "requirements": {
                    "condition": "entity_properties",
                    "entity": "this",
                    "predicate": {
                        "flags": {
                            "is_sneaking": true
                        }
                    }
                },
                "effect": {
                    "type": "change_item_damage",
                    "amount": -1
                }
            }
        ]
    }
}
```

```nim
/give @s bow[enchantments={"advent:running_mend":1}]
```

------------------------------------------------------------------------------------------

### projectile_spawned

投射物エンティティが召喚されたときに適用される効果コンポーネント **`projectile_spawned`** ですが、これを適用可能な対象が大きく増えました。<font color="#888888">雪玉、トライデント、ファイヤーチャージ、投擲ポーション、エンダーパール、釣竿 (浮き)、ロケット花火と、卵。</font>

効果タイプは投射物として適用されるため、投げた瞬間に **`ignite`** される卵や **`run_function`** するトライデントなど、エンチャント一つで面白いことができるように。

## コンポーネント <font color="#ffffff">──────────</font>

### consumable🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#consumable)

右クリック長押しでアイテムを消費できるかを設定できます。これにより **`food`** が食べ物のデータ関連のみを持つようになりました。消費アニメーション＋消費時間に大きな値を設定することで、**右クリック検知用アイテム**として使用できるようになったりも。

**`consume_seconds`** - 消費にかかる時間
**`sound`** - 消費中の音 (playsoundのループ)
**`has_consume_particles`** - 消費中アイテムのパーティクルを出すか

<details><summary><b><code>animation</code></b> - 消費中のアニメーション</summary>

├ **`none`** - なし
├ **`eat`** - 食べ物を食べる動作
├ **`drink`** - ポーション等を飲む動作
├ **`block`** - 盾でガードする動作
├ **`bow`** - 弓を引き絞る動作
├ **`spear`** - トライデントを構える動作
├ **`crossbow`** - クロスボウを引き絞る動作
├ **`spyglass`** - 望遠鏡を覗く動作
├ **`toot_horn`** - 角笛を吹く動作
└ **`brush`** - ブラシを使用する動作
</details>

<details open><summary><b><code>on_consume_effects</code></b> - 消費時の効果</summary>

├ **`apply_effects`** - 指定したステータス効果の付与
├ **`remove_effects`** - 指定したステータス効果の解除
├ **`clear_all_effects`** - すべてのステータス効果の解除
├ **`teleport_randomly`** - 指定範囲でランダムにテレポート
└ **`play_sound`** - 一度きり指定した音を再生する
</details>

``` diff_nim:<font color="#C3CAD5">例) 効果付き食べられる草ブロック (1.20.5→1.21.2)</font>
- /give @s grass_block[food={nutrition:1,saturation:-1.5,can_always_eat:true,eat_seconds:0.2,effects:[{effect:{id:"blindness",amplifier:0,duration:20},probability:0.5}]}]
+ /give @s grass_block[food={nutrition:1,saturation:-1.5,can_always_eat:true},consumable={consume_seconds:0.2,on_consume_effects:[{type:"apply_effects",effects:[{id:"blindness",amplifier:0,duration:20}],probability:0.5}]}]
```

``` nim:<font color="#C3CAD5">例) 天に掲げることができるというだけのダイヤ</font>
/give @s diamond[consumable={consume_seconds:1000000000,animation:"spear",sound:"intentionally_empty",has_consume_particles:false}]
```

![1212-consumable.png](https://drive.google.com/uc?id=1Vp6tDy2-rfjqDDDO65SwsRZC8W4j24AP)
<font color="#888888">ジャーーーン！ダイヤモンド！！</font>

------------------------------------------------------------------------------------------

### damage_resistant🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#damage_resistant)

**`fire_resistant`** が改名されました。とついでに、炎上ダメージ以外のダメージ全般への耐性を設定できるように。アイテムが指定したダメージタイプに耐性があるかを設定できます。

``` diff_nim:<font color="#C3CAD5">例) 燃えない木の棒 (1.20.5→1.21.2)</font>
- /give @s stick[fire_resistant={}]
+ /give @s stick[damage_resistant={types:"#is_fire"}]
```

``` nim:<font color="#C3CAD5">例) 爆発耐性のないネザースター</font>
/give @s nether_star[!damage_resistant]
```

------------------------------------------------------------------------------------------

### death_protection🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#death_protection)

プレイヤーが致死ダメージを受ける際身代わりになるかを設定できます。**不死のトーテム**と同じように、身代わりにするには手に持っている必要があります。

<details open><summary><b><code>death_effects</code></b> - 身代わり発動時の効果 ( <b><code>consumable</code></b> の <b><code>on_consume_effects</code></b> と一緒！)</summary>

├ **`apply_effects`** - 指定したステータス効果の付与
├ **`remove_effects`** - 指定したステータス効果の解除
├ **`clear_all_effects`** - すべてのステータス効果の解除
├ **`teleport_randomly`** - 指定範囲でランダムにテレポート
└ **`play_sound`** - 一度きり指定した音を再生する
</details>

``` nim:<font color="#C3CAD5">例) 不死のトーテム化した鉄のヘルメット (被ると効果無し)</font>
/give @s iron_helmet[death_protection={}]
```

------------------------------------------------------------------------------------------

### enchantable🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#enchantable)

アイテムがエンチャント可能かを設定できます。これと合わせて、データパックの **`data/minecraft/tags/item/enchantable`** で付与できるエンチャントの設定もする必要アリ。<font color="#888888">また、**`value`** は大きい程レアなエンチャント付与の可能性が高くなります...？</font>

``` nim:<font color="#C3CAD5">例) エンチャントできる木の棒 </font>
/give @s stick[enchantable={value:10}]
```

``` nim:<font color="#C3CAD5">例) 木の棒を data/minecraft/tags/item/enchantable/sword.json に追加 </font>
{
    "values": [
        "#minecraft:swords"
        "stick"
    ]
}
```

------------------------------------------------------------------------------------------

### equippable🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#equippable)

アイテムを装備できるかを設定できます。以前アーマー系のアイテム以外を装備スロットに入れるためには右クリック検知等の特別な処理が必要でしたが、かなり簡単になりました。また、これによって簡単に**自作の[カスタムアーマー](#カスタムアーマー)を追加**できるように。

:::note warn
1.21.4にて変更があり、**`model`** が **`asset_id`** に改名されます。また、
アーマーモデルの置き場所が **`models/equipment/`** → **`equipment/`** となります。
:::

<details><summary><b><code>slot</code></b> - 装備先のスロット</summary>

├ **`head`** - 頭装備
├ **`chest`** - 胴装備
├ **`legs`** - 脚装備
├ **`feet`** - 足装備
├ **`body`** - 体 (オオカミなどに使用)
├ **`mainhand`** - メインハンド
└ **`offhand`** - オフハンド
</details>

**`equip_sound`** - 装備するときの効果音
**`model`** (1.21.2にて<font color="#a00000">削除</font>) - カスタムアーマーモデルの参照先
**`camera_overlay`** - 画面にオーバーレイするテクスチャ (例: くり抜かれたカボチャ)
**`allowed_entities`** - アイテムを装備可能なエンティティのID
**`dispensable`** - ディスペンサーで自動装備が可能か
**`swappable`** - 右クリックで指定スロットに装備可能か
**`damage_on_hurt`** - ダメージを受けたとき耐久値を減らすか

``` nim:<font color="#C3CAD5">例) 頭に装備できる金ブロック (くり抜かれたカボチャのオーバーレイ付き)</font>
/give @s gold_block[equippable={slot:head,camera_overlay:"misc/pumpkinblur"}]
```

![1212-equippable.png](https://drive.google.com/uc?id=1TChaC7mj2ighPSm76GbM9HkCjjkds3cH)
<font color="#888888">既存の装備を消さずに、完全に新しいアーマーテクスチャを追加</font>

------------------------------------------------------------------------------------------

### glider🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#glider)

装備時にエリトラのように機能し、滑空できるようになるかが設定できます。

``` nim:<font color="#C3CAD5">例) 胴に装備でき、滑空できるようになる羽</font>
/give @s feather[equippable={slot:chest},glider={}]
```

------------------------------------------------------------------------------------------

### item_model🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#item_model)

アイテムのモデル (見た目) を設定できます。以前はcustom_model_dataで管理されていたアイテムモデルですが、より明示的にこれを追加／変更できるようになりました。これにより、アイテムごとに**リソースパックをいじらずとも**好きな見た目を適用できるように。

:::note warn
1.21.4にて変更があり、フォルダ構成が変わると共に出来ることが大きく増えます。
:::

``` nim:<font color="#C3CAD5">例) 鉄の剣の見た目をしたトライデント</font>
/give @s trident[item_model="iron_sword"]
```

------------------------------------------------------------------------------------------

### repairable🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#repairable)

金床と指定素材でアイテムが修理可能かを設定できます。

``` nim:<font color="#C3CAD5">例) 木の棒+10レベルで修理できる鉄の剣 </font>
/give @s iron_sword[repairable={items:"stick"},damage=100,repair_cost=9]
```

![1212-repairable.png](https://drive.google.com/uc?id=191LS-TqV5bBzw4V2ZONkrljWn7O996iP)
<font color="#888888">repair_costでエンチャントのコストも操作可能。</font>

------------------------------------------------------------------------------------------

### tooltip_style🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#tooltip_style)

アイテムのツールチップの背景を設定できます。リソースパックで[自作のもの](#カスタムツールチップ背景)を用意することで、好きにツールチップの枠と背景を設定することができます。

``` nim:<font color="#C3CAD5">例) 自作の青枠付きの「黄金のリンゴ」 </font>
/give @s golden_apple[tooltip_style="resource:rarity_3"]
```

![1212-tooltip_style.png](https://drive.google.com/uc?id=1lOpdsfHC6_H6ed3UNOJffCvB_hU-8-36)
<font color="#888888">ツールチップの周りの青枠。これがあるだけでかなりの雰囲気が出る！！</font>

------------------------------------------------------------------------------------------

### use_cooldown🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#use_cooldown)

エンダーパールに付いているようなクールダウンをどのアイテムにも設定できるようになりました。それは逆にクールダウンが無くせるようになったとも。

**`seconds`** - 何秒のクールダウンを設定するか
**`cooldown_group`** - 共通のクールダウンを持たせるアイテムのグループ名

``` nim:<font color="#C3CAD5">例) 2秒ごとに投げられるウィンドチャージ </font>
/give @s wind_charge[use_cooldown={seconds:2},cooldown_group:"test_group"]
```

``` nim:<font color="#C3CAD5">例) 連投可能なエンダーパール </font>
/give @s ender_pearl[!use_cooldown]
```

------------------------------------------------------------------------------------------

### use_remainder🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#use_remainder)

1.21における **`food`** コンポーネントの中の **`using_converts_to`** が分離され、こいつになりました。特に機能が増えたというわけではなく、可読性が上がっただけといったところか。

``` diff_nim:<font color="#C3CAD5">例) ヘタ付きのリンゴ (1.21→1.21.2)</font>
- /give @s apple[food={nutrition:4,saturation:2.4,using_converts_to:{id:"stick",count:1}}]
+ /give @s apple[food={nutrition:4,saturation:2.4},use_remainder={id:"stick",count:1}]
```

------------------------------------------------------------------------------------------

### lock

収納系ブロックに鍵をかけられる **`lock`** ですが、鍵として指定できるアイテムの自由度が高くなりました。元々は「名前と一致するアイテム」しか鍵にできませんでしたが、このバージョンから指定した「**コンポーネントに一致するアイテム**」を鍵とすることができます。

``` nim:<font color="#C3CAD5">例) ダメージ増加IIIのエンチャント付きアイテムで開けられる樽 </font>
/give @s barrel[lock={components:{"enchantments":{sharpness:3}}}]
```

------------------------------------------------------------------------------------------

### food

**`eat_seconds` `effects` `using_converts_to`** が他のコンポーネントに分離され、こいつは食べ物のデータのみを持つコンポーネントということになりました。これで当分落ち着きそう。

**`nutrition`** - 満腹度の回復値 (0以上の整数)
**`saturation`** - 隠し満腹度の回復値 (負の値も可)
**`can_always_eat`** - 満腹でも食べられるか

``` nim:<font color="#C3CAD5">例) 食用エメラルド (consumableが未設定だと食べられないが！) </font>
/give @s emerald[food={nutrition:2,saturation:3,can_always_eat:true}]
```

### potion_contents

ポーションの効果に関するデータを持つ **`potion_contents`** ですが、**`custom_name`** が追加され、アイテム名として参照する翻訳キーが追加されました。リソースパックの **`lang`** にて **`item.minecraft.<アイテムID>.effect.<custom_name>`** で定義できます。

**`potion`** - 継承するポーションのID
**`custom_color`** - ポーションの液の色。手作業では指定が難しいのでツールを使うのが吉。
**`custom_effects`** - ポーション／矢が持つエフェクト効果
**`custom_name`** - アイテム名として参照する翻訳キー

``` nim:<font color="#C3CAD5">例) 毒＋発光効果を持つポーションやら</font>
/give @s potion[potion_contents={custom_name:"test",custom_color:10697727,custom_effects:[{id:"poison",amplifier:0,duration:1200},{id:"glowing",amplifier:0,duration:1200}]}]
/give @s tipped_arrow[potion_contents={custom_name:"test",custom_color:10697727,custom_effects:[{id:"poison",amplifier:0,duration:1200},{id:"glowing",amplifier:0,duration:1200}]}]
```

``` nim:<font color="#C3CAD5">例) langファイル側の定義 </font>
{
    "item.minecraft.potion.effect.test": "テストポーション",
    "item.minecraft.splash_potion.effect.test": "テストスプラッシュポーション",
    "item.minecraft.tipped_arrow.effect.test": "テストの矢"
}
```

## コマンド <font color="#ffffff">─────────────</font>

### /rotate🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#rotate)

エンティティの向きを変える！ただそれだけのコマンドが追加されました。/teleportコマンドの向き変更部分のみといったところで、構文もそこを切り取っただけで同じ。

**`/rotate`<font color="#1992d7">`<target> <rotation>`</font>** - <font color="#1992d7">`<target>`</font>の向きを<font color="#1992d7">`<rotation>`</font>に設定する
**`/rotate`<font color="#1992d7">`<target>`</font>`facing`<font color="#1992d7">`<location>`</font>** - <font color="#1992d7">`<target>`</font>を地点<font color="#1992d7">`<location>`</font>方向に向かせる
**`/rotate`<font color="#1992d7">`<target>`</font>`facing entity`<font color="#1992d7">`<entity>`</font>** - <font color="#1992d7">`<target>`</font>を<font color="#1992d7">`<entity>`</font>方向に向かせる

ただ！/rotateでは**慣性を残しながら**向きを変えられたり、**エンティティに乗っていても降りずに**向き変更ができるところで使いどころがあります。/tpでは実現できない部分。

------------------------------------------------------------------------------------------

### /particle

新たに **`block_crumble`** **`trail`** パーティクルが追加されました。ここでは **`trail`** をご紹介。設定した目標座標に向けて飛んでいくという特徴のある、極小のパーティクルです。

**`color`** - パーティクルの色
**`target`** - パーティクルを向かわせる目標地点の座標

:::note warn
1.21.4にて変更があり、新しく **`duration`** の設定が必須になりました。
:::

``` nim:<font color="#C3CAD5">例) マクロで指定座標に向けてtrailの塊を飛ばす (function)</font>
## チャットでの呼び出し例 → /function advent:trail {x:10,y:20,z:30}

$particle trail{color:[1.0,0.0,0.0],target:[$(x),$(y),$(z)]} ~ ~ ~ 1 1 1 0 100
```

------------------------------------------------------------------------------------------

### /ride

リードの結び目、稲妻、釣竿の浮きに乗ることができなくなりました。乗れたの...？

## attributes <font color="#ffffff">────────────</font>
**`generic.` `player.` `zombie.`** のprefixが<font color="#a00000">削除</font>されました。

``` diff_nim:<font color="#C3CAD5">例) 足に装備すると足の速さが+50%される革の靴 (1.20.3→1.20.5→1.21→1.21.2)</font>
- /give @s leather_boots{AttributeModifiers:[{AttributeName:"generic.movement_speed",Name:"example_speed",Amount:0.05,Operation:0,UUID:[I;0,0,0,0],Slot:"feet"}]}
- /give @s leather_boots[attribute_modifiers=[{type:"generic.movement_speed",name:"example_speed",amount:0.05,operation:"add_value",uuid:[I;0,0,0,0],slot:"feet"}]]
- /give @s leather_boots[attribute_modifiers=[{type:"generic.movement_speed",id:"example_speed",amount:0.05,operation:"add_value",slot:"feet"}]]
+ /give @s leather_boots[attribute_modifiers=[{type:"movement_speed",id:"example_speed",amount:0.05,operation:"add_value",slot:"feet"}]]
```

### tempt_range🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#tempt_range)

エンティティがアイテムによって引き付けられる範囲を制御します。基本的には友好モブに既存の要素となっていて、例えばこれを小さな値にすると豚はニンジンに興味を示さなくなります。ただ、**`0`** にすると無限に追ってきます。仕様でしょうかバグでしょうか。

## advancements <font color="#ffffff">───────────</font>

### killed_by_arrow🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#killed_by_arrow)

**`killed_by_crossbow`** が **`killed_by_arrow`** に改名され、名前の通り「クロスボウでエンティティをキル」→「矢でエンティティをキル」することにトリガーの条件が拡大されました。加えて何から矢が発射されたかを条件とする **`fired_from_weapon`** も追加されました。

``` diff_nim:<font color="#C3CAD5">例) クロスボウでエンティティを倒したことを検知 (1.21→1.21.2)
{
    "criteria": {
        "requirement": {
-           "trigger": "killed_by_crossbow"
+           "trigger": "killed_by_arrow",
+           "conditions": {
+               "fired_from_weapon": {
+                   "items": "crossbow"
+               }
+           }
        }
    }
}
```

## predicates <font color="#ffffff">────────────</font>

### input🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#input)

プレイヤーの入力に応じて条件を付けることができます。キーボードからの入力を直接的に検知することができる要素で、色々と面白いことができそう。すごい。

**`forward` `backward` `left` `right`** - 前後左右キーの入力
**`jump`** - ジャンプ (デフォルト: SPACE) キーの入力
**`sneak`** - スニーク (デフォルト: SHIFT) キーの入力
**`sprint`** - ダッシュ (デフォルト: CTRL) キーの入力

``` nim:<font color="#C3CAD5">例) スニークしながら後ずさりしていることの検知
{
    "condition": "entity_properties",
    "entity": "this",
    "predicate": {
        "type_specific": {
            "type": "player",
            "input": {
                "backward": true,
                "sneak": true
            }
        }
    }
}
```

## ゲームルール <font color="#ffffff">───────────</font>

### disablePlayerMovementCheck🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#disableplayermovementcheck)

プレイヤーの移動速度の制限を無効化するかを操作できます。デフォルトでは`false`のため、制限は有効。**`disableElytraMovementCheck`** と同じような要素ですが、エリトラの有無に関わらず検知されるルールとなります。プレイヤーが早く移動しすぎるとゲームの仕様や安定性に色々と不便なことがあるため、通常時は制限が設けられています。

### minecartMaxSpeed (仮)

トロッコの最大速度を操作できる要素が**試験的に**実装されました。ワールド生成時点で実験的機能から「トロッコの改善」をオンにすると使用できるようになります。デフォルト値は`8`(ブロック/秒)。値としては **`1`~`1000`** の範囲から選ぶことができます。爆速。

## リソースパック <font color="#ffffff">──────────</font>

### カスタムツールチップ背景🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#カスタムツールチップ背景)

**`tooltip_style`** コンポーネントを用いて、アイテムのツールチップの見た目を自由に追加できるようになりました。**`assets/<namespace>/textures/gui/sprites/tooltip`** フォルダの中に **`◯◯_frame.png`** と **`◯◯_background.png`**、加えてそれぞれの定義 (.mcmeta) を配置します。

``` nim:<font color="#C3CAD5">例) ◯◯_background.pngの定義ファイル、◯◯_background.png.mcmetaの適当な中身
{
    "gui": {
        "scaling": {
            "type": "nine_slice",
            "width": 100,
            "height": 100,
            "border": 9
        }
    }
}
```

``` nim
/give @s golden_apple[tooltip_style="<namespace>:〇〇"]
```

------------------------------------------------------------------------------------------

### スロットのハイライト操作🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#スロットのハイライト操作)

アイテムにマウスをホバーした時のハイライトをリソースパックで変更できるようになりました。**`assets/minecraft/textures/gui/sprites/container`** フォルダに格納されている
**`slot_highlight_back.png`** と **`slot_highlight_front.png`** がそれぞれアイテムの後方／前方のハイライトを示します。いつかコンポーネントで操作できるようにならないかどうか。

------------------------------------------------------------------------------------------

### 常に輝くモデル (light_emission)🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#常に輝くモデル-light_emission)

ブロックのモデルとして **`light_emission`** が追加され、モデルが周囲の光の影響を受けるかどうかを操作できるようになりました。**`0`~`15`** までの値を指定することができ、必ず指定値以上の光を発するようになります。例えば`15`とした場合は常にモデルが光レベル`15`以上で描画されるため、常に光り輝くモデルとすることも。

**OptifineなどのMOD無し**で、暗闇で光る鉱石！みたいなものができるようになりました。

[<img width="1170" src="https://ewanhowell.com/assets/images/resourcepacks/vanilla-emissive-ores/images/ores.webp">](https://ewanhowell.com/resourcepacks/vanilla-emissive-ores)
<font color="#888888">[Vanilla Emissive Ores - Ewan Howell](https://ewanhowell.com/resourcepacks/vanilla-emissive-ores)</font>

## その他の小ネタ <font color="#ffffff">────────</font>

### 好きな音を鳴らせる角笛🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#好きな音を鳴らせる角笛)

データパックの新要素 **`instrument`** にて、好きに角笛を追加できるようになりました。

**`description`** - 角笛の説明文 (沈思とか書かれる部分)
**`range`** - ブロック単位での音の聞こえる範囲
**`sound_event`** - 鳴らす音のID
**`use_duration`** - 角笛のクールダウン (共通)

``` nim:<font color="#C3CAD5">例) 進捗達成の音が鳴る角笛 test_horn
{
    "description": "",
    "range": 256.0,
    "sound_event": "ui.toast.challenge_complete",
    "use_duration": 0.01
}
```

``` nim
/give @s goat_horn[instrument="<namespace>:test_horn"]
```

:::note warn
試験的な要素であり、読み込みにはワールドのリロードが必須です。
:::

### ニワトリの卵ドロップ🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#ニワトリの卵ドロップ)
ニワトリが定期的に産むアイテム **`chicken_lay`** 、羊や雪だるま等にハサミを使った時のドロップ **`shearing/sheep`** **`shearing/mooshroom`** **`shearing/snow_golem`** を管理するルートテーブルが追加されました。つまりは好きなアイテムドロップを設定できるようになったわけで。

# 1.21.4
[<img width="1170" src="https://www.minecraft.net/content/dam/minecraftnet/games/minecraft/screenshots/1.21.4_1170x500.jpg">](https://www.minecraft.net/en-us/article/minecraft-java-edition-1-21-4)
<font color="#888888">Minecraft Java Edition 1.21.4 | Minecraft</font>

2024年12月3日にリリースされたマイナーアップデートです。**アイテムモデルの要素が分割されデータパックで活用できるようになり、多様な条件下でのアイテムモデルの変更／設定**ができるようになりました。

参考:
[Data & Resource Pack News in Minecraft 1.21.4!](https://www.youtube.com/watch?v=6K1QzvJx1IE) - slicedlime氏の動画
[New Minecraft Release: 1.21.4](https://www.minecraft.net/en-us/article/minecraft-java-edition-1-21-4) - 公式リリース記事

## アイテムモデル <font color="#ffffff">──────────</font>

リソースパックの<namespace>フォルダ直下に、従来の **`models`** **`textures`** フォルダに加えて、**`items`** というフォルダが追加されました。ここではアイテムがどのモデルを参照するかを定義するファイルを並べることができ、これによって色々と遊びができるようになりました。

![1212-repairable.png](https://drive.google.com/uc?id=19H7URWGw5czvYllbhvOMiCsJC1ggCJ97)
<font color="#888888">modelsでtexturesを参照＋結びつけ、itemsでmodelsを参照＋結びつけ。</font>

![1212-repairable.png](https://drive.google.com/uc?id=1rhM4ru0GH5cSta5o5R7wwcOD3zWCEH92)
<font color="#888888">ありとあらゆるアイテムにitem_modelが適用可能！</font>

また、アイテムモデルの登場によって全てのモデルが定義できるようになり、**ハードコードだったトライデントや望遠鏡などのカスタムモデルも作れるように**なりました。やった！

``` nim:<font color="#C3CAD5">例) (行の順番を少しいじった) 既存のトライデントのアイテムモデル trident.json
{
    "model": {
        "type": "minecraft:select",   # 条件によってモデルを変更
        "property": "minecraft:display_context",   # アイテムのディスプレイ位置を条件とする
        "cases": [
            {
                "when": [   # 以下の3通りの場合、次のモデルを参照
                    "gui",   # UI上に置かれている
                    "ground",   # アイテムが地面に落ちている
                    "fixed"   # アイテムが額縁にはめられている
                ],
                "model": {
                    "type": "minecraft:model",
                    "model": "minecraft:item/trident"
                }
            }
        ],
        "fallback": {   # gui,ground,fixedの3通り以外だった場合、次のモデルを参照
            "type": "minecraft:condition",   # 条件によってモデルを変更
            "property": "minecraft:using_item",   # アイテムを使用中かどうかを条件とする
            "on_false": {   # 使用中でなければ以下のモデルを参照
                "type": "minecraft:special",
                "base": "minecraft:item/trident_in_hand",
                "model": {
                    "type": "minecraft:trident"
                }
            },
            "on_true": {   # 使用中なら以下のモデルを参照
                "type": "minecraft:special",
                "base": "minecraft:item/trident_throwing",
                "model": {
                    "type": "minecraft:trident"
                }
            }
        }
    }
}
```

### hand_animation_on_swap🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#hand_animation_on_swap)

アイテムモデルの1要素。これを **`false`** にすると、アイテムを持ち替えた時／データが変更された時の、下からググっとアイテムが上がってくるアニメーションが無効化されます。

``` nim:<font color="#C3CAD5">例) 持ち替えアニメーションを無効化したアイテムモデル honey_apple.json
{
    "model": {
        "type": "model",
        "model": "item/honey_apple"
    },
    "hand_animation_on_swap": false
}
```

### model (モデル参照手法)

さて、アイテムモデルの登場によって新しくできるようになった遊びを全て見ていきましょう。**ひろばおさんの動画でな！！！** ...ありがとうございます、本当に。

[<img width="1170" src="http://img.youtube.com/vi/MZE-MRYm3fA/maxresdefault.jpg">](https://youtu.be/MZE-MRYm3fA?feature=shared&t=121)
<font color="#888888">【1.21.4】最新のリソースパックでできること【マイクラリソパ解説】</font>

## コンポーネント <font color="#ffffff">──────────</font>

### custom_model_data

アイテムのモデルを参照／制御するための数値でしたが、真偽フラグ、文字列やカラーコードも指定できるようになり、**多様にモデルを参照できるように**なりました。今までの1対1でのカスタムモデル割り当ての役割は **`item_model`** が担当し、コイツは複数のモデルを頻繁に変更／重ねる際など特別な場合に活用するような要素となりました。

**`floats`** - **`range_dispatch`** で参照されるfloat型の配列
**`flags`** - **`condition`** で参照される真偽フラグの配列
**`strings`** - **`select`** で参照される文字列の配列
**`colors`** - **`model`** の着色ソースで参照される、10進数カラーコードの配列

``` diff_nim:<font color="#C3CAD5">例) custom_model_dataが1のモデルを参照 (1.21.2→1.21.4)
- /give @s iron_sword[custom_model_data=1]
+ /give @s iron_sword[custom_model_data={floats:[1]}]
```

**`custom_model_data`** による場合分けはアイテムモデルファイルの中に定義します。

``` nim:<font color="#C3CAD5">例) custom_model_dataを定義した鉄の剣のアイテムモデル iron_sword.json
{
    "model": {
        "type": "range_dispatch",
        "property": "custom_model_data",
        "entries": [
            {   # custom_model_data=0(以上) の時下のモデルを参照
                "model": {
                    "type": "model",
                    "model": "item/emerald_sword"
                },
                "threshold": 0
            },
            {   # custom_model_data=1(以上) の時下のモデルを参照
                "model": {
                    "type": "model",
                    "model": "item/obsidian_sword"
                },
                "threshold": 1
            },
            {   # custom_model_data=2(以上) の時下のモデルを参照
                "model": {
                    "type": "model",
                    "model": "item/crystal_sword"
                },
                "threshold": 2
            }
        ],
        "fallback": {   # custom_model_dataの設定が無ければ下のモデルを参照
            "type": "model",
            "model": "item/iron_sword"
        }
    }
}
```

### equippable

アーマーモデルの置き場所が **`models/equipment/`** → **`equipment/`** となりました。また、カスタムアーマーモデル参照先を指していた **`model`** が **`asset_id`** に改名されました。

<details><summary><b><code>slot</code></b> - 装備先のスロット</summary>

├ **`head`** - 頭装備
├ **`chest`** - 胴装備
├ **`legs`** - 脚装備
├ **`feet`** - 足装備
├ **`body`** - 体 (オオカミなどに使用)
├ **`mainhand`** - メインハンド
└ **`offhand`** - オフハンド
</details>

**`equip_sound`** - 装備するときの効果音
**`asset_id`** - カスタムアーマーモデルの参照先
**`camera_overlay`** - 画面にオーバーレイするテクスチャ (例: くり抜かれたカボチャ)
**`allowed_entities`** - アイテムを装備可能なエンティティのID
**`dispensable`** - ディスペンサーで自動装備が可能か
**`swappable`** - 右クリックで指定スロットに装備可能か
**`damage_on_hurt`** - ダメージを受けたとき耐久値を減らすか

``` diff_nim:<font color="#C3CAD5">例) 適当なアイテムにダイヤ頭装備の見た目を持たせる (1.21.2→1.21.4)</font>
- /give @s acacia_fence[equippable={model:"diamond",slot:"head"}]
+ /give @s acacia_fence[equippable={asset_id:"diamond",slot:"head"}]
```

## コマンド <font color="#ffffff">─────────────</font>

### /attribute
1.21からプレイヤーリスポーン時のattributeがリセットされなくなりましたが、これに対応するように**指定エンティティのattributeをリセットする**コマンドが新たに追加されました。

**`/attribute`<font color="#1992d7">`<target> <attribute>`</font>`base reset`** -
ターゲット<font color="#1992d7">`<target>`</font>の属性値<font color="#1992d7">`<attribute>`</font>を標準値にリセットする

``` nim:<font color="#C3CAD5">例) 全てのプレイヤーの攻撃速度を標準にリセット</font>
attribute @a attack_speed base reset
```

### /particle

1.21.2で追加された新パーティクル **`trail`** を出す際、何tickかけて目標地点へ飛んでいくかを示す値 **`duration`** の設定が必須となりました。

**`color`** - パーティクルの色
**`target`** - パーティクルを向かわせる目標地点の座標
**`duration`** - 目標地点へ何tickかけて飛んでいくか

``` diff_nim:<font color="#C3CAD5">例) マクロで指定座標に向けてtrailの塊を飛ばす (function) (1.21.2→1.21.4)</font>
## チャットでの呼び出し例 → /function advent:trail {x:10,y:20,z:30}

- $particle trail{color:[1.0,0.0,0.0],target:[$(x),$(y),$(z)]} ~ ~ ~ 1 1 1 0 100
+ $particle trail{color:[1.0,0.0,0.0],target:[$(x),$(y),$(z)],duration:60} ~ ~ ~ 1 1 1 0 100
```

## リソースパック <font color="#ffffff">──────────</font>

### カスタムアーマー🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#カスタムアーマー)

**`equippable`** コンポーネントとリソースパックの要素 **`equipment`** を用いて、好きに装備のテクスチャを追加できるようになりました。1.21.2から追加自体は可能でしたが、1.21.4で仕様が安定したかと思うので、今回はこちらのバージョンでご紹介。

まず、**`assets/<namespace>/textures/entity/equipment`** 内の **`humanoid`** や **`humanoid_leggings`** フォルダ内に装備のテクスチャを並べます。humanoidが頭／胴／足装備、humanoid_leggingsが脚装備のテクスチャを指します。例は下の通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589374/c234e9f0-49d3-4c13-a98f-6cb7d6df891f.png)
<font color="#888888">左上から頭, 足, 胴, 脚の順番。脚装備だけ別ファイルなの、どうしてですか</font>


続けて、**`assets/<namespace>/equipment`** フォルダにてテクスチャを **`asset_id`** と結びつけます。ここでつけたjsonファイルの名前が、そのままアーマーのIDとして用いられます。

``` nim:<font color="#C3CAD5">例) エメラルドアーマーの定義 emerald.json</font>
{
    "layers": {
        "humanoid": [
            {
                "texture": "emerald"
            }
        ],
        "humanoid_leggings": [
            {
                "texture": "emerald"
            }
        ]
    }
}
```

``` nim:<font color="#C3CAD5">例) エメラルドアーマー！ (アイテムのテクスチャも変更)</font>
/give @s stick[equippable={asset_id:"emerald",slot:"head"},item_model="emerald_helmet"]
/give @s stick[equippable={asset_id:"emerald",slot:"chest"},item_model="emerald_chestplate"]
/give @s stick[equippable={asset_id:"emerald",slot:"legs"},item_model="emerald_leggings"]
/give @s stick[equippable={asset_id:"emerald",slot:"feet"},item_model="emerald_boots"]
```

![1214-armor.png](https://drive.google.com/uc?id=11_jG2mC2ENqFixdKzJ3604opRjAwJwQc)
<font color="#888888">思ったより設定は簡単なので、後はテクスチャが描ければといいますか...。</font>

## その他の小ネタ <font color="#ffffff">────────</font>

### テキストの影操作🔸[<img src=https://drive.google.com/uc?id=1zbFNJT4EV8Aa1eHjcc1NuwGQJzNbSv7Y style="border:none;">](#テキストの影操作)

テキストフォーマットにて指定できる値に **`shadow_color`** が追加され、テキストの影の色や透明度を自由に変更できるようになりました。指定方法にはARGB値のリスト／10進変換したARGB値の2通りがあり、また`0`を指定するとデフォルトの影を消すこともできるように。

```nim:<font color="#C3CAD5">例) オレンジ色の影を付けたテキストを表示
/title @s title {"text":"テキスト影操作","shadow_color":[1,0.5,0,1],"bold":true}
```

```nim:<font color="#C3CAD5">例) (テキストの)影を消したカスタムフォントの表示
/title @s actionbar {"text":"\uE000","shadow_color":0}
```

![1214-shadowcolor.png](https://drive.google.com/uc?id=1h86V-8Jv2A747QJYaUHLrBXJNetEgLID)
<font color="#888888">鮮やかなテキストの影。あまり使いどころは無さそうか...？</font>

### 看板やバナーをblock_displayで表示

名前の通りです。逆に言うと、以前は看板やバナーはblock_displayでは表示できませんでした。ただ、block_displayではブロックデータの指定ができないため、テキストを表示させた看板の召喚は難しいところがあります。text_displayと組み合わせるのが吉。

![1214-shadowcolor.png](https://drive.google.com/uc?id=1pFjLILZD5HCBzQY3o5lO5e6F2vcu-Sj-)
<font color="#888888">scaleやRotationをいじって好きな見た目のものを。</font>

# さいごに

皆のためコマンドの新要素を追いやすくするんだ！という大層な目標を掲げて3年程前より「[コマンド関連新要素のみまとめ](https://www.youtube.com/playlist?list=PL6gYTGrV1UW4_MJ0Z63l2IbjKC3FG2BwU)」の動画シリーズを作っていたのですが、去年は動画が出せず無念だったため、せめてもの思いで書いてみました。

今年はもう少し活動できる年にしたいですね...！！！ん、半分終わった？