/attribute: 基本値と修飾子の違い、そして値がリセットされ続ける理由
基本値の設定は永続的で、修飾子の設定はそうではありません — ただし操作を間違えなければ。3つの操作、適用順序、そしてスロットの落とし穴について。修飾子には固有のIDがあり、そのIDを指定して個別に削除できます。
/attribute は、3つのサブコマンドを持つ1つのコマンドのように見えます。しかし実際には、たまたま同じ名前を共有している2つの異なるシステムであり、これを混同することが値が何度も元に戻ってしまう原因です。
基本値と修飾子
/attribute @s minecraft:max_health base set 40
/attribute @s minecraft:max_health modifier add my_buff 20 add_value
base setはエンティティ自身の値を書き換えます。これはリロードを経ても永続し、別のbase set以外では削除されません。modifier addは名前付きの調整を上に重ねます。基本値と同様にエンティティと一緒に保存され、IDを持ち、そのIDで削除できます。
変更が消えない場合、base set を使ったので base reset が必要か、あるいは追加した修飾子に modifier remove <id> が必要です。
3つの操作と、その適用順序
| 操作 | 内容 | 適用順 |
|---|---|---|
add_value | 値 + n | 最初 |
add_multiplied_base | 値 + (基本値 × n) | 2番目 |
add_multiplied_total | 実行中の合計 × (1 + n) | 最後 |
順序は固定されており、それが重要です。基本値20から始めて、add_value 10 と add_multiplied_total 0.5 を適用すると:
20 → 30 → 45 not 20 → 30 → 30 + 10 = 40
add_multiplied_base は、add_value 修飾子が加算された後の基本値に掛け算します — 実行中の合計ではなく — そのため、2つを重ねると複利ではなく加算的に積み重なります。
修飾子IDは名前空間付きになりました
古いバージョンではUUIDを使用していました。現代のバージョンでは名前空間付きIDを使用します:
/attribute @s minecraft:attack_damage modifier add my_pack:rage 5 add_value
同じIDで2つ目の修飾子を追加すると、スタックしたり置き換わったりするのではなく、「Modifier … is already present」で失敗します。バフを更新するには、まず modifier remove してください。
装備の修飾子はエンティティではなくアイテムに存在します
剣のダメージボーナスは attribute_modifiers のアイテムコンポーネントであり、アイテムが正しいスロットにある間だけ適用されます:
/give @s diamond_sword[attribute_modifiers=[{type:"attack_damage",amount:5,
operation:"add_value",slot:"mainhand",id:"my:bonus"}]]
slot を省略するのがよくある間違いです。 デフォルトは any なので、修飾子はすべての装備スロットで適用されます — 剣がメインハンドだけでなく、オフハンドや防具スロットからでもバフをかけてしまいます。
有効なスロット: mainhand、offhand、hand、head、chest、legs、feet、armor、body、saddle、any。
値を読み戻す
/attribute @s minecraft:max_health get
は修飾子を含む実効合計を返します。/attribute @s minecraft:max_health base get は基本値のみを返します。
これらすべて — スロットを設定したアイテムコンポーネント形式も含めて — はEntity & Combat Command Builderで作成できます。