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

洱海月 v0-07-0300 封包解析:ID 224 CGEventRequest(事件请求)

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

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

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

×

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 本质上就是旧版客户端的通用“事件选项请求”封包。

当前项目里真正要记住的只有五点:

  1. 这条包的 ID 是 224,包体长度是 16 字节。
  2. 当前协议可以稳定按 script_id + ex_index + npc_obj_id + issue_script_id 这 4 个 int32 字段理解。
  3. npc_obj_id == -1 时会直接调脚本;有对象时会转发到目标对象的 event_request()。
  4. ex_index 是当前最常见的业务参数,很多脚本把它当作选项值或数量值使用。
  5. issue_script_id 当前不是无用字段,在帮会 UI 桥接流程里会参与特殊解析。
您需要登录后才可以回帖 登录 | registerss

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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