找回密码
 registerss
搜索
查看: 25|回复: 0

洱海月 v0-07-0300 封包解析:ID 1255 WGCRetTeamRaidPlayerInfo(玩家队伍/团队成员信息返回)

[复制链接]
  • 打卡等级:本地老炮
  • 打卡总天数:603
  • 打卡月天数:1
  • 打卡总奖励:600
  • 最近打卡:2026-10-03 06:32:28
Waylee 发表于 2026-4-14 16:26 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

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

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

×

WGCRetTeamRaidPlayerInfo 是一条用于返回指定玩家当前队伍或团队成员快照的变长回包。按当前 Game.exe 行为,它更像查询或调试用途的结果包,而不是常规团队同步包:成功时客户端会把成员列表写入日志,并弹出“获取成功,有成员 X 人,请从文件中查看结果”;失败时只提示错误结果。现役 /home/ubuntu/Game2 Lua 主链没有注册这条协议。

包信息

项目 内容
封包 ID 1255
包名 WGCRetTeamRaidPlayerInfo
方向 WGC 世界服 -> 客户端
对应请求 当前 Lua 主链未找到明确对应请求;按客户端执行逻辑,更接近查询/调试用途的专用回包
包长 变长;18 + 98 * member_count
当前上限 member_count 在当前客户端读写链中会被限制到 0..30
作用 返回指定玩家所在队伍或团队的成员信息,并在客户端输出查询结果提示

包体结构

这条包由“固定包头 + 成员数组”组成。当前 Game.exe 的 GetPacketSize() 公式为:

18 + 98 * member_count

包头结构如下:

偏移 长度 字段 类型 含义
0x00 0x02 reserved_header_1 int16 当前 Read() / Write() 明确存在;Execute() 未直接消费,构造默认值为 -1
0x02 0x04 reserved_header_2 int32 当前 Read() / Write() 明确存在;Execute() 未直接消费,构造默认值为 -1
0x06 0x04 reserved_header_3 int32 当前 Read() / Write() 明确存在;Execute() 未直接消费,构造默认值为 -1
0x0A 0x04 result_code int32 结果码;0=成功,1=指定玩家没有队伍或团队,其他非零值统一按失败处理
0x0E 0x04 member_count int32 成员数量;当前客户端读写会截断到最大 30
0x12 ... member_list member_entry[member_count] 成员条目数组

单个成员条目以“成员条目起始位置”为基准,实际网络序列化长度为 98 字节:

偏移 长度 字段 类型 含义
+0x00 0x1E member_name char[30] 成员名字,当前执行函数会直接写入日志
+0x1E 0x32 reserved_text_1 char[50] 当前 Read() / Write() 明确存在;Execute() 未直接消费
+0x50 0x04 member_guid uint32 成员 GUID,当前执行函数按 %X 记录到日志
+0x54 0x04 school_id uint32 门派 ID,当前执行函数会映射到 12 个门派名字符串后输出
+0x58 0x04 member_level int32 成员等级
+0x5C 0x02 reserved_i16_1 int16 当前 Read() / Write() 明确存在;Execute() 未直接消费
+0x5E 0x04 fight_value int32 战力值,当前执行函数会直接写入日志

需要注意的是,客户端对象内存里每条成员记录按 100 字节对齐,但网络包体真实序列化长度是 98 字节,因此应以当前 Read() / Write() 的连续字节长度为准。

