包信息
| 项目 |
值 |
| PacketID |
647 |
| 方向 |
Server -> Client |
| 长度 |
4 |
| 作用 |
通知客户端一次背包道具存入仓库的处理结果,携带来源容器、来源格、目标仓库格和结果字节 |
包体结构
| 偏移 |
长度 |
字段 |
类型 |
含义 |
| 0x00 |
0x01 |
from_bag |
uint8 |
来源容器类型,当前 Lua 直接回写 CGBankAddItem.from_bag |
| 0x01 |
0x01 |
from_index |
uint8 |
来源背包格索引 |
| 0x02 |
0x01 |
to_index |
uint8 |
目标仓库格索引;当前 Lua 无有效目标格时写 255 |
| 0x03 |
0x01 |
result |
uint8 |
结果字节;当前 Lua 主链写 1/0,客户端额外保留 2 分支 |
当前实际行为 / 模式说明
request:CGBankAddItem() 会把请求直接转发到 scenecore:char_bank_add_item()。
- 当前服务端真正取来源道具时固定使用人物普通背包容器
prop_bag_container:get_item(from_index),from_bag 在当前 Lua 主链里主要用于回包回显。
- 服务端会先检查来源道具是否存在、是否处于交易中、是否已锁定,不满足条件时直接弹提示并返回,不发送
GCBankAddItem。
- 可叠加物品存仓时,当前 Lua 会优先尝试把数量合并到银行里已有的同类未满格物品上。
- 只要发生叠加合并,服务端就不再发送
GCBankAddItem,而是改走 char_bank_item_info()、char_bank_acquire_list() 和 char_prop_item_info() 的刷新链。
- 只有“未发生合并”的直移路径,当前 Lua 才会发送
GCBankAddItem:
result = 1:移动成功
result = 0:移动失败
to_index = 255:当前没有合法目标仓库格
- 当前
Game.exe 客户端执行函数会按 from_bag == 1 进入正常背包入仓处理;其中 result == 1 走“放入空仓库格”分支,result == 2 走“目标格交换”分支。
- 当前 Lua 主链未见写入
result = 2 的发送点,因此本版本 GCBankAddItem 实际主要使用的是 result = 1/0。
- 当前
Game.exe 里还保留了失败提示键 GCBankAddItemHandler_Info_Item_Save_To_Bank_False 和成功提示键 GCBankAddItemHandler_Info_Item_Save_To_Bank_Ok。
服务端落点
/home/ubuntu/Game2/services/game/packet.lua
/home/ubuntu/Game2/services/msgagent.lua
/home/ubuntu/Game2/services/scene/scenecore.lua
关键代码
-- /home/ubuntu/Game2/services/game/packet.lua
self.from_bag = stream:readuchar()
self.from_index = stream:readuchar()
self.to_index = stream:readuchar()
self.result = stream:readuchar()
-- /home/ubuntu/Game2/services/scene/scenecore.lua
if merged then
if new_bank_slot == define.INVAILD_ID then
...
else
self:char_bank_acquire_list(who)
end
self:char_prop_item_info(who, from_index)
else
msg.from_bag = add.from_bag
msg.from_index = from_index
msg.to_index = final_to_index == define.INVAILD_ID and 255 or final_to_index
msg.result = result and 1 or 0
self:send2client(human, msg)
end
-- /home/ubuntu/Game2/services/msgagent.lua
function request:CGBankAddItem()
skynet.call(my_scene, "lua", "char_bank_add_item", my_obj_id, self)
end
// Game.exe
GetPacketID() = 647;
GetPacketSize() = 4;
Read() : read(a1 + 24, 1); read(a1 + 25, 1); read(a1 + 26, 1); read(a1 + 27, 1);
Write() : write(a1 + 24, 1); write(a1 + 25, 1); write(a1 + 26, 1); write(a1 + 27, 1);
Execute():
if (from_bag == 1 && result == 1) move bag[from_index] -> bank[to_index];
if (from_bag == 1 && result == 2) swap bag[from_index] with bank[to_index];
结论
GCBankAddItem 是当前版本背包道具存入仓库的结果回包,固定长度 4 字节,结构为 from_bag + from_index + to_index + result。当前 Lua 只在“未发生堆叠合并”的直移路径发送它;一旦进入堆叠合并,服务端会改走仓库格刷新或全量仓库刷新,不再发这条单包通知。
|