HumanItemLogic::CreateMultiItemToBag 函数解析报告
-
函数概述
CreateMultiItemToBag 是一个用于向玩家背包批量添加物品的核心函数,处理物品创建、背包空间计算、物品分发和客户端通知等完整流程。
-
函数签名
BOOL CreateMultiItemToBag(
ITEM_LOG_PARAM* pLogParam, // 物品操作日志参数
Obj_Human* pHuman, // 目标玩家对象
UINT uItemIndex, // 物品序列化ID
UINT uCount, // 物品数量
INT nCoinType, // 操作原因/绑定状态
CHAR* pszItemTransfer // 物品转移信息输出
);
-
主要功能流程
3.1 前置检查
- 参数验证:检查物品ID有效性、数量有效性、玩家对象和日志参数
- 背包空间计算:调用
CalcItemSpace 计算是否有足够空间存放物品
3.2 物品分发逻辑
graph TD
A[开始] --> B{有足够空间?}
B -->|是| C[初始化循环变量]
C --> D[循环创建每个物品]
D --> E[调用CreateItemToBag]
E --> F{是新堆叠?}
F -->|是| G[发送旧堆叠更新]
F -->|否| H[增加当前堆叠计数]
D --> I{循环结束?}
I -->|否| D
I -->|是| J[处理最后一堆物品]
J --> K[返回成功]
B -->|否| L[返回失败]
3.3 客户端通知系统
- 装备类物品:使用
GCNotifyEquip 协议包
- 道具类物品:使用
GCItemInfo 协议包
- 宠物类物品:特殊校验和处理
- 关键数据结构
4.1 物品堆叠管理
UINT iBagIndex = INVALID_INDEX; // 当前物品背包索引
UINT iOldBagIndex = INVALID_INDEX; // 上一物品背包索引
UINT uLastCount = uCount; // 剩余待处理数量
UINT uEachPileCount = 0; // 当前堆叠计数
4.2 协议包结构
GCNotifyEquip:
struct GCNotifyEquip {
DWORD _vptr_Packet; // 虚表指针 (0x841DF28)
struct {
GUID m_ItemGUID; // 物品GUID
// ...其他物品字段
} m_Item;
// ...其他方法
};
GCItemInfo:
struct GCItemInfo {
DWORD _vptr_Packet; // 虚表指针 (0x841DB08)
struct {
GUID m_ItemGUID; // 物品GUID
// ...其他物品字段
} m_ITEM;
// ...其他方法
};
- 错误处理机制
错误类型 |
检测方式 |
处理方式 |
日志输出 |
无效物品ID |
Assert检查 |
中断执行 |
无(Assert) |
背包空间不足 |
CalcItemSpace返回值 |
返回FALSE |
无 |
物品创建失败 |
NULL检查 |
返回FALSE |
记录ERROR日志 |
物品类型不匹配 |
类型断言 |
返回FALSE |
记录ERROR日志 |
-
性能特性分析
-
循环复杂度:O(n)线性复杂度,n为物品数量
-
网络优化:
- 相同堆叠物品批量通知
- 最小化协议包大小(使用memset清零)
-
内存使用:
-
使用建议
-
前置检查:调用前应确保:
if (uItemIndex == 0 || uCount == 0 || pHuman == nullptr) {
return FALSE;
}
-
后置处理:成功返回后应:
if (bResult) {
SaveItemLog(pLogParam); // 保存操作日志
ProcessTransferString(pszItemTransfer); // 处理转移信息
}
-
异常情况:
- 当物品数量>100时建议分批调用
- 宠物类物品需特殊处理
-
典型调用示例
ITEM_LOG_PARAM logParam;
CHAR szTransfer[256];
BOOL bRet = HumanItemLogic::CreateMultiItemToBag(
&logParam,
pPlayer,
20101001,
5,
1,
szTransfer
);
本函数实现了完整的批量物品添加流程,兼顾了功能完整性和性能考量,是游戏物品系统的核心组件之一。
|