首頁 游戲

Minecraft指令手冊

第一百一十二章 實體的通用標簽 上

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

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

 ?。ㄔ谀??我怎么沒看到?)

  它作為一個實體,肯定也有自己的NBT標簽。

  在這些NBT標簽中,有很大一部分是大部分實體通用的。

  具體是哪些呢?

  首先,和物品一樣,游戲也會通過實體的NBT來識別該實體到底是什么實體,這就需要用到id這個標簽。id標簽的數據類型是文本(String字符串),它存儲著這個實體的命名空間ID。比如這只羊的id標簽就是:

  {id:“minecraft:sheep“}

  需要注意,id標簽由于是用來判斷實體類型的,十分重要,所以我們在游戲中無法通過指令來獲取并修改它,也就是說你并不能把這只羊變成一只豬。另外,玩家雖然也是實體,但沒有id標簽。

  id可以判斷實體的類型,但如果游戲還想更精確地判斷這個實體到底是哪個個體,就需要使用到UUID。實體的UUID數據也存儲在自身的NBT中,也就是說我們可以通過NBT來獲取到實體甚至玩家的UUID。

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

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

  其中,值后面的大寫字符『L』代表這兩個標簽的數據類型都是Long長整型。目前你只需要知道這種整型能夠存儲很大的數字即可。需要注意的是由于計分板數據類型是Int整型,所以你并不能直接將實體的UUID高低位存進計分板中。

  在Java1.16更新后,實體的UUID改成了用Int整形數組來存儲:

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

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

  一個實體除了自身的類型和UUID,還有許許多多的數據。讓我們仔細思考一下,可能還會有哪些數據。

  一個實體肯定會有位置,所以NBT中自然也要存儲實體的位置數據。Pos標簽就是干這個的。

  Pos的數據類型是『Double雙精度浮點數列表』,列表內的三個元素從左到右分別存儲著該實體的X、Y、Z坐標數據。比如:

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

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

  和Pos作用類似的標簽還有Rotation。Rotation標簽的數據類型是『Float單精度浮點數列表』,列表內的兩個元素分別記錄著這個實體的水平旋轉和垂直旋轉角度。比如:

  {Rotation:[322.82275f,0.0f]}

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

  還記得本書在第二十六章曾經寫過這么幾句話嗎:

  『等等,我們在講tp時,不是說水平旋轉角度是:「以實體為中心,以正南(z軸正方向)為0°,順時針下來,實體朝向和正南方向的夾角(也或者說實體在真南方位角體系中朝向的角度),就是該實體的水平旋轉角度。」

  那這怎么跑出來負數了?

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

  以正南(z軸正方向)為0°,順時針旋轉180°通過正西至正北,用正數,逆時針旋轉180°通過正東至正北,用負數。比如-45°,就代表以正南為基準,逆時針旋轉45°的方向;30°,就代表以正南為基準,順時針旋轉30°的方向。

  也就是說,在Minecraft中,水平旋轉角度的正確范圍是-180°~180°,而不是0°~360°。至于為什么我要在第九章那么講,只是怕一下子就把負數搬出來會嚇你們一跳?!?p>  現在,我們要糾正這里的一個疏漏之處:在Minecraft中,水平旋轉角度其實有兩套標準——一個就是我們在第九章講到的『真南方位角』,也就是0°~360°這個標準;另外一個就是第二十六章講到的-180~180°這套標準。

  你可能已經有些暈了——兩套標準,怎么判斷什么時候要用什么標準?

  其實很簡單,我們只需要記住三個關鍵點就行:

  ①在目標選擇器中,必須采用『-180~180°』這套標準。

 ?、谠谥噶钪?,除了目標選擇器和NBT外,其他地方基本上兩個標準都能用。

  ③在實體NBT中,玩家采用的是『-180~180°』這套標準,而非玩家實體采用的是類似『真南方位角』的0°~360°標準。

  其中的第三點,這邊得好好講一下?;厝タ纯瓷厦婺莻€Rotation標簽,你會發(fā)現那里采用的是『真南方位角』的標準,這說明了什么?

  這說明,這個實體,不是一個玩家。

  沒錯,上面那個Rotation標簽,是作者從Java1.12.2版本中的一只豬上扒下來的。(不用擔心,即使在目前最新的Java1.19.1版本中,這個特性也沒有被Mojang改變)

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

  /data get entity @s Rotation

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

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

  運行一下,游戲返回了以下數據:

  →XXXXXX擁有以下實體數據:[-71.16943f,29.864527f]

  不難注意到,上面的數據中,水平旋轉角度是『-71.16943f』,采用的是與非玩家實體不一樣的標準。

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

  實體肯定能夠運動,因此必然具有速度屬性。那游戲是怎樣存儲實體速度的呢?

  我們在小學二年級就學過:一個物體的速度,可以被分解為該物體在X、Y、Z三個軸上的速度。Minecraft中存儲實體速度的方式就和這差不多。在實體NBT中,用來存儲實體速度的標簽是Motion標簽,它的數據類型是『Double雙精度浮點數列表』,列表內的三個元素從左到右分別是該實體在X、Y、Z三個軸上的速度向量,單位是『米/秒』。舉個簡單的例子:

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

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

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

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

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

  實體的NBT還有許多標簽,好消息是這些標簽相對上面的內容來說很簡單。

  air標簽用于儲存實體的『空氣值』,它的數據類型為Short短整型,允許的最高值為300,實體在水中每刻都會減去1,小于等于0時(對于大多數生物來說)會開始扣血。

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

  FallDistance標簽的數據類型是單精度浮點型,它用來記錄實體已經掉了多遠的距離,然后在實體落地時計算會扣多少滴血。老版本暫停游戲的話,這個值就會清零,所以才會導致這個BUG(于是Mojang修復了)。

  Passengers標簽是一個比較常用的標簽,它的數據類型是『復合標簽列表』,作用是記錄騎著該實體的其他實體的NBT數據。沒錯,這東西可以用來套娃!OOC也就是用這個標簽來制作的。

  需要注意,在Java1.9版本之前,實體并沒有『Passengers標簽』,而是有『Riding標簽』。它的用法和新版本的『Passengers標簽』一模一樣。

  Fire標簽的數據類型是Short短整型,它的作用是決定實體著火或不會著火的時長。如果它的值是正數,就是決定實體身上的火距離熄滅還有多少游戲刻,如果它的值是一個負數,則代表著該實體在接觸到火后,不會著火的刻數。比如:

  {Fire:-40s}

  這代表著當該實體接觸到火時,需要兩秒才會燃起來。

  PortalCooldown標簽的數據類型是Int整型,作用是記錄這個實體還有多長時間(單位為游戲刻)才可以再次穿越下界傳送門。比如這只粉紅羊剛剛穿過下界傳送門,它就需要等至少300刻(15秒)才能再次傳送,因為它的PortalCooldow標簽被設定為了300。

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

  舉個例子:

  {Dimension:“minecraft:overworld“}

  \\Java1.16更新后\\

  {Dimension:0}

  \\Java1.16更新前\\

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

  需要注意,似乎自從Java1.16版本開始,Dimension就不再是實體的通用標簽之一,而是變成僅玩家擁有該標簽。所以對于Java1.16及以上版本的實體來說,并沒有Dimension這個標簽。

  這一章到此為止。

  附錄:實體通用標簽的部分歷史

  Java

  1.9——Riding標簽改為Passengers標簽

  1.16——Dimension標簽不再是實體通用標簽,數據類型從Int整型改為String字符串。

  1.17——實體數據的儲存位置被改變

按 “鍵盤左鍵←” 返回上一章  按 “鍵盤右鍵→” 進入下一章  按 “空格鍵” 向下滾動
目錄
目錄
設置
設置
書架
加入書架
書頁
返回書頁
指南