【MCJE】玩家数据存储与迁移
本文档介绍MC Java版服务器中玩家数据的存放。
playerdata文件夹的内容在 1.7.6 版本受到更改。但是考虑到应该没人开 1.7.6 以前的服,所以只介绍更改后的新版本内容。
如果想要了解旧版本内容,详见minecraft wiki。
玩家数据存储方式
26.1 正式版及之后
从 26.1-snapshot-6 开始,玩家的数据统一存储在/world/players/的三个文件夹下。

玩家的大部分数据会储存在 /world/players/data/<uuid>.dat 的文件中,并且会在某些条件下在同目录下生成一个备份文件。
玩家的进度数据储存在 /world/players/advancements/<uuid>.json 内。
玩家的统计数据存储在 /world/players/stats/<uuid>.json 内。
1.21.11 及之前
玩家的大部分数据会储存在/world/playerdata/<uuid>.dat 的文件中,并且会在某些条件下在同目录下生成一个备份文件。
玩家的进度数据储存在 /world/advancements/<uuid>.json 内(仅在 1.12 后出现)。
玩家的统计数据存储在 /world/stats/<uuid>.json 内。
Minecraft 服务器中,玩家首次连入时会由服务器自动生成一个 UUID。
若服务器开启了正版验证,则 UUID 为此玩家正版账号所对应的 UUID。
若服务器关闭了正版验证,则 UUID 将参照行业规范[注1]生成。
如需查看/计算玩家 ID 所对应的 UUID 可前往 Minecraft Wiki:
注1:此处的行业规范指的是大部分MC启动器及服务端正常情况下产生的离线UUID,与上方计算器算出的结果相同,但是旧版的PCL2启动器所产生的UUID与行业规范不同,这点需要注意。
UUID对应文件
此文件用于缓存玩家的UUID(唯一标识符)和用户名的映射关系。这个文件主要用于加速玩家登录过程。因此其并不会保存玩家的数据。
UUID 对应文件以 usercache.json 为名,存储在服务器根目录下。
因为整个文件都是一个 json 中的值,所以以[开头,以]结尾,每个值之间由英文逗号,隔开。
以下是一个合法值的示例:
{"name":"kawaii_Elaina","uuid":"78a610e7-9107-4653-94b6-0a366ea5b950","expiresOn":"2023-07-27 00:11:19 +0800"}
这个值表示,id为 kawaii_Elaina 的玩家的 uuid 为 78a610e7-9107-4653-94b6-0a366ea5b950,该 uuid 将于 2023-07-27 00:11:19 +0800(UTC+8 2023年7月27日0时11分19秒)时过期。
特殊情况
因为验证方式的不同,玩家数据会有以下种类:
- 离线验证
- 正版验证
- 第三方服务器验证
- (互通服)间歇泉插件写入 (大部分情况下与对应 Java 版账户的 UUID 相同,具体取决于服务器登录配置与 Geyser 登录配置)
其中各个验证方式之间的玩家数据均相互独立。
注:usercache.json 可能分裂出来很多个,但是玩家数据本体始终以 uuid 为名存储在 playerdata 文件夹中。
同时,因为数据种类不同,如果一个服务器最多只同时允许一种验证方式,但是前后更换过验证方式,则因为玩家数据不通用会造成丢失。
迁移玩家数据:修改文件所对应的UUID名
因为所有数据都以uuid为名存储在playerdata文件夹中,所以即使id相同,只要uuid不同,本质上都不是同一个玩家的数据。
这样来看,不管是最简单的数据迁移——服务器并未更换验证模式,只是你换了个号(id)但想要继承上个id的数据——还是服务器启用了一大堆验证模式,有人某一种验证模式登不上了或者服务器选择弃用一种验证模式——
——数据迁移的本质都相同,就是把一个玩家id的数据迁移到另一个id上。
这样看的话,数据迁移方法就很明了了。
我们的目的是让玩家id B用上玩家id A的数据,只要id B和数据A联系起来就行,所以,在playerdata文件夹中将.dat和.dat_old文件改名,就能达成效果。
所有修改文件的行为请在服务器关机状态下进行。
转到 world/players/data(26.1及之后) / /world/playerdata/(1.21.11及之前)文件夹,你会看到一些 dat 和 dat_old 文件:

下方为一个示例教程:
以下为两名玩家的数据文件。现在我们需要把第一名玩家的数据迁移给第二名。
78a610e7-9107-4653-94b6-0a366ea5b950.dat 640KB
78a610e7-9107-4653-94b6-0a366ea5b950.dat_old 640KB
0b881575-595b-4869-b555-4263433925a0.dat 120KB
0b881575-595b-4869-b555-4263433925a0.dat_old 120KB
操作方法:
1.复制第二名玩家的数据文件名,随后删除该文件。
2.将第一名玩家的数据文件重命名为复制的文件名。
成功操作后,数据文件如下:
0b881575-595b-4869-b555-4263433925a0.dat 640KB
0b881575-595b-4869-b555-4263433925a0.dat_old 640KB
此时,第二名玩家再次连入游戏,他的玩家数据将使用原本第一名玩家的数据。