CGEventRequest 是客户端向服务端提交事件选项的通用请求包。
包信息
| 项目 |
内容 |
| 封包 ID |
224 |
| 包名 |
CGEventRequest |
| 对应回包 |
当前未发现固定专用回包 |
| 回包 ID |
无 |
| 作用 |
向 NPC、事件脚本或功能脚本提交一次事件请求,常见于对话选项、功能面板操作与脚本事件触发 |
包体结构
按当前 Game.exe 与 Lua 服务端现状,这条包的包体长度是 16 字节。
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x04 |
script_id |
int32 |
目标事件脚本 ID |
0x04 |
0x04 |
ex_index |
int32 |
扩展索引 / 选项值 |
0x08 |
0x04 |
npc_obj_id |
int32 |
目标 NPC / 对象 ID |
0x0C |
0x04 |
issue_script_id |
int32 |
发起脚本 ID / 附加脚本参数 |
总长度:
16 字节
当前实际行为
- 这条包在当前项目里不是单一任务包,而是一个通用事件请求入口。
- 请求进入场景服后,先检查玩家是否存活;死亡状态下会直接提示“死亡状态无法进行此操作”。
- 服务端会先把原始字段统一整理为
script_id / ex_index / npc_obj_id / issue_script_id 四个明确名字。
- 如果
npc_obj_id == -1,服务端会直接按 script_id 调用脚本 OnEventRequest。
- 如果
npc_obj_id 有效,服务端会先找目标对象,再把请求转发给对象的 event_request()。
- 普通 NPC / 怪物分支最终会落到脚本
OnEventRequest(selfId, targetId, arg, index)。
- 当前项目里这条包还被额外用于帮会 UI 桥接,请求会根据
script_id / ex_index / issue_script_id 的组合改走 BanggongExchange 或 PutGuildMoney。
- 这条包没有固定专用回包,实际结果通常表现为脚本回调、弹窗、提示、界面刷新、场景传送或后续其它封包。
字段说明
script_id 是当前事件主脚本 ID。无目标对象时,服务端会直接按它调用 OnEventRequest。
ex_index 是当前最常用的附加参数,很多脚本会把它当作选项编号、数量值或扩展索引使用。
npc_obj_id 是事件目标对象 ID。当前对象存在时,服务端会把请求转交给该对象。
issue_script_id 在当前项目里不是废字段。普通分支下它主要作为上下文附加参数保留;帮会 UI 桥接分支下,它会参与金额与动作类型解析。
服务端落点
- 协议定义:
services/game/packet.lua
- 请求入口:
services/msgagent.lua
- 参数归一化与主处理:
services/scene/scenecore.lua
- 事件上下文保存:
lualib/scriptenginer.lua
- 对象事件转发:
services/scene/obj/monster.lua
关键代码
当前 Lua 协议定义
self.m_objID = stream:readint()
self.index = stream:readint()
self.arg = stream:readint()
self.unknow = stream:readint()
self.script_id = self.m_objID
self.ex_index = self.index
self.npc_obj_id = self.arg
self.issue_script_id = self.unknow
当前参数归一化
local function normalize_event_request_args(args)
local request = args or {}
request.script_id = tonumber(request.script_id or request.m_objID) or define.INVAILD_ID
request.ex_index = tonumber(request.ex_index or request.index) or define.INVAILD_ID
request.npc_obj_id = tonumber(request.npc_obj_id or request.arg) or define.INVAILD_ID
request.issue_script_id = tonumber(request.issue_script_id or request.unknow) or define.INVAILD_ID
return request
end
当前场景服处理
local request = normalize_event_request_args(args)
self.scriptenginer:push_event_request_context(request)
local obj_id = request.npc_obj_id
if obj_id == define.INVAILD_ID then
self.scriptenginer:call(request.script_id, "OnEventRequest", who, define.INVAILD_ID, request.script_id, request.ex_index)
else
local obj = self:get_obj_by_id(obj_id)
if obj then
if handle_guild_ui_event_request(self, who, obj_me, obj, request) then
return
end
obj:event_request(who, request.script_id, request.ex_index)
end
end
当前对象转发
function monster:event_request(who, ...)
self:get_script_enginer():call(self:get_script_id(), "OnEventRequest", who,
self:get_obj_id(), ...)
end
结论
CGEventRequest 本质上就是旧版客户端的通用“事件选项请求”封包。
当前项目里真正要记住的只有五点:
- 这条包的 ID 是
224,包体长度是 16 字节。
- 当前协议可以稳定按
script_id + ex_index + npc_obj_id + issue_script_id 这 4 个 int32 字段理解。
npc_obj_id == -1 时会直接调脚本;有对象时会转发到目标对象的 event_request()。
ex_index 是当前最常见的业务参数,很多脚本把它当作选项值或数量值使用。
issue_script_id 当前不是无用字段,在帮会 UI 桥接流程里会参与特殊解析。
|