找回密码
 register

QQ登录

只需一步,快速开始

查看: 19|回复: 0

[自写引擎] HumanItemLogic::CreateMultiItemToBag 函数解析报告

[复制链接]

[自写引擎] HumanItemLogic::CreateMultiItemToBag 函数解析报告

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:205
  • 打卡月天数:4
  • 打卡总奖励:203
  • 最近打卡:2025-06-04 09:26:46
Waylee

主题

0

回帖

2万

积分

仙帝

积分
21466
Waylee 2025-6-3 17:52 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×

HumanItemLogic::CreateMultiItemToBag 函数解析报告

  1. 函数概述
    CreateMultiItemToBag 是一个用于向玩家背包批量添加物品的核心函数,处理物品创建、背包空间计算、物品分发和客户端通知等完整流程。

  2. 函数签名

    BOOL CreateMultiItemToBag(
    ITEM_LOG_PARAM* pLogParam,  // 物品操作日志参数 
    Obj_Human* pHuman,          // 目标玩家对象 
    UINT uItemIndex,            // 物品序列化ID 
    UINT uCount,                // 物品数量 
    INT nCoinType,                // 操作原因/绑定状态 
    CHAR* pszItemTransfer       // 物品转移信息输出 
    );
  3. 主要功能流程

3.1 前置检查

  1. 参数验证:检查物品ID有效性、数量有效性、玩家对象和日志参数
  2. 背包空间计算:调用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协议包
  • 宠物类物品:特殊校验和处理
  1. 关键数据结构

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;
    // ...其他方法 
};
  1. 错误处理机制
错误类型 检测方式 处理方式 日志输出
无效物品ID Assert检查 中断执行 无(Assert)
背包空间不足 CalcItemSpace返回值 返回FALSE
物品创建失败 NULL检查 返回FALSE 记录ERROR日志
物品类型不匹配 类型断言 返回FALSE 记录ERROR日志
  1. 性能特性分析

  2. 循环复杂度:O(n)线性复杂度,n为物品数量

  3. 网络优化:

    • 相同堆叠物品批量通知
    • 最小化协议包大小(使用memset清零)
  4. 内存使用:

    • 栈上分配临时变量
    • 无动态内存分配
  5. 使用建议

  6. 前置检查:调用前应确保:

    if (uItemIndex == 0 || uCount == 0 || pHuman == nullptr) {
       return FALSE;
    }
  7. 后置处理:成功返回后应:

    if (bResult) {
       SaveItemLog(pLogParam); // 保存操作日志 
       ProcessTransferString(pszItemTransfer); // 处理转移信息 
    } 
  8. 异常情况:

    • 当物品数量>100时建议分批调用
    • 宠物类物品需特殊处理
  9. 典型调用示例

    ITEM_LOG_PARAM logParam;
    CHAR szTransfer[256];
    BOOL bRet = HumanItemLogic::CreateMultiItemToBag(
    &logParam, 
    pPlayer, 
    20101001, 
    5, 
    1, 
    szTransfer 
    );

本函数实现了完整的批量物品添加流程,兼顾了功能完整性和性能考量,是游戏物品系统的核心组件之一。

您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 | 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 |网站地图|天天打卡

GMT+8, 2025-6-5 18:22 , Processed in 0.092228 second(s), 5 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表