第一百四十七章 可繁殖的生物共通標簽
這兒有一只土豬,它的夢想是那顆白菜。
但今天我們并不是要研究這只土豬,而是在Minecraft中的豬。Minecraft中可沒有白菜。
在生存前期,糧食緊缺,玩家們一般會直接把這只豬殺死;在生存后期,糧食的獲取是長期的事情,因此玩家們經常種田,也就有了各種自動化紅石機械。
但種田獲得的是素食,長期吃素會導致營養(yǎng)不良,所以玩家們還需要一種肉食來源。這時,他們就會另找來一頭豬,拉到這只豬旁邊,然后喂幾根胡蘿卜。幾秒下來,就多了一只小豬。
這個過程,我們稱之為“繁殖”。
在Minecraft中,可繁殖的生物不只有豬一種。據(jù)“成雙成對”成就統(tǒng)計,截至2021年7月6日,Minecraft中一共有19種可繁殖的生物,它們是——雞、牛、哞菇、豬、兔子、羊、海龜、馬(已馴服)、驢(已馴服)、騾(已馴服)、羊駝(已馴服)、豹貓、狼(已馴服)、貓(已馴服)、狐貍、熊貓、蜜蜂、疣豬獸、熾足獸。
既然有這么多生物可以繁殖,那么它們的NBT是否也有共通之處呢?
有的!
看看這只1.12.2版本的豬,在使用了entitydata給它添加了一個have_a_look標簽后,我們獲取到了它的NBT數(shù)據(jù):
{HurtByTimestamp:0,Attributes:[{Base:10.0d,Name:“generic.maxHealth“},{Base:0.0d,Name:“generic.knockbackResistance“},{Base:0.25d,Name:“generic.movementSpeed“},{Base:0.0d,Name:“generic.armor“},{Base:0.0d,Name:“generic.armorToughness“},{Base:1.0d,Name:“forge.swimSpeed“},{Base:16.0d,Modifiers:[{UUIDMost:155161593230540818L,UUIDLeast:-7387004718408769437L,Amount:0.08697153622768039d,Operation:1,Name:“Random spawnbonus“}],Name:“generic.followRange“}],Invulnerable:0b,F(xiàn)allFlying:0b,F(xiàn)orcedAge:0,PortalCooldown:0,AbsorptionAmount:0.0f,Saddle:0b,F(xiàn)allDistance:0.0f,InLove:0,DeathTime:0s,HandDropChances:[0.085f,0.085f],PersistenceRequired:0b,Age:0,Motion:[0.0d,-0.0784000015258789d,0.0d],Leashed:0b,UUIDLeast:-8005055644514598705L,Health:10.0f,LeftHanded:0b,Air:300s,OnGround:1b,Dimension:0,Rotation:[267.60834f,0.0f],UpdateBlocked:0b,HandItems:[{},{}],ArmorDropChances:[0.085f,0.085f,0.085f,0.085f],UUIDMost:-3204752037661752558L,Pos:[618.3102734304896d,4.0d,47.52208547749273d],have_a_look:1b,F(xiàn)ire:-1s,ArmorItems:[{},{},{},{}],CanPickUpLoot:0b,HurtTime:0s}
看著很暈是吧?我們簡化一下,刪去已知的NBT標簽,剩下了這么幾個:
{ForcedAge:0,Saddle:0b,InLove:0,Age:0}
其中,除了Saddle以外,其他都是屬于“可繁殖的生物共通標簽”。
Saddle(布爾值)的作用是確定這豬背上是否放了個鞍,有鞍為1,沒鞍為0.
不難發(fā)現(xiàn),在這“可繁殖的生物共通標簽”中,有兩個NBT標簽(ForcedAge和Age)其標簽名中都有單詞“age”。age這個單詞的意思大家都知道,是年齡的意思,那這兩個NBT標簽有啥用呢?
看,那兒有兩只豬正在村民種的土豆菜地里晃悠。趕緊過去收割一些成熟的土豆,然后喂給這兩只豬吃。很快啊!不到幾秒就出現(xiàn)了一只小豬,讓我們看看這只可愛的小豬的NBT吧!
{ForcedAge:0,InLove:0,Age:-23586}
這只剛生出來的小豬,其Age值為-23586。在《MinecraftWiki:母豬的產后護理》一書中(實際上沒有這本書啦),明確的寫到:“幼年豬在沒有食用任何食物的情況下,需要花費一整天時間長大??梢酝ㄟ^喂食來加快速度,一次喂食加快10%?!?p> Minecraft中的一天為20分鐘,換算成游戲刻即20×60×20=24000刻,而Age的值是-23586,所以Age的作用是?
Age(Int整形)的功能是表示該生物的年齡,幼年時為負值,并隨時間流逝不斷增加直到0。當該生物Age值達到0時,判定該生物成年,并停止增加。
幼年豬要長大需要24000刻,即Age初始值為-24000。這只小豬的Age值為-23586,說明它已經20.7秒大了。
那ForcedAge有啥用?
剛剛引用的那段話最后兩句講到喂食可以加快生長速度,讓我們試一試。
作者喂給這只小豬兩個土豆,NBT就變成了:
{ForcedAge:4400,Saddle:0b,InLove:0,Age:-18853}
剛剛花去的時間不到二十秒,這只豬的Age值就增長了4733(236.65秒),F(xiàn)orcedAge值也變成了4400,這說明給小豬喂土豆是可以加快生長速度的,這加快的值被ForcedAge統(tǒng)計了,并且也加到了Age里面。
但一次喂食是加快10%,兩次喂食豈不是加快了20%或19%,即4800或4560。但這兒卻只加快了4400,稍微有些偏差,這是怎么一回事?
經過作者的多次試驗,發(fā)現(xiàn)每次喂食并不是一定加快10%,而是有一個小幅度的浮動,所以這本《MinecraftWiki:母豬的產后護理》并不一定完全準確。
那InLove又有何用?
作者寫著寫著,這只小豬長大了。此時作者給了它一個土豆,然后就發(fā)現(xiàn)它的NBT標簽變成了:
{ForcedAge:4400,Saddle:0b,InLove:577,Age:0}
“If you hold food in your hand, they follow you around. If you feed them, they enter “l(fā)ove mode“. Two animals in love mode = babies.(只要你手上有食物,它們就會跟著你。如果你喂它們,它們就會進入“求愛模式”。兩只求愛的動物=下崽。)”——Notch
Notch的這番話中提到了一個“l(fā)ove mode(求愛模式)”,這個求愛模式是在喂食之后進入的,InLove也是在喂食之后變化的。而且,InLove直譯是“在愛里”,意思類似“求愛模式”,難不成?
沒錯,InLove就是Notch文中提到的求愛模式在NBT標簽中的具體表現(xiàn),這個“求愛模式”時長2分鐘,即600游戲刻。進入“求愛模式”后,再次喂食不能將InLove值重置為600。在“求愛模式”中,生物會持續(xù)散發(fā)紅色粒子。當兩只進入求愛模式且類型相同的生物相距8格,它們便會靠近,然后的事大家都知道,最終求愛模式結束。
InLove值隨時間減少到0時,求愛模式也會結束。
這只進入求愛模式的豬,多了兩個我們未曾相識的NBT標簽:
{LoveCauseLeast:-8954364695892943005L,LoveCauseMost:865205586299127399
0L}
唉,這Least,這Most,這一長串的Long長整型值——這不就是UUID嗎?
沒錯,這就是UUID,那這UUID是誰的?
是這只豬的愛人的UUID。
?不對啊,這世界的“生物自然生成”已經被關了,豬只有它一個人,那它愛著誰?
作者尋找了一下這個UUID的所有者,結果發(fā)現(xiàn)這是個空號。
嘶——細思極恐啊。
現(xiàn)在,我們已經了解了Age、ForcedAge、InLove和LoveCauseLeast、LoveCauseMost這五個NBT標簽,這些標簽就是“可繁殖的生物共通標簽”的全部內容。眾所周知,1.16版本UUIDLeast和UUIDMost合并了,所以在Minecraft Java1.16及以上版本,LoveCauseLeast和LoveCauseMost被合并成了LoveCause標簽(整形數(shù)組)。
我們按照Minecraft生物一生的發(fā)展來對這些標簽進行分類,可以分出:
幼年(20min)——Age、ForcedAge
成年——Age:0
單身——InLove
結婚——LoveCauseLeast、LoveCauseMost(<Java1.16)|LoveCause(≥Java1.16)
生子——???
可以發(fā)現(xiàn),生物繁殖之后所用的NBT標簽我們還不知道,但“可繁殖的生物共通標簽”就五個標簽,所以生物繁殖之后所用的NBT就在這五個標簽之中。
當然,也可能根本就沒有用到。只不過,在下結論前,請最后看一遍《MinecraftWiki:母豬的產后護理》,其中有這么一段話:“豬繁殖過后,兩只豬都會進入繁殖冷卻期,期間通過喂食將無法進入求愛模式。繁殖冷卻期長達五分鐘,五分鐘過后將會自動回到正常期,可以再次進入求愛模式。”
嗯,按Mojang的尿性,這五分鐘絕對有NBT標簽存著。讓我們動手看一看究竟是哪個NBT存著這繁殖冷卻期的剩余時間。
作者又弄出一只豬,讓這兩只豬繁殖了一下,然后拉開其中一頭,仔細看它的NBT:
{ForcedAge:0,Age:5416,InLove:0,LoveCauseLeast:-8954364695892943005L,LoveCauseMost:8652055862991273990L}
哦吼,發(fā)現(xiàn)沒有!Age的值是5416!我們知道,5分鐘換算成游戲刻是5×60×20=6000刻。所以,Age還有一個用處:
當生物與另一只同種生物進行繁殖過程后,Age的值將會變?yōu)?000,并隨時間減少,為0時停止。Age值減少期間,將是該生物的“繁殖冷卻期”。
到這兒,“可繁殖的生物共通標簽”才算全部講完。哦老天爺,終于更了一章啊。
.......
.......
.......
.......
.......
.......
.......
.......
Minecraft文言文版本真棒!
.......
.......
.......
.......
.......
.......
We know how to use the tag “LoveCause“,but when we fill the tag from the other kind of mobs' UUID,what will happen?
I experimented,but nothing happen.
.......