Cat_Anchor 发表于 2023-9-30 06:48:56

附加包教程:39.NBT

本帖最后由 Cat_Anchor 于 2023-12-2 22:42 编辑




前言



这一期,我们就来简单了解一下NBT。NBT与附加包是两个互相联系的方面,可以实现很多功能。



https://klpbbs.com/static/image/hrline/line5.png


NBT


所谓NBT(Named Binary Tag),命名二进制标签,就是存储在实体、物品和方块实体中的数据。
NBT的存储格式与JSON并不相同,要看懂NBT,首先需要十六进制编辑器来查看文件的十六进制数据;然后需要处理基岩版NBT文件头,理解数字读;接着读出根标签的名称(通常是空的且没有作用),再根据表格找到接下来的数据类型;最后才可以整理出信息。这实在太复杂了,所以我们一般用btr编辑NBT。
虽然btr在1.16.100后似乎已经不能正确显示区块的地形,然后在1.18更新时API升级到30后又不能读取存档了,它仍然是一个很重要的工具。
编辑NBT可以轻松带来很多效果,例如不使用附加包自定义村民交易、物品数据修改(32k之类的)、特殊物品标签(无法损坏物品)、修改方块实体数据和实体数据等等花里胡哨的操作。这也是NBT吸引人的地方,只要勤备份,不要异想天开使游戏崩溃,NBT编辑还是很简单的。

最近,我突然想给我的一个存档导入一张地图画。这种事情也有专门的软件(地图画编辑器,密码是afsz),但问题在于,这个软件只能从编号为1的地图开始生成地图画,而恰好我的那个存档有几张重要的地图,我就没办法了。不过,我突然想到,如果先创建新存档,然后导入地图画,再把地图数据迁移到目标存档,就可以了。这就有了这期教程——地图画的跨存档迁移。
当然,随便找来一个电脑上的工具,如MCCToolChest,就可以完成这个操作,但我想要在手机上完成这个工作,所以这篇教程完全可以用手机实践。



https://klpbbs.com/static/image/hrline/line3.png


教程



首先,创建一个新存档,把这个存档从Android/data/com.mojang.minecraftpe/games/com.mojang/minecraftWorlds/里移动到外部games/com.mojang/minecraftWorlds/里,关掉mc,打开软件,按照提示把地图画导入进新存档里。
然后,不要动这个新存档。打开要导入地图画的目标存档,新建一张地图,把这张地图放在快捷栏里,但是不要拿着(选中)它,保存目标存档,关闭mc,把目标存档从Android/data/com.mojang.minecraftpe/games/com.mojang/minecraftWorlds/里移动到外部games/com.mojang/minecraftWorlds/里,打开btr。
这样,就能在btr中看到这两个存档了。打开原存档,左滑,然后打开单人数据。
https://pic.imgdb.cn/item/64eb2679661c6c8e548c8dbd.jpg
然后打开根标签,打开Inventory,找到生成的地图画并打开(随便打开一个后看Name一项,应该是minecraft:filled_map),打开tag(也就是物品标签)。
https://pic.imgdb.cn/item/64eb27ef661c6c8e548cb968.jpg
复制map_uuid后面那一长串数字,然后退回到地图页面,左滑,点击最下面的按名称打开NBT。把那一串数字粘贴进去,前面加上前缀“map_”,然后点打开。
https://pic.imgdb.cn/item/64eb293e661c6c8e548d1c3a.jpg
这样,你就打开了这张地图的内部地图数据。可以看到一个打着问号的colors标签,长按并复制它。这个复制的内容即使关掉存档并打开另一个存档也有效,只要不重启btr。
https://pic.imgdb.cn/item/64eb29e4661c6c8e548d347a.jpg
现在打开另一个存档,按照之前的步骤找到物品栏中地图的tag,还是复制它的map_uuid,并按照之前的路子打开内部地图数据。长按并删掉它的colors,然后长按根标签下的红色复合标签,选择“作为子标签粘贴”。保存,退出。
现在打开目标存档,千万不要选中放在快捷栏的地图!要直接拿出一个制图台和一片玻璃板,打开制图台,把那张地图放上去,加上玻璃板,锁定地图。地图锁定之后就可以在快捷栏选中,拿起来查看了。这时,原本自然的地形已经变成了你导入的地图画。于是,跨存档迁移地图画成功了。



https://klpbbs.com/static/image/hrline/line2.png


后记



这个导入地图画的方法很简单,就是把记录着地图外观的colors数据复制并覆盖掉原先的临时无用数据。全程适用于手机,从此地图画随便迁移。
这就是NBT的简单运用了,附加包的开发虽然与NBT表面关系不大,但其实二者是联系的,开发附加包也会用到NBT,尤其是结构方面。





第三十八期 第三十九期 第四十期

罒夏灬 发表于 2024-6-29 07:47:10

本帖最后由 罒夏灬 于 2024-6-29 07:48 编辑

您好,我希望您能看完回复解答我的疑惑
​最近我的存档出现异常,掉帧严重且不正常卡顿,严重影响游戏体验,我向论坛上求助时别人告诉我可能是我的存档加删过很多资源包,并说明资源包删不干净
​然后我就想到将原存档的db文件转移至一个同种子的新存档,结果没什么效果
​所以请问,有什么解决办法吗,是否可以用brt解决?还是说这是别的原因?具体详情看我的最新的帖子,我是手机,身边没电脑操作。希望您可以解答我的疑惑,教我处理方式,万分感谢,我可以拿出所有铁粒做为答谢

Cat_Anchor 发表于 2024-2-16 08:58:48

HuaV 发表于 2024-2-15 22:02
是否可以利用NBT来将玩家的生命值,饥饿值,背包物品等复制到另一个存档里,在确保二者兼容的情况下 ...

是的,玩家数据不存储在level.dat中,而是db文件夹中,索引为~local_player。生命值(minecraft:health)和饥饿值(minecraft:player.hunger)等“属性”存储在Attributes中,背包物品在Inventory中,盔甲存储在Armor中。复制这些NBT标签,黏贴并覆盖到目标的玩家数据中,即可把目标玩家的旧数据替换为新数据。

HuaV 发表于 2024-2-15 22:02:31

是否可以利用NBT来将玩家的生命值,饥饿值,背包物品等复制到另一个存档里,在确保二者兼容的情况下
页: [1]
查看完整版本: 附加包教程:39.NBT