第一百四十三章/entitydata-修改實(shí)體的NBT
我們目前已經(jīng)了解了許多NBT標(biāo)簽,也知道了使用/summon生成一個(gè)自定義實(shí)體的正確方式。但我們還不知道一點(diǎn):
該如何修改一個(gè)現(xiàn)成實(shí)體的NBT呢?比如這只粉紅色的羊?
在基巖版,你可以使用blocktopograph等存檔修改器。而在JAVA版,你除了使用修改器,還可以使用專門的指令:
/data
但/data這個(gè)指令是JAVA 1.13扁平化時(shí)扁平出來(lái)的。在JAVA1.13-1.8版本,還有一個(gè)更簡(jiǎn)單的指令:
/entitydata
相信大家看了這么多章之后,應(yīng)該都知道entity是實(shí)體的意思吧?而data的意思相信弄過(guò)計(jì)算機(jī)的人都知道,是“數(shù)據(jù)”的意思。
這下子我們就知道entitydata的意思了:實(shí)體數(shù)據(jù)。
意思知道了,那么我們?cè)撊绾问褂盟兀?p> 正如上文所說(shuō),很簡(jiǎn)單。這條指令,只有兩個(gè)參數(shù):
/entitydata <實(shí)體:目標(biāo)選擇器><要添加或覆蓋的數(shù)據(jù)標(biāo)簽>
目標(biāo)選擇器就不用說(shuō)了,我們只需要看看“要添加或覆蓋的數(shù)據(jù)標(biāo)簽”是什么東西就行了。
舉個(gè)最簡(jiǎn)單的例子:
/entitydata @e[type=!player]{Health:0}
執(zhí)行該指令,游戲?qū)?huì)給除玩家以外的其他實(shí)體添加一個(gè){Health:0}的標(biāo)簽,如果添加的對(duì)象已經(jīng)有了這個(gè)標(biāo)簽,將會(huì)覆蓋這個(gè)標(biāo)簽(同時(shí)聊天框會(huì)出現(xiàn)一大串的信息——實(shí)體數(shù)據(jù)已更新:{XXXXXXXXX:XXXX}.....。這條信息可以用來(lái)查看某個(gè)實(shí)體的NBT標(biāo)簽,但當(dāng)游戲規(guī)則sendCommandFeedback為false時(shí)并不會(huì)顯示。)。比如你在執(zhí)行指令前放了一個(gè)礦車,執(zhí)行指令后礦車什么事情都不會(huì)發(fā)生,只不過(guò)NBT多了一個(gè)沒(méi)用的{Health:0}而已。但如果你旁邊有只羊,執(zhí)行指令后這支羊?qū)?huì)死亡,因?yàn)樗腍ealth被覆蓋為0,因此游戲判定它死亡了。
這條指令的效果相當(dāng)于/kill @e[type=!player]。但與/kill不同的是,只有該指令選中的生物才會(huì)死亡,其他被選中的實(shí)體則不會(huì)受到影響,因?yàn)橹挥猩锊庞蠬ealth值且會(huì)識(shí)別它。
這就說(shuō)明了什么?/kill并不能精確選中生物并殺死,但/entitydata卻可以。
是不是很簡(jiǎn)單?
但問(wèn)題就來(lái)了。
使用剛才的指令后,這個(gè)礦車的NBT就變成了:
{Motion:[0.0d,-0.0d,0.0d],UUIDLeast:-8716891284400396587L,Health:0,Invulnerable:0b,Air:300s,OnGround:0b,Dimension:0,PortalCooldown:0,Rotatlon:[0.0f,0.0f],F(xiàn)allDistance:0.0f,UUidMost:2808881208012130674L,Pos:[-30.5d,4.0625d,-1131.5d],F(xiàn)ire:-1s}
可以發(fā)現(xiàn)Health標(biāo)簽被添加到了第一層,生物的Health標(biāo)簽也在第一層。但如果我們需要替換的標(biāo)簽在第二層甚至是第三四層,該怎么辦?
假設(shè)這里有一個(gè)id是Genshin_Impact的實(shí)體,其NBT是:
{id:“Genshin_Impact“,UUIDMost:2770949638773555276L,UUIDLeast:-9199275516466379440L,Motion:[0.0d,-0.0d,0.0d],Pos:[72.25d,65.7265d,271.5d],Physcal_Power:20,Physcal_Power_Max:205,Sex:1,Health:15782,Health_Max:17817,Role_Id:“Barbatos“,Equipment:[{id:“Chicken_Mushroom_Skewer“,value:15}]}
現(xiàn)在,我們要把Equipment中的id標(biāo)簽的值從Chicken_Mushroom_Skewer改為Adeptus_Temptation,該怎么做?
或許有人會(huì)這樣做:
/entitydata @e[type=Genshin_Impact]{id:“Adeptus_Temptation“}
但其實(shí)這是錯(cuò)誤的,這只能把該實(shí)體從Genshin_Impact變成Adeptus_Temptation。因?yàn)槟氵@只寫了一層,而真正你要改的id標(biāo)簽在Equipment這個(gè)標(biāo)簽中。所以你要:
/entitydata @e[type=Genshin_Impact]{Equipment:[{id:“Adeptus_Temptation“]}}
這樣子,游戲才會(huì)正確的找到你要修改的id標(biāo)簽,然后將其值改為Adeptus_Temptation。
所以,“要添加或覆蓋的數(shù)據(jù)標(biāo)簽”就是填你要修改的標(biāo)簽的NBT路徑+標(biāo)簽,就像是文件的路徑。“要添加或覆蓋的數(shù)據(jù)標(biāo)簽”值的最外層“{}”就相當(dāng)于根目錄,對(duì)應(yīng)目標(biāo)實(shí)體NBT最外面那一層“{}”。
現(xiàn)在懂了吧?
但本章還未結(jié)束?;蛟S有人會(huì)有這么個(gè)疑問(wèn):
為什么只有“添加和覆蓋”而沒(méi)有“刪除”呢?
答案很簡(jiǎn)單,NBT標(biāo)簽不支持刪除,所以你給礦車添加的那一個(gè)沒(méi)有意義的Health標(biāo)簽就永遠(yuǎn)刪不掉了——除非你打掉礦車。
使用/entitydata來(lái)添加或修改數(shù)據(jù)標(biāo)簽還有一個(gè)規(guī)則:如果修改的數(shù)據(jù)標(biāo)簽值類型為字符串,那么這個(gè)字符串里面不能空空如也。
這就是/entitydata的全部?jī)?nèi)容了。