GCDetailAttrib_Pet 是珍兽详细属性的主同步包,当前项目采用“GUID + 交易索引 + 11 字节标记位 + 按标记追加字段”的变长结构。
包信息
| 项目 |
内容 |
| 封包 ID |
281 |
| 包名 |
GCDetailAttrib_Pet |
| 方向 |
Server -> Client |
| 对应请求 |
查看珍兽详情、交易展示、摆摊展示等多条链路 |
| 包长 |
变长 |
| 作用 |
按标记位同步珍兽详细属性、技能和装备信息 |
包体结构
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x08 |
guid |
PetGUID |
珍兽 GUID |
0x08 |
0x04 |
m_nTradeIndex |
uint32 |
交易 / 展示上下文索引 |
0x0C |
0x0B |
m_Flags[11] |
uint8[11] |
字段位图,决定后续写哪些属性 |
0x17 |
变长 |
payload |
list |
按 m_Flags 顺序追加对象 ID、名字、等级、成长、技能、装备等字段 |
当前实际行为
- 当前协议定义已明确这条包是按
m_Flags[11] 控制的变长珍兽详情包,而不是固定结构。
- 现役项目会在珍兽详情查看、脏属性刷新、元宝市场珍兽展示和玩家商店珍兽展示中复用这条协议。
- 当前最稳定的公共头是
guid + trade_index + 11 字节标记位,后面的详细字段只能按标记解释。
服务端落点
- 协议定义:
/home/ubuntu/Game2/services/game/packet.lua
- 脏属性刷新:
/home/ubuntu/Game2/lualib/db/pet_attrib.lua
- 人物发珍兽详情:
/home/ubuntu/Game2/services/scene/obj/human.lua
- 玩家商店 / 元宝市场复用:
/home/ubuntu/Game2/lualib/playershop.lua、/home/ubuntu/Game2/services/game/packet.lua
关键代码
self.guid:bis(stream)
self.m_nTradeIndex = stream:readuint()
for i = 1, 0xB do
self.m_Flags[i] = stream:readuchar()
end
if self.m_Flags[1] & 0x1 == 0x1 then self.m_objID = stream:readuint() end
if self.m_Flags[1] & 0x4 == 0x4 then
self.name_size = stream:readuchar()
self.name = stream:read(self.name_size)
end
... -- 其余字段继续按 m_Flags 逐段展开
结论
GCDetailAttrib_Pet(281) 是珍兽详细属性的变长总包。
- 能稳定确认的公共头只有
PetGUID + trade_index + 11 字节标记位。
- 写文档时应按“标记位控制的字段快照”理解,不要把它伪造成固定长度协议。
|