第一百零六章 屬性修飾符 下-最終倍乘和/attribute指令
在上一章,我們了解了Operation的『屬性增量』和『倍率增量』計(jì)算模式,還有一個(gè)『最終倍乘』。那什么是最終倍乘呢?
『最終倍乘』是這樣計(jì)算的:
R=C?×(1+A?)×(1+A?)×......×(1+A?)
C?=C?×(1+a?+a?+.....+a?)
C?=C+m?+m?+.....+m?
R······最終結(jié)果
A??...?······計(jì)算模式為『最終倍乘』的修飾符的Amount值
a??...?······計(jì)算模式為『倍率增量』的修飾符的Amount值
m??...?······計(jì)算模式為『屬性增量』的修飾符的Amount值
C?······『倍率增量』計(jì)算結(jié)果
C?······『屬性增量』計(jì)算結(jié)果
舉個(gè)例子,假設(shè)現(xiàn)在有這些修飾符:
{AttributeName:'generic.max_health',Amount:5.0,Operation:0}
{AttributeName:'generic.max_health',Amount:3.0,Operation:0}
{AttributeName:'generic.max_health',Amount:2.0,Operation:1}
{AttributeName:'generic.max_health',Amount:1.5,Operation:1}
{AttributeName:'generic.max_health',Amount:1.1,Operation:2}
{AttributeName:'generic.max_health',Amount:0.1,Operation:2}
當(dāng)這些修飾符在一個(gè)玩家身上全部生效,且該名玩家的最大生命值僅僅受這些修飾符影響時(shí),這名玩家的生命值上限將會(huì)從20.0點(diǎn)變成291.06點(diǎn)。這個(gè)『291.06』是這樣得出來(lái)的:
[(20+5+3)×(1+2+1.5)]×(1+1.1)×(1+0.1)
↓先計(jì)算『屬性增量』↓
[28×(1+2+1.5)]×(1+1.1)×(1+0.1)
↓再計(jì)算『倍率增量』↓
126×(1+1.1)×(1+0.1)
↓最后計(jì)算『最終倍乘』↓
291.06
這就是『最終倍乘』,到這Operation的全部?jī)?nèi)容也就講完了。
但這不代表本章到此結(jié)束。還記得上一章提到的/attribute指令嗎?讓我們來(lái)了解下這指令如何使用:
/attribute
作用:可以更改和讀取屬性
存在版本:Java1.16-今
需要權(quán)限等級(jí):Java-2
需要作弊:是
格式:
/attribute <目標(biāo)玩家/生物><屬性>[base] get [乘數(shù)]
\\返回指定屬性的『總值』。如果指定了base,則返回『基值』\\
/attribute <目標(biāo)玩家/生物><屬性> base set <值>
\\將指定屬性的『基值』設(shè)定為指定的值\\
/attribute <目標(biāo)玩家/生物><屬性> modifier add <UUID><名字><值>(add|multiply|multiply_base)
\\如果沒(méi)有UUID相同的屬性修飾符,就給指定屬性添加上屬性修飾符\\
/attribute <目標(biāo)玩家/生物><屬性> modifier remove <UUID>
\\移除指定屬性的具有指定UUID的修飾符\\
/attribute <目標(biāo)玩家/生物><屬性> modifier value get <UUID>[乘數(shù)]
\\返回具有指定UUID的屬性修飾符的值\\
使用這條指令可以很方便地修改實(shí)體的屬性,以及為實(shí)體添加上屬性修飾符。只不過(guò)由于/attribute指令是直接給實(shí)體添加上修飾符,沒(méi)有物品作為載體,所以在這邊添加的修飾符無(wú)需指定『欄位』參數(shù)。
讓我們來(lái)試一試,直接修改屬性的值。比如,把我們的生命值上限改成40點(diǎn):
/attribute @s generic.max_health base set 40.0
→實(shí)體xxx的屬性最大生命值的基值已設(shè)置為40.0
很好,這下子我們就有40點(diǎn)生命值了。只不過(guò)要注意,玩家的屬性會(huì)在死亡后重置,也就是說(shuō)如果你死一次,最大生命值就會(huì)變回20點(diǎn)。
get子命令可以獲得我們屬性的總值或基值??傊狄簿褪墙?jīng)過(guò)修飾符修飾后最終的值,基值也就是沒(méi)有修飾過(guò)的初始值。比如:
/attribute @s generic.max_health base get
由于上面我們已經(jīng)把基值改成了40.0,因此這將會(huì)返回:
→實(shí)體xxx的屬性最大生命值的基值為40.0
等等,這個(gè)『乘數(shù)』參數(shù)有什么用?讓我們?cè)囈辉嚕?p> /attribute @s generic.max_health base get 2.0
→實(shí)體xxx的屬性最大生命值的基值為40.0
不難發(fā)現(xiàn),這個(gè)乘數(shù)參數(shù)沒(méi)有任何的用處.......呃,其實(shí)有用的。
用在哪呢?execute的store子命令:
?、?execute store result score @s health_max run attribute @s generic.max_health base get
?、?execute store result score @s health_max run attribute @s generic.max_health base get 2.0
指令①的返回值為正常的40.0,也就是將我們自己在health_max計(jì)分項(xiàng)上的值改為40。指令②雖然給我們的消息是40.0,但實(shí)際返回的是80.0,計(jì)分項(xiàng)上的分?jǐn)?shù)也會(huì)改為80。
所以,『乘數(shù)』參數(shù)并不是沒(méi)有用,而是它的用處在于影響指令的返回值。
修改屬性還是很簡(jiǎn)單的。那使用/attribute給實(shí)體添加修飾符呢?讓我們?cè)僭囈辉嚕?p> /attribute @s generic.max_health modifier add 1-1-1-1-1 A 1.0 add
→為實(shí)體xxx的屬性最大生命值添加了修飾符00000001-0001-0001-0001-000000000001
在上面的指令中,使用了『modifier』子命令的『add』子命令來(lái)添加一個(gè)修飾符,參數(shù)『1-1-1-1-1』指定了該修飾符的UUID,『A』指定了該修飾符的名稱,『1.0』指定了該修飾符的值,『add』指定了該修飾符的計(jì)算模式是『屬性增量』。其中得講一下的就是這個(gè)UUID參數(shù)。
在這邊的UUID參數(shù),填寫(xiě)的是『帶連字符的十六進(jìn)制UUID』。這種形式的UUID很常見(jiàn),它長(zhǎng)下面這樣:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
詳細(xì)內(nèi)容會(huì)在第一百一十章講到,在這邊你只需要把這東西當(dāng)做填寫(xiě)五個(gè)用連字符『-』連在一起的整數(shù)即可:
1-1-1-1-1
上面的『add』參數(shù)所在的位置,也可以填寫(xiě)multiply_base(倍率增量)和multiply(最終倍乘),來(lái)改變運(yùn)算模式。
現(xiàn)在,讓我們看看的生命值上限是不是高達(dá)41.0:
/attribute @s generic.max_health base get
→實(shí)體xxx的屬性最大生命值的基值為40.0
???怎么還是40.0?啊,是用錯(cuò)了,這獲取到的是基值,應(yīng)該把『base』參數(shù)去掉:
/attribute @s generic.max_health get
→實(shí)體xxx的屬性最大生命值的值為41.0
很好,所以你現(xiàn)在會(huì)用/attribute給實(shí)體添加屬性修飾符了嗎?
remove和value get兩個(gè)子命令的使用很簡(jiǎn)單,讓我們?cè)囈辉嚕?p> /attribute @s minecraft:generic.max_health modifier value get 1-1-1-1-1 2.0
→實(shí)體xxx的屬性最大生命值中修飾符00000001-0001-0001-0001-000000000001值為1.0
上面這條指令會(huì)返回這個(gè)修飾符的值。并且由于指定了乘數(shù)為『2.0』,這條指令的返回值還會(huì)是『2.0』(1.0×2.0)。
/attribute @s minecraft:generic.max_health modifier remove 1-1-1-1-1
→為實(shí)體xxx的屬性最大生命值移除了修飾符00000001-0001-0001-0001-000000000001
這樣子我們就刪掉了剛剛給我們自己添加的屬性修飾符,生命值上限回到了40.0。
本章到此為止。
附錄:/attribute歷史
Java
1.16——加入了/attribute