MCLF-CN / docs

公开的实现规范/文档
12 stars 0 forks source link

固定启动器离线用户默认UUID生成规则 #7

Open Steve-xmh opened 7 months ago

Steve-xmh commented 7 months ago

检查项

您是什么类型的用户

启动器作者

请简单的说一下您的想法

可以的话,以一个固定的方式统一离线用户的 UUID 生成规则,例如 UUID v3 (基于 MD5 生成)

它能解决什么样的问题/带来什么样的帮助

可以避免因交叉使用启动器导致玩家存档物品内容不同步的情况

期望的结果

以一个固定的方式统一离线用户的 UUID 生成规则

是否有对这个方案的相关链接?

No response

附注

No response

tnqzh123 commented 7 months ago

其实也可以考虑找一个统一的位置生成一个类似服务端的 usercache.json 的文件,把 username 和 UUID 写进去,然后让所有启动器都去读这个文件…

Steve-xmh commented 7 months ago

备注一下自己的方式:

我的启动器支持多账户管理,离线账户的UUID在创建时生成并保存在了固定的路径下。因此如果这个规则如果固定下来了,之后跟进只会影响新创建的离线账户,对旧账户影响不大。 (考虑到我的用户技术能力因此我认为有义务自行保护数据安全,故没有所多少加解密操作)

image

image

ZhaiSoul commented 7 months ago

目前国内外比较统一的UUID生成规则是根据 OfflinePlayer: 后跟随用户名来生成的,来源于Bukkit。

bangbang93 commented 7 months ago

建议与Bukkit统一,实现例: https://github.com/PrismarineJS/node-minecraft-protocol/blob/21240f8ab2fd41c76f50b64e3b3a945f50b25b5e/src/datatypes/uuid.js#L14

LTCatt commented 7 months ago

其实也可以考虑找一个统一的位置生成一个类似服务端的 usercache.json 的文件,把 username 和 UUID 写进去,然后让所有启动器都去读这个文件…

我更倾向于如果要做的话按照这个实现……因为大家提到的其他实现 PCL 在底层逻辑上就迁移不了 Orz

burningtnt commented 7 months ago

HMCL 是与 Bukkit 一致的

laolarou726 commented 7 months ago

建议与Bukkit统一,实现例: https://github.com/PrismarineJS/node-minecraft-protocol/blob/21240f8ab2fd41c76f50b64e3b3a945f50b25b5e/src/datatypes/uuid.js#L14

目前 LauncherX 的实现和Bukkit一致

TT702 commented 7 months ago

BakaXL 对应离线玩家 UUID 的行为与 Bukkit 一致。

Silverteal commented 7 months ago

根据 OfflinePlayer: 后跟随用户名来生成

这个方式也是原版服务端关闭在线模式时对玩家生成的UUID。

Silverteal commented 6 months ago

我支持默认使用“OfflinePlayer:玩家名”取UUIDv3,这能够实现以下目标: 1.一个用户名在没有任何附加信息的情况下唯一对应一个UUID,符合玩家思维习惯。 2.能使某些通过UUID版本识别玩家类型的相关工具正常工作。 3.避免了启动器对游戏文件夹的“侵入式修改”,无需额外的文件记忆,所以不会出现“UUID索引丢失导致存档找不到”等问题。 4.能正确处理多人游戏存档。这个算法是原版服务端(内置和专业)生成离线玩家UUID的方式。在(离线)局域网世界或下载的(离线)服务器世界中,可以实现“使用某用户名登录=使用对应玩家的存档”。如果采用“UUID索引”的方式,则无法/很难记录多人游戏玩家。

