GCRefreshKFSSkill 是现役 Lua 仍在发送的另一条“三技能槽”刷新包。当前 Game.exe 与 /home/ubuntu/Game2 Lua 都能确认,它同样是固定 10 字节:一个背包位,加上 3 个技能槽。
包信息
| 项目 |
内容 |
| 封包 ID |
1014 |
| 包名 |
GCRefreshKFSSkill |
| 方向 |
GC 服务端 -> 客户端 |
| 固定包长 |
10 |
| 当前 Lua 协议定义 |
已接入 |
| 当前 Lua 发送入口 |
已接入 |
| 主要作用 |
同步 KFS 相关物品或系统的 3 个临时技能槽 |
当前 Game.exe 可直接确认:
GCRefreshKFSSkill
GetPacketID() = 1014;
GetPacketSize() = 10;
Execute thunk = 0x1405FEFF0 -> sub_14008E960;
包体结构
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x04 |
bag_index |
int32 |
背包位置 |
0x04 |
0x06 |
skills[3] |
int16[3] |
三个技能槽 |
从线结构看,它与 GCRefreshDarkSkill(1012) 的差异主要不在长度,而在业务含义和客户端落地位置:两者分别写入不同的本地临时技能区。
当前实际行为
现役 Lua 在 /home/ubuntu/Game2/lualib/script_base.lua 中会先生成 skills[3],再执行:
obj:set_temp_wh_skills(skills),把结果写入服务端临时缓存。
- 构造
GCRefreshKFSSkill,写入 bag_index 与 skills。
- 发给客户端。
客户端 Execute() 则把包体写入另一块本地临时技能区,并触发事件 883。因此它和 1012 属于“结构相同、落点不同”的并行协议。
服务端落点
- 协议定义:
/home/ubuntu/Game2/services/game/packet.lua
- 发送 helper:
/home/ubuntu/Game2/lualib/script_base.lua
关键代码
当前 Lua 的发送骨架
obj:set_temp_wh_skills(skills)
local msg = packet_def.GCRefreshKFSSkill.new()
msg.bag_index = bag_pos
msg.skills = skills
obj:get_scene():send2client(obj, msg)
当前 Game.exe 的执行结论
Execute() {
local_kfs_skill_block.bag_index = bag_index;
local_kfs_skill_block.skills[0] = skills[0];
local_kfs_skill_block.skills[1] = skills[1];
local_kfs_skill_block.skills[2] = skills[2];
fire_event(883);
return 2;
}
结论
GCRefreshKFSSkill(1014) 是固定 10 字节的 KFS 技能刷新包。
- 包体结构可以明确写成
bag_index + 3 个 int16 技能槽。
- 现役 Lua 会先计算临时技能,再整体下发给客户端。
- 客户端收到后写入对应本地缓存,并触发事件
883。
|