编写人员:雪舞
编写时间: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
金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。