(真正深入了解nbt-6)
(注意,本章中指出的中文minecraft wiki错误现已修正)
在前五章,我们仔细地了解了一下nbt的数据类型。现在,我们已经了解得差不多了,那么还剩下什么呢?
nbt的版本
——第三节:nbt的版本
nbt最早在indev版本就出现了,但是当时只有0到10这11个标签可用。
后来,到了minecraf,nbt正式有了第一个格式版本:
minecraft 1.2版本时,notch引入了anvil[.mca]文件格式来存储区块,在此之前存储区块的文件格式为region[.mcr](minecraf时为存储区块引入的)。而随着anvil的引入,nbt的版本正式由升级到了,虽然只是新加入了一个整形数组(int array:[i])。
神奇的是,1.12版本时加入long长整型时并没有更新nbt格式版本号。
nbt的版本就是这样,但它对我们有啥影响呢?
目前,如果我们要编辑nbt文件,我们除了使用java版1.13及之后minecraft内置的snbt和压缩后(gzip压缩)的nbt文件的转换器来编辑nbt文件,还可以使用第三方软件编辑nbt的文件。如果我们使用第三方软件nbt编辑文件的话,nbt的格式版本此时就有些影响了:
nbtedit————windows
nbtexplorer————windows\/mac\/liunx
neinedit————mac
mineback ultimate————windows
nbt2yaml————windowszuqi.org 葡萄小说网
webnbt————浏览器
nbt grammar for synalyze it————mac
如上,每个软件所支持的nbt格式是不同的。只不过,对我们的影响似乎也就这一点。
——第四节:snbt
上面我有提到一个东西:snbt,那么snbt是个什么鬼东西呢?
其实它并不是一个鬼,而且它并不陌生,我们已经见过它很多很多次了。
它的全称就是:string named binary tags(字符串化的二进制命名标签)
似乎这么说来还有点陌生。那么就直白点说吧,snbt就是纯文本形式的nbt,且通常用于指令!我们所见到的所有文本形式的nbt都是snbt!
——第五节:nbt?snbt
我们现在知道了nbt文件它其实是二进制的,且不同于我们平常所见到的snbt。那么,我们该怎样转化nbt和snbt呢?
其实很简单,上面提到mc社区里有许多第三方软件,随便下一个基本上就可以了。
但第三方软件毕竟不是mojang开发的。那么mojang这个官方有开发吗?
答案是肯定的。
java版1.13之后,mc服务端就有自带的数据生成器。这个数据生成器有这么几个功能:
1实现nbt(.nbt)?snbt(.snbt)
2生成原版数据包的全部内容
3生成一个列出了所有方块状态、注册名和完整的原版命令树的json文件
那么我们该如何启动它呢?
很不简单。首先,我们需要一个minecraft 1.13版本及以上的服务端,你可以在mcbbs或者是官方启动器上下载,只不过官方的下载.......你需要一个迅雷。
下载完后,你可以直接粗暴地双击(服务端),你也可以按照作品相关里的教程自己创建一个.bat文件方便打开:
o off
color 0
title a minecraft server
java -xms2g -xmx2g -ja pause
如果你打开不了,那有3种可能:
1.你抄错了上面的指令(方法:细心检查)
2.你未安装java(方法:安装一个java 8)
3.你安了个32位的java(方法:卸了,重新装一个64位的java 8,或把-xms2g -xmx2g调成-xms1g -xmx1g)
(会不会有人打开不了,发现没安java,于是下了个32位的java 10,只不过不是脱机的,然后嫌下载慢随便在网上找了一个。结果java安好了,捆绑软件也一大堆,浏览器主页还被改了。再次打开仍然打开不了,于是删了java 10,去下了个64位的java 10,这次聪明用脱机。结果发现系统是32位,不知道怎么弄,弄来弄去还差点把windows换成了mac。最后重新买了一台装了64位的windows系统电脑,花了998$。安了64bit java 10,再次打开,发现还是打开不了。然后才了解到mc是java8的,于是下了java 8 64bit脱机,结果仍然打不开。最后终于发现原来打成了:
o off
color 0
title a minecraft server
java -xms2g -xmx2g -jar server pause)
回到正题。
按照作品相关里的教程,我们配置好服务器后(实际上不用配置也可以),这样子做:
首先,打开命令提示符(windows)或终端(mac)
打开方法这里就不多叙述了。
然后复制这一串代码:
java -c
复制粘贴进去不要立刻执行,因为这毛用都没有,还会显示:
(windows)
错误:找不到或无法加载主类.
(mac)
错误:找不到或无法加载主类.
原因: :.
那么该怎么办呢?
其实很简单,你直接输入进去这系统压根就找不到这个文件,所以,这里你就要这样子:
打开你的所在的文件位置,然后直接把整个文件拖进去,你就会发现系统自动给你输入了的路径。
现在好了,你只需要用这段路径替换原来的,比如你的路径是:
d:\\minecraft\\minecraft server\\1.13.2\\我的世界1.13.2官方服务端.jar(windows)
\/users\/block\/desktop\/桌面文件\/server\/(mac)
那么你替换之后,就会变成这个样子:
java -cp d:\\minecraft\\minecraft server\\1.13.2\\我的世界1.13.2官方服务端.jar.(windows)
java -cp \/users\/block\/desktop\/桌面文件\/server\/(mac)
现在,执行,你就成功——走出了第一步。系统找到了这个,并执行了指令,只要你这个是1.13版本及以上的,那么就会跳出:
option description
-----------------
--all include all generators
--client include client generators
--dev include development tools
--help show the help menu
--inputstring input folder
--outputstring output folder (default: generated)
--reports include data reports
--server include server generators
这是啥意思呢?我们把这一大串放到生草机里去搅拌一下,就会得到:
选项说明
-----------------
--全部
包括所有发电机
--客户
包括客户端生成器
--开发
包括开发工具
--救命
显示帮助菜单
--输入
输入文件夹
--输出
输出文件夹(默认:生成)
--报告
包括数据报告
--服务器
包括服务器生成器
差不多可以看出一些端倪,只不过这仍然太生草了。所以我们需要上一下minecraft wiki,得出这些东西的具体用途是:
--all 生成原版数据包
--client 生成assets\/minecraft文件夹,包含blockstates和models文件夹
--dev 用于nbt文件和snbt文件的相互转换[需要验证]
--help 显示选项和描述列表
--input 输入含有nbt或snbt文件的文件夹
--output 规定输出的目标文件夹,若目标文件夹不存在则自动新建该文件夹(默认为generated)
--reports 生成reports文件夹,包含biomes文件夹和blocks、mands、registries三个json文件
--server 生成data\/minecraft文件夹,包含advancements、loot_tables、recipes、tags四个文件夹
--validate [需要更多信息]
现在我们可以尝试生成一个原版的数据包,这就需要在控制台上输入:
java -cp d:\\minecraft\\minecraft server\\1.13.2\\我的世界1.13.2官方服务端.jar. --all(没错,只需要在原本的后面加上你要执行的指令就可以了),回车运行。
然后你就会发现出现了一大串的信息。
接着,到目录去查看......
反正作者这边什么东西也没有生成。minecraft wiki上还写着:
原版数据包(文件除外)将生成在当前文件夹的generated目录中。
难不成是打开方式不对?
来试试其他的功能吧,比如这个--help,看一下会有什么帮助:
java -cp d:\\minecraft\\minecraft server\\1.13.2\\我的世界1.13.2官方服务端.jar. --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
就很离谱。
对了,我们最开始不是要转换文件的吗?咋弄成这个了?
好,那现在我们就开始尝试一下--dev:
java -cp d:\\minecraft\\minecraft server\\1.13.2\\我的世界1.13.2官方服务端.jar. --dev --input“d:\\minecraft\\minecraft server\\1.13.2\\world“
然后......
实际上这是一个错误的做法。正确的做法应该这样子:
在服务端这个目录创建一个新的文件夹(实际上也不用创建,创建只是为了更好的把要转换的文件集中起来),并将其取名为:input
然后,找到实际上是以nbt存储的.dat的文件(比如world下的),将它们丢进去。
接下来,改这些文件的后缀.dat为.nbt。
最后,最重要的一点,执行:
java -cp d:\\minecraft\\minecraft server\\1.13.2\\我的世界1.13.2官方服务端.jar. --dev --input “d:\\minecraft\\minecraft server\\1.13.2\\input“
(注意,空格一定要空,作者最开始时就是少了一个空格,然后就是一堆问题!特别是--input和后面的文件夹路径中间一定要空!这是个坑!)
然后,当出现:
[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)
找到这个目录,你就会发现了自己期待已久的:
.snbt!
这个文件你现在可以用记事本来打开并修改了。
但现在问题又来了,我们现在可以使用dev来进行.nbt→.snbt,那该怎么.nbt←.snbt呢?
很简单。我们把刚才弄出来的.snbt文件再放进input文件夹,顺便删掉那个.nbt。再度执行:
java -cp d:\\minecraft\\minecraft server\\1.13.2\\我的世界1.13.2官方服务端.jar. --dev --input “d:\\minecraft\\minecraft server\\1.13.2\\input“
然后你就会发现这不行。
为啥呢?minecraft wiki上说:
用于nbt文件和snbt文件的相互转换[需要验证]
很明显这里错了,--dev只能是.nbt→.snbt,并不能.nbt←.snbt。
那该怎么办呢?
使用--client:
java -cp d:\\minecraft\\minecraft server\\1.13.2\\我的世界1.13.2官方服务端.jar. --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。现在你打开generated,你就会发现.snbt重新被转换成了.nbt。
现在我们知道了--dev是.nbt→.snbt,--client是.nbt←.snbt,也发现了minecraft wiki中的错误。剩下的内容,我们就以后再研究了,毕竟剩下的不是本章的重点。
ok那么nbt就讲到这了。我们下一章再见。