本帖最后由 哔哔_哩哩 于 2023-5-19 22:23 编辑
前言:本篇文章目标为将服务器低版本存档完美迁移到高版本单机存档,同理单机迁移服务器存档相反操作即可,但最好不要从高版本向低版本迁移。标题注明的【1.12.2-1.20】仅为本人测试版本,不清楚更低的版本是否可用,理论上是没问题的。
需求:将手中的服务器存档迁移为单人存档,要求保留正确的背包及末影箱的物品。 第二需求:升级存档从1.12.2至1.19.4,删除合适的区块,使新版本地形得以生成 所用工具:NbtStudio(数据编辑工具)、 MCA Selector(区块域块编辑工具)
迁移前的准备及了解
首先了解一下数据保存结构:
很显然,Wiki告诉我们,一个世界(存档)中和玩家相关的数据储存在 level.dat(.dat 格式)这个文件里面,但仅限单人模式,多人游戏时(服务器)中各个玩家的数据是储存在 playerdata文件夹中的<uuid>.dat (不同的uuid对应不同的玩家)。
不过据我观察,即使是在单人模式,/playerdata/<uuid>.dat也会储存玩家自己的数据,并且这里的数据和level.dat中的Player(类型为复合标签)一致,但单人模式下仅修改/playerdata/<uuid>.dat而不修改level.dat不会影响玩家数据,因此得知单人模式以level.dat为主。 因此我们只需要:
但经过实测,1.12.2与1.19.4的数据保存格式不同,若直接进行数据修改,会导致物品bug(附魔失效,潜影盒物品丢失) 因此展开来讲,结合我们的两项需求,我们具体需要:
将服务器存档进行合适的修改,使其可以正常的在单人模式加载 在1.12.2版本下找到目标数据,复制到1.12.2的单人存档数据内 删除游玩区域附近不需要的区块 在1.19.4版本直接打开,生成1.19.4新地形,并且自动升级.dat数据
将服务器存档结构修改以适配单人模式本步骤分两部分完成
存档结构了解
本人希望迁移的存档为1.12.2版本bukkit服务端,存档结构如下: - <font face="微软雅黑">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
- 这里也是空的</font></font>
复制代码 |
在1.12.2模式新建一个世界,进入地狱和末地创建地图后,可以看到结构如下:
- <font face="微软雅黑">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</font>
复制代码 |
实操打开单人存档,打开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内搜索你的数据,将你的数据复制到一个不会被你搞混的地方,比如桌面。
还记得在刚刚你还把一个level.dat文件也复制出来了么?完成上述两个大步骤,你现在应该已经拥有:
下载这个可以修改 .dat 格式的文件的编辑器(从1.7到1.20都可以)
现在同时选中这两个文件,直接拖进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,删除其中的数据后粘贴新数据即可完成人物坐标的更改。
第二个大步骤完成了!你现在已经:
完成了三大世界的迁移 完成了背包与末影箱的物品迁移 完成了其他状态迁移
直接在高版本打开低版本存档时,会自动将低版本的附魔信息等数据升级 删除不需要的区块,保证新地形生成下面是最后一步了,如果你不打算在高版本打开该存档,没必要进行此步骤!
此步骤为的是保证新版本地形及特性能够正常生成。
请直接观看XeKr的视频教程
|