第一百三十一章 生物的共通NBT-1
在第一百一十二章到一百一十三章這兩章里,我詳細(xì)地介紹了實(shí)體的通用NBT,或者說是實(shí)體的基礎(chǔ)NBT。在此基礎(chǔ)上,Mojang又添加了一些新的NBT,這些新的NBT加上原來的實(shí)體NBT,就變成了:
生物的共通NBT
生物的共通NBT的內(nèi)容相較于實(shí)體基礎(chǔ)NBT增加了很多,以至于要用更多的篇幅去講述它。當(dāng)然這些并不一定要背下來,稍微了解個(gè)大概,需要用的時(shí)候過來看就行了。有時(shí)候用著用著說不定就記下來了呢?。ó?dāng)然,荒廢一段時(shí)間還是會(huì)還回去的)
那么這些共通的NBT到底是什么呢?
我們知道,一個(gè)生物,最基礎(chǔ)的就是血量,所以共通NBT自然而然就有血量:
Health(值:數(shù)值)
這個(gè)Health就是生物的血量值。但如果你玩過游戲,應(yīng)該就會(huì)知道一個(gè)生物的血量至少要有兩個(gè)變量:
1.當(dāng)前的血量
2.血量最大值
而這個(gè)Health就是指當(dāng)前的血量,比如現(xiàn)在有一只豬它有1滴血,它的NBT就是:
{Health:1}
但實(shí)際上,很多時(shí)候這個(gè)Health并不是個(gè)整數(shù),而是個(gè)小數(shù)(準(zhǔn)確的來說是“浮點(diǎn)數(shù)”)。比如你徒手去攻擊一位全是鉆石套的大佬,你別看它的心數(shù)沒變,就認(rèn)為你的攻擊沒起到作用,實(shí)際上是因?yàn)閭^小被約沒了而已,因?yàn)檫@個(gè)大佬在受傷后的的Health是:
{Health:19.927367235714243}
你給這位大佬造成了0.072632764285757滴血的傷害,相當(dāng)于這位大佬血量的3.631638214288‰
嗯,確實(shí)夠小的。
而有時(shí)候,Health也可以達(dá)到負(fù)數(shù),比如你一擊就秒了對方,那么對方在臨終前的血量就是:
{Health:-623.5}
嗯,這傷害都夠同時(shí)秒末影龍和一只JAVA版的凋零了。
而如果這個(gè)Health的值超過了所允許的最大值,比如你通過修改器把自己的血量修改成了2147483647會(huì)怎么樣?
答案是你進(jìn)入游戲后就會(huì)擁有2147483647滴血,只不過這并沒有什么卵用,因?yàn)楫?dāng)你遭受到了傷害,就算是一點(diǎn)點(diǎn),游戲也會(huì):
本次攻擊共造成了0.00635滴血的傷害,正在扣除中
我靠,這家伙的血量怎么超過了這個(gè)生物屬性里的generic.maxHealth*數(shù)值!
?。?關(guān)于generic.maxHealth早在第一百零五章時(shí)就講到了,當(dāng)時(shí)就已經(jīng)講到了生物的屬性,建議忘記的同學(xué)趕緊回去復(fù)習(xí)一下)
不行,這家伙絕對開掛了!必須要干點(diǎn)什么。
也不知道這家伙在修改之前的生命值是多少。算了,直接改成允許的最大值吧!
——Health的值從2147483647變成了20
——Health的值從20變成了19.99365
恭喜你,你的血量一夜回到了解放前!
所以說以后改血量的時(shí)候最好先把最大值改了,不然改個(gè)毛線。
上面說過,要弄血量至少需要兩個(gè)變量。但MC作為一個(gè)十多年還在煥發(fā)活力的老游戲,只有兩個(gè)血量的變量,未免有些奇怪。所以MC不只兩個(gè)血量變量,而是還有:
AbsorptionAmount(值:數(shù)值)
?。òプ髡?,最大值還沒講呢?。?p> 呃,其實(shí)早就講過了,最大值其實(shí)就是一個(gè)屬性,在第一百零五章時(shí)就講過了。
AbsorptionAmount的作用是指通過傷害吸收效果所獲得的額外生命值,就是那個(gè)吃了金蘋果生命值多了的那個(gè)黃色小心心。
為什么Mojang要單獨(dú)添加這個(gè)屬性呢?
因?yàn)镸inecraft還有一個(gè)和傷害吸收作用很相似的效果:生命提升
但這只是表面相似,實(shí)際上生命提升是直接提升generic.maxHealth生命最大值,所以顯示出來的是紅心,而且掉了還可以回。傷害吸收就不一樣了,那黃色生命是一次性的,生命最大值還是最大值,提升的實(shí)際上并不是生命,而是添加了類似于盾牌的效果,只不過抵擋的生命值是可以直觀顯示的。
所以,AbsorptionAmount這個(gè)屬性的作用是指能抵消的傷害量,并不是指提升的血量。
比如:
{Health:20,AbsorptionAmount:4}
這樣子顯示成心的話將會(huì)是10顆紅心+2顆黃心。
.......一個(gè)并不華麗的分割線......
“......看,紅隊(duì)那名玩家剛剛挖了藍(lán)隊(duì)的床,藍(lán)隊(duì)的那些成員都圍在那紅隊(duì)的旁邊。可以看到有一名膽小的藍(lán)隊(duì)跑了,雖然這看起來有些背叛其他人,但接下來那名紅隊(duì)玩家以一擋五,使用了單身起碼15年的手速迅速地先干掉兩名離他最近的藍(lán)隊(duì),將其打下虛空。剩下那3名藍(lán)隊(duì)竟然沒有潰逃,而是團(tuán)結(jié)在了一起,重新像那紅隊(duì)發(fā)起進(jìn)攻。紅隊(duì)那名玩家看動(dòng)作應(yīng)該是打算先虛張聲勢一下,趁藍(lán)隊(duì)恍惚間逃走,但沒想到藍(lán)隊(duì)反應(yīng)速度之快,將其打個(gè)措手不及,死亡......”
相信你一定玩過起床戰(zhàn)爭,就算沒玩過也起碼干過PVP或PVE。在攻擊敵方時(shí),敵方受到攻擊都會(huì)發(fā)紅,這點(diǎn)在羊身上特別明顯,一白一紅的強(qiáng)烈反差述說著那羊的痛苦,以及引出了一個(gè)新的問題:
這個(gè)發(fā)紅的時(shí)間是否有跟生物本身的NBT有關(guān)?
確實(shí)有關(guān)。
在生物的共通NBT里,有這么一個(gè)標(biāo)簽:
HurtTime
這個(gè)英文簡直是太簡單了,按照現(xiàn)在的神童標(biāo)準(zhǔn)出生不到一分鐘就可以翻譯了:
疼痛時(shí)間
這個(gè)疼痛時(shí)間其也是一個(gè)數(shù)值,存儲(chǔ)著生物被擊中后發(fā)紅了多長時(shí)間,單位是刻。生物不紅之后值返回0,即代表著:生物最近未被擊中。如:
{Health:4.65,AbsorptionAmount:0,HurtTime:16}
說明這個(gè)生物發(fā)紅已經(jīng)持續(xù)16刻了。
這個(gè)標(biāo)簽是控制生物的發(fā)紅時(shí)間的,我們不需要太深入研究。
而另外一個(gè)標(biāo)簽:
HurtByTimestamp(值:數(shù)值)
和HurtTime也與傷害有關(guān),只不過這個(gè)標(biāo)簽記錄的是“距離該生物上次受到傷害的時(shí)間”,單位也是刻,比如:
{Health:6,HurtByTimestamp:853,HurtTime:0}
就說明該生物距離上次受到傷害已經(jīng)過去853刻的時(shí)間了。
真的是這么理解的嗎?
實(shí)際上還有另外一種理解方式:
就說明該生物距離生成或出生已經(jīng)過去853刻的時(shí)間了。
沒錯(cuò),如果該生物這生還沒受到傷害,那么這個(gè)值將會(huì)記錄它已經(jīng)出生或生成多久了。
而當(dāng)該生物死亡了呢?
如果這個(gè)生物不是玩家的話,那就沒了。
但如果是玩家,實(shí)際上生物的共通NBT里有這么一個(gè)標(biāo)簽:
DeathTime(值:數(shù)值)
這對于生物本身沒什么用,但它在玩家的NBT里就有用了——它記錄者玩家距離上次死亡多久了,主要是用于控制死亡動(dòng)畫,單位當(dāng)然也是刻。
這個(gè)標(biāo)簽我們當(dāng)然不需要深究,但我們卻可以思考一個(gè)問題:
為什么生物的NBT里有這個(gè)玩家才用得到的標(biāo)簽?zāi)兀?p> 答案很不簡單,作者猜是這樣的:
上古時(shí)期(JAVA-Classic),貧瘠的Minecraft迎來了第一個(gè)生命——人類。這個(gè)神奇的生物不會(huì)饑餓,不會(huì)口渴,更不會(huì)死亡。它們會(huì)在世界里亂跑,亂跳。正是因?yàn)樗鼈兊拇嬖?,Minecraft才出現(xiàn)了樹、史蒂夫、羊、牛、雞等物種,給這片本來貧瘠的大地帶來勃勃生機(jī)。
?。òプ髡撸琈inecraft的第一個(gè)生命不是草嗎?)
所以玩家是由生物進(jìn)化而來的,自然而然玩家就遺傳了生物的DNA(NBT)。
嗯,這樣子就解釋得通了。
OK生物的共通NBT就先講到這,我們下章再見!