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