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

洱海月 v0-07-0300 封包解析:ID 096 GCClearDirty(聊天脏词记录清理通知)

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

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

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

×

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 字节。

客户端读写结构是:

  • 4 字节
  • 4 字节
  • 30 字节

其中当前 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");
}

结论

  1. GCClearDirty 的封包 ID 是 096,固定长度 38 字节。
  2. 包体结构可以稳定确认是 uint32 + uint32 + char[30]。
  3. 当前 Game.exe handler 真正使用的只有最后这段 30 字节文本字段。
  4. 这段文本会被客户端当成待清理聊天内容,用于移除聊天分屏和聊天历史中的对应记录。
  5. 前面两个 uint32 在当前 handler 中未参与逻辑,当前版本不适合强行命名。
  6. 当前 Temp_Release_v0-07-0300 的 Lua 主链未发现这条包的协议定义和发送代码。
您需要登录后才可以回帖 登录 | registerss

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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