上面PCL的开发者提到“PCL在底层逻辑上难以实现此方案”,据我了解可能由于如下原因: 1.PCL目前生成的离线UUID(实际上)由很多的0开头,而启动器内部通过判断UUID前面是否有五个0来判断UUID是否是离线的。 2.PCL存在“通过修改UUID修改玩家离线皮肤”的功能,导致一个用户名在皮肤配置不同的情况下会对应多个不同的UUID。 对于问题1,如果采用上述方案,可以改为通过判断UUID的版本来判断UUID是否离线。 对于问题2,如果PCL不大幅度改变现有逻辑,我没有想到什么好的解决方法;然而我个人认为“启动器通过修改登录UUID实现离线皮肤的替换”本身是不合适的,可能的替代方案有: 1.引导用户安装CustomSkinLoader 2.或者干脆在本地设立Yggdrasil服务器,向游戏客户端提供包含自定义皮肤的用户档案(没记错的话,这也是HMCL和BakaXL使用的办法)

编辑: 同时我认为也应该允许高级用户自定义UUID。据我所知目前御三家应该只有HMCL支持此功能。

ZhaiSoul commented 6 months ago

我支持默认使用“OfflinePlayer:玩家名”取UUIDv3,这能够实现以下目标: 1.一个用户名在没有任何附加信息的情况下唯一对应一个UUID,符合玩家思维习惯。 2.能使某些通过UUID版本识别玩家类型的相关工具正常工作。 3.避免了启动器对游戏文件夹的“侵入式修改”,无需额外的文件记忆,所以不会出现“UUID索引丢失导致存档找不到”等问题。 4.能正确处理多人游戏存档。这个算法是原版服务端(内置和专业)生成离线玩家UUID的方式。在(离线)局域网世界或下载的(离线)服务器世界中,可以实现“使用某用户名登录=使用对应玩家的存档”。如果采用“UUID索引”的方式,则无法/很难记录多人游戏玩家。

上面PCL的开发者提到“PCL在底层逻辑上难以实现此方案”,据我了解可能有如下几点: 1.PCL目前生成的离线UUID(实际上)由很多的0开头,而启动器内部通过判断UUID前面是否有五个0来判断UUID是否是离线的。 2.PCL存在“通过修改UUID修改玩家离线皮肤”的功能,导致一个用户名在皮肤配置不同的情况下会对应多个不同的UUID。 对于问题1,如果采用上述方案,可以改为通过判断UUID的版本来判断UUID是否离线。 对于问题2,如果不大幅度改变现有逻辑,我没有想到什么好的解决方法;然而我个人认为通过这种方式实现离线皮肤本身是不合适的,可能的替代方案有: 1.引导用户安装CustomSkinLoader 2.或者干脆在本地设立Yggdrasil服务器,向游戏客户端提供包含自定义皮肤的用户档案(没记错的话,这也是HMCL和BakaXL使用的办法)

不是为了实现皮肤,而是存档内判断用户和权限依据是使用的uuid

Silverteal commented 6 months ago

不是为了实现皮肤,而是存档内判断用户和权限依据是使用的uuid

没看懂,能具体讲下吗?如果是说UUID在游戏里的作用的话,我应该不是那个意思......

ZhaiSoul commented 6 months ago

不是为了实现皮肤,而是存档内判断用户和权限依据是使用的uuid

没看懂,能具体讲下吗?如果是说UUID在游戏里的作用的话,我应该不是那个意思......

游戏内背包物品以及权限的归属是通过uuid判断的,和身份证一样。uuid变了,游戏自然不会认为你是他了

Silverteal commented 6 months ago

不是为了实现皮肤,而是存档内判断用户和权限依据是使用的uuid

没看懂,能具体讲下吗?如果是说UUID在游戏里的作用的话,我应该不是那个意思......

游戏内背包物品以及权限的归属是通过uuid判断的,和身份证一样。uuid变了,游戏自然不会认为你是他了

我提到的“通过修改UUID实现离线皮肤”是指PCL的业务逻辑,我知道UUID的作用的...

d3ara1n commented 5 months ago

很多启动器都是用的Bukkit方案,可以以此作为标准