首頁 游戲

Minecraft指令手冊

第一百四十五章 箭共通標簽

Minecraft指令手冊 你好MC 2908 2021-05-23 23:14:46

  我們都知道實體有實體共通標簽,實體中的彈射物有彈射物共通標簽。箭屬于彈射物,它像礦車一樣,擁有許多種類(額......實際上,除了光靈箭以外,其他的箭只是藥水效果不同而已)。既然礦車擁有自己的共通標簽,那箭呢?

  Let us open Minecraft and have a look.

  我們打開1.12.2版本,一進游戲就先往天空射一發(fā),然后在箭落地之前快速敲下“/entitydata @e[type=arrow]{have_a_look:1b}”,然后這支箭的NBT標簽就多了一個:

  have_a_look:1b

  的標簽,同時我們也獲得了這支箭的NBT標簽:

  {Motion:[-0.017573624569493466d,1.2870474554049782d,-0.01 7998429037403802d],damage:2.0d,shake:0b,xTile:-1,UUIDLeast:-85 75954613148320732L,inGround:0b,pickup:2b,Invulnerable:0b,Air:300s,OnGround:0b,Dimension:0,PortalCooldown:0,Rotation:[-135.68414f,89.041885f],life:0s,F(xiàn)allDistance:0.0f,inTile:“minecraft:air“,UUIDMost:-2256734521454604841L,inData:0b,crit:1b,Pos:[651.21191092562d,57.02173662322392d,41.009244940034264d],have _a_ look:1b,zTile:-1,F(xiàn)ire:0s,yTile:-1}

  看著有點暈是吧?好,那我們歸納一下。

  在這串NBT內(nèi),除了我們的have_a_look標簽,其他的標簽一共有24個。分類一下,可以得到:

  Tags common to all entities={Motion,UUIDLeast,Invulnerable,Air,OnGround,Dimension,PortalCooldown,Rotation,F(xiàn)allDistance,UUIDMost,inData,crit,Pos,F(xiàn)ire}

  Unknow tags={damage,shake,inGround,pickup,inTile,inData,crit,yTile,zTile,xTile}

  這些標簽中一共有10個我們還不知道是個啥,那今天我們就來仔細研究研究。

  “damage”這個單詞是“損壞”的意思,可作為名詞或動詞。但實際上按照這個標簽的用途來說,它在這應(yīng)該是個使動用法的謂語動詞(????):使......損壞。再看看上面這串NBT,它的值是“2.0d”,最后的這個“d”,說明damage的值是雙精度浮點數(shù)。

  這標簽的用途到底是什么?我們來個反向思維,damage的主語在這邊應(yīng)該是箭,即:

  Arrows damage ......(箭使.......損壞了)

  箭會使什么東西損壞?肯定是射中的實體啦!所以damage的作用就是:

  設(shè)定箭將造成的傷害。

  上面NBT中damage的值是2.0d,就代表著這個箭射中實體將造成2滴血(1顆心)的傷害。由于是雙精度浮點數(shù)的值,所以這不一定是個整數(shù)。這個值會隨著發(fā)射該箭的武器所有的力量附魔等級而變化,具體是力量附魔每高一級,就會增加0.5的值。假設(shè)你用一個附魔了144514級力量的弓發(fā)射這支箭,那么該值將會是:

  57259.0d(114514×0.5+2.0)

  等等,實際上還要再加一個0.5,因為只要一把弓附魔了力量,不管是多少級,都會額外加上0.5,然后再加上(0.5×力量等級)。所以,實際上的值應(yīng)該是:

  57259.5d

  實際上箭造成的傷害不會那么低。箭的傷害還有被箭的速度影響,具體公式如下:

  V箭×damage+暴擊傷害=真實傷害

  但還有一些情況傷害是個定值,如發(fā)射器射出的箭傷害一定是3滴血。

  damage是這樣,那接下來的shake又是何物?

  shake的意思是“搖”,這個比較難猜,就直接上答案:

  當箭擊中方塊時,shake將會設(shè)定為7(單位為游戲刻)。在shake還未降為0時,就是箭的“抖動狀態(tài)”,玩家此時不能撿起箭,需待shake為0時,方可撿起。

  上面NBT中的shake值為0b,b就說明這是字節(jié)型數(shù)值。這個0,說明這支箭可能還在飛行,也可能已經(jīng)落地超過0.35秒了。

  那該如何判斷一支箭是否落地了呢?

  ground的意思是“地面”,作為動詞時有“著陸”的意思。上面,我們歸納出的第三個我們還不知道是干啥的NBT標簽是“inGround”。in the ground是一個短語,和on the ground意思差不多,都是“在地面”的意思,只不過前者更注重于強調(diào)“接觸”。

  那“inGround”的作用大家應(yīng)該猜到了吧?即:

  箭是否接觸地面。

  上面的NBT標簽中,inGround的值是:

  0b

  說明inGround的數(shù)值類型為Byte(字節(jié)型),同時這個0(false)也說明了這支箭還在飛。如果這里的值不是0,而是1(true),那就是接觸地面了。

  當一支箭接觸到地面,就代表玩家可以撿起它。但,眾所周知,小白射出的箭玩家是不能白嫖的,你知道這是為什么嗎?

  你肯定不知道,但看完下面這一段,你就知道了。

  實際上,不光是小白的箭無法撿起。當你開啟創(chuàng)造模式用弓射一發(fā)再調(diào)成生存時,你會發(fā)現(xiàn)你照樣無法撿起創(chuàng)造模式射出來的箭。

  為啥?

  pickup這個單詞的意思是“皮卡”,但這邊應(yīng)該把它拆分成pick up(撿起)。

  既然pick up的意思是撿起,那么就是對撿起的設(shè)置咯?

  對!

  在上面的NBT中,pickup的值是2b,b說明這也是一個byte字節(jié)型標簽。那這個2說明了什么?

  pickup的值你翻遍整個Minecraft之后會發(fā)現(xiàn)只有三種:

  小白射出的箭——0

  你在非創(chuàng)造模式射出的箭——1

  你在創(chuàng)造模式射出的箭——2

  結(jié)合你玩Minecraft的經(jīng)驗和作者上面分享的發(fā)現(xiàn),可以得出:

  非玩家生物射出的箭:0——不可被玩家撿起

  非創(chuàng)造模式玩家射出的箭(發(fā)射器也算):1——可被除旁觀者模式外其他模式玩家撿起(注:Wiki上言“可以被玩家在生存或創(chuàng)造模式中撿起”,未提冒險模式,但作者實測冒險模式也可以撿起)

  創(chuàng)造模式玩家射出的箭:2——只可被創(chuàng)造模式玩家撿起

  現(xiàn)在我們可以回答上面的問題了:

  這個2說明了這是一個創(chuàng)造模式玩家射出的箭

 ?。ㄗⅲ河弥噶钌傻募齪ickup值也是0,即不可被撿起。推測是游戲本身產(chǎn)生的箭都不可以被玩家撿起)

  ........

  在之前,我們遇見過兩個在1.13扁平化中被合并的NBT標簽,這兩個標簽相信大家還記得,它們是:

  DisplayTile+DisplayData=DisplayState(礦車共通標簽)

  Block+Data=BlockState(下落的方塊)

  現(xiàn)在,我們在1.12.2版本的箭共通標簽遇見了:

  inTile和inData

  這兩個NBT標簽和我們之前遇見的那兩個標簽在未合并之前的構(gòu)造非常相似,那么它們是否在1.13版本中被合并了?

  DisplayState和BlockState有個共同點,就在于他們都是與方塊有關(guān)系。合并之前,它們都分別有一個用來表示數(shù)據(jù)值的標簽:DisplayData和Data。數(shù)據(jù)值在1.13版本中被刪除,所以這種類型的標簽也就合并了。

  inData和DisplayData、Data一樣,末尾都有一個“Data”,那inData是否就是表示方塊數(shù)據(jù)值所用呢?

  inData如果真是表示數(shù)據(jù)值,那inTile呢?是不是用來表示方塊id?

  您別說,還真是。

  在上面的NBT中,這兩個標簽的值分別是:

  inTile:“minecraft:air“

  inData:0b

  你看,這minecraft:air不就是空氣方塊嗎?這“0”不就是方塊數(shù)據(jù)值嗎?

  這兩個標簽存的是啥我們知道了,但用處呢?

  我們已經(jīng)知道這支箭是飛在空中的,既然這里是空氣方塊,那么這兩個的作用難道是.......

  這支箭所處的方塊?

  您別說,您又對了。這兩個標簽的作用還真是這樣的。

  但我們還沒有回答上面的問題呢。實際上的確是被合并了。至于合并成了什么東西.......

  已知Block+Data=BlockState,Block=Tile,求單詞式inTile+inData的單詞值。

  解:

  inTile+inData=in(Tile+Data)①

  將Block=Tile代入①,得

  inTile+inData=in(Block+Data)②

  將Block+Data=BlockState代入②,得

  inTile+inData=inBlockState

  ∴inTile+inData=inBlockState

  1.13版本扁平化過后,inTile和inData被合并成inBlockState(值類型:復(fù)合標簽),內(nèi)含兩個NBT標簽:

  Name(字符串)——該方塊的ID

  Propertie(復(fù)合標簽)——該方塊的命名空間

  ——方塊狀態(tài)名稱:值(類型:字符串)

  ......

  crit這個單詞的意思是“暴擊”。在上面的NBT中,crit標簽的值是:

  1b

  說明crit標簽的值類型是Byte字節(jié)型。既然值類型是字節(jié)型,那就說明這個標簽的作用不是確定這支箭暴擊的傷害,而是這支箭是否會造成暴擊。

  所以,這支箭會造成暴擊,因為它的crit值是1。

  crit標簽在1.11版本才被添加,1.11版本前沒有這個標簽,這需要注意一下。

  最后,我們還剩下三個我們還未曾見過的標簽:

  xTile,yTile,zTile

  這三個標簽在上面的NBT中值都為-1,且沒有類型字母,應(yīng)該是Long長整型。并且它們?nèi)雌饋砀鴺擞嘘P(guān),而且坐標的三個值也是長整型......

  首先,我這邊說一點,這三個標簽不是箭共通標簽內(nèi)的,它們還出現(xiàn)在1.11以前的魚竿浮標和火球類實體(如火焰彈,凋零之首)中。至于它們?nèi)惺裁从?,我們以后再了解?p>  現(xiàn)在我們知道箭共通標簽內(nèi)有這些東西:

  damage、shake、inGround、pickup、inTile和inData(inBlockState)、crit,那這就是全部了嗎?

  不,在更新的版本中,還有一些更新的標簽:

  PierceLevel(Byte:字節(jié)型)——中文Wiki介紹是“箭能射穿實體的時間長度”,但這好像并不是這個用途

  ShotFromCrossbow(Byte:字節(jié)型[true|false])(1.14+)——表示這支箭是否來自于一把弩

  SoundEvent——擊中東西時觸發(fā)的聲音事件

  SoundEvent我們先不用管。這個PierceLevel我本人也搞不懂,返回的值一直是0b,這可能是在擊中實體的那一瞬間才可能會變化。剩下的這個,就是ShotFromCrossbow。

  ShotFromCrossbow很簡單,上面都介紹過了,相信只要是看得懂的都能懂吧?

  總之,只要ShotFromCrossbow的值為1b,那么這箭就來自一把弩,0b則來自其他的東東。

  這就是“箭共通標簽”。

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