前言:本篇文章目标为将服务器低版本存档完美迁移到高版本单机存档,同理单机迁移服务器存档相反操作即可,但最好不要从高版本向低版本迁移。
- 需求:将手中的服务器存档迁移为单人存档,要求保留正确的背包及末影箱的物品。
- 第二需求:升级存档从1.12.2至1.19.4,删除合适的区块,使新版本地形得以生成
- 所用工具:NbtStudio(数据编辑工具)、 MCA Selector(区块域块编辑工具)
迁移前的准备及了解 #
首先了解一下数据保存结构:
本段内容参考: [Mcbbs] 玩家背包的数据在哪里 和 [WiKi]了解player.dat格式
很显然,Wiki告诉我们,一个世界(存档)中和玩家相关的数据储存在 level.dat
(.dat 格式)这个文件里面,但仅限单人模式,多人游戏时(服务器)中各个玩家的数据是储存在 playerdata文件夹中的<uuid>.dat
(不同的uuid对应不同的玩家)。
不过据我观察,即使是在单人模式,/playerdata/<uuid>.dat
也会储存玩家自己的数据,并且这里的数据和level.dat
中的Player(类型为复合标签)一致,但单人模式下仅修改/playerdata/<uuid>.dat
而不修改level.dat
不会影响玩家数据,因此得知单人模式以level.dat
为主。
因此我们只需要:
- 找到服务器内名为"Ling_Yun67"的玩家数据
- 将其的背包数据与末影箱数据复制
- 将其粘贴到单人存档内
但经过实测,1.12.2与1.19.4的数据保存格式不同,若直接进行数据修改,会导致物品bug(附魔失效,潜影盒物品丢失)
因此展开来讲,结合我们的两项需求,我们具体需要:
- 将服务器存档进行合适的修改,使其可以正常的在单人模式加载
- 在1.12.2版本下找到目标数据,复制到1.12.2的单人存档数据内
- 删除游玩区域附近不需要的区块
- 在1.19.4版本直接打开,生成1.19.4新地形,并且自动升级.dat数据
将服务器存档结构修改以适配单人模式 #
本步骤分两部分完成
存档结构了解 #
本人希望迁移的存档为1.12.2版本bukkit服务端,存档结构如下:
D:.
├─world
│ │ level.dat //单人模式下会加载的存档数据,服务器模式应该是op的数据?
│ │ level.dat_old
│ │ session.lock
│ │ uid.dat
│ │
│ ├─advancements
│ │ 00c71676-1488-48bb-9881-ae863cd73b83.json
│ │ 00dcb825-d242-47b8-b156-9048f8eb5fe8.json
│ │ ......所有玩家.json......
│ │ ffa724e9-373f-4a1a-a483-ced7f251e640.json
│ │ ffad1cef-e7f4-478e-a070-5cbb501aabfc.json
│ │
│ ├─data
│ │ │ idcounts.dat
│ │ │ Mansion.dat
│ │ │ map_0.dat
│ │ │ map_1.dat
│ │ │ map_10.dat
│ │ │ .......
│ │ │
│ │ ├─advancements
│ │ └─functions
│ ├─playerdata //玩家背包数据在这里
│ │ 00c1983f-80e4-4a88-b6f0-8632629aa9e5.dat
│ │ 00c71676-1488-48bb-9881-ae863cd73b83.dat
│ │ ......所有玩家数据.dat......
│ │ ffa724e9-373f-4a1a-a483-ced7f251e640.dat
│ │ ffad1cef-e7f4-478e-a070-5cbb501aabfc.dat
│ │
│ ├─region //主世界所有方块数据
│ │ r.-1.-1.mca
│ │ r.-1.-10.mca
│ │ ......所有域块数据......
│ │ r.9.8.mca
│ │ r.9.9.mca
│ │
│ └─stats
│ 00c1983f-80e4-4a88-b6f0-8632629aa9e5.json
│ 00c71676-1488-48bb-9881-ae863cd73b83.json
│ ......这个大概也是所有玩家的数据......
│ ffa724e9-373f-4a1a-a483-ced7f251e640.json
│ ffad1cef-e7f4-478e-a070-5cbb501aabfc.json
│
├─world_nether
│ │ level.dat
│ │ level.dat_old
│ │ session.lock
│ │ uid.dat
│ │
│ ├─data
│ │ │ Fortress.dat
│ │ │ villages_nether.dat
│ │ │
│ │ └─functions
│ ├─DIM-1
│ │ └─region //地狱所有方块数据
│ │ r.-1.-1.mca
│ │ r.-1.-10.mca
│ │ ......所有域块数据......
│ │ r.9.8.mca
│ │ r.9.9.mca
│ │
│ └─playerdata
│ 这里空的
└─world_the_end
│ level.dat
│ level.dat_old
│ session.lock
│ uid.dat
│
├─data
│ │ EndCity.dat
│ │ villages_end.dat
│ │
│ └─functions
├─DIM1
│ └─region //末地所有方块数据
│ r.-1.-1.mca
│ r.-1.-10.mca
│ ......所有域块数据......
│ r.9.8.mca
│ r.9.9.mca
│
└─playerdata
这里也是空的
在1.12.2模式新建一个世界,进入地狱和末地创建地图后,可以看到结构如下:
C:.
│ icon.png
│ level.dat
│ level.dat_old
│ session.lock
│
├─advancements
│ 55d7fbc5-d038-413b-8446-d9e66ccfb206.json
│
├─data
│ │ Fortress.dat
│ │ Temple.dat
│ │ Village.dat
│ │ villages.dat
│ │ villages_end.dat
│ │ villages_nether.dat
│ │
│ ├─advancements
│ └─functions
├─DIM-1
│ └─region
│ r.-1.-1.mca
│ r.-1.0.mca
│ r.0.-1.mca
│ r.0.0.mca
│
├─DIM1
│ └─region
│ r.-1.-1.mca
│ r.-1.0.mca
│ r.0.-1.mca
│ r.0.0.mca
│
├─playerdata
│ 55d7fbc5-d038-413b-8446-d9e66ccfb206.dat
│
├─region
│ r.-1.0.mca
│ r.0.0.mca
│
└─stats
55d7fbc5-d038-413b-8446-d9e66ccfb206.json
实操 #
打开单人存档,打开playerdata,里面会有一到两个文件,文件的名字是一样的,后缀不一样,大概长这样:099261a8-503b-39d4-9616-f7782702095c.dat
,将文件名找个地方记下来。
打开单人存档,将根目录的level.dat
复制到一个你不会搞混的地方,比如桌面
现在同时打开服务器存档的World文件夹,可以看到文件结构相当相似,为了保证准确我们将单人存档内的如下文件全部删除,直接将服务器的world文件夹内的所有文件复制到单人存档下
现在打开单人存档的DIM1和DIM-1文件夹,删除里面的所有文件,将world_nether内,注意是內部的所有文件复制到DIM-1,将world_the_end内,注意是內部的所有文件复制到DIM1,其实就是改了个名字,从world_nether改到DIM-1,从world_the_end改到DIM1。
打开单人存档的DIM-1与DIM1,可以看到有这么一个文件夹,将其拿出来
DIM-1代表地狱,DIM1是末地,两个文件夹都要操作
至此服务器存档的三个世界数据已经迁移完毕。
找到目标玩家数据并迁移到单人模式 #
在bukkit服务端中,根目录\world\playerdata
存放着玩家数据,玩家数据是一串不知道什么玩意的字符,这个字符并不是随机的,并且与是否打开了正版验证有关。
举例:当我在启动器登录正版后进入一个新的游戏,为我生成的文件是:55d7fbc5-d038-413b-8446-d9e66ccfb206.dat
,事实上,这就是我的正版UUID。
刚刚提到过,无论是服务器还是单人模式,都会生成一个UUID.dat文件,在正版验证下若玩家改名,不会导致存档丢失,仅以UUID判断玩家。
我之前在服务器使用的ID是Ling_Yun67,到现在改为Yun67后完全没有受到影响。
- 当我用盗版模式使用ID:Ling_Yun67,生成的文件是:
82a86d15-1ee6-3b3d-9026-7306445dc40f.dat
- 当我用盗版模式使用ID:Yun67,生成的文件是:
099261a8-503b-39d4-9616-f7782702095c.dat
- 当我用固定的账号正版验证使用任意ID,生成的文件都是:
55d7fbc5-d038-413b-8446-d9e66ccfb206.dat
因此如果想在服务器的存档里找到自己的数据,刚刚在单人存档新建的1.12.2的存档的时候生成的.dat文件的名字,也就是你记下的文件名去掉.dat的后缀就是你的uuid。
然后直接在服务器存档\world\playerdata内搜索你的数据,将你的数据复制到一个不会被你搞混的地方,比如桌面。
如果是正版验证,可以在 namemc.com搜索自己现在的id,即可获得uuid。
还记得在刚刚你还把一个level.dat
文件也复制出来了么?完成上述两个大步骤,你现在应该已经拥有:
- 在一个不会被干扰的文件夹拥有一个
level.dat
文件,这个文件来自1.12.2单人模式,刚创建,很新鲜。 - 一个UUID.dat文件,里面保存着你想要迁移的数据。这个文件来自服务器存档。
下载这个可以修改 .dat 格式的文件的编辑器(从1.7到1.20都可以) [全版本]NBT Studio 汉化版 —— 更加现代化的 NBT 编辑工具
现在同时选中这两个文件,直接拖进NBT编辑工具。
下面的步骤中你可以使用查找工具,相当好用。
找到UUID.dat/Inventory
,选中复制其中所有的数据
找到level.dat/Data/Player/Inventory
,先删除其中所有的数据
选中Inventory后粘贴,即可将背包数据迁移。
再找到UUID.dat/EnderItems
,复制其中所有的数据,与刚刚类似,找到level.dat/Data/Player/EnderItems
,删除其中的数据后粘贴新数据即可完成末影箱的数据迁移。
再找到UUID.dat/Pos
,复制其中所有的数据,与刚刚类似,找到level.dat/Data/Player/Pos
,删除其中的数据后粘贴新数据即可完成人物坐标的更改。
如果还想继续更改其他数据如剩余血量、当前经验值、身上的状态效果,请参照 [WiKi]了解player.dat格式
第二个大步骤完成了!你现在已经:
- 完成了三大世界的迁移
- 完成了背包与末影箱的物品迁移
- 完成了其他状态迁移
直接在高版本打开低版本存档时,会自动将低版本的附魔信息等数据升级
删除不需要的区块,保证新地形生成 #
下面是最后一步了,如果你不打算在高版本打开该存档,没必要进行此步骤!
此步骤为的是保证新版本地形及特性能够正常生成。
请直接观看XeKr的视频教程