当前实际行为

  • 当前 Game.exe 中,WGCRetTeamRaidPlayerInfo::GetPacketID() 返回 1255。
  • 当前 GetPacketSize() 返回:
    • 18 + 98 * member_count
  • 当前 Read() / Write() 都会先处理固定包头,再按 member_count 循环处理成员条目。
  • 当前客户端在 Read() 阶段会把 member_count 修正到 0..30 范围,Write() 也只会按这个范围实际写出成员条目。
  • 当前 Execute() 的结果处理已经可以明确确认:
    • result_code == 0 时,逐条把成员信息写入日志,并弹出“获取成功,有成员%d人,请从文件中查看结果”
    • result_code == 1 时,弹出“指定玩家没有队伍或团队”
    • 其他非零 result_code 时,弹出“获取玩家队伍信息失败”
  • 当前执行函数输出的日志格式可以直接佐证以下字段语义:
    • member_name
    • school_id
    • member_guid
    • member_level
    • fight_value
  • 当前执行函数不会把这条包写入现役团队缓存,也不会走普通团队同步链;它的行为更接近“查询结果展示/日志输出”。
  • 当前 /home/ubuntu/Game2 中没有 WGCRetTeamRaidPlayerInfo 的协议定义、发送链和处理落点。
  • 当前项目里正常使用的团队同步主链,仍然是 GCRaidList、GCRaidMemberInfo、GCRaidResult 等协议,而不是这条 WGC 查询结果包。

服务端落点

  • /home/ubuntu/Game2/services/game/packet.lua
  • /home/ubuntu/Game2/services/msgagent.lua
  • /home/ubuntu/Game2/services/scene

当前结论是:现役 /home/ubuntu/Game2 Lua 主链没有接入 WGCRetTeamRaidPlayerInfo。当前仓库里也没有找到它的协议定义、发送点或业务处理分支。

关键代码

当前 Game.exe 的读写结论

GetPacketID()   -> 1255
GetPacketSize() -> 18 + 98 * member_count

Read():
- read 2 bytes  -> reserved_header_1
- read 4 bytes  -> reserved_header_2
- read 4 bytes  -> reserved_header_3
- read 4 bytes  -> result_code
- read 4 bytes  -> member_count
- clamp member_count to [0, 30]
- repeat member_count times:
  - read 30 bytes -> member_name
  - read 50 bytes -> reserved_text_1
  - read 4 bytes  -> member_guid
  - read 4 bytes  -> school_id
  - read 4 bytes  -> member_level
  - read 2 bytes  -> reserved_i16_1
  - read 4 bytes  -> fight_value

当前 Execute() 的结果处理

if result_code == 0:
    日志输出:
    成员%d:角色名=%s, 门派=%d(%s), GUID=%X, 等级=%d, 战力=%d
    界面提示:
    获取成功,有成员%d人,请从文件中查看结果
elif result_code == 1:
    界面提示:
    指定玩家没有队伍或团队
else:
    界面提示:
    获取玩家队伍信息失败

当前 Lua 主链未接入该包

/home/ubuntu/Game2/services/game/packet.lua
- 当前没有 XYID_WGCRETTEAMRAIDPLAYERINFO
- 当前没有 packet.WGCRetTeamRaidPlayerInfo

/home/ubuntu/Game2/services/msgagent.lua
- 当前没有 WGCRetTeamRaidPlayerInfo 的收发或通知分支

/home/ubuntu/Game2/services/scene
- 当前没有这条包的场景业务处理落点

结论

  1. WGCRetTeamRaidPlayerInfo(1255) 是一条变长 WGC 回包,当前结构为 18 字节包头加 member_count 个 98 字节成员条目。
  2. 当前 Game.exe 已能明确确认 result_code、member_count、member_name、member_guid、school_id、member_level、fight_value 的实际用途。
  3. 这条包在客户端的实际行为不是常规团队状态同步,而是把查询结果写日志并弹提示,更接近 GM/查询/调试用途的结果包。
  4. 包头前 3 个字段、成员条目里的 reserved_text_1 与 reserved_i16_1,当前证据还不足以稳定命名,保留为 reserved_* 更安全。
  5. 现役 /home/ubuntu/Game2 Lua 主链没有接入这条协议,因此它不属于当前项目正在使用的团队同步主链。
您需要登录后才可以回帖 登录 | registerss

本版积分规则

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

GMT+8, 2026-10-4 11:26 , Processed in 0.063040 second(s), 26 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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