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

洱海月 v0-07-0300 封包解析:ID 181 CGLeaveScene(离开场景)

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

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

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

×

CGLeaveScene 是旧版客户端里用于发起离开场景的请求包。

但在当前 Temp_Release_v0-07-0300 Lua 服务端主链里,这条包没有显式接入;当前项目实际离场,主要走服务端内部 leave_scene() 调用链。

包信息

项目 内容
封包 ID 181
包名 CGLeaveScene
客户端保留回包 GCLeaveScene
回包 ID 359
作用 请求角色离开当前场景;当前项目中主要体现为客户端保留协议

包体结构

这条包是固定长度包。

当前 Game.exe 的 GetPacketSize() 结论为:

4

包体结构如下:

偏移 长度 字段 类型 含义
0x00 0x04 obj_id int32 对象 ID;旧结构命名为 m_ObjID

当前 Game.exe 的 Read / Write 都只处理这一个 int32 字段。

客户端保留回包

当前 Game.exe 里还能确认到 GCLeaveScene:

项目 内容
封包 ID 359
包名 GCLeaveScene
包长 5
结构 obj_id(int32) + leave_code(uint8)

当前客户端 handler 收到 GCLeaveScene 后,会按 obj_id 定位场景对象并执行移除逻辑;leave_code 在当前 handler 主逻辑里没有看到继续参与判定。

当前实际行为

  • 当前客户端协议中保留了 CGLeaveScene,Game.exe 也保留了完整读写与包号定义。
  • 当前 Lua 服务端里没有发现 packet.CGLeaveScene 的协议定义。
  • 当前 Lua 服务端里也没有发现 request:CGLeaveScene() 请求入口。
  • 这说明 CGLeaveScene 在当前项目中不是显式接入的网络主链。
  • 当前项目真正执行“离开场景”的主流程,主要走内部 ma_func:leave_scene()。
  • ma_func:leave_scene() 会调用当前场景的 leave(guid, del_obj_flag),取回角色存档数据并保存。
  • CGAskChangeScene 在切场景前,也会先调用旧场景的 leave,随后把角色数据保存成 "leave_scene"。
  • 场景服执行 leave 时,会记录登出时间、触发 OnScenePlayerLeave、移除宠物、清理 AOI 视野和对象表,最后返回存档数据。

服务端落点

这条包在当前项目里的关键位置如下:

  • 当前 Lua 未发现显式协议定义:
    • services/game/packet.lua
  • 当前 Lua 未发现显式请求入口:
    • services/msgagent.lua
  • 当前实际离场主链:
    • msgagent_module/ma_func.lua
  • 当前场景离场处理:
    • services/scene/scenecore.lua

关键代码

当前服务端实际离场入口

function ma_func:leave_scene()
    if self.my_scene then
        local data = skynet.call(self.my_scene, "lua", "leave", self.my_guid, self.del_obj_flag)
        self:save_my_data(data, "leave_scene")
    end
end

当前 CGAskChangeScene 的离场处理

if my_scene then
    data = skynet.call(my_scene, "lua", "leave", my_guid, ma_func:get_del_obj_flag())
    if data then
        call_name = "leave_scene"
    else
        data = ma_func:get_my_data()
    end
end

当前场景服离场处理

obj:set_logout_time(os.time())
pcall(self.on_player_leave_scene, self, obj_id)
...
pcall(AOI.leave, AOI, obj)
self.objs[obj_id] = nil
self.guid2objs[guid] = nil
...
local save_data = obj:get_save_data()
return save_data

当前 Game.exe 的读写结论

GetPacketID() = 181;
GetPacketSize() = 4;

Read(stream) {
    read_i32(obj_id);
}

Write(stream) {
    write_i32(obj_id);
}

当前 Game.exe 的 GCLeaveScene 结论

GetPacketID() = 359;
GetPacketSize() = 5;

Read(stream) {
    read_i32(obj_id);
    read_u8(leave_code);
}

结论

CGLeaveScene 在当前项目里的最终定位很明确:

  1. 这条包的 ID 是 181,固定长度 4。
  2. 当前客户端协议里仍然保留这条包,包体只有一个对象 ID 字段。
  3. 当前 Lua 服务端没有显式接入 CGLeaveScene 的协议定义和请求入口。
  4. 当前项目实际离开场景,主要走服务端内部 leave_scene() 和场景 leave 调用链。
  5. 客户端虽然还保留 GCLeaveScene(359),但当前 Lua 主链里没有发现它的显式发送点。
您需要登录后才可以回帖 登录 | registerss

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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