CGDisclosureToGM 是聊天右键菜单“投诉/举报”与邮件投诉等旧 GM 申告入口使用的上行包。它和外挂举报窗口的 CGReportWaigua(1215) 不是同一条链路:聊天菜单 ContexMenu_ChatBoard_Toushu_Clicked() 调用 Talk:HandleMenuAction("Toushu"),客户端随后发送的是本包。
包信息
| 项目 |
内容 |
| 封包 ID |
171 |
| 包名 |
CGDisclosureToGM |
| 方向 |
CG 客户端 -> 游戏服 |
| 对应回包 |
GCRetGMMsg(92) |
| 作用 |
向 GM 提交聊天、密聊、邮件等投诉信息 |
当前 Game.exe 可确认它是由 5 段变长文本和 5 个 uint32 组成的复合变长包:
packet_size = text_1_len + text_2_len + nested_text_1_len
+ nested_text_2_len + nested_text_3_len + 31
包体结构
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x04 |
reserved_1 |
uint32 |
顶层保留整型 |
0x04 |
0x01 |
text_1_len |
uint8 |
第一段文本长度,上限 30 |
0x05 |
text_1_len |
text_1 |
bytes[len] |
第一段文本,GBK |
0x05 + text_1_len |
0x02 |
text_2_len |
uint16 |
第二段文本长度,上限 256 |
0x07 + text_1_len |
text_2_len |
text_2 |
bytes[len] |
第二段文本,GBK |
0x07 + text_1_len + text_2_len |
0x04 |
reserved_2 |
uint32 |
顶层中段保留整型 |
0x0B + text_1_len + text_2_len |
0x04 |
reserved_3 |
uint32 |
顶层中段保留整型 |
0x0F + text_1_len + text_2_len |
0x01 |
nested_text_1_len |
uint8 |
子结构第一段文本长度,上限 30 |
0x10 + text_1_len + text_2_len |
nested_text_1_len |
nested_text_1 |
bytes[len] |
子结构第一段文本,GBK |
0x10 + text_1_len + text_2_len + nested_text_1_len |
0x01 |
nested_text_2_len |
uint8 |
子结构第二段文本长度,上限 64 |
0x11 + text_1_len + text_2_len + nested_text_1_len |
nested_text_2_len |
nested_text_2 |
bytes[len] |
子结构第二段文本,GBK |
0x11 + text_1_len + text_2_len + nested_text_1_len + nested_text_2_len |
0x02 |
nested_text_3_len |
uint16 |
子结构第三段文本长度,上限 256 |
0x13 + text_1_len + text_2_len + nested_text_1_len + nested_text_2_len |
nested_text_3_len |
nested_text_3 |
bytes[len] |
子结构第三段文本,GBK |
0x13 + text_1_len + text_2_len + nested_text_1_len + nested_text_2_len + nested_text_3_len |
0x04 |
nested_reserved_1 |
uint32 |
子结构尾部保留整型 |
0x17 + text_1_len + text_2_len + nested_text_1_len + nested_text_2_len + nested_text_3_len |
0x04 |
reserved_4 |
uint32 |
顶层尾部保留整型 |
0x1B + text_1_len + text_2_len + nested_text_1_len + nested_text_2_len + nested_text_3_len |
0x04 |
reserved_5 |
uint32 |
顶层最终尾字段 |
当前实际行为
- 客户端聊天右键菜单的投诉入口不会弹
AccusationStudio,而是直接发送本包。
- 当前 Lua 服务端解析全部
5 段文本和保留整型,写入 log_disclosure_to_gm。
- 服务端落库后发送
GCRetGMMsg(92),当前成功分支使用 return_code = 0。
- 客户端收到
return_code = 0 后会映射本地字典键 dr_suc,提示举报已发送给 GM,并把玩家名加入屏蔽列表。
服务端落点
- 协议定义:
/home/ubuntu/Game2/services/game/packet.lua
- 请求入口:
/home/ubuntu/Game2/services/msgagent.lua 的 request:CGDisclosureToGM()
- 投诉日志集合:
log_disclosure_to_gm
- 成功提示回包:
GCRetGMMsg(92)
关键代码
当前 Lua 包体解析:
self.reserved_1 = stream:readuint()
self.text_1_len = stream:readuchar()
self.text_1 = read_text(self.text_1_len, 0x1E)
self.text_2_len = stream:readushort()
self.text_2 = read_text(self.text_2_len, 0x100)
self.reserved_2 = stream:readuint()
self.reserved_3 = stream:readuint()
self.nested_text_1_len = stream:readuchar()
self.nested_text_1 = read_text(self.nested_text_1_len, 0x1E)
self.nested_text_2_len = stream:readuchar()
self.nested_text_2 = read_text(self.nested_text_2_len, 0x40)
self.nested_text_3_len = stream:readushort()
self.nested_text_3 = read_text(self.nested_text_3_len, 0x100)
self.nested_reserved_1 = stream:readuint()
self.reserved_4 = stream:readuint()
self.reserved_5 = stream:readuint()
当前 Lua 处理逻辑:
skynet.send(".logdb", "lua", "insert", { collection = "log_disclosure_to_gm", doc = doc })
local msg = packet_def.GCRetGMMsg.new()
msg.return_code = 0
Net:send(msg)
结论
CGDisclosureToGM(171) 是聊天投诉 / GM 申告包,不是外挂举报窗口包。
- 当前包体是复合变长结构,总长度为
5 段文本长度之和加 31。
- 当前服务端已接入解析、落库和成功回包;后续如果要做频率限制,应通过
GCRetGMMsg.return_code = 1 触发 dr_err_toofast。
|