GCPTDBSyncBattleData 是客户端仍保留的一条 PTDB 战斗同步包。当前 Game.exe 已能明确确认它先以 mode 区分分支,再在 mode == 1/2/3 时附带 count 和若干个固定 52 字节战斗条目;其中 mode == 1 还额外携带两个 uint32 附加值。现役 /home/ubuntu/Game2 Lua 主链未检出同名定义。
包信息
| 项目 |
内容 |
| 封包 ID |
1307 |
| 包名 |
GCPTDBSyncBattleData |
| 方向 |
GC 游戏服 -> 客户端 |
| 长度 |
条件变长,取决于 mode 与 count |
| 专用请求 |
无专用请求 |
| 当前 Lua 协议定义 |
未在 /home/ubuntu/Game2 现役 Lua 主链中检出 |
| 主要作用 |
向客户端同步一组 PTDB 战斗条目,并转交本地 PTDB 战斗管理器处理 |
当前 Game.exe 可直接确认:
GetPacketID() = 1307;
GetPacketSize() = mode == 1 ? 10 + 52 * count
: (mode == 2 || mode == 3) ? 2 + 52 * count
: 1;
Read() = 按 mode 读取 count、extra_u32_list 和 battle_entry_list;
Write() = 按同顺序写回;
Execute() = 转交本地 PTDB 战斗管理器;
包体结构
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x01 |
mode |
uint8 |
包体分支模式 |
0x01 |
0x01 |
count |
uint8 |
仅 mode == 1/2/3 时存在;当前客户端最多处理前 16 条 |
0x02 |
0x08 |
extra_u32_list |
uint32[2] |
仅 mode == 1 时存在的附加参数 |
0x0A |
52 * count |
battle_entry_list |
bytes[52 * count] |
仅 mode == 1 时存在的战斗条目区 |
0x02 |
52 * count |
battle_entry_list |
bytes[52 * count] |
仅 mode == 2/3 时存在的战斗条目区 |
总长度公式:
mode == 1 -> 10 + 52 * count
mode == 2 或 mode == 3 -> 2 + 52 * count
其他 mode -> 1
需要特别说明:
Read() / Write() 在 mode == 1/2/3 时最多只处理前 16 条战斗条目。
GetPacketSize() 仍直接按 count 计算,因此这条协议在客户端侧的有效上限应视为 16。
当前实际行为
mode 不属于 1/2/3 时,包体只有一个字节;当前 Execute() 不再细分处理,而是直接返回。
mode == 1 时,客户端会先读取 count、两个 uint32 附加值,再读取 count 个 52 字节战斗条目。
mode == 2 或 mode == 3 时,客户端只读取 count 与战斗条目,不再读取额外 uint32。
- 当前
Execute() 本身不直接解析条目字段,而是把整个包对象转交给本地 PTDB 战斗管理器处理。
- 因此从主包类层面,当前能稳定确认的字段只有
mode、count、extra_u32_list[2] 和 52 字节定长条目块;战斗条目内部子字段仍应保守命名。
服务端落点
- 当前检索
/home/ubuntu/Game2/services 与 /home/ubuntu/Game2/lualib,未命中 GCPTDBSyncBattleData。
- 已重点复核但未命中的现役文件包括:
/home/ubuntu/Game2/services/game/packet.lua
/home/ubuntu/Game2/services/msgagent.lua
/home/ubuntu/Game2/services/scene/scenecore.lua
/home/ubuntu/Game2/services/scene/obj/human.lua
- 因此本文结构与行为结论以当前
Game.exe 为准;服务端现役链路仅能确认“未见接入”。
关键代码
当前 Game.exe 结构
GetPacketID() = 1307;
GetPacketSize() = mode == 1 ? 10 + 52 * count
: (mode == 2 || mode == 3) ? 2 + 52 * count
: 1;
Read() / Write():
uint8 mode;
if (mode == 1) {
uint8 count;
uint32 extra_u32_list[2];
bytes battle_entry_list[count][52];
} else if (mode == 2 || mode == 3) {
uint8 count;
bytes battle_entry_list[count][52];
}
当前客户端执行逻辑
if (globals_ready() && manager_ready()) {
forward_to_ptdb_battle_manager(this);
}
return 2;
结论
GCPTDBSyncBattleData 是按 mode 分支的 PTDB 战斗同步包。
mode == 1 时额外带两个 uint32 参数;mode == 2/3 时没有该附加段。
- 每条战斗记录固定
52 字节,客户端最多只处理前 16 条。
- 当前主包类只负责把整包转交给本地 PTDB 战斗管理器,战斗条目内部字段仍不宜仅凭现役证据强命名。
- 现役
/home/ubuntu/Game2 Lua 主链未检出该协议,因此当前更适合作为客户端保留同步链路记录。
|