GCClearDirty 是旧版客户端里保留的一条聊天清理回包。
当前 Game.exe 可以确认这条包仍然存在,并且客户端收到后会按包内文本去清理聊天窗口中的对应记录;但当前 Temp_Release_v0-07-0300 的 Lua 主链里,未发现这条包的协议定义与发送代码。
包信息
| 项目 |
内容 |
| 封包 ID |
096 |
| 包名 |
GCClearDirty |
| 对应请求 |
当前未发现固定专用请求 |
| 作用 |
通知客户端按指定文本清理聊天分屏/聊天历史中的对应记录 |
当前 Game.exe 的虚函数结论为:
GCClearDirty
GetPacketID() = 96;
GetPacketSize() = 38;
Read = 0x140611E80;
Write = 0x140611EE0;
Execute thunk = 0x140611E70 -> sub_140342690;
包体结构
当前 Game.exe 可以确认,这条包固定长度 38 字节。
客户端读写结构是:
其中当前 handler 只实际使用最后这段 30 字节文本,并按 0 结尾字符串处理。前面两个 uint32 在当前客户端逻辑中没有参与实际判断,因此当前版本最稳妥的命名如下:
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x04 |
reserved_1 |
uint32 |
当前 Game.exe handler 未使用 |
0x04 |
0x04 |
reserved_2 |
uint32 |
当前 Game.exe handler 未使用 |
0x08 |
0x1E |
message_text |
char[30] |
要清理的聊天文本;当前客户端按 0 结尾字符串读取实际长度 |
客户端读写逻辑可概括为:
Read(stream) {
read_u32(reserved_1);
read_u32(reserved_2);
read_bytes(message_text, 30);
}
Write(stream) {
write_u32(reserved_1);
write_u32(reserved_2);
write_bytes(message_text, 30);
}
当前实际行为
- 当前 Lua 服务端中未发现
packet.GCClearDirty 定义。
- 当前 Lua 主链中也未发现
GCClearDirty 的发送代码。
- 因此这条包在当前项目里不能按“Lua 现行正式回包”来理解。
- 当前
Game.exe 收到这条包后,会从偏移 0x08 处取出文本,并按 0 结尾计算真实字符串长度。
- 随后客户端会拿这段文本去匹配本地聊天管理结构中的记录。
- 一旦匹配成功,会清理聊天窗口中的对应聊天项。
- 当前明确涉及的聊天窗口有:
Chat_Frame_Fenping
Chat_Frame_History
- 结合包名
ClearDirty 与 handler 的实际操作,这条包的当前含义可以收敛为:
- 服务端通知客户端清理某条聊天脏词/脏消息对应的本地聊天记录
上面最后一点是根据当前客户端 handler 行为做出的结论,当前 Lua 主链没有可直接对照的发送代码。
服务端落点
当前项目中,以下位置未发现 GCClearDirty 的现行接入:
/home/ubuntu/Game2/services/game/packet.lua
/home/ubuntu/Game2/services/msgagent.lua
/home/ubuntu/Game2/services/scene
/home/ubuntu/Game2/lualib
也就是说,这条包目前更像是客户端保留协议,而不是当前 Lua 主链正在发送的回包。
关键代码
GCClearDirty
GetPacketID() = 96;
GetPacketSize() = 38;
Read(stream) {
read_u32(reserved_1);
read_u32(reserved_2);
read_bytes(message_text, 30);
}
Execute(packet) {
std::string text = packet.message_text;
if (!text.empty()) {
按文本匹配本地聊天记录;
从 Chat_Frame_Fenping / Chat_Frame_History 中移除对应项;
}
return 2;
}
if (*(_DWORD *)(a1 + 612) == 1) {
remove_from_chat(v18, "Chat_Frame_Fenping");
remove_from_chat(v18, "Chat_Frame_History");
} else {
remove_from_chat(v18, "Chat_Frame_History");
}
结论
GCClearDirty 的封包 ID 是 096,固定长度 38 字节。
- 包体结构可以稳定确认是
uint32 + uint32 + char[30]。
- 当前
Game.exe handler 真正使用的只有最后这段 30 字节文本字段。
- 这段文本会被客户端当成待清理聊天内容,用于移除聊天分屏和聊天历史中的对应记录。
- 前面两个
uint32 在当前 handler 中未参与逻辑,当前版本不适合强行命名。
- 当前
Temp_Release_v0-07-0300 的 Lua 主链未发现这条包的协议定义和发送代码。
|