第一百四十章 真正深入了解NBT-6
?。ㄕ嬲钊肓私釴BT-6)
(注意,本章中指出的中文Minecraft Wiki錯誤現(xiàn)已修正)
在前五章,我們仔細地了解了一下NBT的數(shù)據類型?,F(xiàn)在,我們已經了解得差不多了,那么還剩下什么呢?
NBT的版本
——第三節(jié):NBT的版本
NBT最早在Indev版本就出現(xiàn)了,但是當時只有0到10這11個標簽可用。
后來,到了Minecraft Beta1.3,NBT正式有了第一個格式版本:19132
Minecraft 1.2版本時,Notch引入了Anvil[.mca]文件格式來存儲區(qū)塊,在此之前存儲區(qū)塊的文件格式為Region[.mcr](Minecraft Beta1.3時為存儲區(qū)塊引入的)。而隨著Anvil的引入,NBT的版本正式由19132升級到了19133,雖然只是新加入了一個整形數(shù)組(Int Array:[I])。
神奇的是,1.12版本時加入Long長整型時并沒有更新NBT格式版本號。
NBT的版本就是這樣,但它對我們有啥影響呢?
目前,如果我們要編輯NBT文件,我們除了使用Java版1.13及之后Minecraft內置的SNBT和壓縮后(GZIP壓縮)的NBT文件的轉換器來編輯NBT文件,還可以使用第三方軟件編輯NBT的文件。如果我們使用第三方軟件NBT編輯文件的話,NBT的格式版本此時就有些影響了:
NBTEdit——19132——Windows
NBTExplorer——19133——Windows/Mac/Liunx
NEINedit——19132——Mac
MineBack Ultimate——19133——Windows
NBT2YAML——19133——Windows
webNBT——19133——瀏覽器
NBT grammar for Synalyze It——19132——Mac
如上,每個軟件所支持的NBT格式是不同的。只不過,對我們的影響似乎也就這一點。
——第四節(jié):SNBT
上面我有提到一個東西:SNBT,那么SNBT是個什么鬼東西呢?
其實它并不是一個鬼,而且它并不陌生,我們已經見過它很多很多次了。
它的全稱就是:String Named Binary Tags(字符串化的二進制命名標簽)
似乎這么說來還有點陌生。那么就直白點說吧,SNBT就是純文本形式的NBT,且通常用于指令!我們所見到的所有文本形式的NBT都是SNBT!
——第五節(jié):NBT?SNBT
我們現(xiàn)在知道了NBT文件它其實是二進制的,且不同于我們平常所見到的SNBT。那么,我們該怎樣轉化NBT和SNBT呢?
其實很簡單,上面提到MC社區(qū)里有許多第三方軟件,隨便下一個基本上就可以了。
但第三方軟件畢竟不是Mojang開發(fā)的。那么Mojang這個官方有開發(fā)嗎?
答案是肯定的。
Java版1.13之后,MC服務端就有自帶的數(shù)據生成器。這個數(shù)據生成器有這么幾個功能:
①實現(xiàn)NBT(.nbt)?SNBT(.snbt)
?、谏稍鏀?shù)據包的全部內容
③生成一個列出了所有方塊狀態(tài)、注冊名和完整的原版命令樹的JSON文件
那么我們該如何啟動它呢?
很不簡單。首先,我們需要一個Minecraft 1.13版本及以上的服務端,你可以在MCBBS或者是官方啟動器上下載,只不過官方的下載.......你需要一個迅雷。
下載完后,你可以直接粗暴地雙擊server.jar(服務端),你也可以按照作品相關里的教程自己創(chuàng)建一個.bat文件方便打開:
@echo off
color 0
title A Minecraft Server
java -Xms2g -Xmx2g -jar server.jar pause
如果你打開不了,那有3種可能:
1.你抄錯了上面的指令(方法:細心檢查)
2.你未安裝JAVA(方法:安裝一個JAVA 8)
3.你安了個32位的JAVA(方法:卸了,重新裝一個64位的JAVA 8,或把-Xms2g -Xmx2g調成-Xms1g -Xmx1g)
?。〞粫腥舜蜷_不了,發(fā)現(xiàn)沒安JAVA,于是下了個32位的JAVA 10,只不過不是脫機的,然后嫌下載慢隨便在網上找了一個。結果JAVA安好了,捆綁軟件也一大堆,瀏覽器主頁還被改了。再次打開仍然打開不了,于是刪了Java 10,去下了個64位的Java 10,這次聰明用脫機。結果發(fā)現(xiàn)系統(tǒng)是32位,不知道怎么弄,弄來弄去還差點把Windows換成了Mac。最后重新買了一臺裝了64位的Windows系統(tǒng)電腦,花了998$。安了64bit JAVA 10,再次打開,發(fā)現(xiàn)還是打開不了。然后才了解到MC是JAVA8的,于是下了Java 8 64bit脫機,結果仍然打不開。最后終于發(fā)現(xiàn)原來打成了:
@echo off
color 0
title A Minecraft Server
java -Xms2g -Xmx2g -jar server pause)
回到正題。
按照作品相關里的教程,我們配置好服務器后(實際上不用配置也可以),這樣子做:
首先,打開命令提示符(Windows)或終端(Mac)
打開方法這里就不多敘述了。
然后復制這一串代碼:
java -cp server.jar net.minecraft.data.Main
復制粘貼進去不要立刻執(zhí)行,因為這毛用都沒有,還會顯示:
(Windows)
錯誤:找不到或無法加載主類 net.minecraft.data.Main
?。∕ac)
錯誤:找不到或無法加載主類 net.minecraft.data.Main
原因: java.lang.ClassNotFoundException: net.minecraft.data.Main
那么該怎么辦呢?
其實很簡單,你直接輸入進去這系統(tǒng)壓根就找不到server.jar這個文件,所以,這里你就要這樣子:
打開你的server.jar所在的文件位置,然后直接把整個server.jar文件拖進去,你就會發(fā)現(xiàn)系統(tǒng)自動給你輸入了server.jar的路徑。
現(xiàn)在好了,你只需要用這段路徑替換原來的server.jar,比如你的server.jar路徑是:
D:\Minecraft\Minecraft Server\1.13.2\我的世界1.13.2官方服務端.jar(Windows)
/Users/block/Desktop/桌面文件/Server/server.jar(Mac)
那么你替換之后,就會變成這個樣子:
java -cp D:\Minecraft\Minecraft Server\1.13.2\我的世界1.13.2官方服務端.jar net.minecraft.data.Main(Windows)
java -cp /Users/block/Desktop/桌面文件/Server/server.jar net.minecraft.data.Main(Mac)
現(xiàn)在,執(zhí)行,你就成功——走出了第一步。系統(tǒng)找到了這個server.jar,并執(zhí)行了指令,只要你這個server.jar是1.13版本及以上的,那么就會跳出:
Option Description
-----------------
--all Include all generators
--client Include client generators
--dev Include development tools
--help Show the help menu
--input<String> Input folder
--output<String> Output folder (default: generated)
--reports Include data reports
--server Include server generators
這是啥意思呢?我們把這一大串放到生草機里去攪拌一下,就會得到:
選項說明
-----------------
--全部
包括所有發(fā)電機
--客戶
包括客戶端生成器
--開發(fā)
包括開發(fā)工具
--救命
顯示幫助菜單
--輸入
輸入文件夾
--輸出
輸出文件夾(默認:生成)
--報告
包括數(shù)據報告
--服務器
包括服務器生成器
差不多可以看出一些端倪,只不過這仍然太生草了。所以我們需要上一下Minecraft Wiki,得出這些東西的具體用途是:
--all 生成原版數(shù)據包
--client 生成assets/minecraft文件夾,包含blockstates和models文件夾
--dev 用于NBT文件和SNBT文件的相互轉換[需要驗證]
--help 顯示選項和描述列表
--input 輸入含有nbt或snbt文件的文件夾
--output 規(guī)定輸出的目標文件夾,若目標文件夾不存在則自動新建該文件夾(默認為generated)
--reports 生成reports文件夾,包含biomes文件夾和blocks、commands、registries三個JSON文件
--server 生成data/minecraft文件夾,包含advancements、loot_tables、recipes、tags四個文件夾
--validate [需要更多信息]
現(xiàn)在我們可以嘗試生成一個原版的數(shù)據包,這就需要在控制臺上輸入:
java -cp D:\Minecraft\Minecraft Server\1.13.2\我的世界1.13.2官方服務端.jar net.minecraft.data.Main --all(沒錯,只需要在原本的后面加上你要執(zhí)行的指令就可以了),回車運行。
然后你就會發(fā)現(xiàn)出現(xiàn)了一大串的信息。
接著,到目錄去查看......
反正作者這邊什么東西也沒有生成。Minecraft Wiki上還寫著:
原版數(shù)據包(pack.mcmeta文件除外)將生成在當前文件夾的generated目錄中。
難不成是打開方式不對?
來試試其他的功能吧,比如這個--help,看一下會有什么幫助:
java -cp D:\Minecraft\Minecraft Server\1.13.2\我的世界1.13.2官方服務端.jar net.minecraft.data.Main --help
結果......還是這個界面:
Option Description
-----------------
--all Include all generators
--client Include client generators
--dev Include development tools
--help Show the help menu
--input Input folder
--output Output folder (default: generated)
--reports Include data reports
--server Include server generators
就很離譜。
對了,我們最開始不是要轉換文件的嗎?咋弄成這個了?
好,那現(xiàn)在我們就開始嘗試一下--dev:
java -cp D:\Minecraft\Minecraft Server\1.13.2\我的世界1.13.2官方服務端.jar net.minecraft.data.Main --dev --input“D:\Minecraft\Minecraft Server\1.13.2\world“
然后......
實際上這是一個錯誤的做法。正確的做法應該這樣子:
在服務端這個目錄創(chuàng)建一個新的文件夾(實際上也不用創(chuàng)建,創(chuàng)建只是為了更好的把要轉換的文件集中起來),并將其取名為:input
然后,找到實際上是以NBT存儲的.dat的文件(比如world下的level.dat),將它們丟進去。
接下來,改這些文件的后綴.dat為.nbt。
最后,最重要的一點,執(zhí)行:
java -cp D:\Minecraft\Minecraft Server\1.13.2\我的世界1.13.2官方服務端.jar net.minecraft.data.Main --dev --input “D:\Minecraft\Minecraft Server\1.13.2\input“
?。ㄗ⒁?,空格一定要空,作者最開始時就是少了一個空格,然后就是一堆問題!特別是--input和后面的文件夾路徑中間一定要空!這是個坑?。?p> 然后,當出現(xiàn):
[xx:xx:xx][main/INFO]: Starting provider: NBT to SNBT
[xx:xx:xx][main/INFO]: Converted level from NBT to SNBT
[xx:xx:xx][main/INFO]: NBT to SNBT finished after xxx ms
恭喜你!你成功了!
但轉換后的文件去哪了呢?
答案很簡單:
C:\Users\XXXXX\generated(Windows)
/Users/XXXXXX/generated(Mac)
找到這個目錄,你就會發(fā)現(xiàn)了自己期待已久的:
.snbt!
這個文件你現(xiàn)在可以用記事本來打開并修改了。
但現(xiàn)在問題又來了,我們現(xiàn)在可以使用dev來進行.nbt→.snbt,那該怎么.nbt←.snbt呢?
很簡單。我們把剛才弄出來的.snbt文件再放進input文件夾,順便刪掉那個.nbt。再度執(zhí)行:
java -cp D:\Minecraft\Minecraft Server\1.13.2\我的世界1.13.2官方服務端.jar net.minecraft.data.Main --dev --input “D:\Minecraft\Minecraft Server\1.13.2\input“
然后你就會發(fā)現(xiàn)這不行。
為啥呢?Minecraft Wiki上說:
用于NBT文件和SNBT文件的相互轉換[需要驗證]
很明顯這里錯了,--dev只能是.nbt→.snbt,并不能.nbt←.snbt。
那該怎么辦呢?
使用--client:
java -cp D:\Minecraft\Minecraft Server\1.13.2\我的世界1.13.2官方服務端.jar net.minecraft.data.Main --client --input “D:\Minecraft\Minecraft Server\1.13.2\input“
然后:
[xx:xx:xx][main/INFO]: Starting provider: SNBT -> NBT
[xx:xx:xx][main/INFO]: SNBT -> NBT finished after xxx ms
Minecraft Wiki上這樣介紹--client:
生成assets/minecraft文件夾,包含blockstates和models文件夾
很明顯這句話完全錯誤(來自2021-8-5的注:實際上并不是完全錯誤,確實有這功能,只不過還附帶了.nbt←.snbt的功能)。實際上,--client的作用就是.nbt←.snbt?,F(xiàn)在你打開generated,你就會發(fā)現(xiàn).snbt重新被轉換成了.nbt。
現(xiàn)在我們知道了--dev是.nbt→.snbt,--client是.nbt←.snbt,也發(fā)現(xiàn)了Minecraft Wiki中的錯誤。剩下的內容,我們就以后再研究了,畢竟剩下的不是本章的重點。
OK那么NBT就講到這了。我們下一章再見。