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() 返回:
- 当前
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
- 当前没有这条包的场景业务处理落点
结论
WGCRetTeamRaidPlayerInfo(1255) 是一条变长 WGC 回包,当前结构为 18 字节包头加 member_count 个 98 字节成员条目。
- 当前
Game.exe 已能明确确认 result_code、member_count、member_name、member_guid、school_id、member_level、fight_value 的实际用途。
- 这条包在客户端的实际行为不是常规团队状态同步,而是把查询结果写日志并弹提示,更接近 GM/查询/调试用途的结果包。
- 包头前 3 个字段、成员条目里的
reserved_text_1 与 reserved_i16_1,当前证据还不足以稳定命名,保留为 reserved_* 更安全。
- 现役
/home/ubuntu/Game2 Lua 主链没有接入这条协议,因此它不属于当前项目正在使用的团队同步主链。
|