前言:本篇文章目标为将服务器低版本存档完美迁移到高版本单机存档,同理单机迁移服务器存档相反操作即可,但最好不要从高版本向低版本迁移。
- 需求:将手中的服务器存档迁移为单人存档,要求保留正确的背包及末影箱的物品。
- 第二需求:升级存档从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服务端,存档结构如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
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模式新建一个世界,进入地狱和末地创建地图后,可以看到结构如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
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的视频教程