CGDispelBuffReq 是旧版客户端里用于请求移除指定 Buff 的封包。
包信息
| 项目 |
内容 |
| 封包 ID |
002 |
| 包名 |
CGDispelBuffReq |
| 固定回包 |
无固定专用回包 |
| 作用 |
请求移除指定 Buff / Impact |
包体结构
按当前 Game.exe 与 Lua 服务端现状,这条包按下面结构理解即可:
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x04 |
skill_id |
uint32 |
技能编号 |
0x04 |
0x02 |
impact_id |
uint16 |
Buff / Impact 编号 |
0x06 |
0x04 |
sn |
uint32 |
Buff 实例序号 |
总长度:
10 字节
当前真正决定移除目标的是:
服务端落点
这条包在 Lua 服务端里的关键位置如下:
- 协议定义:
- 请求入口:
- 场景侧处理:
services/scene/scenecore.lua
最终生效逻辑只有一行:
obj_me:unregister_impact_by_sn(req.sn)
当前实际行为
这条包在当前 Lua 服务端里的实际作用很明确:
- 客户端发送
CGDispelBuffReq
- 服务端进入场景服
- 按
req.sn 注销对应的 impact / buff
也就是说,当前实现里:
skill_id 不参与判定
impact_id 不参与判定
- 真正用于定位要移除哪条 Buff 的,是
sn
关键代码
协议字段
packet.CGDispelBuffReq = {
xy_id = packet.XYID_CG_DISPEL_BUFF_REQ,
bis = function(self, buffer)
local stream = bistream.new()
stream:attach(buffer)
self.skill_id = stream:readuint()
self.buffer_id = stream:readushort()
self.sn = stream:readuint()
end,
}
请求入口
function request:CGDispelBuffReq()
skynet.call(my_scene, "lua", "char_dispel_buff", my_obj_id, self)
end
场景侧处理
function scenecore:char_dispel_buff(obj_id, req)
local obj_me = self.objs[obj_id]
obj_me:unregister_impact_by_sn(req.sn)
end
结论
CGDispelBuffReq 这条包本质上就是“按 Buff 实例序号请求移除 Buff”的封包。
当前项目里真正要记住的只有三点:
- 这条包的 ID 是
002。
- 当前
Game.exe 下包体长度是 10 字节,字段顺序是 4 + 2 + 4。
- 当前 Lua 服务端实际只使用
sn,通过 unregister_impact_by_sn(req.sn) 移除对应 Buff。
|