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 未发现显式协议定义:
- 当前 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 在当前项目里的最终定位很明确:
- 这条包的 ID 是
181,固定长度 4。
- 当前客户端协议里仍然保留这条包,包体只有一个对象 ID 字段。
- 当前 Lua 服务端没有显式接入
CGLeaveScene 的协议定义和请求入口。
- 当前项目实际离开场景,主要走服务端内部
leave_scene() 和场景 leave 调用链。
- 客户端虽然还保留
GCLeaveScene(359),但当前 Lua 主链里没有发现它的显式发送点。