GCDelObject 是当前旧版项目仍在使用的视野对象删除包。角色、平台等对象离开观察者视野时,Lua 场景服会向客户端发送这条固定 6 字节包,让客户端把指定对象从当前场景里移除。
包信息
| 项目 |
内容 |
| 封包 ID |
144 |
| 包名 |
GCDelObject |
| 方向 |
Server -> Client |
| 包长 |
6 |
| 当前 Lua 协议定义 |
已实现 |
| 作用 |
通知客户端删除当前视野中的场景对象 |
包体结构
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x04 |
m_objID |
uint32 |
需要从视野中移除的对象 ID |
0x04 |
0x02 |
m_idScene |
uint16 |
当前场景 ID |
当前实际行为
- 当前
Game.exe 中,GetPacketID() 返回 144,GetPacketSize() 返回 6。
- 当前 Lua 协议定义与
Game.exe 完全一致,bis() / bos() 都只处理 m_objID + m_idScene。
- 现役发送点位于
character:on_obj_leave_view(obj):
- 目标对象离开当前观察者视野时
- 服务端构造
GCDelObject
- 把目标对象 ID 和当前场景 ID 一起发给客户端
- 这条包是当前旧版项目真正在线使用的“对象离视野删除”主链。
服务端落点
- 协议定义:
/home/ubuntu/Game2/services/game/packet.lua
- 现役发送点:
/home/ubuntu/Game2/services/scene/obj/character.lua
关键代码
packet.GCDelObject = {
bis = function(self, buffer)
local stream = bistream.new()
stream:attach(buffer)
self.m_objID = stream:readuint()
self.m_idScene = stream:readushort()
end,
bos = function(self)
local stream = bostream.new()
stream:writeuint(self.m_objID)
stream:writeushort(self.m_idScene)
return stream:get()
end
}
function character:on_obj_leave_view(obj)
local ret = packet_def.GCDelObject.new()
ret.m_objID = obj:get_obj_id()
ret.m_idScene = self.scene:get_id()
self.scene:send2client(self, ret)
character.super.on_obj_leave_view(self, obj)
end
结论
GCDelObject(144) 是当前版本现役的视野删除通知包。结构非常稳定,就是 m_objID + m_idScene 两个字段;只要对象离开观察者视野,Lua 场景服就会直接发送它。
|