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