|
|

楼主 |
发表于 2025-5-18 17:58:58
|
显示全部楼层
无论多血条还是直接显示60000e之类本质上都一样的,
为什么会有21e限制? 就是因为客户端血量使用的32位的,
源码为了兼容客户端的数据格式所以也用的32位, 也就是-21e ~ 21e
而所谓突破限制就是服务端部分改成64位去处理,
int64范围-9223372036854775808 ~ 9223372036854775807, 基本满足需求了
服务端用int64, 原理就是把uint64剪成两段, 一段正常发到客户端作为正常血量, 另一段自己想办法发到客户端
比如血量6,585,214,785(int64) 转无符号 13,170,429,570(uint64) -> 0x3 1104 CE82, 分成两截, 一个是0x3 0000 0000, 一个是0x1104 CE82,
其中0x1104 CE82就是发到客户端的血量, 当然客户端会自己换成int32的, 这个不用管
然后0x3 0000 0000这截就自己想办法发到客户端, 当然发的时候后面的0去掉就发0x3就行了,
如果你了解进制之间的关系的话, 其实可以知道 0x3 0000 0000 就相当于三个(0xFFFF FFFFF + 1), 然后0xFFFFFFFF就是你想突破的21e血量了
简单来说就是0x3这截有多少, 就代表有多少条21e血量
也因为这个0x3是64位的半截, 所以最大能有21e条21e血量的血条, 如果你前半截不用int32位而用uint32的话, 甚至能有42e条21e血量的血条
这就是多条血量的基本原理了, 插件只需要把0x3部分用多条血量表现出来就好了
至于直接显示6,585,214,785这个血量在客户端, 其实只是插件把0x3 和 0x1104 CE82 重新组合, 重新算出来具体数值而已, 底层逻辑是一样的
|
|