第一百零五章 屬性修飾符 上-哪個(gè)MC玩家不想擁有一套神裝呢?
在Minecraft中,最厲害的神裝是怎樣的?
在了解這一章的內(nèi)容之前,你估計(jì)認(rèn)為Minecraft最厲害的神裝就是:
→手拿下界合金劍(鋒利、耐久、亡靈殺手、戒指殺手........LV.2147483647)
→身裹殘骸(保護(hù)、耐久.......LV.2147483647)
→滿滿一潛影盒的附魔金蘋果
這就是神裝。
但這是最厲害的神裝嗎?
并不是,因?yàn)槲覀冞€可以堆料——使用Mojang官方提供的Minecraft內(nèi)置屬性修改器:
AttributeModifiers [Mojang?]修改器
等等,什么是屬性修改器?
『屬性修改器』,確切的來說,是『屬性修飾符』(Attribute Modifiers)。它是一種能夠修飾屬性的東西。
什么是屬性?
屬性(Attributes)是Minecraft中生物和玩家身上的增益/減益特性系統(tǒng)。比如你的最大生命值、攻擊速度、攻擊距離等等,這些都是你的屬性。
我們可以直接修改屬性的基礎(chǔ)值,也可以在屬性上加上『屬性修飾符』對(duì)屬性的值進(jìn)行一個(gè)修飾。比如,你可以為你的最大生命值加上一個(gè)修飾符,就可以將最大生命值提高到2048點(diǎn)。你也可以直接修改最大生命值的基礎(chǔ)值,但這種直接修改和通過屬性修飾符修改有很大不同,以后會(huì)講到它們的差別。
那怎么添加屬性修飾符呢?
有兩種辦法:①使用/attribute指令②使用NBT
至于第一種辦法我們以后再講,這兩章我們就來了解使用NBT該如何添加屬性修飾符。更確切地說,我們接下來要研究的是:如何給物品添加上屬性修飾符。
需要注意的是,物品沒有屬性,因此給物品添加上屬性修飾符,本質(zhì)上就是通過物品這個(gè)載體給擁有此物品的玩家/生物添加上屬性修飾符。
物品的屬性修飾符存儲(chǔ)于物品NBT的AttributeModifiers標(biāo)簽下。AttributeModifiers標(biāo)簽的數(shù)據(jù)類型是『復(fù)合標(biāo)簽列表』,其中的每一個(gè)『復(fù)合標(biāo)簽』都代表著一個(gè)『屬性修飾符』:
{AttributeModifiers:[{屬性修飾符},{屬性修飾符}......]}
每個(gè)屬性修飾符都具有如下標(biāo)簽:
AttributeName(文本)——此屬性修飾符要修飾的屬性
Name(文本)——此屬性修飾符的名稱
Slot(文本)——此屬性修飾符生效的欄位
Operation(Int整形)——修飾的運(yùn)算模式
Amount(Double浮點(diǎn)數(shù))——修飾數(shù)值
UUIDMost(Int整形)——這個(gè)修飾符的UUID的高位[JE1.16刪除]
UUIDLeast(Int整形)——這個(gè)修飾符的UUID的低位[JE1.16刪除]
UUID(Int整形數(shù)組)——這個(gè)屬性的UUID[JE1.16新增]
在具體使用屬性修飾符之前,讓我們先來了解下都有哪些屬性:
\\基礎(chǔ)屬性\\
generic.max_health——最大生命值[0.0~1024.0]
generic.movement_speed*——移動(dòng)速度[0.0~1024.0]
\\攻擊相關(guān)\\
generic.attack_damage——普通攻擊傷害[0.0~2048.0]
generic.attack_knockback——攻擊擊退力度[0.0~???]
generic.attackReach?——玩家攻擊距離[0.0~6.0]
generic.attack_speed——玩家攻擊的速度[0.0~1024.0]
\\防御相關(guān)\\
generic.armor——盔甲防御點(diǎn)數(shù)[0.0~30.0]
generic.armor_toughness——盔甲韌性[0.0~20.0]
\\玩家的其他屬性\\
generic.reachDistance?——玩家的觸及半徑,也就是你的手有多長(zhǎng)[0.0~256.0]
generic.luck——玩家幸運(yùn)度[-1024.0~1024.0]
\\更多屬性\\
generic.follow_range——生物追蹤距離[0.0~2048.0]
generic.knockback_resistance——生物抗擊退效果[0.0~1.0]
generic.flying_speed*——鸚鵡的飛行速度[0.0~1024.0]
horse.jump_strength*——馬的彈跳力[0.0~1.0]
zombie.spawn_reinforcements——僵尸攻擊一次在周圍生成另一個(gè)僵尸的可能性[0.0~1.0]
注:『*』代表此屬性的度量標(biāo)準(zhǔn)不明,『?』代表此屬性還未正式啟用。
這些就是Minecraft Java截止1.19.1版本的所有屬性。
讓我們來試一試,創(chuàng)建一個(gè)能夠修改最大生命值的屬性修飾符:
{AttributeModifiers:[{AttributeName:“generic.maxHealth“}]}
\\適用于Java1.6.1~1.15.2\\
{AttributeModifiers:[{AttributeName:'generic.max_health'}]}
\\適用于Java1.16及以上版本\\
上面僅僅指定了該屬性修飾符要修飾的屬性,我們還需要給這個(gè)修飾符添加更多的信息才能使其生效。
首先,我們需要添加Name標(biāo)簽,用于指定該修飾符的名稱:
{AttributeName:xxxx,Name:“修飾生命值用“}
如你所見,Name標(biāo)簽的值隨便填,只要合規(guī)就可以。
其次,作為一個(gè)物品的屬性修飾符,我們需要使用Slot標(biāo)簽指定該修飾符要在物品放在哪個(gè)地方時(shí)才會(huì)生效。Slot標(biāo)簽雖然說填的是欄位,但游戲只允許我們選擇下面六個(gè)欄位:
mainhand——拿在主手時(shí)才起作用
offhand——拿在副手時(shí)才起作用
feet——套在腳上才有用
legs——穿在腿上才有用
chest——當(dāng)作胸甲穿才有用
head——頂在頭上才有用
比如我們可以指定要把物品拿在副手時(shí)才起作用:
{AttributeName:xxxx,Name:xxxx,Slot:“offhand“}
第三,作為一個(gè)修飾符,肯定要通過Amount標(biāo)簽指定修飾的數(shù)值。Amount標(biāo)簽的數(shù)據(jù)類型是Double雙精度浮點(diǎn)數(shù),你在這把它當(dāng)做普通的浮點(diǎn)數(shù)來看就行了。
我們可以指定修飾的數(shù)值為5:
{......,Amount:5.0}
但需要注意的是,這里的數(shù)值并不代表最終修飾成的屬性值。最終的值除了看Amount標(biāo)簽,還要看Operation標(biāo)簽指定的是什么運(yùn)算模式。
Operation的作用是『用來指定修飾的計(jì)算模式』,也就是『這個(gè)修飾符要怎樣修飾原來的屬性』。它可以指定三個(gè)值,分別對(duì)應(yīng)三種計(jì)算模式:
0——屬性增量(也就是直接加上去)
1——倍率增量(并不是簡(jiǎn)單的乘上去)
2——最終倍乘(和倍率增量有點(diǎn)像)
我們先來看看『屬性增量』計(jì)算模式,它是這樣計(jì)算的:
R=C+A
C······屬性基礎(chǔ)值
A······Amount標(biāo)簽值
R······結(jié)果
舉個(gè)例子,假設(shè)有一個(gè)修飾符,它的數(shù)值為4.4,計(jì)算模式為『屬性增量』,修飾的屬性『玩家幸運(yùn)值』基礎(chǔ)值為2.5,那么該屬性經(jīng)過修飾后的結(jié)果就是:
6.9=2.5+4.4
如果有兩個(gè)修飾符都是修飾『玩家幸運(yùn)值』的呢?而且它們倆都是『屬性增量』,且數(shù)值分別為2.4和9.1。
結(jié)果就是:
14=2.5+2.4+9.1
『倍率增量』的計(jì)算模式有點(diǎn)復(fù)雜,它是這樣計(jì)算的:
R=C?×(1+A)
C?······屬性基礎(chǔ)值經(jīng)過『屬性增量』計(jì)算后的值
A······Amount標(biāo)簽值
R······結(jié)果
1······基礎(chǔ)倍率
舉個(gè)例子,假設(shè)也有一個(gè)修飾符,它的數(shù)值為4.4,修飾的屬性『玩家幸運(yùn)值』基礎(chǔ)值為2.5。但它的計(jì)算模式是『倍率增量』,也就是說屬性的值經(jīng)過它修飾后會(huì)變成:
13.5=2.5×(1+4.4)
這種只有一個(gè)修飾符的情況很簡(jiǎn)單。但如果是這樣的情況呢:
→有四個(gè)修飾符,分別叫作A、B、C、D。這四個(gè)修飾符的大致SNBT標(biāo)簽如下:
{AttributeName:幸運(yùn)值,Name:'A',Amount:4.1,Operation:0}
{AttributeName:幸運(yùn)值,Name:'B',Amount:3.6,Operation:0}
{AttributeName:幸運(yùn)值,Name:'C',Amount:1.7,Operation:1}
{AttributeName:幸運(yùn)值,Name:'D',Amount:2.5,Operation:1}
屬性『幸運(yùn)值』的基礎(chǔ)值為3.5。請(qǐng)問,該屬性經(jīng)過修飾后的值為多少?
答案是:
58.24=11.2×(1+1.7+2.5)=(3.5+4.1+3.6)×(1+1.7+2.5)
為什么是這樣呢?
首先,游戲會(huì)進(jìn)行『屬性增量』計(jì)算,也就是:
11.2=3.5+4.1+3.6
然后,游戲會(huì)拿『屬性增量』計(jì)算的結(jié)果再次經(jīng)過『倍率增量』計(jì)算:
58.24=11.2×(1+1.7+2.5)
就得到了58.24這個(gè)值。
『最終倍乘』會(huì)在下一章講到。在此之前,讓我們看看最后的UUIDMost和UUIDLeast標(biāo)簽。這兩個(gè)標(biāo)簽該填什么?
看到UUID這四個(gè)字母時(shí)你估計(jì)已經(jīng)知道這就是屬性的ID。
所以隨便寫,保證只要是數(shù)字就可以了。比如:
{UUIDMost:1,UUIDLeast:22}
至于1.16及之后的UUID標(biāo)簽,也一樣,只不過從兩個(gè)整數(shù)變成了四個(gè)整數(shù):
{UUID:[I;1,1,1,1]}
我們會(huì)在第一百一十章具體了解到UUID的相關(guān)內(nèi)容。
最后,讓我們把上面的東西結(jié)合起來,就可以得到:
/give @s diamond 1 0 {AttributeModifiers:[{AttributeName:“generic.maxHealth“,Name:“修飾生命值用“,Slot:“offhand“,Amount:5.0,Operation:0,UUIDMost:1,UUIDLeast:22}]}
\\適用于Java1.6.1~1.12.2\\
/give @s diamond{AttributeModifiers:[{AttributeName:“generic.maxHealth“,Name:“修飾生命值用“,Slot:“offhand“,Amount:5.0,Operation:0,UUIDMost:1,UUIDLeast:22}]}
\\適用于Java1.13~1.15.2\\
/give @s diamond{AttributeModifiers:[{AttributeName:'generic.max_health',Name:'修飾生命值用',Slot:'offhand',Amount:5.0,Operation:0,UUID:[I;1,1,1,1]}]}
\\適用于Java1.16及以上版本\\
一個(gè)『在副手時(shí)』能夠『+5 最大生命值』的鉆石!
本章到此為止。
——附錄:屬性的歷史
Java
1.6.1——加入了屬性
1.7.2——屬性現(xiàn)在可通過SNBT用于指令中
1.9——加入了攻擊速度屬性、盔甲屬性、盔甲韌性屬性和幸運(yùn)值屬性。
1.14——加入了擊退距離屬性。
1.16——更改了大部分屬性的ID,加入了/attribute指令。
Combat Test[即將到來]——正式加入攻擊距離屬性
攜帶版/基巖版
0.12.1——加入了屬性
......
......
......
......
太棒了!一個(gè)特別棒的蘋果:
/give @p apple{Enchantments:[{lvl:255,id:“sharpness“}],AttributeModifiers:[{Operation:0,Amount:2048,UUID:[I;1,1,1,1],AttributeName:“generic.attack_damage“,Name:“a“,Slot:“mainhand“},{Operation:0,Amount:1024,UUID:[I;1,1,1,2],AttributeName:“generic.attack_speed“,Name:“b“,Slot:“mainhand“},{Operation:0,Amount:1024,UUID:[I;1,1,1,3],AttributeName:“generic.max_health“,Name:“c“,Slot:“mainhand“},{Operation:0,Amount:30,UUID:[I;1,1,1,4],AttributeName:“generic.armor“,Name:“d“,Slot:“mainhand“},{Operation:0,Amount:20,UUID:[I;1,1,1,5],AttributeName:“generic.armor_toughness“,Name:“e“,Slot:“mainhand“},{Operation:0,Amount:1024,UUID:[I;1,1,1,6],AttributeName:“generic.luck“,Name:“f“,Slot:“mainhand“}],display:{Name:'“蘋果手機(jī)“',Lore:['“喬布斯開發(fā)的可以吃的蘋果手機(jī)!“']}}
?。▎滩妓贡硎竞茕疲?