CGAuctionMultiBuyItem 是客户端提交给游戏服的拍卖行批量购买请求包。当前 /home/ubuntu/Game2 的协议层已经保留了解包定义,能够稳定确认它由“条目数 + 最多 10 条购买项”组成;每条购买项都携带目标物品 GUID、卖家 GUID、货架索引和成交价格。
包信息
| 项目 |
内容 |
| 封包 ID |
1108 |
| 包名 |
CGAuctionMultiBuyItem |
| 方向 |
CG 客户端 -> 游戏服 |
| 包长 |
变长;空包头 1 字节,完整形态为 1 + 17 * count |
| 数量上限 |
count <= 10 |
| 当前 Lua 状态 |
已定义解包,但当前主链未检出明确处理入口 |
| 专用回包 |
无专用回包 |
当前 Game.exe 与 Lua 协议层结论一致:
PacketID = 1108;
PacketSize = 1 + 17 * count;
包体结构
主包结构
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x01 |
count |
uint8 |
批量购买条目数量,当前协议限制最大 10 |
0x01 |
0x11 * count |
buy_items |
buy_item[count] |
批量购买项列表 |
buy_item 结构
| 偏移 |
长度 |
字段 |
类型 |
含义 |
+0x00 |
0x08 |
item_guid |
bytes[8] |
拍卖行目标物品 GUID |
+0x08 |
0x04 |
seller_guid |
int32 |
卖家角色 GUID |
+0x0C |
0x01 |
listing_index |
uint8 |
卖家货架 / 列表内索引 |
+0x0D |
0x04 |
price |
uint32 |
本次购买时客户端提交的成交价格 |
当前实际行为
- 当前 Lua
bis() 会先读取 count,仅当 count <= 0xA 时继续解包。
- 每条购买项都会按固定 17 字节读取,不存在额外类型分支。
- 当前 Lua 协议层变量名虽然用了
packet.ItemInfo.new():bis(stream),但按当前 Game.exe 的包长可以确认这里实际占用的是 8 字节 GUID 段。
- 现有证据可以稳定确认这是“拍卖行批量购买请求”而不是单条申请包。
- 当前
/home/ubuntu/Game2 主链没有检出明确的处理入口,因此它更像是客户端与协议层仍保留、但现役 Lua 场景逻辑未正式接线的请求包。
服务端落点
当前 Lua 服务端落点如下:
/home/ubuntu/Game2/services/game/packet.lua
- 定义
CGAuctionMultiBuyItem
bis() 读取 count 与 buy_items
- 限制最多
10 条
当前主链未找到以下内容:
/home/ubuntu/Game2/services/msgagent.lua 中的显式分发入口
/home/ubuntu/Game2/services/scene 中的同名业务处理
- 当前 Lua 服务端对应的批量购买专用回包
关键代码
当前 Lua 的解包逻辑
local count = stream:readuchar()
if count <= 0xA then
for i = 1, count do
local buy = {}
buy.item_guid = packet.ItemInfo.new()
buy.item_guid:bis(stream)
buy.seller_guid = stream:readint()
buy.index = stream:readuchar()
buy.price = stream:readuint()
table.insert(self.buy_items, buy)
end
end
当前 Game.exe 的长度约束
if (count > 10)
return 1;
return 1 + 17 * count;
结论
CGAuctionMultiBuyItem(1108) 是一条批量购买请求包,包体由 count 和最多 10 条购买项组成。
- 单条购买项固定
17 字节,可稳定确认字段为 item_guid + seller_guid + listing_index + price。
- 当前
/home/ubuntu/Game2 已定义这条协议的解包,但现役主链未检出明确处理入口。
- 这条包的最终结构判断以当前
Game.exe 和当前 Lua 协议层为准,不需要借助旧 Server 才能成立。
|