找回密码
 registerss
搜索

洱海月 v0-07-0300 封包解析:ID 1307 GCPTDBSyncBattleData(PTDB 战斗数据同步)

[复制链接]
Waylee 发表于 2026-4-15 17:13 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?registerss

×

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;

结论

  1. GCPTDBSyncBattleData 是按 mode 分支的 PTDB 战斗同步包。
  2. mode == 1 时额外带两个 uint32 参数;mode == 2/3 时没有该附加段。
  3. 每条战斗记录固定 52 字节,客户端最多只处理前 16 条。
  4. 当前主包类只负责把整包转交给本地 PTDB 战斗管理器,战斗条目内部字段仍不宜仅凭现役证据强命名。
  5. 现役 /home/ubuntu/Game2 Lua 主链未检出该协议,因此当前更适合作为客户端保留同步链路记录。
您需要登录后才可以回帖 登录 | registerss

本版积分规则

QQ|手机版|雪舞知识库 ( 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 )

GMT+8, 2026-10-24 13:58 , Processed in 0.027031 second(s), 27 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表