首頁(yè) 游戲

Minecraft指令手冊(cè)

第一百一十二章 實(shí)體的通用標(biāo)簽 上

Minecraft指令手冊(cè) 你好MC 1281 2020-06-18 22:34:46

  看,這是一頭有胡子的粉紅羊!

 ?。ㄔ谀??我怎么沒(méi)看到?)

  它作為一個(gè)實(shí)體,肯定也有自己的NBT標(biāo)簽。

  在這些NBT標(biāo)簽中,有很大一部分是大部分實(shí)體通用的。

  具體是哪些呢?

  首先,和物品一樣,游戲也會(huì)通過(guò)實(shí)體的NBT來(lái)識(shí)別該實(shí)體到底是什么實(shí)體,這就需要用到id這個(gè)標(biāo)簽。id標(biāo)簽的數(shù)據(jù)類型是文本(String字符串),它存儲(chǔ)著這個(gè)實(shí)體的命名空間ID。比如這只羊的id標(biāo)簽就是:

  {id:“minecraft:sheep“}

  需要注意,id標(biāo)簽由于是用來(lái)判斷實(shí)體類型的,十分重要,所以我們?cè)谟螒蛑袩o(wú)法通過(guò)指令來(lái)獲取并修改它,也就是說(shuō)你并不能把這只羊變成一只豬。另外,玩家雖然也是實(shí)體,但沒(méi)有id標(biāo)簽。

  id可以判斷實(shí)體的類型,但如果游戲還想更精確地判斷這個(gè)實(shí)體到底是哪個(gè)個(gè)體,就需要使用到UUID。實(shí)體的UUID數(shù)據(jù)也存儲(chǔ)在自身的NBT中,也就是說(shuō)我們可以通過(guò)NBT來(lái)獲取到實(shí)體甚至玩家的UUID。

  UUID的NBT存儲(chǔ)方式在Java1.16版本中迎來(lái)了巨大改變,這件事我們已經(jīng)在第一百一十章了解過(guò)了。在Java1.16之前,實(shí)體的UUID在NBT中是以『高低位』的方式存儲(chǔ),也就是像下面這樣子:

  {UUIDMost:1783197533150072793L,UUIDLeast:-7109092977889688726L}

  其中,值后面的大寫(xiě)字符『L』代表這兩個(gè)標(biāo)簽的數(shù)據(jù)類型都是Long長(zhǎng)整型。目前你只需要知道這種整型能夠存儲(chǔ)很大的數(shù)字即可。需要注意的是由于計(jì)分板數(shù)據(jù)類型是Int整型,所以你并不能直接將實(shí)體的UUID高低位存進(jìn)計(jì)分板中。

  在Java1.16更新后,實(shí)體的UUID改成了用Int整形數(shù)組來(lái)存儲(chǔ):

  {UUID:[I;-985669504,-1477950631,-1338504796,372293997]}

  由于改成了Int整型數(shù)組的存儲(chǔ)方式,所以在Java1.16版本更新后,你就可以直接將實(shí)體的UUID存入計(jì)分板。

  一個(gè)實(shí)體除了自身的類型和UUID,還有許許多多的數(shù)據(jù)。讓我們仔細(xì)思考一下,可能還會(huì)有哪些數(shù)據(jù)。

  一個(gè)實(shí)體肯定會(huì)有位置,所以NBT中自然也要存儲(chǔ)實(shí)體的位置數(shù)據(jù)。Pos標(biāo)簽就是干這個(gè)的。

  Pos的數(shù)據(jù)類型是『Double雙精度浮點(diǎn)數(shù)列表』,列表內(nèi)的三個(gè)元素從左到右分別存儲(chǔ)著該實(shí)體的X、Y、Z坐標(biāo)數(shù)據(jù)。比如:

  {Pos:[14.294485503905866d,72.0d,133.22538953931465d]}

  這代表著該實(shí)體處于(14.294485503905866,72,133.22538953931465)這個(gè)位置。

  和Pos作用類似的標(biāo)簽還有Rotation。Rotation標(biāo)簽的數(shù)據(jù)類型是『Float單精度浮點(diǎn)數(shù)列表』,列表內(nèi)的兩個(gè)元素分別記錄著這個(gè)實(shí)體的水平旋轉(zhuǎn)和垂直旋轉(zhuǎn)角度。比如:

  {Rotation:[322.82275f,0.0f]}

  這代表著該實(shí)體正水平地朝向南偏東37.17725°的方向。等等!『322.82275』?!

  還記得本書(shū)在第二十六章曾經(jīng)寫(xiě)過(guò)這么幾句話嗎:

  『等等,我們?cè)谥vtp時(shí),不是說(shuō)水平旋轉(zhuǎn)角度是:「以實(shí)體為中心,以正南(z軸正方向)為0°,順時(shí)針下來(lái),實(shí)體朝向和正南方向的夾角(也或者說(shuō)實(shí)體在真南方位角體系中朝向的角度),就是該實(shí)體的水平旋轉(zhuǎn)角度?!?p>  那這怎么跑出來(lái)負(fù)數(shù)了?

  其實(shí)在Minecraft中,水平旋轉(zhuǎn)角度雖然可以像我們之前在第九章講tp時(shí)那么用,但大多數(shù)時(shí)候,你都得這么用:

  以正南(z軸正方向)為0°,順時(shí)針旋轉(zhuǎn)180°通過(guò)正西至正北,用正數(shù),逆時(shí)針旋轉(zhuǎn)180°通過(guò)正東至正北,用負(fù)數(shù)。比如-45°,就代表以正南為基準(zhǔn),逆時(shí)針旋轉(zhuǎn)45°的方向;30°,就代表以正南為基準(zhǔn),順時(shí)針旋轉(zhuǎn)30°的方向。

  也就是說(shuō),在Minecraft中,水平旋轉(zhuǎn)角度的正確范圍是-180°~180°,而不是0°~360°。至于為什么我要在第九章那么講,只是怕一下子就把負(fù)數(shù)搬出來(lái)會(huì)嚇你們一跳?!?p>  現(xiàn)在,我們要糾正這里的一個(gè)疏漏之處:在Minecraft中,水平旋轉(zhuǎn)角度其實(shí)有兩套標(biāo)準(zhǔn)——一個(gè)就是我們?cè)诘诰耪轮v到的『真南方位角』,也就是0°~360°這個(gè)標(biāo)準(zhǔn);另外一個(gè)就是第二十六章講到的-180~180°這套標(biāo)準(zhǔn)。

  你可能已經(jīng)有些暈了——兩套標(biāo)準(zhǔn),怎么判斷什么時(shí)候要用什么標(biāo)準(zhǔn)?

  其實(shí)很簡(jiǎn)單,我們只需要記住三個(gè)關(guān)鍵點(diǎn)就行:

  ①在目標(biāo)選擇器中,必須采用『-180~180°』這套標(biāo)準(zhǔn)。

 ?、谠谥噶钪?,除了目標(biāo)選擇器和NBT外,其他地方基本上兩個(gè)標(biāo)準(zhǔn)都能用。

  ③在實(shí)體NBT中,玩家采用的是『-180~180°』這套標(biāo)準(zhǔn),而非玩家實(shí)體采用的是類似『真南方位角』的0°~360°標(biāo)準(zhǔn)。

  其中的第三點(diǎn),這邊得好好講一下?;厝タ纯瓷厦婺莻€(gè)Rotation標(biāo)簽,你會(huì)發(fā)現(xiàn)那里采用的是『真南方位角』的標(biāo)準(zhǔn),這說(shuō)明了什么?

  這說(shuō)明,這個(gè)實(shí)體,不是一個(gè)玩家。

  沒(méi)錯(cuò),上面那個(gè)Rotation標(biāo)簽,是作者從Java1.12.2版本中的一只豬上扒下來(lái)的。(不用擔(dān)心,即使在目前最新的Java1.19.1版本中,這個(gè)特性也沒(méi)有被Mojang改變)

  那玩家的呢?讓我們使用/data指令獲取一下:

  /data get entity @s Rotation

  \\適用于Java1.13及以上版本\\

  data指令本書(shū)還沒(méi)講到,如果你感興趣的話可以去Minecraft Wiki上了解了解。在這邊你只需要知道,上面那條指令可以獲取到你自己(執(zhí)行者)的Rotation標(biāo)簽數(shù)據(jù)。

  運(yùn)行一下,游戲返回了以下數(shù)據(jù):

  →XXXXXX擁有以下實(shí)體數(shù)據(jù):[-71.16943f,29.864527f]

  不難注意到,上面的數(shù)據(jù)中,水平旋轉(zhuǎn)角度是『-71.16943f』,采用的是與非玩家實(shí)體不一樣的標(biāo)準(zhǔn)。

  So,你學(xué)會(huì)了嗎?Rotation標(biāo)簽就這樣子,如果能的話你可以探究一下把實(shí)體的水平旋轉(zhuǎn)角度設(shè)成負(fù)數(shù)會(huì)發(fā)生什么。接下來(lái)讓我們繼續(xù)了解更多的實(shí)體NBT標(biāo)簽。

  實(shí)體肯定能夠運(yùn)動(dòng),因此必然具有速度屬性。那游戲是怎樣存儲(chǔ)實(shí)體速度的呢?

  我們?cè)谛W(xué)二年級(jí)就學(xué)過(guò):一個(gè)物體的速度,可以被分解為該物體在X、Y、Z三個(gè)軸上的速度。Minecraft中存儲(chǔ)實(shí)體速度的方式就和這差不多。在實(shí)體NBT中,用來(lái)存儲(chǔ)實(shí)體速度的標(biāo)簽是Motion標(biāo)簽,它的數(shù)據(jù)類型是『Double雙精度浮點(diǎn)數(shù)列表』,列表內(nèi)的三個(gè)元素從左到右分別是該實(shí)體在X、Y、Z三個(gè)軸上的速度向量,單位是『米/秒』。舉個(gè)簡(jiǎn)單的例子:

  {Motion:[1.2990381056d,-0.75d,0.0d]}

  這代表著該實(shí)體正朝著正東、水平向下約30°的方向以約1.5米每秒的速度前進(jìn)。需要注意的是,Motion的值并不會(huì)固定不變,而是會(huì)受到游戲模擬的阻力的影響。

 ?。ㄗⅲ?.75倍根號(hào)3就約為1.2990381056,因此你可以把1.2990381056看作0.75√3)

  由于本書(shū)并不是一個(gè)物理教材,所以關(guān)于Motion我們就不繼續(xù)深入,你大概知道是這么一回事就行。如果你沒(méi)有看懂,可以去求助你的物理老師。

  或者你可以去找一下那位屎尿屁專家?幫他完成屎尿屁大統(tǒng)一理論?

  實(shí)體的NBT還有許多標(biāo)簽,好消息是這些標(biāo)簽相對(duì)上面的內(nèi)容來(lái)說(shuō)很簡(jiǎn)單。

  air標(biāo)簽用于儲(chǔ)存實(shí)體的『空氣值』,它的數(shù)據(jù)類型為Short短整型,允許的最高值為300,實(shí)體在水中每刻都會(huì)減去1,小于等于0時(shí)(對(duì)于大多數(shù)生物來(lái)說(shuō))會(huì)開(kāi)始扣血。

  FallDistance標(biāo)簽很有趣。如果你玩過(guò)JAVA版的老版本,那你可能知道在舊版本中,從高空落下而不被摔死的方法,除了落地水,還可以挑戰(zhàn)手速按ESC暫停游戲,然后再繼續(xù)游戲。這個(gè)時(shí)候你的再掉下去就只會(huì)或幾乎沒(méi)有傷害。這個(gè)BUG的核心就在于實(shí)體的FallDistance標(biāo)簽。

  FallDistance標(biāo)簽的數(shù)據(jù)類型是單精度浮點(diǎn)型,它用來(lái)記錄實(shí)體已經(jīng)掉了多遠(yuǎn)的距離,然后在實(shí)體落地時(shí)計(jì)算會(huì)扣多少滴血。老版本暫停游戲的話,這個(gè)值就會(huì)清零,所以才會(huì)導(dǎo)致這個(gè)BUG(于是Mojang修復(fù)了)。

  Passengers標(biāo)簽是一個(gè)比較常用的標(biāo)簽,它的數(shù)據(jù)類型是『復(fù)合標(biāo)簽列表』,作用是記錄騎著該實(shí)體的其他實(shí)體的NBT數(shù)據(jù)。沒(méi)錯(cuò),這東西可以用來(lái)套娃!OOC也就是用這個(gè)標(biāo)簽來(lái)制作的。

  需要注意,在Java1.9版本之前,實(shí)體并沒(méi)有『Passengers標(biāo)簽』,而是有『Riding標(biāo)簽』。它的用法和新版本的『Passengers標(biāo)簽』一模一樣。

  Fire標(biāo)簽的數(shù)據(jù)類型是Short短整型,它的作用是決定實(shí)體著火或不會(huì)著火的時(shí)長(zhǎng)。如果它的值是正數(shù),就是決定實(shí)體身上的火距離熄滅還有多少游戲刻,如果它的值是一個(gè)負(fù)數(shù),則代表著該實(shí)體在接觸到火后,不會(huì)著火的刻數(shù)。比如:

  {Fire:-40s}

  這代表著當(dāng)該實(shí)體接觸到火時(shí),需要兩秒才會(huì)燃起來(lái)。

  PortalCooldown標(biāo)簽的數(shù)據(jù)類型是Int整型,作用是記錄這個(gè)實(shí)體還有多長(zhǎng)時(shí)間(單位為游戲刻)才可以再次穿越下界傳送門。比如這只粉紅羊剛剛穿過(guò)下界傳送門,它就需要等至少300刻(15秒)才能再次傳送,因?yàn)樗腜ortalCooldow標(biāo)簽被設(shè)定為了300。

  Dimension標(biāo)簽的數(shù)據(jù)類型是Int整型[Java1.16以下]或文本(String字符串)[Java1.16更新后],它的作用是記錄該實(shí)體所處的維度。

  舉個(gè)例子:

  {Dimension:“minecraft:overworld“}

  \\Java1.16更新后\\

  {Dimension:0}

  \\Java1.16更新前\\

  這代表著該實(shí)體所處的維度為『主世界』。對(duì)了,『下界』的維度數(shù)字ID為-1,『末地』為1。

  需要注意,似乎自從Java1.16版本開(kāi)始,Dimension就不再是實(shí)體的通用標(biāo)簽之一,而是變成僅玩家擁有該標(biāo)簽。所以對(duì)于Java1.16及以上版本的實(shí)體來(lái)說(shuō),并沒(méi)有Dimension這個(gè)標(biāo)簽。

  這一章到此為止。

  附錄:實(shí)體通用標(biāo)簽的部分歷史

  Java

  1.9——Riding標(biāo)簽改為Passengers標(biāo)簽

  1.16——Dimension標(biāo)簽不再是實(shí)體通用標(biāo)簽,數(shù)據(jù)類型從Int整型改為String字符串。

  1.17——實(shí)體數(shù)據(jù)的儲(chǔ)存位置被改變

按 “鍵盤左鍵←” 返回上一章  按 “鍵盤右鍵→” 進(jìn)入下一章  按 “空格鍵” 向下滾動(dòng)
目錄
目錄
設(shè)置
設(shè)置
書(shū)架
加入書(shū)架
書(shū)頁(yè)
返回書(shū)頁(yè)
指南