洞穴夜莺 发表于 2024-2-25 22:38:20

存档UUID重映射器

本帖最后由 洞穴夜莺 于 2024-2-25 23:09 编辑


接上一帖:https://klpbbs.com/thread-129321-1-1.html

这个工具可以用于将服务器存档从正版验证迁移至离线模式、从离线模式迁移至正版验证、为离线模式下的玩家改名、转移一个账号的数据到另一个账号等。同时保留账号上的玩家位置、状态、物品栏、统计信息、成就、驯服的动物、吸引的仇恨等几乎所有数据。

一些模组,比如 Luckperms ,使用数据库保存玩家信息,需要另外修改 。

其主要工作方式是查找 NBT 文件和文本文件及它们的文件名中的 UUID ,并对找到的文件中的每个 UUID 替换为新的 UUID。查找范围和模式为:

[*]文本文件:*.txt, *.json, *.json5, *.toml, *.yml, *.yaml, *.properties,模式:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx、xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[*]NBT文件:*.nbt, *.dat, *.mca, *.mcc,模式:{*UUIDMost: xyL, *UUIDLeast: zwL}、、字符串字段模式同文本文件
[*]上述两类文件的文件名,模式同文本文件。

目前这个程序在我维护的服务器上处理了70GiB的存档(1.18.2),暂未发现问题。

用法:
uuid-remapper <PATH> <MAPPING_KIND> <MAPPING_FILE> [-t <THREAD_COUNT>] [-yes] [-no]
[*] <PATH>是需要重映射的路径,程序会扫描这个路径下的文件并进行处理,例如/var/minecraft
[*] <MAPPING_KIND>是函数的输入格式,见后文,例如csv
[*] <MAPPING_FILE>是函数的输入路径,见后文,例如func.csv
[*] [-t <THREAD_COUNT>]指定使用的线程数量,如果不写,使用24线程
[*] [-y]跳过确认步骤
[*] [-n]不进行修改,用于调试


重映射函数
总共有8种输入格式,下面介绍每种输入格式:
csv
除了第一行表头被忽略以外,剩下每行两个以逗号分隔的UUID x,y表示从x映射到y,例如
旧UUID,新UUID
c50d0fb23bc24da5bcd63b50c99dcd5a,fb1ad51ecf1f41f78fd110dff164b17d表示将文件夹中的c50d0fb23bc24da5bcd63b50c99dcd5a替换为fb1ad51ecf1f41f78fd110dff164b17d。
使用常见的表格处理工具,例如Excel、Libreoffice Calc便可制作这样的文件。

json
文件包含一个JSON对象,其中的键值对"x": "y"表示从"x"映射到"y",例如
{
    "c50d0fb23bc24da5bcd63b50c99dcd5a": "fb1ad51ecf1f41f78fd110dff164b17d"
}表示将文件夹中的c50d0fb23bc24da5bcd63b50c99dcd5a替换为fb1ad51ecf1f41f78fd110dff164b17d。
许多编程语言,比如Javascript、Java、Python、Rust,可以很方便地操纵这种文件格式。

list-to-offline
文件是一个玩家清单,表示将这些玩家的正版UUID映射到离线UUID,程序通过Mojang API查询用户正版UUID,大小写敏感,例如
CaveNightingale
Notch表示将文件夹中CaveNightingale和Notch的正版UUID替换为离线UUID。
此种输入往往只需要将白名单申请共享文档中的用户名一列复制下来便可获得。

list-to-online
和上面一样,但是离线UUID替换为正版UUID。

usercache-to-offline
此种格式文件中带有一个JSON数组,数组中的元素是对象,每个对象有一个字段name保存用户的名称,将所有name字段的值取出则得到list-to-offline的输入,例如
[
    {
      "name": "CaveNightingale"
    },
    {
      "name": "Notch"
    }
]表示将文件夹中CaveNightingale和Notch的正版UUID替换为离线UUID。
这种格式的输入可以直接用服务端目录下的usercache.json或者whitelist.json,以便迁移所有玩家/当前白名单玩家的数据。

usercache-to-online
和上面一样,但是离线UUID替换为正版UUID。

offline-rename-csv
在离线UUID之间进行改名操作,格式见csv,但是原像和像都是用户名,例如
旧用户名,新用户名
Notch,CaveNightingale
表示将离线账号Notch名下的数据迁移给离线账号CaveNightingale。

offline-to-specific-csv
将离线账号的UUID迁移到指定账号,格式见csv,原像是用户名,像是UUID,例如
离线用户名,目标账号
CaveAlt,fb1ad51ecf1f41f78fd110dff164b17d
表示将离线账号CaveAlt替换为fb1ad51ecf1f41f78fd110dff164b17d(正版账号CaveNightingale)。

以上所有格式,对于函数中没有被定义的UUID,程序不作修改。对于涉及到正版UUID而给出的用户名没有正版账号的,等同于没有定义。

一个完整示例
uuid-remapper /var/minecraft usercache-to-online /var/minecraft/usercache.json -t12
将/var/minecraft文件夹中的服务端内所有玩家账号迁移到正版,使用12个线程。
如果不使用-y参数运行,将会被要求核对文件清单和UUID清单,必须回答yes或y(不区分大小写)


下载:
可从Github Release或者Github Action下载,文件是一样的。(由于论坛无法上传exe扩展名的文件,请从论坛下载的用户自行重命名添加.exe后缀)

平台文件查毒
X86_64 GNU/Linux查毒报告
X86_64 Windows查毒报告
X86_64 macOS查毒报告
源代码不适用

请在Github或者论坛提出BUG或者功能请求。
程序以Mit许可证分发,通俗地说,你可以无限制地修改、分发、使用本程序,只需要在分发时也一并发送一份Mit许可证文本。

编译
cargo build --release编译结果在target/release下

水怪席:@Aurora_Feather @星河皓月xyz @凌雨林 @开心的阿诺 @Su·東紅 @wsseieiei @Pink_Dove

Pink_Dove 发表于 2024-2-25 23:28:25

虽然我暂时用不上,但是就冲这句

“ 这个工具可以用于将服务器存档从正版验证迁移至离线模式、从离线模式迁移至正版验证、为离线模式下的玩家改名、转移一个账号的数据到另一个账号等。同时保留账号上的玩家位置、状态、物品栏、统计信息、成就、驯服的动物、吸引的仇恨等几乎所有数据。”

也得支持一下(

wsseieiei 发表于 2024-2-26 20:02:20

竟然提到我了
能迁移账号的数据,看起来就很实用
页: [1]
查看完整版本: 存档UUID重映射器