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

洱海月 v0-07-0300 封包解析:ID 089 CGAskDetailEquipList(查看角色装备详情)

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

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

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

×

CGAskDetailEquipList 用于请求查看目标角色的装备详情列表。当前链路成功处理后,会返回 GCDetailEquipList。

包信息

项目 内容
封包 ID 089
包名 CGAskDetailEquipList
对应回包 GCDetailEquipList
回包 ID 772
作用 请求查看目标角色当前穿戴的装备详情

包体结构

按当前 Game.exe,这条请求包固定为 20 字节。结合当前客户端结构、现有回包字段以及旧链路命名线索,可整理为以下结构:

偏移 长度 字段 类型 含义
0x00 0x04 m_objID uint32 目标对象 ID
0x04 0x04 m_mode uint32 请求模式,当前 Lua 未使用
0x08 0x0C m_wPartFlags uint8[12] 装备部位位图,当前 Lua 未使用

总长度:

20 字节

当前实际行为

  • 当前 Game.exe 的 Read / Write 明确按 4 + 4 + 12 读写整包。
  • 当前 Lua 服务端只读取 m_objID,不会继续消费 m_mode 和 m_wPartFlags。
  • 服务端会在当前场景内按 m_objID 查找目标对象。
  • 只有目标存在且对象类型为 human 时,才会继续组装回包。
  • 当前回包 m_mode 固定写为 ASK_EQUIP_ALL。
  • 当前返回范围是 HEQUIP_WEAPON ~ HEQUIP_ALL 的全部已穿戴装备。
  • 目标不存在或不是人物时,当前 Lua 直接结束,不发送专用错误回包。
  • 当前客户端 Execute() 为空实现,这条包只负责提交请求数据。

服务端落点

这条包在当前项目里的关键位置如下:

  • 协议定义:
    • /home/ubuntu/Game2/services/game/packet.lua
  • 请求入口:
    • /home/ubuntu/Game2/services/msgagent.lua
  • 场景处理:
    • /home/ubuntu/Game2/services/scene/scenecore.lua
  • 装备变更时的主动刷新发送:
    • /home/ubuntu/Game2/services/scene/obj/human.lua

关键代码

当前客户端包体

Read(packet + 0x18, 4);
Read(packet + 0x1C, 4);
Read(packet + 0x20, 12);

当前 Lua 读取

packet.CGAskDetailEquipList = {
    xy_id = packet.XYID_CG_ASK_DETAIL_EQUIP_LIST,
    ctor = function(self)
        self.m_objID = 0
    end,
    bis = function(self, buffer)
        local stream = bistream.new()
        stream:attach(buffer)
        self.m_objID = stream:readuint()
    end
}

场景处理

function scenecore:ask_detail_equip_list(who, ask)
    local obj = self.objs[ask.m_objID]
    if obj and obj:get_obj_type() == "human" then
        local ret = packet_def.GCDetailEquipList.new()
        ret.m_mode = ret.ASK_EQUIP_MODE.ASK_EQUIP_ALL
        ret.m_objID = obj:get_obj_id()
        ret.itemList = {}
        for i = define.HUMAN_EQUIP.HEQUIP_WEAPON, define.HUMAN_EQUIP.HEQUIP_ALL do
            local item = obj:get_equip_container():get_item(i)
            if item then
                ret.itemList[i] = item:copy_raw_data()
            end
        end
        self:send2client(who, ret)
    end
end

结论

CGAskDetailEquipList 本质上就是“请求查看目标人物装备详情”的查询包。

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

  1. 这条包的 ID 是 089。
  2. 当前客户端完整包体是 20 字节,结构为 m_objID + m_mode + m_wPartFlags[12]。
  3. 当前 Lua 实际只使用 m_objID,后面的 16 字节没有参与业务处理。
  4. 只要目标对象存在且类型是 human,服务端就会返回 GCDetailEquipList。
  5. 当前实现默认返回目标人物的全部穿戴装备,不区分请求模式,也没有专用错误回包。
您需要登录后才可以回帖 登录 | registerss

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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