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 本质上就是“请求查看目标人物装备详情”的查询包。
当前项目里真正要记住的只有五点:
- 这条包的 ID 是
089。
- 当前客户端完整包体是
20 字节,结构为 m_objID + m_mode + m_wPartFlags[12]。
- 当前 Lua 实际只使用
m_objID,后面的 16 字节没有参与业务处理。
- 只要目标对象存在且类型是
human,服务端就会返回 GCDetailEquipList。
- 当前实现默认返回目标人物的全部穿戴装备,不区分请求模式,也没有专用错误回包。
|