找回密码
 register

QQ登录

只需一步,快速开始

查看: 46|回复: 0

[自写引擎] CGUseEquipHandler::Execute 函数完整版重写C++源代码

[复制链接]

[自写引擎] CGUseEquipHandler::Execute 函数完整版重写C++源代码

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:186
  • 打卡月天数:9
  • 打卡总奖励:184
  • 最近打卡:2025-05-09 15:00:47
Waylee

主题

0

回帖

1万

积分

仙帝

积分
19618
Waylee 2025-4-27 14:01 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

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

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

×

编写人员:雪舞
编写时间:2025-4-27
还原途径:IDA 9.1
代码类型:单一函数非成品
使用用途:代码执行思路学习
代码行数:720行


V1.0 2025-4-27 初步还原整个函数执行逻辑,全部使用结构体.附带基础注释方便理解

***付费内容***


UINT CGUseEquipHandler::Execute_hk(CGUseEquip* pPacket, Player* pPlayer)
{
    __ENTER_FUNCTION;

    // 获取游戏玩家对象
    GamePlayer* pGamePlayer = (GamePlayer*)pPlayer;
    Assert(pGamePlayer);

    // 获取玩家的人类角色对象
    Obj_Human* pHuman = pGamePlayer->GetHuman();
    Assert(pHuman);

    // 获取当前场景
    Scene* pScene = pHuman->getScene();
    if (pScene == NULL)
    {
        Assert(FALSE);
        return PACKET_EXE_ERROR;
    }

    // 检查线程执行资源是否正确 
    Assert(MyGetCurrentThreadID() == pScene->m_ThreadID);

    // 检查玩家是否可以进行逻辑操作
    if (!pGamePlayer->IsCanLogic())
    {
        CacheLog(LOG_FILE_DEBUG, "CGUseEquip0mentHandler: GUID=%X change scene", pGamePlayer->m_HumanGUID);
        return PACKET_EXE_CONTINUE;
    }

    // 获取包中的装备位置信息
    UINT BagIndex = (UINT)pPacket->getBagIndex();        //背包索引
    UINT EquipPoint = (UINT)pPacket->getEquipPoint(); //装备点位置

    if (EquipPoint > 18)
    {
        Assert(FALSE);
        return PACKET_EXE_CONTINUE;
    }

    // 获取要使用的物品
    Item* pUseItem = HumanItemLogic::GetItem(pHuman, BagIndex);
    Assert(pUseItem);
    Assert(pUseItem->m_pItem);

    // 初始化装备使用结果消息
    GCUseEquipResult Msg;
    Msg.m_ItemID.m_Server = 0;
    Msg.m_ItemID.m_World = 0;
    Msg.m_EquipID.m_Server = 0;
    Msg.m_EquipID.m_World = 0;
    Msg._vptr_Packet = (INT (**)(...))0x0841E9A8;
    Msg.m_ItemID.m_Serial = 0;
    Msg.m_EquipID.m_Serial = 0;

    // 获取物品类别并检查是否为装备
    UCHAR itemClass = pUseItem->GetItemClass();
    if (itemClass != ICLASS_EQUIP)
    {
        Msg.setResult(USEEQUIP_TYPE_FAIL);
        Msg.m_BagIndex = 0;
        Msg.m_EquipPoint = 0;
        pGamePlayer->SendPacket(&Msg);
        RED_CacheLog(LOG_FILE_DEBUG, "CGUseEquipmentHandler: GUID=%X BagIndex=%d itemClass=%d", pGamePlayer->m_HumanGUID, BagIndex, itemClass);
        return PACKET_EXE_CONTINUE;
    }

    // 检查装备耐久度 
    INT nCurDur = 0;
    if (pUseItem->IsDark() && pUseItem->GetItemClass() == ICLASS_EQUIP && pUseItem->m_pItem->m_Equip.m_bytDarksFlag == 1)
    {
        // 暗器的特殊耐久度计算 
        BLUE_EQUIP_TB* pBlueItemTB = g_ItemTable.GetBlueItemTB(pUseItem->m_pItem->m_ItemIndex);
        if (pBlueItemTB != nullptr)
        {
            nCurDur = pBlueItemTB->m_MaxDur;
        }
    }
    else
    {
        // 普通装备的当前耐久度 
        nCurDur = pUseItem->m_pItem->m_Equip.m_CurDurPoint;
    }

    // 耐久度不足检查 
    if (nCurDur <= 0)
    {
        Msg.setResult(6);
        pGamePlayer->SendPacket(&Msg);
        CacheLog(LOG_FILE_DEBUG, "CGUseEquipmentHandler GUID=%X: dur fail", pGamePlayer->m_HumanGUID);
        return PACKET_EXE_CONTINUE;
    }

    // 检查等级要求 
    INT nReqLevel = -1;
    if (pUseItem->IsEquip())
    {
        EQUIP_TB* pEquipTB = g_ItemTable.GetEquipTB(pUseItem->m_pItem->m_ItemIndex);
        if (pEquipTB)
        {
            if (pUseItem->IsDark())
            {
                // 暗器的等级要求计算 
                UINT nDarkLevel = pUseItem->IsDark() ? pUseItem->m_pItem->m_DarksInfo.m_Level : pUseItem->GetRequireLevel();
                nReqLevel = (pEquipTB->m_ReqLevel <= nDarkLevel) ? (pUseItem->IsDark() ? pUseItem->m_pItem->m_DarksInfo.m_Level : pUseItem->GetRequireLevel()) : pEquipTB->m_ReqLevel;
            }
            else
            {
                // 普通装备的等级要求 
                nReqLevel = pEquipTB->m_ReqLevel;
            }
        }
    }

    // 等级不足检查 
    if (nReqLevel > pHuman->GetLevel())
    {
        Msg.m_Result = USEEQUIP_LEVEL_FAIL;
        pGamePlayer->SendPacket(&Msg);
        CacheLog(LOG_FILE_DEBUG, "CGUseEquipmentHandler GUID=%X: level fail", pGamePlayer->m_HumanGUID);
        return PACKET_EXE_CONTINUE;
    }

    // 检查门派限制 
    if (pUseItem->IsEquip())
    {
        EQUIP_TB* pEquipTB = g_ItemTable.GetEquipTB(pUseItem->m_pItem->m_ItemIndex);
        if (!pEquipTB || pEquipTB->m_MenpaiLimitFlag != -1)
        {
            UINT nMenPai = pHuman->GetMenPai();
            if (nMenPai <= 8)
            {
                UINT nMenpaiLimitFlag = 0;
                if (pUseItem->IsEquip())
                {
                    pEquipTB = g_ItemTable.GetEquipTB(pUseItem->m_pItem->m_ItemIndex);
                    if (pEquipTB)
                    {
                        nMenpaiLimitFlag = pEquipTB->m_MenpaiLimitFlag;
                    }
                }

                // 检查门派是否匹配 
                if ((nMenpaiLimitFlag & (1 << nMenPai)) == 0)
                {
                    Msg.m_Result = 9;
                    pGamePlayer->SendPacket(&Msg);
                    CacheLog(LOG_FILE_DEBUG, "CGUseEquipmentHandler GUID=%X: menpai fail", pGamePlayer->m_HumanGUID);
                    return PACKET_EXE_CONTINUE;
                }
            }
        }
    }

    // 检查密码锁状态  
    BOOL bPWLock = FALSE;
    if (pUseItem->m_Type == ITEM_DATA_TYPE::IDT_PET)
    {
        if (pUseItem->m_pPet)
        {
            bPWLock = (pUseItem->m_pPet->m_yFlags & 1) != 0;
        }
    }
    else if (pUseItem->m_pItem)
    {
        bPWLock = pUseItem->m_pItem->GetItemPLock();
    }
    // 密码锁检查 
    if (bPWLock && pUseItem->IsCanEquipBind())
    {
        if (!pUseItem->m_pItem->GetItemBind())
        {
            Msg.m_Result = USEEQUIP_JOB_FAIL;
            pGamePlayer->SendPacket(&Msg);
            RED_CacheLog(LOG_FILE_DEBUG, "CGUseEquipmentHandler GUID=%X: pwlock fail", pGamePlayer->m_HumanGUID);
            return PACKET_EXE_CONTINUE;
        }
    }

    // 检查装备鉴定状态 
    if (ItemRulerCheck::CheckTypeRuler(ITEM_RULER_LIST::IRL_NEEDIDENT, pUseItem->m_pItem->m_ItemIndex))
    {
        if (pUseItem->m_pItem->m_Equip.m_AttrCount &&
            pUseItem->GetItemClass() == ICLASS_EQUIP &&
            pUseItem->GetSerialQual((UINT)pUseItem->m_pItem) == 2 &&
            !pUseItem->m_pItem->GetItemIdent())
        {
            Msg.m_Result = USEEQUIP_IDENT_FAIL;
            pGamePlayer->SendPacket(&Msg);
            RED_CacheLog(LOG_FILE_DEBUG, "CGUseEquipmentHandler GUID=%X: ident fail", pGamePlayer->m_HumanGUID);
            return PACKET_EXE_CONTINUE;
        }
    }

    // 获取装备位置 
    HUMAN_EQUIP Equip_Point;
    if (pUseItem->IsEquip())
    {
        EQUIP_TB* pEquipTB = g_ItemTable.GetEquipTB(pUseItem->m_pItem->m_ItemIndex);
        if (pEquipTB)
        {
            Equip_Point = (HUMAN_EQUIP)pEquipTB->m_EquipPoint;
        }
    }

    // 检查装备位置是否匹配 
    if (Equip_Point != EquipPoint)
    {
        // 处理戒指和护符的特殊位置情况 
        if ((Equip_Point != HUMAN_EQUIP::HEQUIP_RING && Equip_Point != HEQUIP_RING_2) || 
            (EquipPoint != 6 && EquipPoint != 11) && 
            ((Equip_Point - 12) > 1 || (EquipPoint - 12) > 1))
        {
            RED_CacheLog(LOG_FILE_DEBUG, "ERROR CGUseEquipmentHandler: GUID=%X EPoint=%d EquipPoint Error",pGamePlayer->m_HumanGUID, Equip_Point);
            return PACKET_EXE_CONTINUE;
        }
        Equip_Point = (HUMAN_EQUIP)EquipPoint;
    }

    // 获取装备容器 
    ItemContainer* pEquipContainer = pHuman->GetEquipContain();
    if (pEquipContainer == nullptr)
    {
        RED_CacheLog(LOG_FILE_DEBUG, "ERROR CGUseEquipmentHandler: GUID=%X EPoint=%d pEquipContainer Fail",pGamePlayer->m_HumanGUID, Equip_Point);
        return PACKET_EXE_CONTINUE;
    }

    // 获取当前装备位置的物品 
    Item* pEquipItem = pEquipContainer->GetItem(Equip_Point);
    if (pEquipItem == nullptr)
    {
        RED_CacheLog(LOG_FILE_DEBUG, "ERROR CGUseEquipmentHandler: GUID=%X EPoint=%d pEquipItem Fail 0",pGamePlayer->m_HumanGUID, Equip_Point);
        return PACKET_EXE_CONTINUE;
    }

    // 记录装备状态和扩展信息 
    BOOL bEquipStatus = !pEquipItem->IsEmpty();
    BOOL ExtBag = FALSE;
    INT ExtSizeBag = 0;
    BOOL ExtBox = FALSE;
    INT ExtSizeBox = 0;

    // 处理背包扩展 
    if (Equip_Point == HEQUIP_BAG)
    {
        if (bEquipStatus)
        {
            // 发送提示消息 (背包已装备物品)
            ScriptParam_MissionTips paramMissionTips;
            paramMissionTips.m_strText.m_Size = 0;
            memset(paramMissionTips.m_strText.m_szString, 0, sizeof(paramMissionTips.m_strText.m_szString));

            const char* pText = StringTable_GetText(140);
            if (pText)
            {
                UINT nLen = strlen(pText) + 1;
                paramMissionTips.m_strText.m_Size = (nLen - 1 <= 255) ? nLen - 1 : 255;
                if (paramMissionTips.m_strText.m_Size > 0)
                {
                    memcpy(paramMissionTips.m_strText.m_szString, pText, paramMissionTips.m_strText.m_Size);
                }
                paramMissionTips.m_strText.m_szString[paramMissionTips.m_strText.m_Size] = 0;
            }

            GCScriptCommand MsgTips;
            MsgTips._vptr_Packet = (INT (**)(...))0x084259C8;
            MsgTips.m_nCmdID = 5;
            memcpy(&MsgTips.m_paramEnentList, ¶mMissionTips, 0x102u);
            pGamePlayer->SendPacket(&MsgTips);
        }
        else
        {
            // 获取背包扩展信息 
            BLUE_EQUIP_TB* pBlueItemTB = g_ItemTable.GetBlueItemTB(pUseItem->m_pItem->m_ItemIndex);
            if (pBlueItemTB && pBlueItemTB->m_Bag > 0)
            {
                ExtSizeBag = pBlueItemTB->m_Bag;
                if (ExtSizeBag > 10)
                {
                    ExtSizeBag = 10;
                }
                // 检查原有背包空间是否大于新背包空间 
                BLUE_EQUIP_TB* pOldBlueItemTB = g_ItemTable.GetBlueItemTB(pEquipItem->m_pItem->m_ItemIndex);
                if (pBlueItemTB->m_Bag < (pOldBlueItemTB ? pOldBlueItemTB->m_Bag : 0))
                {
                    // 检查原有扩展空间中是否有物品 
                    for (INT i = pBlueItemTB->m_Bag + 20; i <= (pOldBlueItemTB ? pOldBlueItemTB->m_Bag : 0) + 20; ++i)
                    {
                        Item* pItem = pHuman->GetBaseContain()->GetItem(i);
                        if (!pItem->IsEmpty())
                        {
                            Msg.m_Result = 7;
                            pGamePlayer->SendPacket(&Msg);
                            RED_CacheLog(LOG_FILE_DEBUG, "CGUseEquipmentHandler GUID=%X: bag size err", pGamePlayer->m_HumanGUID);
                            return PACKET_EXE_CONTINUE;
                        }
                    }
                }
                // 标记是否需要扩展背包 
                if (pBlueItemTB->m_Bag != (pOldBlueItemTB ? pOldBlueItemTB->m_Bag : 0))
                {
                    ExtBag = TRUE;
                }
            }
        }
    }

    // 处理仓库扩展 
    if (Equip_Point == HEQUIP_BOX && !bEquipStatus)
    {
        BLUE_EQUIP_TB* pBlueItemTB = g_ItemTable.GetBlueItemTB( pUseItem->m_pItem->m_ItemIndex);
        if (pBlueItemTB && pBlueItemTB->m_Box > 0)
        {
            ExtSizeBox = pBlueItemTB->m_Box;
            if (ExtSizeBox > 10)
            {
                ExtSizeBox = 10;
            }
            // 检查原有仓库空间是否大于新仓库空间 
            BLUE_EQUIP_TB* pOldBlueItemTB = g_ItemTable.GetBlueItemTB(pEquipItem->m_pItem->m_ItemIndex);
            if (pBlueItemTB->m_Box < (pOldBlueItemTB ? pOldBlueItemTB->m_Box : 0))
            {
                // 检查原有扩展空间中是否有物品 
                for (INT j = pBlueItemTB->m_Box + 20; j <= (pOldBlueItemTB ? pOldBlueItemTB->m_Box : 0) + 20; ++j)
                {
                    Item* pItem = pHuman->GetMatContain()->GetItem(j);
                    if (!pItem->IsEmpty())
                    {
                        Msg.m_Result = 8;
                        pGamePlayer->SendPacket(&Msg);
                        RED_CacheLog(LOG_FILE_DEBUG, "CGUseEquipmentHandler GUID=%X: box size err", pGamePlayer->m_HumanGUID);
                        return PACKET_EXE_CONTINUE;
                    }
                }
            }
            // 标记是否需要扩展仓库 
            if (pBlueItemTB->m_Box != (pOldBlueItemTB ? pOldBlueItemTB->m_Box : 0))
            {
                ExtBox = TRUE;
            }
        }
    }

    // 获取背包容器 
    ItemContainer* pBagContainer = HumanItemLogic::GetContainer(pHuman, BagIndex);
    INT SimilarSecond = -1; // 副装备位置(如戒指2、护符2)

    // 处理戒指和护符的特殊情况 
    if (Equip_Point == HEQUIP_RING)
    {
        SimilarSecond = 11; // 戒指2的位置 
    }
    else if (Equip_Point == HEQUIP_CHARM)
    {
        SimilarSecond = 13; // 护符2的位置 
    }

    // 检查是否有空位 
    if (SimilarSecond != -1)
    {
        Item* pTempItem = pEquipContainer->GetItem(Equip_Point);
        if (pTempItem->IsEmpty())
        {
            // 主位置为空,使用主位置 
        }
        else
        {
            pTempItem = pEquipContainer->GetItem(SimilarSecond);
            if (!pTempItem->IsEmpty())
            {
                // 两个位置都满了,强制使用主位置并交换 
                Equip_Point = (HUMAN_EQUIP)EquipPoint;
                bEquipStatus = TRUE;
            }
            else
            {
                // 副位置为空,使用副位置 
                Equip_Point = (HUMAN_EQUIP)SimilarSecond;
                bEquipStatus = FALSE;
            }
        }
    }

    // 获取技能ID(用于后续效果处理)
    INT nDataIndex = -1;
    if (bEquipStatus)
    {
        if (pEquipItem->IsEquip())
        {
            EQUIP_TB* pEquipTB = g_ItemTable.GetEquipTB(pEquipItem->m_pItem->m_ItemIndex);
            if (pEquipTB)
            {
                nDataIndex = pEquipTB->m_SkillID;
            }
        }
        else
        {
            nDataIndex = pEquipItem->m_pItem->m_Medic.m_nSkillID;
        }
    }

    // 执行物品交换或移动 
    if (!bEquipStatus)
    {
        // 直接移动物品到装备位置 
        g_ItemOperator.MoveItem(pBagContainer, pBagContainer->BagIndex2ConIndex(BagIndex), pEquipContainer, Equip_Point);
        GREEN_CacheLog(LOG_FILE_DEBUG, "CGUseEquipmentHandler: GUID=%X MoveItem Success", pGamePlayer->m_HumanGUID);
    }
    else
    {
        // 交换物品位置 
        if (!g_ItemOperator.ExchangeItem(pBagContainer, pBagContainer->BagIndex2ConIndex(BagIndex), pEquipContainer, Equip_Point))
        {
            // 处理特殊装备效果 
            if (!EquipPoint && nDataIndex != -1 && pHuman->Impact_HaveImpactOfSpecificDataIndex(nDataIndex))
            {
                pHuman->Impact_DispelSpecificImpactByDataIndex(nDataIndex, 1);
            }

            // 检查戒指和护符的特殊装备 
            Item* pEquipRing = HumanItemLogic::GetEquip(pHuman, HEQUIP_RING);
            Item* pEquipRing2 = HumanItemLogic::GetEquip(pHuman, HEQUIP_RING_2);
            Item* pEquipCharm1 = HumanItemLogic::GetEquip(pHuman, HEQUIP_CHARM);
            Item* pEquipCharm2 = HumanItemLogic::GetEquip(pHuman, HEQUIP_CHARM_2);

            UINT nRingID = pEquipRing->m_pItem ? pEquipRing->m_pItem->m_ItemIndex : 0;
            UINT nRing2ID = pEquipRing2->m_pItem ? pEquipRing2->m_pItem->m_ItemIndex : 0;
            UINT nCharm1ID = pEquipCharm1->m_pItem ? pEquipCharm1->m_pItem->m_ItemIndex : 0;
            UINT nCharm2ID = pEquipCharm2->m_pItem ? pEquipCharm2->m_pItem->m_ItemIndex : 0;

            // 处理戒指效果 
            if ((EquipPoint == 6 || EquipPoint == 11) &&
                nRingID != 10422016 && nRing2ID != 10422016 &&
                nDataIndex != -1 && pHuman->Impact_HaveImpactOfSpecificDataIndex(nDataIndex))
            {
                pHuman->Impact_DispelSpecificImpactByDataIndex(nDataIndex, 1);
            }

            // 处理护符效果 
            if ((EquipPoint - 12) <= 1 &&
                nCharm1ID != 10423024 && nCharm2ID != 10423024 &&
                nDataIndex != -1 && pHuman->Impact_HaveImpactOfSpecificDataIndex(nDataIndex))
            {
                pHuman->Impact_DispelSpecificImpactByDataIndex(nDataIndex, 1);
            }

            if ((EquipPoint - 12) <= 1 &&
                nCharm1ID != 10423025 && nCharm2ID != 10423025 &&
                nDataIndex != -1 && pHuman->Impact_HaveImpactOfSpecificDataIndex(nDataIndex))
            {
                pHuman->Impact_DispelSpecificImpactByDataIndex(nDataIndex, 1);
            }

            if ((EquipPoint - 12) <= 1 &&
                nCharm1ID != 10423026 && nCharm2ID != 10423026 &&
                nDataIndex != -1 && pHuman->Impact_HaveImpactOfSpecificDataIndex(nDataIndex))
            {
                pHuman->Impact_DispelSpecificImpactByDataIndex(nDataIndex, 1);
            }
            RED_CacheLog(LOG_FILE_DEBUG, "CGUseEquipmentHandler: GUID=%X ExchangeItem Success", pGamePlayer->m_HumanGUID);
        }
    }

    // 设置绑定状态 
    Item* pEquip = pEquipContainer->GetItem(Equip_Point);
    if (pEquip && pEquip->IsCanEquipBind())
    {
        g_ItemOperator.SetItemBind(pEquipContainer, Equip_Point);
    }

    // 发送结果消息 
    Msg.m_BagIndex = BagIndex;
    Msg.m_EquipPoint = Equip_Point;
    Msg.m_EquipID = pEquipItem->GetGUID();
    Msg.m_EquipResId = pEquipItem->GetItemTableIndex();
    Msg.m_ItemResId = pUseItem->GetItemTableIndex();
    Msg.m_ItemID = pUseItem->GetGUID();
    Msg.m_Result = USEEQUIP_SUCCESS;
    pGamePlayer->SendPacket(&Msg);

    // 更新装备版本号 
    BYTE yEquipmentVer = pHuman->m_yEquipmentVer;
    pHuman->m_yEquipmentVer = (yEquipmentVer == 0xFE) ? 0 : yEquipmentVer + 1;

    // 刷新装备效果 
    pHuman->ItemEffectFlush();

    // 处理武器技能效果 
    if (Equip_Point == HEQUIP_WEAPON && pEquip)
    {
        INT nSkillID = -1;
        if (pEquip->IsEquip())
        {
            EQUIP_TB* pEquipTB = g_ItemTable.GetEquipTB(pEquip->m_pItem->m_ItemIndex);
            if (pEquipTB)
            {
                nSkillID = pEquipTB->m_SkillID;
            }
        }
        else
        {
            nSkillID = pEquip->m_pItem->m_Medic.m_nSkillID;
        }

        if (nSkillID != -1 && !g_ImpactCore.ImpactCore_T::SendImpactToUnit(*pHuman, nSkillID, pHuman->GetID(), 0, 0, 0, 0))
        {
            RED_CacheLog(LOG_FILE_DEBUG, "ERROR CGUseEquipmentHandler::SendImpactToUnit GUID=%X ItemID=%d SkillID=%d",
                pGamePlayer->m_HumanGUID, pEquip->m_pItem->m_ItemIndex, nSkillID);
        }
    }

    // 处理特殊装备效果 
    if (pEquip)
    {
        UINT nItemID = pEquip->m_pItem->m_ItemIndex;
        BOOL bIsSpecial = ItemRulerCheck::IsInSpecialIDSet(nItemID);

        if ((nItemID != 10422016 && nItemID != 10423024 && nItemID != 10423025 && nItemID != 10423026 && !bIsSpecial) || !pEquip)
        {
            // 不是特殊装备,跳过 
        }
        else
        {
            INT nSkillID = -1;
            if (pEquip->IsEquip())
            {
                EQUIP_TB* pEquipTB = g_ItemTable.GetEquipTB(pEquip->m_pItem->m_ItemIndex);
                if (pEquipTB)
                {
                    nSkillID = pEquipTB->m_SkillID;
                }
            }
            else
            {
                nSkillID = pEquip->m_pItem->m_Medic.m_nSkillID;
            }

            if (nSkillID != -1 && !g_ImpactCore.ImpactCore_T::SendImpactToUnit(*pHuman, nSkillID, pHuman->GetID(), 0, 0, 0, 0))
            {
                RED_CacheLog(LOG_FILE_DEBUG, "ERROR CGUseEquipmentHandler::SendImpactToUnit GUID=%X ItemID=%d SkillID=%d",
                    pGamePlayer->m_HumanGUID, pEquip->m_pItem->m_ItemIndex, nSkillID);
            }
        }
    }

    // 广播装备变化 
    if (pHuman->IsVisualPart(Equip_Point))
    {
        GCCharEquipment OtherMsg;
        OtherMsg.m_uEquipmentVer = 255;
        OtherMsg.m_ObjID = -1;
        OtherMsg._vptr_Packet = (INT (**)(...))0x08429968;
        OtherMsg.m_wFlags = 0;
        OtherMsg.m_uEquipmentVer = pHuman->m_yEquipmentVer;
        OtherMsg.m_ObjID = pHuman->GetID();

        if (Equip_Point == HEQUIP_DRESS)
        {
            // 处理服装显示 
            if ((pHuman->GetDB()->GetSettingDB()->m_aSetting[1].m_SettingData & 0x100000) != 0)
            {
                OtherMsg.m_DressID = -1;  // 隐藏服装 
            }
            else
            {
                OtherMsg.m_DressID = pEquip->m_pItem->m_ItemIndex;
            }
            OtherMsg.m_wFlags |= 0x10000u;
        }
        else
        {
            UINT nItemID = pEquip->m_pItem->m_ItemIndex;
            UINT nGemID = pHuman->GetEquipGemID(Equip_Point);

            // 根据装备位置设置消息内容 
            switch (Equip_Point)
            {
            case HEQUIP_WEAPON:
                OtherMsg.m_WeaponID = nItemID;
                OtherMsg.m_WeaponGemID = nGemID;

                OtherMsg.m_wFlags |= 1;
                break;
            case HEQUIP_CAP:
                OtherMsg.m_CapID = nItemID;
                OtherMsg.m_CapGemID = nGemID;
                OtherMsg.m_wFlags |= 2;
                break;
            case HEQUIP_ARMOR:
                OtherMsg.m_ArmourID = nItemID;
                OtherMsg.m_ArmourGemID = nGemID;
                OtherMsg.m_wFlags |= 4;
                break;
            case HEQUIP_CUFF:
                OtherMsg.m_CuffID = nItemID;
                OtherMsg.m_CuffGemID = nGemID;
                OtherMsg.m_wFlags |= 8;
                break;
            case HEQUIP_BOOT:
                OtherMsg.m_BootID = nItemID;
                OtherMsg.m_BootGemID = nGemID;
                OtherMsg.m_wFlags |= 0x10;
                break;
            case HEQUIP_DRESS:
                OtherMsg.m_DressID = nItemID ? nItemID : -1;
                OtherMsg.m_wFlags |= 0x10000;
                break;
            default:
                break;
            }

            // 处理外观 
            switch (Equip_Point)
            {
            case HEQUIP_WEAPON:
                if (pEquip->IsEquip())
                {
                    OtherMsg.m_WeaponVisual = pEquip->m_pItem->m_Equip.m_Visual;
                }
                OtherMsg.m_wFlags |= 1;
                break;
            case HEQUIP_CAP:
                if (pEquip->IsEquip())
                {
                    OtherMsg.m_CapVisual = pEquip->m_pItem->m_Equip.m_Visual;
                }
                OtherMsg.m_wFlags |= 2;
                break;
            case HEQUIP_ARMOR:
                if (pEquip->IsEquip())
                {
                    OtherMsg.m_ArmourVisual = pEquip->m_pItem->m_Equip.m_Visual;
                }
                OtherMsg.m_wFlags |= 4;
                break;
            case HEQUIP_CUFF:
                if (pEquip->IsEquip())
                {
                    OtherMsg.m_CuffVisual = pEquip->m_pItem->m_Equip.m_Visual;
                }
                OtherMsg.m_wFlags |= 8;
                break;
            case HEQUIP_BOOT:
                if (pEquip->IsEquip())
                {
                    OtherMsg.m_BootVisual = pEquip->m_pItem->m_Equip.m_Visual;
                }
                OtherMsg.m_wFlags |= 0x10;
                break;
            default:
                break;
            }
        }

        // 广播装备变化消息 
        pScene->BroadCast(&OtherMsg, pHuman, TRUE);
    }

    // 处理背包/仓库扩展 
    if (ExtBag || ExtBox)
    {
        GCBagSizeChange bsmsg;
        bsmsg._vptr_Packet = (INT (**)(...))0x0841D1E8;

        if (ExtBag)
        {
            pHuman->GetBaseContain()->SetContainerSize(ExtSizeBag + 20);
        }

        if (ExtBox)
        {
            pHuman->GetMatContain()->SetContainerSize(ExtSizeBox + 20);
        }

        // 发送背包/仓库大小变化消息 
        bsmsg.SetExtBagSize(pHuman->GetBaseContain()->m_nRealSize);
        bsmsg.SetExtBoxSize(pHuman->GetMatContain()->m_nRealSize);
        pGamePlayer->SendPacket(&bsmsg);
    }

    // 发送装备列表更新 
    GCDetailEquipList SelfMsg;
    SelfMsg._vptr_Packet = (INT (**)(...))0x0841D7C8;
    _ITEM* pItemList = SelfMsg.GetEquipData();
    for (INT k = 18; k != -1; --k)
    {
        pItemList->m_ItemGUID.m_Serial = 0;
        pItemList->m_ItemGUID.m_Server = 0;
        pItemList->m_ItemGUID.m_World = 0;
        memset(pItemList++, 0, sizeof(_ITEM));
    }
    SelfMsg.SetAskPart(0);
    SelfMsg.setObjID(pHuman->GetID());

    // 获取装备物品 
    Item* pEquipItema = HumanItemLogic::GetEquip(pHuman,Equip_Point);
    if (pEquipItema == nullptr)
    {
        RED_CacheLog(LOG_FILE_DEBUG, "ERROR CGUseEquipmentHandler: GUID=%X EPoint=%d pEquipItem Fail",pGamePlayer->m_HumanGUID, Equip_Point);
        return PACKET_EXE_CONTINUE;
    }

    if (pEquipItema->IsEmpty())
    {
        RED_CacheLog(LOG_FILE_DEBUG, "ERROR CGUseEquipmentHandler: GUID=%X Equip_Point =%d Fail",pGamePlayer->m_HumanGUID, Equip_Point);
        return PACKET_EXE_CONTINUE;
    }

    // 更新装备列表消息 
    pEquipItema->SaveValueTo(&SelfMsg.m_ItemList[Equip_Point]);
    SelfMsg.SetAskPart(1 << Equip_Point);
    pGamePlayer->SendPacket(&SelfMsg);

    CacheLog(LOG_FILE_DEBUG, "CGUseEquipmentHandler: GUID=%X BagIndex=%d itemClass=%d",pGamePlayer->m_HumanGUID, BagIndex, itemClass);

    return PACKET_EXE_CONTINUE;
    __LEAVE_FUNCTION;
    return PACKET_EXE_ERROR;
}
付费看帖
剩余 1% 内容需要支付 200.00 金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
您需要登录后才可以回帖 登录 | register

本版积分规则

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

GMT+8, 2025-5-9 23:52 , Processed in 0.101750 second(s), 8 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

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