Attribute(属性)のメモ書き

Attribute(属性)とは

プレイヤーやモブなどのエンティティが、特定箇所に装備しているときだけ発動する効果のこと。

装備しているとは以下のときなので、インベントリに入れているだけでは発動しません。

  • メインハンドに持っている
  • オフハンドに持っている
  • 頭に装備している
  • 胴に装備している
  • 腰に装備している
  • 脚に装備している

ここ以降はAttributeは属性と言い換えてメモしていきます。

属性の基本形

装備品に指定する場合

{
    AttributeModifiers:[
        {
            Slot: "mainhand",
            AttributeName: "generic.attackDamage",
            Amount: 20.0,
            Operation: 0,
            UUIDMost: 1L,
            UUIDLeast: 1L
        }
    ]
}
パラメータ 説明 定義 必須
Slot 効果を発動させる装備場所
- メインハンド : mainhand
- オフハンド : offhand
- 頭 : head
- 胴 : chest
- 腰 : feet
- 脚 : legs
string
AttributeName 発動する効果 string
Amount 発動する効果の値・倍率 number
Operation Amountの計算方法 number
UUIDMost / UUIDLeast 属性の固有の値 number(Long)

モブ側のデフォルト値を変更する場合

{
    Attributes:[
        {
            Name: "generic.attackDamage",
            Base: 1.0
        }
    ]
}
パラメータ 説明 定義 必須
Name 発動する効果 string
Base 基本となる値 number

Attribute NameとNameに指定できる属性

各属性には最小値と最大値が設定されており、それを超える値は最大値(最小値)に設定されるので注意。

AttributeName / Name 効果 デフォルト値
generic.maxHealth ハートを増減させる(1につき0.5個) 20.0
generic.followRange モブの攻撃対象の検出距離 32.0
generic.knockbackResistance ノックバックの抵抗確率 0.0
generic.movementSpeed 移動速度 0.7
generic.attackDamage 攻撃ダメージ(1につき0.5個) 1.0
generic.armor 防御ダメージ 0.0
generic.armorToughness 防具の耐久力 0.0
generic.attackKnockback ノックバック 0.0
generic.attackSpeed プレイヤーの攻撃クールダウンの時間(秒) 4.0
generic.luck プレイヤーの運。ルートテーブルなどで使用 0.0
horse.jumpStrength 馬のジャンプ力 0.7
generic.flyingSpeed オウムの飛行速度 0.4
zombie.spawnReinforcements ゾンビ攻撃時に別のゾンビを召喚する確率 0.0

Amount と Operation について

Attributeを計算する場合にどのような計算方法を使うかを選択できます。

デフォルトは0。

例として、以下の属性を与えた場合の説明をします。

// アイテムA (メインハンドに持つ)
{
    AttributeModifiers:[
        {
            AttributeName: "generic.maxHealth",
            Amount: 1.0,
            Operation: ???,
            UUIDMost: 1L,
            UUIDLeast: 1L
        }
    ]
}
// アイテムB (オフハンドに持つ)
{
    AttributeModifiers:[
        {
            AttributeName: "generic.maxHealth",
            Amount: 2.0,
            Operation: ???,
            UUIDMost: 2L,
            UUIDLeast: 2L
        }
    ]
}

単純に値を追加する : 0

プレイヤーの最大体力のデフォルト値が20なので、

20 (デフォルト) + 1 (アイテムA) + 2 (アイテムB)

の合計値、23(ハート11.5個)が最大体力になります。

元の値に掛けてから足す : 1

プレイヤーの最大体力をベースとすると、

20 (デフォルト) + (20 x 1 (アイテムA)) + (20 x 2 (アイテムB))

となるので、

20 + 20 + 40

の合計値、80(ハート40個)が最大体力になります。

アイテムの説明文としては、+100%などのパーセント表記で表されます。

値に1を足してから掛ける : 2

またもプレイヤーの最大体力をベースとすると、

20 (デフォルト) x (1 + 1 (アイテムA)) x (1 + 2 (アイテムB))

という感じで計算されます。つまり、

=> 20 x 2 x 3
=> 20 x 6
=> 120

ということで、合計値の120(ハート60個)が最大体力になります。

こちらもアイテムの説明文としては、+100%などのパーセント表記で表されます。

UUID Most / Least について

UUIDとはなにか?

=>たった一つしか存在しないIDのこと

ということで、UUID Most/Least です。この2つはペアになっており、MostとLeastの組み合わせてIDが作られています。例えば、Mostが1L、Leastが2Lならばマイクラ上では下のようなUUIDが作り上げられます。

UUID : 00000000-0000-0001-0000-000000000002

UUIDの制限

UUID Most/Leastはマイナス値だとうまく反映されません。

正確には、反映されるのですがオーバーフローします。要するにバグります。

UUID Most/Leastは-9223372036854775808~9223372036854775807の間で指定できますが、UUID Leastが0だと属性の効果が反映されませんので、注意しましょう。

UUIDは同じ属性の中でぶつかり合う

さて、このUUID。同じ属性同士で同じUUIDを使って両方装備してしまうとどうなるのか。

効果が反映されたり、されなかったりして、バグります。

UUIDさえ異なれば良いので、UUID Mostが一緒でもUUID Leastが異なるなら、セーフです。

逆にUUID Leastが一緒でもUUID Mostが異なるなら、セーフです。

データパックの配布を行う場合は気をつけよう

データパック同士が同じUUIDを使っているとどうなるか。

バグります。ちゃんとIDを決めてあげましょう。