uint CGEquipLevelupHandler::Execute(CGEquipLevelup* 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(pHuman->m_ExchangBox.m_Status > 0) {//丢弃 g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: ObjID=%d, ExchangBox::m_Status>0" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; } //摆摊状态不可操作 if(pHuman->m_StallBox.GetStallStatus() == ServerStallBox::STALL_OPEN) {//丢弃 g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: ObjID=%d, ServerStallBox::STALL_OPEN" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; } Item* pEquipItem = NULL; UINT EquipPoint = INVALID_ITEM_POS; UINT BagIndex = INVALID_ITEM_POS; EQUIPLEVEUP_RESULT nResult = EQUIPLEVEUP_FAIL; GCEquipLevelupResult Msg; switch(pPacket->GetEquipPosType()) { case ENUM_EQUIP_POINT: { EquipPoint = pPacket->GetPos(); if(EquipPoint>HEQUIP_ADORN2) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipLevelupHandler: EquipPoint error, EquipPoint=%d", EquipPoint) ; return PACKET_EXE_ERROR; } ItemContainer* pEquipContainer = pHuman->GetEquipContain(); if(NULL==pEquipContainer) { AssertEx(FALSE,"[CGUseGem]: NULL EquipContainer pointer found!"); } pEquipItem = pEquipContainer->GetItem((UINT)EquipPoint); Assert(pEquipItem); if(pEquipItem->IsEmpty()) { nResult = EQUIPLEVEUP_EQUIP_FAIL; Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipLevelupHandler pEquipItem is Null at EquipPoint= %d", EquipPoint) ; return PACKET_EXE_CONTINUE; } Assert (pEquipItem->GetItemClass() == ICLASS_EQUIP); if(!(pPacket->getItemID() == pEquipItem->GetGUID())) { nResult = EQUIPLEVEUP_EQUIP_FAIL; Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipLevelupHandler GUID is different ") ; return PACKET_EXE_CONTINUE; } } break; case ENUM_BAG: { BagIndex = pPacket->GetPos(); ItemContainer* pItemContainer = HumanItemLogic::GetBagContainer(pHuman,BagIndex); if( pItemContainer == NULL ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipLevelupHandler: BagIndex error, BagIndex=%d", BagIndex) ; return PACKET_EXE_ERROR; } if (!pItemContainer->IsCanUse()) { nResult = EQUIPLEVEUP_BAG_INVALID; Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipLevelupHandler: ItemContainer is invalid, ContainerType=%d, BagIndex=%d", pItemContainer->GetContainerType(), BagIndex) ; return PACKET_EXE_ERROR; } pEquipItem = pItemContainer->GetItem(pItemContainer->BagIndex2ConIndex(BagIndex)); if(pEquipItem->IsEmpty()) { nResult = EQUIPLEVEUP_EQUIP_FAIL; Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "Obj_Human::EquipLevelup pEquipItem is Null at BagIndex= %d", BagIndex) ; return PACKET_EXE_CONTINUE; } if (pEquipItem->GetItemClass() != ICLASS_EQUIP) { nResult = EQUIPLEVEUP_EQUIP_FAIL; Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "EquipLevelup GetItemClass is not ICLASS_EQUIP ") ; return PACKET_EXE_CONTINUE; } if(!(pPacket->getItemID() == pEquipItem->GetGUID())) { nResult = EQUIPLEVEUP_EQUIP_FAIL; Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "Obj_Human::EquipLevelup GUID is different ") ; return PACKET_EXE_CONTINUE; } if (pEquipItem->GetItemType() > EQUIP_ADORN) { nResult = EQUIPLEVEUP_EQUIP_FAIL; Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "Obj_Human::EquipLevelup GUID is different ") ; return PACKET_EXE_CONTINUE; } } break; default: { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipLevelupHandler: EquipFromType error, EquipFromType=%d", pPacket->GetEquipPosType()) ; return PACKET_EXE_ERROR; } break; } INT nCurLevel = pEquipItem->GetCurLevel(); if(nCurLevel >=MAX_EQUIP_LEVELUP_NUM) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipLevelupHandler LEVEL full ") ; nResult = EQUIPLEVEUP_FULL_FAIL; Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; return PACKET_EXE_CONTINUE; } nResult = (EQUIPLEVEUP_RESULT)pHuman->EquipLevelup(pEquipItem, pPacket->getGemID(), pPacket->GetGemNum()); if(nResult == EQUIPLEVEUP_FAIL) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipLevelupHandler: pHuman->AddHole Fail") ; return PACKET_EXE_ERROR; } Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; ////////////////////////////////////////////////////////////////////////// if((nResult == EQUIPLEVEUP_SUCCESS)||(nResult == EQUIPLEVEUP_FAIL_SUCCESS)) { if(pPacket->GetEquipPosType() == ENUM_EQUIP_POINT) { pHuman->ItemEffectFlush(); pHuman->SetEquipVer(pHuman->GetEquipVer()+1); INT Equip_Point = pPacket->GetPos(); UINT RetPart = 0; GCDetailEquipList SelfMsg; SelfMsg.setObjID( pHuman->GetID() ); Item* pEquipItem = HumanItemLogic::GetEquip(pHuman, (HUMAN_EQUIP)Equip_Point); if(!pEquipItem) { Assert(FALSE); } if(pEquipItem->IsEmpty()) { Assert(FALSE); } pEquipItem->SaveValueTo(SelfMsg.GetEquipData((HUMAN_EQUIP)Equip_Point)); RetPart|=(1<<((UINT)Equip_Point)); SelfMsg.SetAskPart(RetPart); pGamePlayer->SendPacket( &SelfMsg ) ; } else { GCItemInfo EquipMsg; EquipMsg.setIsNull(FALSE); EquipMsg.setID(BagIndex); pEquipItem->SaveValueTo(EquipMsg.getItem()); pHuman->GetPlayer()->SendPacket(&EquipMsg); } } g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipLevelupHandler: success nResult=%d", nResult ) ; return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR; }
UINT CGSouXiaRefiningHandler::Execute( CGSouXiaRefining* 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 ); //切场景时丢弃换装消息 //交易状态不可操作 //摆摊状态不可操作 // 获取缝合的捜侠录和缝合道具 BYTE iRefiningSouXiaItem = pPacket->GetRefiningSouXiaIndex(); Assert(iRefiningSouXiaItem >= 0 ); Assert(iRefiningSouXiaItem <= MAX_BAG_SIZE); BYTE iRefiningSouXiaItem2 = pPacket->GetRefiningSouXia2Index(); Assert(iRefiningSouXiaItem2 >= 0 ); Assert(iRefiningSouXiaItem2 <= MAX_BAG_SIZE); BYTE iRefiningItem = pPacket->GetRefiningItemIndex(); Assert(iRefiningItem >= 0 ); Assert(iRefiningItem <= MAX_BAG_SIZE); GCSouXiaRefining refiningMsg; // 背包索引获取搜侠道具信息并验证 ItemContainer* pBagContainer = HumanItemLogic::GetBagContainer(pHuman, iRefiningSouXiaItem); if (pBagContainer == NULL) { g_pLog->FastSaveLog( LOG_FILE_1, "CGSouXiaRefining souxia BagIndex is invalid, BagIndex = %d", iRefiningSouXiaItem) ; return PACKET_EXE_ERROR; } Item* pRefiningSouXiaItem = pBagContainer->GetItem(pBagContainer->BagIndex2ConIndex(iRefiningSouXiaItem)); if(pRefiningSouXiaItem->GetItemClass() != ICLASS_EQUIP || EQUIP_SOUXIA != pRefiningSouXiaItem->GetItemType()) { g_pLog->FastSaveLog( LOG_FILE_1, "CGSouXiaRefining souxia type is invalid, BagIndex = %d", iRefiningSouXiaItem) ; refiningMsg.SetResult(GET_ITEM_ERROR); pGamePlayer->SendPacket(&refiningMsg); return PACKET_EXE_ERROR; } // 背包索引获取第二本搜侠录道具信息 pBagContainer = HumanItemLogic::GetBagContainer(pHuman, iRefiningSouXiaItem2); if (pBagContainer == NULL) { g_pLog->FastSaveLog( LOG_FILE_1, "CGSouXiaRefining souxia BagIndex is invalid, BagIndex = %d", iRefiningSouXiaItem2) ; return PACKET_EXE_ERROR; } Item* pRefiningSouXiaItem2 = pBagContainer->GetItem(pBagContainer->BagIndex2ConIndex(iRefiningSouXiaItem2)); if(pRefiningSouXiaItem2->GetItemClass() != ICLASS_EQUIP || EQUIP_SOUXIA != pRefiningSouXiaItem2->GetItemType()) { g_pLog->FastSaveLog( LOG_FILE_1, "CGSouXiaRefining souxia type is invalid, BagIndex = %d", iRefiningSouXiaItem2) ; refiningMsg.SetResult(GET_ITEM_ERROR); pGamePlayer->SendPacket(&refiningMsg); return PACKET_EXE_ERROR; } // 背包索引获取炼化道具信息 pBagContainer = HumanItemLogic::GetBagContainer(pHuman, iRefiningItem); if (pBagContainer == NULL) { g_pLog->FastSaveLog( LOG_FILE_1, "CGSouXiaRefining refiningItem BagIndex is invalid, BagIndex = %d", iRefiningItem) ; return PACKET_EXE_ERROR; } Item* pRefiningItem = pBagContainer->GetItem(pBagContainer->BagIndex2ConIndex(iRefiningItem)); if(pRefiningItem->GetItemClass() != ICLASS_COMITEM || COMITEM_SOUXIA != pRefiningItem->GetItemType()) { g_pLog->FastSaveLog( LOG_FILE_1, "CGSouXiaRefining refiningItem type is invalid, BagIndex = %d", iRefiningSouXiaItem2) ; refiningMsg.SetResult(GET_ITEM_ERROR); pGamePlayer->SendPacket(&refiningMsg); return PACKET_EXE_ERROR; } SOUXIA_INFO_TB* pGet = g_ItemTable.GetSouXiaTB(pRefiningItem->GetItemTableIndex()); if (NULL != pGet && ITEM_REFINING == pGet->m_nUseType) { if(pGet->m_nNeedLevel > pHuman->GetLevel()) // 使用道具没有达到限制等级 { refiningMsg.SetResult(HUMAN_LEVEL_NOT_ENOUGH); Player* pPlayer = pHuman->GetPlayer(); if( pPlayer != NULL ) { pPlayer->SendPacket( &refiningMsg ); } return PACKET_EXE_CONTINUE; } } // 炼化逻辑 ItemParamValue ipv = (ItemParamValue)IPV_INT; INT iParamSouXiaID = pRefiningSouXiaItem->GetItemParam(0,ipv); INT iParamSouXiaPos = pRefiningSouXiaItem->GetItemParam(4,ipv); INT iParamSouXiaID2 = pRefiningSouXiaItem2->GetItemParam(0,ipv); INT iParamSouXiaPos2 = pRefiningSouXiaItem2->GetItemParam(4,ipv); //两本捜侠录都为空 if ( (iParamSouXiaID == 0 && iParamSouXiaPos <= 0 ) && (iParamSouXiaID2 == 0 && iParamSouXiaPos2 <= 0 )) { refiningMsg.SetResult(SOUXIA_EMPTY); Player* pPlayer = pHuman->GetPlayer(); if( pPlayer != NULL ) { pPlayer->SendPacket( &refiningMsg ); } return PACKET_EXE_CONTINUE; } BOOL bRefiningResult = FALSE; BYTE refiningType = 0; BYTE refiningRule = 0; SHORT refiningRate = -1; BYTE randNum = pScene->GetRand100(); SOUXIA_DATA randSouXiaData;//炼化随机后取得的新数据 if (pGet->m_nRefiningRule[0][0] > 0)//炼化技能道具 { refiningRule = pGet->m_nRefiningRule[0][0]; refiningRate = pGet->m_nRefiningRule[0][1]; if (randNum < refiningRate) { bRefiningResult = SouXiaLogic::RefiningSouXia(pHuman, pRefiningSouXiaItem, pRefiningSouXiaItem2, refiningRule, randSouXiaData, ITEM_SOUXIASKILL); refiningType = ITEM_SOUXIASKILL; } } else if (pGet->m_nRefiningRule[1][0] > 0)//炼化配方道具 { refiningRule = pGet->m_nRefiningRule[1][0]; refiningRate = pGet->m_nRefiningRule[1][1]; if (randNum < refiningRate) { bRefiningResult = SouXiaLogic::RefiningSouXia(pHuman, pRefiningSouXiaItem, pRefiningSouXiaItem2, refiningRule, randSouXiaData, ITEM_PRODUCT); refiningType = ITEM_PRODUCT; } } else if (pGet->m_nRefiningRule[2][0] > 0)//炼化神兽召唤道具 { refiningRule = pGet->m_nRefiningRule[2][0]; refiningRate = pGet->m_nRefiningRule[2][1]; if (randNum < refiningRate) { bRefiningResult = SouXiaLogic::RefiningSouXia(pHuman, pRefiningSouXiaItem, pRefiningSouXiaItem2, refiningRule, randSouXiaData, ITEM_PET_ZHAOHUAN); refiningType = ITEM_PET_ZHAOHUAN; } } else if (pGet->m_nRefiningRule[3][0] > 0)//炼化坐骑召唤道具 { refiningRule = pGet->m_nRefiningRule[3][0]; refiningRate = pGet->m_nRefiningRule[3][1]; if (randNum < refiningRate) { bRefiningResult = SouXiaLogic::RefiningSouXia(pHuman, pRefiningSouXiaItem, pRefiningSouXiaItem2, refiningRule, randSouXiaData, ITEM_ZUOJI_ZHAOHUAN); refiningType = ITEM_ZUOJI_ZHAOHUAN; } } if (!bRefiningResult) { refiningMsg.SetResult(SOUXIA_SKILL_REFINING_FAIL); Player* pPlayer = pHuman->GetPlayer(); if( pPlayer != NULL ) { pPlayer->SendPacket( &refiningMsg ); } return PACKET_EXE_CONTINUE; } // 手续费用的扣除 // 成功删除使用的道具和捜侠录 if (randNum <= refiningRate) { UINT newSouXiaIndex = 0; BYTE newSouXiaCurPos = 0; // 取玩家身上捜侠录的数据pos 和 skillId if (iParamSouXiaID == 0 && iParamSouXiaPos <= 0)//第一本为空 { newSouXiaIndex = iParamSouXiaID2; newSouXiaCurPos = iParamSouXiaPos2; } if (iParamSouXiaID2 == 0 && iParamSouXiaPos2 <= 0)//第二本为空 { newSouXiaIndex = iParamSouXiaID; newSouXiaCurPos = iParamSouXiaPos; } // 第一本的最大页数 BYTE maxPage = 0, maxPage2 = 0; pGet = g_ItemTable.GetSouXiaTB(pRefiningSouXiaItem->GetItemTableIndex()); Assert(pGet); maxPage = pGet->m_nMaxPages[0]; // 第二本最大页数 pGet = g_ItemTable.GetSouXiaTB(pRefiningSouXiaItem2->GetItemTableIndex()); Assert(pGet); maxPage2 = pGet->m_nMaxPages[0]; ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_REFINING_SOUXIA; UINT newSouXiaBagIndex = 0;//新的捜侠录item背包索引 if (maxPage >= maxPage2) // 第一本的最大页大于第二本则保留第一本 { BOOL bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman, pBagContainer->BagIndex2ConIndex(iRefiningSouXiaItem2)); if(bRet) { SaveItemLog(&ItemLogParam); } else { refiningMsg.SetResult(ERASE_ITEM_FAIL); pGamePlayer->SendPacket(&refiningMsg); return PACKET_EXE_CONTINUE; } if (iParamSouXiaPos2 >= 0) { pHuman->EraseSouXia(iParamSouXiaPos2);//人身上销毁第二本 } newSouXiaBagIndex = iRefiningSouXiaItem;//保留第一本的数据的bagindex if ( (iParamSouXiaID > 0 && iParamSouXiaPos >= 0) && (iParamSouXiaID2 > 0 && iParamSouXiaPos2 >= 0)) { newSouXiaIndex = iParamSouXiaID; newSouXiaCurPos = iParamSouXiaPos; } } else // 销毁第一本 { BOOL bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman, pBagContainer->BagIndex2ConIndex(iRefiningSouXiaItem)); if(bRet) { SaveItemLog(&ItemLogParam); } else { refiningMsg.SetResult(ERASE_ITEM_FAIL); pGamePlayer->SendPacket(&refiningMsg); return PACKET_EXE_CONTINUE; } if (iParamSouXiaPos >= 0) { pHuman->EraseSouXia(iParamSouXiaPos);//人身上销毁第一本 } newSouXiaBagIndex = iRefiningSouXiaItem2;//保留第二本的数据的bagindex if ( (iParamSouXiaID > 0 && iParamSouXiaPos >= 0) && (iParamSouXiaID2 > 0 && iParamSouXiaPos2 >= 0)) { newSouXiaIndex = iParamSouXiaID2; newSouXiaCurPos = iParamSouXiaPos2; } } Assert (newSouXiaIndex > 0 && newSouXiaCurPos >= 0); randSouXiaData.m_CurPos = newSouXiaCurPos; randSouXiaData.m_SouXiaID = newSouXiaIndex; // 销毁炼化道具 BOOL bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman, pBagContainer->BagIndex2ConIndex(iRefiningItem)); if(bRet) { SaveItemLog(&ItemLogParam); } else { refiningMsg.SetResult(ERASE_ITEM_FAIL); pGamePlayer->SendPacket(&refiningMsg); return PACKET_EXE_CONTINUE; } // 改变保留的捜侠录道具的信息 Item* pNewSouXiaItem = HumanItemLogic::GetBagItem(pHuman, pBagContainer->BagIndex2ConIndex(newSouXiaBagIndex)); Assert(pNewSouXiaItem); bRet = g_ItemOperator.SetItemParam( pHuman->GetBaseContain(),pHuman->GetBaseContain()->BagIndex2ConIndex(newSouXiaBagIndex),0, ipv, newSouXiaIndex); if (!bRet) { return PACKET_EXE_CONTINUE; } bRet = g_ItemOperator.SetItemParam( pHuman->GetBaseContain(),pHuman->GetBaseContain()->BagIndex2ConIndex(newSouXiaBagIndex), 4, ipv, newSouXiaCurPos); if (!bRet) { return PACKET_EXE_CONTINUE; } /*bRet = g_ItemOperator.SetItemParam( pHuman->GetBaseContain(),pHuman->GetBaseContain()->BagIndex2ConIndex(newSouXiaBagIndex),8, ipv, refiningType); if (!bRet) { return PACKET_EXE_CONTINUE; }*/ // 以上设置ITEM param注意保存到文件,并且要通知ITEM 的param 改变 GCItemInfo Msg; Msg.setID( newSouXiaBagIndex ); Msg.setIsNull(FALSE); pNewSouXiaItem->SaveValueTo(Msg.getItem()); pHuman->GetPlayer()->SendPacket(&Msg); pHuman->SetSouXia(randSouXiaData, newSouXiaCurPos); // 保存到文件 _SOUXIA_DB_LOAD SouXia_db_Load; SouXia_db_Load.m_SouXiaData[newSouXiaCurPos] = randSouXiaData; pHuman->GetDB()->SetSouXiaDBInfo(&SouXia_db_Load, newSouXiaCurPos); // 发送新的捜侠录消息 refiningMsg.SetNewItemBagIndex(newSouXiaBagIndex); refiningMsg.SetSouXiaData(&randSouXiaData);//炼化以后的捜侠录数据 refiningMsg.SetCurRefiningType(refiningType); refiningMsg.SetResult(SOUXIA_REFINING_SUCCESS); Player* pPlayer = pHuman->GetPlayer(); if( pPlayer != NULL ) { pPlayer->SendPacket( &refiningMsg ); } } return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR; }
uint CGEquipRemouldHandler::Execute(CGEquipRemould* 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(pHuman->m_ExchangBox.m_Status > 0) {//丢弃 g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: ObjID=%d, ExchangBox::m_Status>0" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; } //摆摊状态不可操作 if(pHuman->m_StallBox.GetStallStatus() == ServerStallBox::STALL_OPEN) {//丢弃 g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: ObjID=%d, ServerStallBox::STALL_OPEN" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; } Item* pEquipItem = NULL; UINT EquipPoint = INVALID_ITEM_POS; UINT BagIndex = INVALID_ITEM_POS; EQUIPREMOULD_RESULT nResult = EQUIPREMOULD_FAIL; GCEquipRemouldResult Msg; switch(pPacket->GetEquipPosType()) { case ENUM_EQUIP_POINT: { EquipPoint = pPacket->GetPos(); if(EquipPoint>HEQUIP_ADORN2) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRemouldHandler: EquipPoint error, EquipPoint=%d", EquipPoint) ; return PACKET_EXE_ERROR; } ItemContainer* pEquipContainer = pHuman->GetEquipContain(); if(NULL==pEquipContainer) { AssertEx(FALSE,"[CGEquipRemouldHandler]: NULL EquipContainer pointer found!"); } pEquipItem = pEquipContainer->GetItem((UINT)EquipPoint); Assert(pEquipItem); if(pEquipItem->IsEmpty()) { nResult = EQUIPREMOULD_EQUIP_FAIL; Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRemouldHandler pEquipItem is Null at EquipPoint= %d", EquipPoint) ; return PACKET_EXE_CONTINUE; } Assert (pEquipItem->GetItemClass() == ICLASS_EQUIP); if(!(pPacket->getItemID() == pEquipItem->GetGUID())) { nResult = EQUIPREMOULD_EQUIP_FAIL; Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRemouldHandler GUID is different ") ; return PACKET_EXE_CONTINUE; } } break; case ENUM_BAG: { BagIndex = pPacket->GetPos(); ItemContainer* pItemContainer = HumanItemLogic::GetBagContainer(pHuman,BagIndex); if( pItemContainer == NULL ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRemouldHandler: BagIndex error, BagIndex=%d", BagIndex) ; return PACKET_EXE_ERROR; } if (!pItemContainer->IsCanUse()) { nResult = EQUIPREMOULD_BAG_INVALID; Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRemouldHandler: ItemContainer is invalid, ContainerType=%d, BagIndex=%d", pItemContainer->GetContainerType(), BagIndex) ; return PACKET_EXE_ERROR; } pEquipItem = pItemContainer->GetItem(pItemContainer->BagIndex2ConIndex(BagIndex)); if(pEquipItem->IsEmpty()) { nResult = EQUIPREMOULD_EQUIP_FAIL; Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRemouldHandler pEquipItem is Null at BagIndex= %d", BagIndex) ; return PACKET_EXE_CONTINUE; } if (pEquipItem->GetItemClass() != ICLASS_EQUIP) { nResult = EQUIPREMOULD_EQUIP_FAIL; Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRemouldHandler GetItemClass is not ICLASS_EQUIP ") ; return PACKET_EXE_CONTINUE; } if(!(pPacket->getItemID() == pEquipItem->GetGUID())) { nResult = EQUIPREMOULD_EQUIP_FAIL; Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRemouldHandler GUID is different ") ; return PACKET_EXE_CONTINUE; } if (pEquipItem->GetItemType() > EQUIP_ADORN) { nResult = EQUIPREMOULD_EQUIP_FAIL; Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRemouldHandler GUID is different ") ; return PACKET_EXE_CONTINUE; } } break; default: { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRemouldHandler: EquipFromType error, EquipFromType=%d", pPacket->GetEquipPosType()) ; return PACKET_EXE_ERROR; } break; } if (pEquipItem->GetEquipFromType() != ITEM_CREATE) { nResult = EQUIPREMOULD_TYPE_FAIL; Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRemouldHandler Type error ") ; return PACKET_EXE_CONTINUE; } ITEM_PRODUCT_INFO_TB* pCreateTB = g_ItemTable.GetItemProductInfoTB(pEquipItem->GetItemTableIndex()); if(pCreateTB == NULL) { nResult = EQUIPREMOULD_EQUIP_FAIL; Msg.SetResult(nResult); pGamePlayer->SendPacket(&Msg); return PACKET_EXE_CONTINUE; } if (pCreateTB->m_nRemouldInfoCount != pPacket->GetValidNum()) { return PACKET_EXE_ERROR; } if (pCreateTB->m_RemouldMoney > pHuman->GetMoney()) { nResult = EQUIPREMOULD_MONEY_FAIL; Msg.SetResult(nResult); pGamePlayer->SendPacket(&Msg); return PACKET_EXE_CONTINUE; } struct MATERIAL_REQ { UINT m_nIndex; UINT m_nCount; }; MATERIAL_REQ MaterialIndex[MAX_REMOULD_MATERIAL_NUM]; UINT nEquipScore = 0; for (UINT i=0; i<pCreateTB->m_nRemouldInfoCount; ++i) { REMOULDITEM_INFO RemouldInfo = pCreateTB->m_RemouldInfo[i]; EQUIPREMOULD_MATERIAL_INFO MaterialInfo = pPacket->GetMaterialReq(i); if(MaterialInfo.m_nMaterialType != RemouldInfo.m_MaterialType) { nResult = EQUIPREMOULD_MATERIAL_FAIL; Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRemouldHandler MaterialType error") ; return PACKET_EXE_CONTINUE; } if(MaterialInfo.m_nMaterialLevel < RemouldInfo.m_NeedLevel) { nResult = EQUIPREMOULD_MATERIAL_LEVEL; Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRemouldHandler MaterialLevel fail") ; return PACKET_EXE_CONTINUE; } UINT nMaterialIndex = GenMaterialIndex(MaterialInfo.m_nMaterialType, MaterialInfo.m_nMaterialLevel); //查询物品表该材料是否存在 COMMITEM_INFO_TB* pMaterialInfoTB = g_ItemTable.GetCommItemInfoTB(nMaterialIndex); if(pMaterialInfoTB == NULL) { return PACKET_EXE_ERROR; } INT nCount = HumanItemLogic::CalcBagItemCount(pHuman, nMaterialIndex); if (nCount<RemouldInfo.m_MaterialNum) { nResult = EQUIPREMOULD_MATERIAL_COUNT; Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRemouldHandler Material num fail") ; return PACKET_EXE_CONTINUE; } //获取对应材料分 MATERIAL_LEVEL_INFO_TB* pMaterialLevelInfo = g_ItemTable.GetMaterialInfoTB(MaterialInfo.m_nMaterialLevel); Assert(pMaterialLevelInfo != NULL); if (!pMaterialLevelInfo) { g_pLog->FastSaveLog( LOG_FILE_1, "[CGEquipRemouldHandler::Execute] GetMaterialInfoTB index is error [%d]",MaterialInfo.m_nMaterialLevel); return PACKET_EXE_ERROR; } nEquipScore = nEquipScore + pMaterialLevelInfo->m_MaterialValue; MaterialIndex[i].m_nIndex = nMaterialIndex; MaterialIndex[i].m_nCount = pCreateTB->m_RemouldInfo[i].m_MaterialNum; } nResult = (EQUIPREMOULD_RESULT)pHuman->EquipRemould(pEquipItem, nEquipScore); if(nResult == EQUIPREMOULD_FAIL) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRemouldHandler: pHuman->AddHole Fail") ; return PACKET_EXE_ERROR; } if (nResult == EQUIPREMOULD_SUCCESS) { ITEM_LOG_PARAM LogParam; LogParam.OpType = ITEM_REMOULD_CONSUME; LogParam.CharGUID = pHuman->GetGUID(); LogParam.XPos = pHuman->getWorldPos()->m_fX; LogParam.ZPos = pHuman->getWorldPos()->m_fZ; LogParam.SceneID = pHuman->getScene()->SceneID(); for (UINT i=0; i<pCreateTB->m_nRemouldInfoCount; ++i) { if(HumanItemLogic::EraseBagItem(&LogParam, pHuman,MaterialIndex[i].m_nIndex, MaterialIndex[i].m_nCount)) { SaveItemLog(&LogParam); } } pHuman->SetMoney(pHuman->GetMoney() - pCreateTB->m_RemouldMoney); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_REMOULD_REDUCE; MoneyLogParam.Count = (INT)pCreateTB->m_RemouldMoney; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); } Msg.SetResult(nResult); pGamePlayer->SendPacket( &Msg ) ; ////////////////////////////////////////////////////////////////////////// if((nResult == EQUIPREMOULD_SUCCESS)||(nResult == EQUIPREMOULD_MAX_FAIL)) { if(pPacket->GetEquipPosType() == ENUM_EQUIP_POINT) { pHuman->ItemEffectFlush(); pHuman->SetEquipVer(pHuman->GetEquipVer()+1); INT Equip_Point = pPacket->GetPos(); UINT RetPart = 0; GCDetailEquipList SelfMsg; SelfMsg.setObjID( pHuman->GetID() ); Item* pEquipItem = HumanItemLogic::GetEquip(pHuman, (HUMAN_EQUIP)Equip_Point); if(!pEquipItem) { Assert(FALSE); } if(pEquipItem->IsEmpty()) { Assert(FALSE); } pEquipItem->SaveValueTo(SelfMsg.GetEquipData((HUMAN_EQUIP)Equip_Point)); RetPart|=(1<<((UINT)Equip_Point)); SelfMsg.SetAskPart(RetPart); pGamePlayer->SendPacket( &SelfMsg ) ; } else { GCItemInfo ItemMsg; ItemMsg.setIsNull(FALSE); ItemMsg.setID(BagIndex); pEquipItem->SaveValueTo(ItemMsg.getItem()); pHuman->GetPlayer()->SendPacket(&ItemMsg); } } g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRemouldHandler: success nResult=%d", nResult ) ; return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR; }
uint CGBankAddItemHandler::Execute( CGBankAddItem* 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 ) ; UINT indexFrom = pPacket->GetIndexFrom(); UINT indexTo = pPacket->GetIndexTo(); GCBankAddItem Msg; switch(pPacket->GetFromType()) { case CGBankAddItem::EQUIP_POS: { pHuman->GetDB()->OverWriteEquip2Bank((HUMAN_EQUIP)indexFrom, indexTo); Msg.SetFromType(GCBankAddItem::EQUIP_POS); Msg.SetIndexFrom(indexFrom); Msg.SetIndexTo(indexTo); } break; case CGBankAddItem::BAG_POS: //Bag->Bank { ItemContainer *pBankContainer = pHuman->GetBankContain(); ItemContainer *pBagContainer = HumanItemLogic::GetContainer(pHuman,indexFrom); Item *pBagItem = pBagContainer->GetItem( pBagContainer->BagIndex2ConIndex(indexFrom) ); //防止连续点击 if(pBagItem->IsEmpty()) { g_pLog->FastSaveLog( LOG_FILE_1, "CGBankAddItemHandler too many click") ; return PACKET_EXE_CONTINUE; } //Item *pBankItem = pBankContainer->GetItem( indexTo ); //合并标志 INT bSplice = 0; INT nSpliceTo = -1; UINT TempIndexTo = indexTo; //自动搜索空格租赁箱1 switch(TempIndexTo) { case CGBankAddItem::AUTO_POS_BOX1: { //先查询是不是有可以合并的物品,(只在本租赁箱中) if( pBagItem->IsCanLay() ) { for( INT i=RENTBOX1_START_INDEX; i<RENTBOX2_START_INDEX; i++ ) { Item *pBankItem = pBankContainer->GetItem(i); // 验证是否可以叠加成功 if( pBankItem->GetItemTableIndex() == pBagItem->GetItemTableIndex() && pBankItem->GetLayedNum() + pBagItem->GetLayedNum() <= pBankItem->GetMaxLayedNum() ) { bSplice = 1; nSpliceTo = i; indexTo = i; break; } } } //没有可以叠加的物品,就寻找一个空格 BYTE indextemp = RENTBOX1_START_INDEX; if(0 == bSplice) { while( ITEMREFPTRISVALID(HumanItemLogic::GetBankItem(pHuman, indextemp)) && indextemp < RENTBOX2_START_INDEX ) { indextemp++; } if(indextemp == RENTBOX2_START_INDEX) { indexTo = indextemp-1; } else { indexTo = indextemp; } } } break; case CGBankAddItem::AUTO_POS_BOX2: { //先查询是不是有可以合并的物品,(只在本租赁箱中) if( pBagItem->IsCanLay() ) { for( INT i=RENTBOX2_START_INDEX; i<RENTBOX3_START_INDEX; i++ ) { Item *pBankItem = pBankContainer->GetItem(i); // 验证是否可以叠加成功 if( pBankItem->GetItemTableIndex() == pBagItem->GetItemTableIndex() && pBankItem->GetLayedNum() + pBagItem->GetLayedNum() <= pBankItem->GetMaxLayedNum() ) { bSplice = 1; nSpliceTo = i; indexTo = i; break; } } } //没有可以叠加的物品,就寻找一个空格 BYTE indextemp = RENTBOX2_START_INDEX; if(0 == bSplice) { while( ITEMREFPTRISVALID(HumanItemLogic::GetBankItem(pHuman, indextemp)) && indextemp < RENTBOX3_START_INDEX ) { indextemp++; } if(indextemp == RENTBOX3_START_INDEX) { indexTo = indextemp-1; } else { indexTo = indextemp; } } } break; case CGBankAddItem::AUTO_POS_BOX3: { //先查询是不是有可以合并的物品,(只在本租赁箱中) if( pBagItem->IsCanLay() ) { for( INT i=RENTBOX3_START_INDEX; i<RENTBOX4_START_INDEX; i++ ) { Item *pBankItem = pBankContainer->GetItem(i); // 验证是否可以叠加成功 if( pBankItem->GetItemTableIndex() == pBagItem->GetItemTableIndex() && pBankItem->GetLayedNum() + pBagItem->GetLayedNum() <= pBankItem->GetMaxLayedNum() ) { bSplice = 1; nSpliceTo = i; indexTo = i; break; } } } //没有可以叠加的物品,就寻找一个空格 BYTE indextemp = RENTBOX3_START_INDEX; if(0 == bSplice) { while( ITEMREFPTRISVALID(HumanItemLogic::GetBankItem(pHuman, indextemp)) && indextemp < RENTBOX4_START_INDEX ) { indextemp++; } if(indextemp == RENTBOX4_START_INDEX) { indexTo = indextemp-1; } else { indexTo = indextemp; } } } break; case CGBankAddItem::AUTO_POS_BOX4: { //先查询是不是有可以合并的物品,(只在本租赁箱中) if( pBagItem->IsCanLay() ) { for( INT i=RENTBOX4_START_INDEX; i<RENTBOX5_START_INDEX; i++ ) { Item *pBankItem = pBankContainer->GetItem(i); // 验证是否可以叠加成功 if( pBankItem->GetItemTableIndex() == pBagItem->GetItemTableIndex() && pBankItem->GetLayedNum() + pBagItem->GetLayedNum() <= pBankItem->GetMaxLayedNum() ) { bSplice = 1; nSpliceTo = i; indexTo = i; break; } } } //没有可以叠加的物品,就寻找一个空格 BYTE indextemp = RENTBOX4_START_INDEX; if(0 == bSplice) { while( ITEMREFPTRISVALID(HumanItemLogic::GetBankItem(pHuman, indextemp)) && indextemp < RENTBOX5_START_INDEX ) { indextemp++; } if(indextemp == RENTBOX5_START_INDEX) { indexTo = indextemp-1; } else { indexTo = indextemp; } } } break; case CGBankAddItem::AUTO_POS_BOX5: { //先查询是不是有可以合并的物品,(只在本租赁箱中) if( pBagItem->IsCanLay() ) { for( INT i=RENTBOX5_START_INDEX; i<MAX_BANK_SIZE; i++ ) { Item *pBankItem = pBankContainer->GetItem(i); // 验证是否可以叠加成功 if( pBankItem->GetItemTableIndex() == pBagItem->GetItemTableIndex() && pBankItem->GetLayedNum() + pBagItem->GetLayedNum() <= pBankItem->GetMaxLayedNum() ) { bSplice = 1; nSpliceTo = i; indexTo = i; break; } } } //没有可以叠加的物品,就寻找一个空格 BYTE indextemp = RENTBOX5_START_INDEX; if(0 == bSplice) { while( ITEMREFPTRISVALID(HumanItemLogic::GetBankItem(pHuman, indextemp)) && indextemp < MAX_BANK_SIZE ) { indextemp++; } if(indextemp == MAX_BANK_SIZE) { indexTo = indextemp-1; } else { indexTo = indextemp; } } } break; //检查直接选定的目标是不是可以合并 default: { if( pBagItem->IsCanLay() ) { Item *pItemFrom = pBagContainer->GetItem(pBagContainer->BagIndex2ConIndex(indexFrom)); Item *pItemTo = pBankContainer->GetItem(indexTo); if( pItemFrom->GetItemTableIndex() == pItemTo->GetItemTableIndex() ) { bSplice = 2; nSpliceTo = indexTo; } } } break; } //验证位置的合法性 if( indexFrom>=0 && indexFrom<MAX_BAG_SIZE && indexTo>=0 && (indexTo<(UINT)(pHuman->__GetBankEndIndex()) || (indexTo>=251 && indexTo<=255) ) ) { if(1 == bSplice) //执行合并 { //验证位置里是否有东西 if(ITEMREFPTRISVALID(HumanItemLogic::GetItem(pHuman, indexFrom))) { if(ITEMREFPTRISVALID(HumanItemLogic::GetBankItem(pHuman, nSpliceTo))) { g_ItemOperator.SpliceItem(pBagContainer, (UINT)pBagContainer->BagIndex2ConIndex(indexFrom), pBankContainer, (UINT)nSpliceTo); Item *pItemBag = pBagContainer->GetItem(pBagContainer->BagIndex2ConIndex(indexFrom)); Item *pItemBank= pBankContainer->GetItem(nSpliceTo); //发一个通知更新银行的消息 GCBankItemInfo MsgBankItemInfo; MsgBankItemInfo.setBankIndex((WORD)nSpliceTo); MsgBankItemInfo.setIsNull(pItemBank->IsEmpty()); pItemBank->SaveValueTo(MsgBankItemInfo.getItem()); pGamePlayer->SendPacket( &MsgBankItemInfo ); //发送一个通知背包更新的消息 GCItemInfo MsgBagItemInfo; MsgBagItemInfo.setID((WORD)indexFrom); MsgBagItemInfo.setIsNull(pItemBag->IsEmpty()); pItemBag->SaveValueTo(MsgBagItemInfo.getItem()); pGamePlayer->SendPacket( &MsgBagItemInfo ); } } g_pLog->FastSaveLog( LOG_FILE_1, "CGBankAddItemHandler Empty Item indexFrom = %d", indexFrom) ; return PACKET_EXE_CONTINUE; } else if(2 == bSplice) { //验证位置里是否有东西 if(ITEMREFPTRISVALID(HumanItemLogic::GetItem(pHuman, indexFrom))) { if(ITEMREFPTRISVALID(HumanItemLogic::GetBankItem(pHuman, nSpliceTo))) { g_ItemOperator.MoveSpliceItem(pBagContainer, (UINT)pBagContainer->BagIndex2ConIndex(indexFrom), pBankContainer, (UINT)nSpliceTo); Item *pItemBag = pBagContainer->GetItem(pBagContainer->BagIndex2ConIndex(indexFrom)); Item *pItemBank= pBankContainer->GetItem(nSpliceTo); //发一个通知更新银行的消息 GCBankItemInfo MsgBankItemInfo; MsgBankItemInfo.setBankIndex((WORD)nSpliceTo); MsgBankItemInfo.setIsNull(pItemBank->IsEmpty()); pItemBank->SaveValueTo(MsgBankItemInfo.getItem()); pGamePlayer->SendPacket( &MsgBankItemInfo ); //发送一个通知背包更新的消息 GCItemInfo MsgBagItemInfo; MsgBagItemInfo.setID((WORD)indexFrom); MsgBagItemInfo.setIsNull(pItemBag->IsEmpty()); pItemBag->SaveValueTo(MsgBagItemInfo.getItem()); pGamePlayer->SendPacket( &MsgBagItemInfo ); } } g_pLog->FastSaveLog( LOG_FILE_1, "CGBankAddItemHandler Empty Item indexFrom = %d", indexFrom) ; return PACKET_EXE_CONTINUE; } else //不执行合并 { //验证位置里是否有东西 if(ITEMREFPTRISVALID(HumanItemLogic::GetItem(pHuman, indexFrom))) { if(ITEMREFPTRISVALID(HumanItemLogic::GetBankItem(pHuman, indexTo))) //执行了交换 { //判断银行内的这个物品是不是能够放入背包中 ItemContainer* pBankContainer = pHuman->GetBankContain(); Item *pItem = pBankContainer->GetItem(indexTo); ItemContainer *pHumanCon = HumanItemLogic::GetItemContain(pHuman, pItem->GetItemTableIndex()); if( !pHumanCon ) { //返回错误信息 Msg.SetFromType(GCBankAddItem::ERROR_POS); break; } if( !pHumanCon->IsInContainer(indexFrom) ) { //返回错误信息 Msg.SetFromType(GCBankAddItem::ERROR_POS); break; } g_ItemOperator.ExchangeItem(pBagContainer, pBagContainer->BagIndex2ConIndex(indexFrom), pBankContainer, (UINT)indexTo); //执行了交换 Msg.SetOperateType(GCBankAddItem::OPERATE_SWAP); } else //执行了移动 { g_ItemOperator.MoveItem(pBagContainer, pBagContainer->BagIndex2ConIndex(indexFrom), pBankContainer, (UINT)indexTo); //执行了移动 Msg.SetOperateType(GCBankAddItem::OPERATE_MOVE); } Msg.SetFromType(GCBankAddItem::BAG_POS); Msg.SetIndexFrom(indexFrom); Msg.SetIndexTo(indexTo); } else { Msg.SetFromType(GCBankAddItem::ERROR_POS); } } } else //数据不合法 { Msg.SetFromType(GCBankAddItem::ERROR_POS); } } break; default: break; } pGamePlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGBankAddItemHandler: indexFrom=%d, indexTo=%d", indexFrom, indexTo ) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint CGEquipExChangePaiTypeHandler::Execute(CGEquipExChangePaiType* 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(pHuman->m_ExchangBox.m_Status > 0) {//丢弃 g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: ObjID=%d, ExchangBox::m_Status>0" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; } //摆摊状态不可操作 if(pHuman->m_StallBox.GetStallStatus() == ServerStallBox::STALL_OPEN) {//丢弃 g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: ObjID=%d, ServerStallBox::STALL_OPEN" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; } //摆摊不可操作 if(pHuman->m_StallBox.GetStallStatus() == ServerStallBox::STALL_OPEN) {//丢弃 g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: ObjID=%d, ServerStallBox::STALL_OPEN" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; } ObjID_t NpcObjID= pPacket->GetUniqueID(); Obj* pNpcObj = pScene->GetObjManager()->GetObj(NpcObjID); if (pNpcObj == NULL) { return PACKET_EXE_ERROR; } else { if( pNpcObj->GetObjType() != Obj::OBJ_TYPE_MONSTER ) { return PACKET_EXE_ERROR; } } FLOAT fDist = MySqrt(pNpcObj->getWorldPos(), pHuman->getWorldPos()); if(fDist>MAX_NPC_DISTANCE) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler Out Of Range ObjName = %s", pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } EQUIPEXCHANGEPAITTYPE_RESULT Result = EQUIPEXCHANGEPAITTYPE_FAIL; GCEquipExChangePaiTypeResult ResultPacket; Item* pEquip1Item = NULL; Item* pEquip2Item = NULL; INT Equip1Point = INVALID_ITEM_POS; INT Equip2Point = INVALID_ITEM_POS; if(pPacket->GetEquip1PosType()>=INVALID_ITEM_POS_TYPE) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler Equip posType error, posType=%d", pPacket->GetEquip1PosType()) ; return PACKET_EXE_ERROR; } if(pPacket->GetEquip1PosType() == ENUM_BAG) { ItemContainer* pItemContainer1 = HumanItemLogic::GetBagContainer(pHuman,pPacket->GetPos1()); if( pItemContainer1 == NULL ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler: BagIndex error, BagIndex=%d", pPacket->GetPos1()) ; return PACKET_EXE_ERROR; } if (!pItemContainer1->IsCanUse()) { Result = EQUIPEXCHANGEPAITTYPE_BAG_INVALID; ResultPacket.SetResult(Result); pGamePlayer->SendPacket(&ResultPacket);; g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler: ItemContainer is invalid, ContainerType=%d, BagIndex=%d", pItemContainer1->GetContainerType(), pPacket->GetPos1()) ; return PACKET_EXE_ERROR; } pEquip1Item = pItemContainer1->GetItem(pItemContainer1->BagIndex2ConIndex(pPacket->GetPos1())); if(pEquip1Item->IsEmpty()) { Result = EQUIPEXCHANGEPAITTYPE_EQUIP_FAIL; ResultPacket.SetResult(Result); pGamePlayer->SendPacket(&ResultPacket); g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler Equip empyty, bagpos=%d", pPacket->GetPos1()) ; return PACKET_EXE_CONTINUE; } if(pEquip1Item->GetItemClass()!=ICLASS_EQUIP) { Result = EQUIPEXCHANGEPAITTYPE_EQUIP_FAIL; ResultPacket.SetResult(Result); pGamePlayer->SendPacket(&ResultPacket); g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler is not ICLASS_EQUIP") ; return PACKET_EXE_CONTINUE; } if (pEquip1Item->GetItemType() > EQUIP_ADORN) { Result = EQUIPEXCHANGEPAITTYPE_EQUIP_FAIL; ResultPacket.SetResult(Result); pGamePlayer->SendPacket(&ResultPacket); g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler is not ICLASS_EQUIP") ; return PACKET_EXE_CONTINUE; } } if(pPacket->GetEquip1PosType() == ENUM_EQUIP_POINT) { if(pPacket->GetPos1()>HEQUIP_ADORN2) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler Item pos error") ; return PACKET_EXE_ERROR; } Equip1Point = pPacket->GetPos1(); ItemContainer* pEquipContainer = pHuman->GetEquipContain(); if(NULL==pEquipContainer) { AssertEx(FALSE,"[CGEquipExChangePaiTypeHandler]: NULL EquipContainer pointer found!"); } pEquip1Item = pEquipContainer->GetItem((UINT)Equip1Point); Assert(pEquip1Item != NULL); if(pEquip1Item->IsEmpty()) { Result = EQUIPEXCHANGEPAITTYPE_EQUIP_FAIL; ResultPacket.SetResult(Result); pGamePlayer->SendPacket(&ResultPacket); g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler Equip empyty, bagpos=%d", pPacket->GetPos1()) ; return PACKET_EXE_CONTINUE; } Assert (pEquip1Item->GetItemClass() == ICLASS_EQUIP); } if(!(pEquip1Item->GetGUID() == pPacket->getItem1ID())) { Result = EQUIPEXCHANGEPAITTYPE_EQUIP_FAIL; ResultPacket.SetResult(Result); pGamePlayer->SendPacket(&ResultPacket); g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler guid error") ; return PACKET_EXE_CONTINUE; } if(pPacket->GetEquip2PosType()>=INVALID_ITEM_POS_TYPE) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler Equip posType error, posType=%d", pPacket->GetEquip1PosType()) ; return PACKET_EXE_ERROR; } if(pPacket->GetEquip2PosType() == ENUM_BAG) { ItemContainer* pItemContainer2 = HumanItemLogic::GetBagContainer(pHuman,pPacket->GetPos2()); if( pItemContainer2 == NULL ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipDecompoundHandler: BagIndex error, BagIndex=%d", pPacket->GetPos2()) ; return PACKET_EXE_ERROR; } if (!pItemContainer2->IsCanUse()) { Result = EQUIPEXCHANGEPAITTYPE_BAG_INVALID; ResultPacket.SetResult(Result); pGamePlayer->SendPacket(&ResultPacket);; g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipDecompoundHandler: ItemContainer is invalid, ContainerType=%d, BagIndex=%d", pItemContainer2->GetContainerType(), pPacket->GetPos2()) ; return PACKET_EXE_ERROR; } pEquip2Item = pItemContainer2->GetItem(pItemContainer2->BagIndex2ConIndex(pPacket->GetPos2())); if(pEquip2Item->IsEmpty()) { Result = EQUIPEXCHANGEPAITTYPE_EQUIP_FAIL; ResultPacket.SetResult(Result); pGamePlayer->SendPacket(&ResultPacket); g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler Equip empyty, bagpos=%d", pPacket->GetPos2()) ; return PACKET_EXE_CONTINUE; } if(pEquip2Item->GetItemClass()!=ICLASS_EQUIP) { Result = EQUIPEXCHANGEPAITTYPE_EQUIP_FAIL; ResultPacket.SetResult(Result); pGamePlayer->SendPacket(&ResultPacket); g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler is not ICLASS_EQUIP") ; return PACKET_EXE_CONTINUE; } if (pEquip2Item->GetItemType() > EQUIP_ADORN) { Result = EQUIPEXCHANGEPAITTYPE_EQUIP_FAIL; ResultPacket.SetResult(Result); pGamePlayer->SendPacket(&ResultPacket); g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler is not ICLASS_EQUIP") ; return PACKET_EXE_CONTINUE; } } if(pPacket->GetEquip2PosType() == ENUM_EQUIP_POINT) { if(pPacket->GetPos2()>HEQUIP_ADORN2) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler Item pos error") ; return PACKET_EXE_ERROR; } Equip2Point = pPacket->GetPos2(); ItemContainer* pEquipContainer = pHuman->GetEquipContain(); if(NULL==pEquipContainer) { AssertEx(FALSE,"[CGEquipExChangePaiTypeHandler]: NULL EquipContainer pointer found!"); } pEquip2Item = pEquipContainer->GetItem((UINT)Equip2Point); Assert(pEquip2Item != NULL); if(pEquip2Item->IsEmpty()) { Result = EQUIPEXCHANGEPAITTYPE_EQUIP_FAIL; ResultPacket.SetResult(Result); pGamePlayer->SendPacket(&ResultPacket); g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler Equip empyty, bagpos=%d", pPacket->GetPos2()) ; return PACKET_EXE_CONTINUE; } Assert (pEquip2Item->GetItemClass() == ICLASS_EQUIP); } if(!(pEquip2Item->GetGUID() == pPacket->getItem2ID())) { Result = EQUIPEXCHANGEPAITTYPE_EQUIP_FAIL; ResultPacket.SetResult(Result); pGamePlayer->SendPacket(&ResultPacket); g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler guid error") ; return PACKET_EXE_CONTINUE; } if ((!pEquip1Item->GetItemBind())||(!pEquip2Item->GetItemBind())) { Result = EQUIPEXCHANGEPAITTYPE_EQUIPBIND_FAIL; ResultPacket.SetResult(Result); pGamePlayer->SendPacket(&ResultPacket); g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler no Bind") ; return PACKET_EXE_CONTINUE; } Result = (EQUIPEXCHANGEPAITTYPE_RESULT)pHuman->EquipChangePai(pEquip1Item, pEquip2Item, pPacket->getGemBagPos()); ResultPacket.SetResult(Result); pGamePlayer->SendPacket(&ResultPacket); //如果装备在身上 if(((pPacket->GetEquip1PosType() == ENUM_EQUIP_POINT)&&(Equip1Point != INVALID_ITEM_POS)) ||((pPacket->GetEquip2PosType() == ENUM_EQUIP_POINT)&&(Equip2Point != INVALID_ITEM_POS))) { //设置装备版本 pHuman->SetEquipVer(pHuman->GetEquipVer()+1); //刷新装备对人物的属性影响 pHuman->ItemEffectFlush(); //更新装备 UINT RetPart = 0; GCDetailEquipList SelfMsg; SelfMsg.setObjID( pHuman->GetID() ); if (pPacket->GetEquip1PosType() == ENUM_EQUIP_POINT) { pEquip1Item = HumanItemLogic::GetEquip(pHuman,(HUMAN_EQUIP)Equip1Point); if(!pEquip1Item) { Assert(FALSE); return PACKET_EXE_CONTINUE; } if(pEquip1Item->IsEmpty()) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler: Equip_Point =%d Fail", Equip1Point ) ; return PACKET_EXE_CONTINUE; } pEquip1Item->SaveValueTo(SelfMsg.GetEquipData((HUMAN_EQUIP)Equip1Point)); RetPart|=(1<<((UINT)Equip1Point)); } if (pPacket->GetEquip2PosType() == ENUM_EQUIP_POINT) { pEquip2Item = HumanItemLogic::GetEquip(pHuman,(HUMAN_EQUIP)Equip2Point); if(!pEquip2Item) { Assert(FALSE); return PACKET_EXE_CONTINUE; } if(pEquip2Item->IsEmpty()) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipExChangePaiTypeHandler: Equip_Point =%d Fail", Equip2Point ) ; return PACKET_EXE_CONTINUE; } pEquip2Item->SaveValueTo(SelfMsg.GetEquipData((HUMAN_EQUIP)Equip2Point)); RetPart|=(1<<((UINT)Equip2Point)); } SelfMsg.SetAskPart(RetPart); pGamePlayer->SendPacket( &SelfMsg ) ; if (pPacket->GetEquip1PosType() != ENUM_EQUIP_POINT) { GCItemInfo EquipMsg; EquipMsg.setIsNull(FALSE); EquipMsg.setID(pPacket->GetPos1()); pEquip1Item->SaveValueTo(EquipMsg.getItem()); pHuman->GetPlayer()->SendPacket(&EquipMsg); } if (pPacket->GetEquip2PosType() != ENUM_EQUIP_POINT) { GCItemInfo EquipMsg; EquipMsg.setIsNull(FALSE); EquipMsg.setID(pPacket->GetPos2()); pEquip2Item->SaveValueTo(EquipMsg.getItem()); pHuman->GetPlayer()->SendPacket(&EquipMsg); } } else //仅仅通知背包内物品改变 { GCItemInfo EquipMsg; EquipMsg.setIsNull(FALSE); EquipMsg.setID(pPacket->GetPos1()); pEquip1Item->SaveValueTo(EquipMsg.getItem()); pHuman->GetPlayer()->SendPacket(&EquipMsg); EquipMsg.setIsNull(FALSE); EquipMsg.setID(pPacket->GetPos2()); pEquip2Item->SaveValueTo(EquipMsg.getItem()); pHuman->GetPlayer()->SendPacket(&EquipMsg); } return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR; }
uint CGAskLockObjHandler::Execute(CGAskLockObj* 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 ) ; BYTE LockType = pPacket->GetLockType(); BYTE lockObj = pPacket->GetLockObj(); GCAddLockObj msg; // 如果要执行加锁先查询玩家是不是还有足够的精力(为一个物品或者宠物加保护,需要10点精力) if(pPacket->GetLockType() == CGAskLockObj::OPR_LOCK) { if( LOCK_A_OBJ_NEED_ENERGY > pHuman->GetEnergy() ) { msg.SetLockObj(GCAddLockObj::LOCK_ITEM); msg.SetResult(GCAddLockObj::RESULT_NO_JINGLI); pHuman->GetPlayer()->SendPacket(&msg); return PACKET_EXE_CONTINUE ; } } switch(lockObj) { case CGAskLockObj::LOCK_ITEM: //物品 { msg.SetLockObj(GCAddLockObj::LOCK_ITEM); INT nItemIndex = HumanItemLogic::GetBagItemPosByGUID( pHuman, pPacket->GetItemGUID() ); if(INVALID_ID == nItemIndex) { return PACKET_EXE_CONTINUE ; } Item* pItem = HumanItemLogic::GetBagItem( pHuman, nItemIndex ); if(!pItem) { return PACKET_EXE_CONTINUE ; } ItemContainer* pCon = HumanItemLogic::GetBagContainer( pHuman, nItemIndex ); if(!pCon) { return PACKET_EXE_CONTINUE ; } if(LockType == CGAskLockObj::OPR_LOCK) //加锁 { if(g_ItemOperator.SetItemPWLock(pCon, pCon->BagIndex2ConIndex(nItemIndex), TRUE)) { //扣除精力 pHuman->SetEnergy(pHuman->GetEnergy() - LOCK_A_OBJ_NEED_ENERGY); msg.SetResult(GCAddLockObj::RESULT_LOCK_OK); GCItemInfo MsgItem; MsgItem.setIsNull(FALSE); MsgItem.setID((WORD)nItemIndex); pItem->SaveValueTo(MsgItem.getItem()); pHuman->GetPlayer()->SendPacket(&MsgItem); } } else if(LockType == CGAskLockObj::OPR_UNLOCK) //去锁 { if(g_ItemOperator.SetItemPWLock(pCon, pCon->BagIndex2ConIndex(nItemIndex), FALSE)) { msg.SetResult(GCAddLockObj::RESULT_UNLOCK_OK); GCItemInfo MsgItem; MsgItem.setIsNull(FALSE); MsgItem.setID((WORD)nItemIndex); pItem->SaveValueTo(MsgItem.getItem()); pHuman->GetPlayer()->SendPacket(&MsgItem); } } } break; case CGAskLockObj::LOCK_PET: //宠物 { msg.SetLockObj(GCAddLockObj::LOCK_PET); } break; default: break; } pHuman->GetPlayer()->SendPacket(&msg); return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }