UINT CGUnEquipHandler::Execute( CGUnEquip* 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 ) ; HUMAN_EQUIP EquipPoint = (HUMAN_EQUIP)pPacket->getEquipPoint(); //Assert( pHuman->GetDB()->GetEquipDB()->IsSet(EquipPoint) ) ; Item* pEquipItem = HumanItemLogic::GetEquip(pHuman,EquipPoint); if(!pEquipItem) { Assert(pEquipItem); return PACKET_EXE_CONTINUE; } if(pEquipItem->IsEmpty()) { return PACKET_EXE_CONTINUE; } UCHAR itemClass = pEquipItem->GetItemClass(); if(itemClass == ICLASS_EQUIP) { INT BagIndex;// = pHuman->GetFirstEmptyBagIndex(); ItemContainer* pEquipContainer = pHuman->GetEquipContain(); ItemContainer* pBaseContainer = pHuman->GetBaseContain(); if(!pEquipContainer) { Assert(pEquipItem); return PACKET_EXE_CONTINUE; } BYTE DeliverBagIndex = pPacket->getBagIndex(); if(DeliverBagIndex<pBaseContainer->GetContainerSize()) { BagIndex = g_ItemOperator.MoveItem(pEquipContainer, EquipPoint, pBaseContainer,DeliverBagIndex); } else { BagIndex = g_ItemOperator.MoveItem(pEquipContainer, EquipPoint, pBaseContainer); } GCUnEquipResult Msg; if(BagIndex>=0 && BagIndex<pBaseContainer->GetContainerSize()) { Msg.setEquipPoint(EquipPoint); Msg.setBagIndex(BagIndex); Msg.setItemID(pEquipItem->GetGUID()); Msg.setItemTableIndex(pEquipItem->GetItemTableIndex()); Msg.setResult(UNEQUIP_SUCCESS); pHuman->SetEquipVer(pHuman->GetEquipVer()+1); pHuman->ItemEffectFlush(); pGamePlayer->SendPacket( &Msg ) ; //如果可见 if(pHuman->IsVisualPart(EquipPoint)) { GCCharEquipment OtherMsg; OtherMsg.setObjID(pHuman->GetID()); //if(EquipPoint == HEQUIP_WEAPON) //{ // UINT uGemID = GetEquipmentMaxLevelGemID(pEquipItem); // OtherMsg.setID(EquipPoint,pEquipItem->GetItemTableIndex(), uGemID); //} //else //{ OtherMsg.setID(EquipPoint,pEquipItem->GetItemTableIndex(), -1); //} pScene->BroadCast(&OtherMsg,pHuman,TRUE); } } else { if(ITEMOE_DESTOPERATOR_HASITEM == BagIndex) { Msg.setResult(UNEQUIP_HAS_ITEM); pGamePlayer->SendPacket( &Msg ); } else if(ITEMOE_DESTOPERATOR_FULL == BagIndex) { Msg.setResult(UNEQUIP_BAG_FULL); pGamePlayer->SendPacket( &Msg ); } } } else { Assert(FALSE); //装备为什么不是 ICLASS_EQUIP } g_pLog->FastSaveLog( LOG_FILE_1, "CGUnEquipHandler EquipPoint=%d itemClass=%d", EquipPoint, itemClass ) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
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 CGEquipSuitExchangeHandler::Execute(CGEquipSuitExchange* 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(pGamePlayer->GetPlayerStatus()!=PS_SERVER_NORMAL || !pHuman->IsActiveObj() ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipSuitExchangeHandler: change scene") ; 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 ; } UINT nSuitNum = pPacket->getEquipSuitNum(); if( nSuitNum > MAX_EQUIP_SUIT_NUM ) { return PACKET_EXE_ERROR ; } ItemContainer* pEquipContainer = pHuman->GetEquipContain(); Assert(pEquipContainer); _SUIT_SETTING suitSetting = pHuman->GetEquipSuitSetting(nSuitNum); GCEquipSuitExchangeResult Msg; GCDetailEquipList SelfMsg; GCCharEquipment OtherMsg; SelfMsg.setObjID( pHuman->GetID() ); BOOL bChange = FALSE; UINT RetPart = 0; //遍历所有套装 for(INT i=0; i<HEQUIP_NUMBER; ++i) { //存在套装数据 if(!suitSetting.m_EquipData[i].isNull()) { //检查装备栏 Item* pEquip = pEquipContainer->GetItem(i); Assert(pEquip); //装备有变化,装备栏数据与保存的对应位置套装信息不一致,需要到背包里找 if(!(pEquip->GetGUID() == suitSetting.m_EquipData[i])) { INT nPos = INVALID_INDEX; ItemContainer* pBagContainer = HumanItemLogic::GetBagItemContain(pHuman, &suitSetting.m_EquipData[i], nPos); //背包里也找不到,需记录下来(卖掉了?丢掉了?。。) if(nPos == INVALID_INDEX) { EXCHANGE_EQUIP_INFO ExchangeInfo; ExchangeInfo.m_BagIndex = INVALID_ITEM_POS; ExchangeInfo.m_EquipPoint = INVALID_ITEM_POS; Msg.setEquipInfo(ExchangeInfo, i); continue; } //找到了 Item* pExchangeItem = HumanItemLogic::GetBagItem(pHuman, nPos); Assert(pExchangeItem->GetItemClass() == ICLASS_EQUIP); if(pExchangeItem->GetEquipPoint() != i) { if(pExchangeItem->GetEquipPoint() == HEQUIP_RING1) { Assert(i == HEQUIP_RING2); } else if(pExchangeItem->GetEquipPoint() == HEQUIP_ADORN1) { Assert(i == HEQUIP_ADORN2); } else Assert(0); } //玩家可能等级变了 if(pExchangeItem->GetRequireLevel() > pHuman->GetLevel() ) { EXCHANGE_EQUIP_INFO ExchangeInfo; ExchangeInfo.m_BagIndex = INVALID_ITEM_POS; ExchangeInfo.m_EquipPoint = i; Msg.setEquipInfo(ExchangeInfo, i); g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipSuitExchangeHandler: Equiplevel , pEquip->GetRequireLevel()=%d", pEquip->GetRequireLevel() ) ; continue; } //可能换职业了 if(!pExchangeItem->IsWuMenPai()) { if(!pExchangeItem->InReqJob(pHuman->GetMenPai())) { EXCHANGE_EQUIP_INFO ExchangeInfo; ExchangeInfo.m_BagIndex = INVALID_ITEM_POS; ExchangeInfo.m_EquipPoint = i; Msg.setEquipInfo(ExchangeInfo, i); g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipSuitExchangeHandler: ReqJob") ; continue; } } if (pEquip->IsEmpty()) { g_ItemOperator.MoveItem( pBagContainer, pBagContainer->BagIndex2ConIndex(nPos), pEquipContainer, i ) ; } else { if (pBagContainer->IsCanUse()) { //与装备的物品进行交换 g_ItemOperator.ExchangeItem(pBagContainer, pBagContainer->BagIndex2ConIndex(nPos), pEquipContainer, i); } else //背包已经过期 { EXCHANGE_EQUIP_INFO ExchangeInfo; ExchangeInfo.m_BagIndex = INVALID_ITEM_POS; ExchangeInfo.m_EquipPoint = INVALID_ITEM_POS; Msg.setEquipInfo(ExchangeInfo, i); continue; } } EXCHANGE_EQUIP_INFO ExchangeInfo; ExchangeInfo.m_BagIndex = nPos; ExchangeInfo.m_EquipPoint = i; Msg.setEquipInfo(ExchangeInfo, i); //交换到人身上了,重新获取一下 Item* pEquipItem = HumanItemLogic::GetEquip(pHuman, (HUMAN_EQUIP)i); if(!pEquipItem) { Assert(FALSE); return PACKET_EXE_CONTINUE; } Assert(!pEquipItem->IsEmpty()); pEquipItem->SaveValueTo(SelfMsg.GetEquipData((HUMAN_EQUIP)i)); RetPart|=(1<<((UINT)i)); SelfMsg.SetAskPart(RetPart); RetPart = 0; //如果可见 if(pHuman->IsVisualPart((HUMAN_EQUIP)i)) { OtherMsg.setObjID(pHuman->GetID()); OtherMsg.setID((HUMAN_EQUIP)i, pEquipItem->GetItemTableIndex()); } //换装了 bChange = TRUE; } //装备正穿着呢,不需要通知 continue; } else { //根本没有呀 EXCHANGE_EQUIP_INFO ExchangeInfo; ExchangeInfo.m_BagIndex = INVALID_ITEM_POS; ExchangeInfo.m_EquipPoint = i; Msg.setEquipInfo(ExchangeInfo, i); } } if(bChange) { Msg.setResult(EQUIPSUIT_SUCCESS); pGamePlayer->SendPacket(&Msg); pGamePlayer->SendPacket( &SelfMsg ) ; pScene->BroadCast(&OtherMsg,pHuman,TRUE); pHuman->SetEquipVer(pHuman->GetEquipVer()+1); //刷新装备对人物的属性影响 pHuman->ItemEffectFlush(); } else { Msg.setResult(EQUIPSUIT_SUCCESS); pGamePlayer->SendPacket(&Msg); } g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipSuitExchangeHandler: nSuitNum=%d", nSuitNum ) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint CGExchangeOkIIIHandler::Execute( CGExchangeOkIII* 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 ) ; EXCHANGE_CERTIFY_EACH_OTHER(pHuman) ObjID_t DestID = pHuman->m_ExchangBox.m_ObjID; Obj_Character *pTarget = (Obj_Character*)(pScene->GetObjManager()->GetObj( DestID )); if(pTarget->GetObjType() != Obj::OBJ_TYPE_HUMAN) { g_pLog->FastSaveLog( LOG_FILE_1, "CGExchangeOkIIIHandler: %s ask not a human.", pHuman->GetName() ) ; return PACKET_EXE_CONTINUE; } Obj_Human* pDestHuman = (Obj_Human*)pTarget; if( pDestHuman == NULL ) { Assert(FALSE); return PACKET_EXE_CONTINUE; } // 不同阵营,不让查看 if( pHuman->IsEnemy( pDestHuman ) ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGExchangeOkIIIHandler: %s cann't ask %s's detailattr ", pHuman->GetName(), pDestHuman->GetName() ) ; return PACKET_EXE_CONTINUE; } if(pHuman->m_ExchangBox.m_Status == ServerExchangeBox::EXCHANGE_WAIT_FOR_CONFIRM) { //设置可以交换 pHuman->m_ExchangBox.m_Status = ServerExchangeBox::EXCHANGE_CONFIRM_READY; if(pDestHuman->m_ExchangBox.m_Status == ServerExchangeBox::EXCHANGE_CONFIRM_READY) {//可以交换了 //1.变量初始化 ItemContainer* pMyExchangeContainer = &(pHuman->m_ExchangBox.m_Container); ItemContainer* pOtExchangeContainer = &(pDestHuman->m_ExchangBox.m_Container); ItemContainer* pMyExchangePetContainer = &(pHuman->m_ExchangBox.m_PetContainer); ItemContainer* pOtExchangePetContainer = &(pDestHuman->m_ExchangBox.m_PetContainer); _EXCHANGE_ITEM_LIST ItemListMeToOt; _EXCHANGE_ITEM_LIST ItemListOtToMe; ItemListMeToOt.Init(); ItemListOtToMe.Init(); //2.验证循环 g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 与 [%s] 开始验证循环", pHuman->GetName(), pDestHuman->GetName()) ; for(INT i = 0; i<EXCHANGE_BOX_SIZE; i++) { if(pMyExchangeContainer->GetItem(i)->IsEmpty() == FALSE) { ItemListMeToOt.AddItem( pMyExchangeContainer->GetItem(i) ); } if(pOtExchangeContainer->GetItem(i)->IsEmpty() == FALSE) { ItemListOtToMe.AddItem( pOtExchangeContainer->GetItem(i) ); } } for(INT i = 0; i<EXCHANGE_PET_BOX_SIZE; i++) { if(pMyExchangePetContainer->GetItem(i)->IsEmpty() == FALSE) { ItemListMeToOt.AddItem( pMyExchangePetContainer->GetItem(i) ); } if(pOtExchangePetContainer->GetItem(i)->IsEmpty() == FALSE) { ItemListOtToMe.AddItem( pOtExchangePetContainer->GetItem(i) ); } } if( FALSE == HumanItemLogic::CanReceiveExchangeItemList( pHuman, ItemListOtToMe) ) {//空间不够 GCExchangeError MsgSelf; MsgSelf.SetID(EXCHANGE_MSG::ERR_NOT_ENOUGHT_ROOM_SELF); pHuman->GetPlayer()->SendPacket(&MsgSelf); GCExchangeError MsgOther; MsgOther.SetID(EXCHANGE_MSG::ERR_NOT_ENOUGHT_ROOM_OTHER); pDestHuman->GetPlayer()->SendPacket(&MsgOther); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] 空间不够", pHuman->GetName()) ; return PACKET_EXE_CONTINUE; } if( FALSE == HumanItemLogic::CanReceiveExchangeItemList( pDestHuman, ItemListMeToOt) ) {//空间不够 GCExchangeError MsgSelf; MsgSelf.SetID(EXCHANGE_MSG::ERR_NOT_ENOUGHT_ROOM_SELF); pDestHuman->GetPlayer()->SendPacket(&MsgSelf); GCExchangeError MsgOther; MsgOther.SetID(EXCHANGE_MSG::ERR_NOT_ENOUGHT_ROOM_OTHER); pHuman->GetPlayer()->SendPacket(&MsgOther); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] 空间不够", pDestHuman->GetName()) ; return PACKET_EXE_CONTINUE; } if( pHuman->m_ExchangBox.m_Money > pHuman->GetMoney() ) {//金钱非法 GCExchangeError MsgSelf; MsgSelf.SetID(EXCHANGE_MSG::ERR_NOT_ENOUGHT_MONEY_SELF); pHuman->GetPlayer()->SendPacket(&MsgSelf); GCExchangeError MsgOther; MsgOther.SetID(EXCHANGE_MSG::ERR_NOT_ENOUGHT_MONEY_OTHER); pDestHuman->GetPlayer()->SendPacket(&MsgOther); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] 金钱不足", pHuman->GetName()) ; return PACKET_EXE_CONTINUE; } if( pDestHuman->m_ExchangBox.m_Money > pDestHuman->GetMoney() ) {//金钱非法 GCExchangeError MsgSelf; MsgSelf.SetID(EXCHANGE_MSG::ERR_NOT_ENOUGHT_MONEY_SELF); pDestHuman->GetPlayer()->SendPacket(&MsgSelf); GCExchangeError MsgOther; MsgOther.SetID(EXCHANGE_MSG::ERR_NOT_ENOUGHT_MONEY_OTHER); pHuman->GetPlayer()->SendPacket(&MsgOther); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] 金钱不足", pDestHuman->GetName()) ; return PACKET_EXE_CONTINUE; } //2.1宠物验证 Obj_Pet* pDestPet = pDestHuman->GetPet(); Obj_Pet* pMyPet = pHuman->GetPet(); PET_GUID_t DestPetGuid; PET_GUID_t MyPetGuid; if(pDestPet) { DestPetGuid = pDestPet->GetPetGUID(); } if(pMyPet) { MyPetGuid = pMyPet->GetPetGUID(); } //如果是当前召唤出来的宠物,先收回来再换 for(INT i = 0; i<EXCHANGE_PET_BOX_SIZE; i++) { if(pMyExchangePetContainer->GetItem(i)->IsEmpty() == FALSE) { INT nPetLevel = pMyExchangePetContainer->GetItem(i)->GetLevel(); INT nHumanLevel = pDestHuman->GetLevel(); PET_GUID_t ExchPetGuid = pMyExchangePetContainer->GetItem(i)->GetPetGUID(); if(nPetLevel>nHumanLevel) { GCExchangeError Msg; Msg.SetID(EXCHANGE_MSG::ERR_PET_LEVEL_TOO_HIGH); pHuman->GetPlayer()->SendPacket(&Msg); pDestHuman->GetPlayer()->SendPacket(&Msg); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> 宠物级别过高 petlevel = %d, humanlevel = %d", nPetLevel, nHumanLevel) ; return PACKET_EXE_CONTINUE; } if(ExchPetGuid == MyPetGuid) { pHuman->ReCallPet(); } } if(pOtExchangePetContainer->GetItem(i)->IsEmpty() == FALSE) { INT nPetLevel = pOtExchangePetContainer->GetItem(i)->GetLevel(); INT nHumanLevel = pHuman->GetLevel(); PET_GUID_t ExchPetGuid = pOtExchangePetContainer->GetItem(i)->GetPetGUID(); if(nPetLevel>nHumanLevel) { GCExchangeError Msg; Msg.SetID(EXCHANGE_MSG::ERR_PET_LEVEL_TOO_HIGH); pHuman->GetPlayer()->SendPacket(&Msg); pDestHuman->GetPlayer()->SendPacket(&Msg); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> 宠物级别过高 petlevel = %d, humanlevel = %d", nPetLevel, nHumanLevel) ; return PACKET_EXE_CONTINUE; } if(ExchPetGuid == DestPetGuid) { pDestHuman->ReCallPet(); } } } //3.移动物品循环 g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 与 [%s] 开始移动循环", pHuman->GetName(), pDestHuman->GetName()) ; GCExchangeSuccessIII MsgSuccessToMe, MsgSuccessToOt; GCExchangeSuccessIII::_SUCC_ITEM ItemListToMe[EXCHANGE_BOX_SIZE+EXCHANGE_PET_BOX_SIZE]; INT MyItemNum = 0; GCExchangeSuccessIII::_SUCC_ITEM ItemListToOt[EXCHANGE_BOX_SIZE+EXCHANGE_PET_BOX_SIZE]; INT OtItemNum = 0; BOOL bFlag = FALSE; //用来记录可以交换的物品 struct ExItem_t { UCHAR uItemType; INT nIndex; INT nIndexInEx; ExItem_t() { uItemType = 0; nIndex = -1; nIndexInEx = -1; } }; INT ExItemNumOt = 0; ExItem_t ExItemIndexInOt[EXCHANGE_BOX_SIZE]; INT ExItemNumMy = 0; ExItem_t ExItemIndexInMy[EXCHANGE_BOX_SIZE]; INT ExPetItemNumOt = 0; ExItem_t ExPetItemIndexInOt[EXCHANGE_PET_BOX_SIZE]; INT ExPetItemNumMy = 0; ExItem_t ExPetItemIndexInMy[EXCHANGE_PET_BOX_SIZE]; for(INT i = 0; i<EXCHANGE_BOX_SIZE; i++) { if(pMyExchangeContainer->GetItem(i)->IsEmpty() == FALSE) { Item* pItemRef = pMyExchangeContainer->GetItem(i); ItemContainer* pMyBagContainer = HumanItemLogic::GetItemContain(pHuman, pItemRef->GetItemTableIndex()); ExItemIndexInMy[ExItemNumMy].uItemType = pItemRef->GetItemClass(); ExItemIndexInMy[ExItemNumMy].nIndex = pMyBagContainer->GetIndexByGUID(&pItemRef->GetGUID()); ExItemIndexInMy[ExItemNumMy].nIndexInEx = i; ExItemNumMy++; } if(pOtExchangeContainer->GetItem(i)->IsEmpty() == FALSE) { Item* pItemRef = pOtExchangeContainer->GetItem(i); ItemContainer* pOtBagContainer = HumanItemLogic::GetItemContain(pDestHuman, pItemRef->GetItemTableIndex()); ExItemIndexInOt[ExItemNumOt].uItemType = pItemRef->GetItemClass(); ExItemIndexInOt[ExItemNumOt].nIndex = pOtBagContainer->GetIndexByGUID(&pItemRef->GetGUID()); ExItemIndexInOt[ExItemNumOt].nIndexInEx = i; ExItemNumOt++; } } for(INT i = 0; i<EXCHANGE_PET_BOX_SIZE; i++) { if(pMyExchangePetContainer->GetItem(i)->IsEmpty() == FALSE) { Item* pItemRef = pMyExchangePetContainer->GetItem(i); ItemContainer* pMyPetContainer = pHuman->GetPetContain(); ExPetItemIndexInMy[ExPetItemNumMy].nIndex = pMyPetContainer->GetIndexByGUID(&pItemRef->GetPetGUID()); ExPetItemIndexInMy[ExPetItemNumMy].nIndexInEx = i; ExPetItemNumMy++; } if(pOtExchangePetContainer->GetItem(i)->IsEmpty() == FALSE) { Item* pItemRef = pOtExchangePetContainer->GetItem(i); ItemContainer* pOtPetContainer = pDestHuman->GetPetContain(); ExPetItemIndexInOt[ExPetItemNumOt].nIndex = pOtPetContainer->GetIndexByGUID(&pItemRef->GetPetGUID()); ExPetItemIndexInOt[ExPetItemNumOt].nIndexInEx = i; ExPetItemNumOt++; } } //3.1先把能交换的交换掉,如果在对方的包中找到了正在跟自己交易的物品,直接交换这两个物品的位置 for(INT i = 0; i<EXCHANGE_BOX_SIZE; i++) { if(pMyExchangeContainer->GetItem(i)->IsEmpty() == FALSE) { INT result = 0; Item* pItemRef = pMyExchangeContainer->GetItem(i); //自己的容器 ItemContainer* pMyBagContainer = HumanItemLogic::GetItemContain(pHuman, pItemRef->GetItemTableIndex()); INT BagIndex = pMyBagContainer->GetIndexByGUID(&pItemRef->GetGUID()); //对方的容器 ItemContainer* pOtBagContainer = HumanItemLogic::GetItemContain(pDestHuman, pItemRef->GetItemTableIndex()); //去换能换得 for(INT j = 0; j<ExItemNumOt; j++) { //此位置已经无效 if(ExItemIndexInOt[j].nIndex == -1) continue; //只有同一类型的物品才能够交换 if(pItemRef->GetItemClass()!=ExItemIndexInOt[j].uItemType) continue; //解锁自己 g_ItemOperator.UnlockItem( pMyBagContainer, BagIndex ); //先解锁对方 g_ItemOperator.UnlockItem( pOtBagContainer, ExItemIndexInOt[j].nIndex ); //设置自己物品已经不是交易物品了 pMyBagContainer->GetItem(BagIndex)->SetInExchange(FALSE); //设置对方物品已经不是交易物品了 pOtBagContainer->GetItem(ExItemIndexInOt[j].nIndex)->SetInExchange(FALSE); //与一个对方欲交易的物品交换 result = g_ItemOperator.ExchangeItem ( pMyBagContainer, BagIndex, pOtBagContainer, ExItemIndexInOt[j].nIndex ); if(result<0) {//拷贝失败 GCExchangeError Msg; Msg.SetID(EXCHANGE_MSG::ERR_ILLEGAL); pHuman->GetPlayer()->SendPacket(&Msg); pDestHuman->GetPlayer()->SendPacket(&Msg); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] <-> [%s] 物品 [%d]失败 result = %d", pHuman->GetName(), pDestHuman->GetName(), pItemRef->GetItemTableIndex(), result ); return PACKET_EXE_CONTINUE; } else { ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_EXCHANGE_TOOTHER; ItemLogParam.CharGUID = pHuman->GetGUID(); ItemLogParam.TargetGUID = pDestHuman->GetGUID(); ItemLogParam.XPos = pHuman->getWorldPos()->m_fX; ItemLogParam.ZPos = pHuman->getWorldPos()->m_fZ; ItemLogParam.SceneID = pHuman->getScene()->SceneID(); ItemLogParam.ItemGuid = pItemRef->GetGUID(); ItemLogParam.ItemType = pItemRef->GetItemTableIndex(); ItemListToOt[OtItemNum].m_FromType = 0; ItemListToOt[OtItemNum].m_FromIndex = i; ItemListToOt[OtItemNum].m_ToType = EXCHANGE_MSG::POS_BAG; ItemListToOt[OtItemNum++].m_ToIndex = pOtBagContainer->ConIndex2BagIndex(ExItemIndexInOt[j].nIndex); ItemListToMe[MyItemNum].m_FromType = 0; ItemListToMe[MyItemNum].m_FromIndex = ExItemIndexInOt[j].nIndexInEx; ItemListToMe[MyItemNum].m_ToType = EXCHANGE_MSG::POS_BAG; ItemListToMe[MyItemNum++].m_ToIndex = pMyBagContainer->ConIndex2BagIndex(BagIndex); //从交易盒中删掉此物品,在后面的移动中就不用再移动它了 g_ItemOperator.EraseItem(pMyExchangeContainer, i); g_ItemOperator.EraseItem(pOtExchangeContainer, ExItemIndexInOt[j].nIndexInEx); ExItemIndexInOt[j].nIndex = -1; g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] <-> [%s] 物品 [%d]成功", pHuman->GetName(), pDestHuman->GetName(), pItemRef->GetItemTableIndex() ); break; } } } } //3.2不能交换的一个一个放进去,剩下的直接由系统找格放入 for(INT i = 0; i<EXCHANGE_BOX_SIZE; i++) { if(pMyExchangeContainer->GetItem(i)->IsEmpty() == FALSE) { INT result = 0; Item* pItemRef = pMyExchangeContainer->GetItem(i); //自己的容器 ItemContainer* pMyBagContainer = HumanItemLogic::GetItemContain(pHuman, pItemRef->GetItemTableIndex()); INT BagIndex = pMyBagContainer->GetIndexByGUID(&pItemRef->GetGUID()); //对方的容器 ItemContainer* pOtBagContainer = HumanItemLogic::GetItemContain(pDestHuman, pItemRef->GetItemTableIndex()); //先解锁 g_ItemOperator.UnlockItem( pMyBagContainer, BagIndex ); pMyBagContainer->GetItem(BagIndex)->SetInExchange(FALSE); //自动找格,支持自动叠加 //这里的自动找格改成可以自动叠加,这里会有一个问题,上面收取检测时是不考虑叠加状态的,所以,如果非叠加状态下的 //可以收取一系列物品,可叠加的一定可以接受。检测的范围会大一点。 result = g_ItemOperator.MoveItem ( pMyBagContainer, BagIndex, bFlag, pOtBagContainer ); if(result<0) {//拷贝失败 GCExchangeError Msg; Msg.SetID(EXCHANGE_MSG::ERR_ILLEGAL); pHuman->GetPlayer()->SendPacket(&Msg); pDestHuman->GetPlayer()->SendPacket(&Msg); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 物品 [%d]失败 result = %d", pHuman->GetName(), pDestHuman->GetName(), pItemRef->GetItemTableIndex(), result ); return PACKET_EXE_CONTINUE; } else { ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_EXCHANGE_TOOTHER; ItemLogParam.CharGUID = pHuman->GetGUID(); ItemLogParam.TargetGUID = pDestHuman->GetGUID(); ItemLogParam.XPos = pHuman->getWorldPos()->m_fX; ItemLogParam.ZPos = pHuman->getWorldPos()->m_fZ; ItemLogParam.SceneID = pHuman->getScene()->SceneID(); ItemLogParam.ItemGuid = pItemRef->GetGUID(); ItemLogParam.ItemType = pItemRef->GetItemTableIndex(); ItemListToOt[OtItemNum].m_FromType = 0; ItemListToOt[OtItemNum].m_FromIndex = i; ItemListToOt[OtItemNum].m_ToType = EXCHANGE_MSG::POS_BAG; ItemListToOt[OtItemNum++].m_ToIndex = pOtBagContainer->ConIndex2BagIndex(result); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 物品 [%d]成功", pHuman->GetName(), pDestHuman->GetName(), pItemRef->GetItemTableIndex() ); } } if(pOtExchangeContainer->GetItem(i)->IsEmpty() == FALSE) { INT result = 0; Item* pItemRef = pOtExchangeContainer->GetItem(i); //对方的容器 ItemContainer* pOtBagContainer = HumanItemLogic::GetItemContain(pDestHuman, pItemRef->GetItemTableIndex()); INT BagIndex = pOtBagContainer->GetIndexByGUID(&pItemRef->GetGUID()); //自己的容器 ItemContainer* pMyBagContainer = HumanItemLogic::GetItemContain(pHuman, pItemRef->GetItemTableIndex()); //先解锁 g_ItemOperator.UnlockItem( pOtBagContainer, BagIndex ); pOtBagContainer->GetItem(BagIndex)->SetInExchange(FALSE); //自动找格,支持自动叠加 result = g_ItemOperator.MoveItem ( pOtBagContainer, BagIndex, bFlag, pMyBagContainer ); if(result<0) {//拷贝失败 GCExchangeError Msg; Msg.SetID(EXCHANGE_MSG::ERR_ILLEGAL); pHuman->GetPlayer()->SendPacket(&Msg); pDestHuman->GetPlayer()->SendPacket(&Msg); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 物品 [%d]失败 result = %d", pDestHuman->GetName(), pHuman->GetName(), pItemRef->GetItemTableIndex(), result ); return PACKET_EXE_CONTINUE; } else { ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_EXCHANGE_TOOTHER; ItemLogParam.CharGUID = pDestHuman->GetGUID(); ItemLogParam.TargetGUID = pHuman->GetGUID(); ItemLogParam.XPos = pDestHuman->getWorldPos()->m_fX; ItemLogParam.ZPos = pDestHuman->getWorldPos()->m_fZ; ItemLogParam.SceneID = pDestHuman->getScene()->SceneID(); ItemLogParam.ItemGuid = pItemRef->GetGUID(); ItemLogParam.ItemType = pItemRef->GetItemTableIndex(); SaveItemLog(&ItemLogParam); ItemListToMe[MyItemNum].m_FromType = 0; ItemListToMe[MyItemNum].m_FromIndex = i; ItemListToMe[MyItemNum].m_ToType = EXCHANGE_MSG::POS_BAG; ItemListToMe[MyItemNum++].m_ToIndex = pMyBagContainer->ConIndex2BagIndex(result); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 物品 [%d]成功", pDestHuman->GetName(), pHuman->GetName(), pItemRef->GetItemTableIndex() ); } } } //3.3换宠物 g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 与 [%s] 开始交换宠物", pHuman->GetName(), pDestHuman->GetName()) ; for(INT i = 0; i<EXCHANGE_PET_BOX_SIZE; i++) { INT result = 0; Item* pItemRef = pMyExchangePetContainer->GetItem(i); if(pItemRef->IsEmpty()) continue; PET_LOG_PARAM PetLogParam; PetLogParam.PetGUID = pItemRef->GetPetGUID(); PetLogParam.DataID = pItemRef->GetDataID(); //自己的容器 ItemContainer* pMyPetContainer = pHuman->GetPetContain(); INT PetIndexInBag = pMyPetContainer->GetIndexByGUID(&pItemRef->GetPetGUID()); //对方的容器 ItemContainer* pOtPetContainer = pDestHuman->GetPetContain(); //去换能换得 for(INT j = 0; j<ExPetItemNumOt; j++) { //如果无效 if(ExPetItemIndexInOt[j].nIndex == -1) continue; //解锁自己 g_ItemOperator.UnlockItem( pMyPetContainer, PetIndexInBag ); //先解锁对方 g_ItemOperator.UnlockItem( pOtPetContainer, ExPetItemIndexInOt[j].nIndex ); //设置自己物品已经不是交易物品了 pMyPetContainer->GetItem(PetIndexInBag)->SetInExchange(FALSE); //设置对方物品已经不是交易物品了 pOtPetContainer->GetItem(ExPetItemIndexInOt[j].nIndex )->SetInExchange(FALSE); //与一个对方欲交易的物品交换 result = g_ItemOperator.ExchangeItem ( pMyPetContainer, PetIndexInBag, pOtPetContainer, ExPetItemIndexInOt[j].nIndex ); if(result<0) {//拷贝失败 GCExchangeError Msg; Msg.SetID(EXCHANGE_MSG::ERR_ILLEGAL); pHuman->GetPlayer()->SendPacket(&Msg); pDestHuman->GetPlayer()->SendPacket(&Msg); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] <-> [%s] 物品 [%d]失败 result = %d", pHuman->GetName(), pDestHuman->GetName(), pItemRef->GetItemTableIndex(), result ); return PACKET_EXE_CONTINUE; } else { PetLogParam.CharGUID = pDestHuman->GetGUID(); PetLogParam.OPType = PET_OP_EXCHANGE_OTHER; PetLogParam.SceneID = pDestHuman->getScene()->SceneID(); PetLogParam.TargetGUID = pHuman->GetGUID(); PetLogParam.XPos = pDestHuman->getWorldPos()->m_fX; PetLogParam.ZPos = pDestHuman->getWorldPos()->m_fZ; SavePetLog(&PetLogParam); ItemListToMe[MyItemNum].m_FromType = EXCHANGE_MSG::POS_PET; ItemListToMe[MyItemNum].m_FromIndex = ExPetItemIndexInOt[j].nIndexInEx; ItemListToMe[MyItemNum].m_ToType = EXCHANGE_MSG::POS_PET; ItemListToMe[MyItemNum++].m_ToIndex = PetIndexInBag; ItemListToOt[OtItemNum].m_FromType = EXCHANGE_MSG::POS_PET; ItemListToOt[OtItemNum].m_FromIndex = i; ItemListToOt[OtItemNum].m_ToType = EXCHANGE_MSG::POS_PET; ItemListToOt[OtItemNum++].m_ToIndex = ExPetItemIndexInOt[j].nIndex; //从交易盒中删掉此物品,在后面的移动中就不用再移动它了 g_ItemOperator.EraseItem(pMyExchangePetContainer, i); g_ItemOperator.EraseItem(pOtExchangePetContainer, ExPetItemIndexInOt[j].nIndexInEx); ExPetItemIndexInOt[j].nIndex = -1; g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] <-> [%s] 物品 [%s]成功", pHuman->GetName(), pDestHuman->GetName(), pItemRef->GetName() ); break; } } } //3.4移宠物 for(INT i = 0; i<EXCHANGE_PET_BOX_SIZE; i++) { if(pMyExchangePetContainer->GetItem(i)->IsEmpty() == FALSE) { INT result = 0; Item* pItemRef = pMyExchangePetContainer->GetItem(i); PET_LOG_PARAM PetLogParam; PetLogParam.PetGUID = pItemRef->GetPetGUID(); PetLogParam.DataID = pItemRef->GetDataID(); //自己的容器 ItemContainer* pMyPetContainer = pHuman->GetPetContain(); INT PetIndexInBag = pMyPetContainer->GetIndexByGUID(&pItemRef->GetPetGUID()); //对方的容器 ItemContainer* pOtPetContainer = pDestHuman->GetPetContain(); //先解锁 g_ItemOperator.UnlockItem( pMyPetContainer, PetIndexInBag ); pMyPetContainer->GetItem(PetIndexInBag)->SetInExchange(FALSE); //自动找格,支持自动叠加 //这里的自动找格改成可以自动叠加,这里会有一个问题,上面收取检测时是不考虑叠加状态的,所以,如果非叠加状态下的 //可以收取一系列物品,可叠加的一定可以接受。检测的范围会大一点。 result = g_ItemOperator.MoveItem ( pMyPetContainer, PetIndexInBag, pOtPetContainer ); if(result<0) {//拷贝失败 GCExchangeError Msg; Msg.SetID(EXCHANGE_MSG::ERR_ILLEGAL); pHuman->GetPlayer()->SendPacket(&Msg); pDestHuman->GetPlayer()->SendPacket(&Msg); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 宠物 [%s]失败 result = %d", pHuman->GetName(), pDestHuman->GetName(), pItemRef->GetName(), result ); return PACKET_EXE_CONTINUE; } else { PetLogParam.CharGUID = pDestHuman->GetGUID(); PetLogParam.OPType = PET_OP_EXCHANGE_OTHER; PetLogParam.SceneID = pDestHuman->getScene()->SceneID(); PetLogParam.TargetGUID = pHuman->GetGUID(); PetLogParam.XPos = pDestHuman->getWorldPos()->m_fX; PetLogParam.ZPos = pDestHuman->getWorldPos()->m_fZ; SavePetLog(&PetLogParam); ItemListToOt[OtItemNum].m_FromType = EXCHANGE_MSG::POS_PET; ItemListToOt[OtItemNum].m_FromIndex = i; ItemListToOt[OtItemNum].m_ToType = EXCHANGE_MSG::POS_PET; ItemListToOt[OtItemNum++].m_ToIndex = result; g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 宠物 [%s]成功", pHuman->GetName(), pDestHuman->GetName(), pItemRef->GetName() ); } } if(pOtExchangePetContainer->GetItem(i)->IsEmpty() == FALSE) { INT result = 0; Item* pItemRef = pOtExchangePetContainer->GetItem(i); PET_LOG_PARAM PetLogParam; PetLogParam.PetGUID = pItemRef->GetPetGUID(); PetLogParam.DataID = pItemRef->GetDataID(); //对方的容器 ItemContainer* pOtPetContainer = pDestHuman->GetPetContain(); INT PetIndexInBag = pOtPetContainer->GetIndexByGUID(&pItemRef->GetPetGUID()); //自己的容器 ItemContainer* pMyPetContainer = pHuman->GetPetContain(); //先解锁 g_ItemOperator.UnlockItem( pOtPetContainer, PetIndexInBag ); pOtPetContainer->GetItem(PetIndexInBag)->SetInExchange(FALSE); //自动找格,支持自动叠加 result = g_ItemOperator.MoveItem ( pOtPetContainer, PetIndexInBag, pMyPetContainer ); if(result<0) {//拷贝失败 GCExchangeError Msg; Msg.SetID(EXCHANGE_MSG::ERR_ILLEGAL); pHuman->GetPlayer()->SendPacket(&Msg); pDestHuman->GetPlayer()->SendPacket(&Msg); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 宠物 [%s]失败 result = %d", pDestHuman->GetName(), pHuman->GetName(), pItemRef->GetName(), result ); return PACKET_EXE_CONTINUE; } else { PetLogParam.CharGUID = pHuman->GetGUID(); PetLogParam.OPType = PET_OP_EXCHANGE_OTHER; PetLogParam.SceneID = pHuman->getScene()->SceneID(); PetLogParam.TargetGUID = pDestHuman->GetGUID(); PetLogParam.XPos = pHuman->getWorldPos()->m_fX; PetLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SavePetLog(&PetLogParam); ItemListToMe[MyItemNum].m_FromType = EXCHANGE_MSG::POS_PET; ItemListToMe[MyItemNum].m_FromIndex = i; ItemListToMe[MyItemNum].m_ToType = EXCHANGE_MSG::POS_PET; ItemListToMe[MyItemNum++].m_ToIndex = result; g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 宠物 [%s]成功", pDestHuman->GetName(), pHuman->GetName(), pItemRef->GetName() ); } } } //2.换钱 g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 与 [%s] 开始交换金钱", pHuman->GetName(), pDestHuman->GetName()) ; if( pHuman->m_ExchangBox.m_Money <= pHuman->GetMoney() && pHuman->m_ExchangBox.m_Money>0 ) { pDestHuman->SetMoney(pDestHuman->GetMoney()+pHuman->m_ExchangBox.m_Money); pHuman->SetMoney(pHuman->GetMoney()-pHuman->m_ExchangBox.m_Money); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.TargetGUID = pDestHuman->GetGUID(); MoneyLogParam.OPType = MONEY_EXCHANGE_OUTCOME; MoneyLogParam.Count = pHuman->m_ExchangBox.m_Money; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); MoneyLogParam.CharGUID = pDestHuman->GetGUID(); MoneyLogParam.TargetGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_EXCHANGE_INCOME; MoneyLogParam.Count = pHuman->m_ExchangBox.m_Money; MoneyLogParam.SceneID = pDestHuman->getScene()->SceneID(); MoneyLogParam.XPos = pDestHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pDestHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 金钱 [%d]", pHuman->GetName(), pDestHuman->GetName(), pHuman->m_ExchangBox.m_Money ); } if( pDestHuman->m_ExchangBox.m_Money <= pDestHuman->GetMoney() && pDestHuman->m_ExchangBox.m_Money>0 ) { pHuman->SetMoney(pHuman->GetMoney()+pDestHuman->m_ExchangBox.m_Money); pDestHuman->SetMoney(pDestHuman->GetMoney() - pDestHuman->m_ExchangBox.m_Money); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.TargetGUID = pDestHuman->GetGUID(); MoneyLogParam.OPType = MONEY_EXCHANGE_INCOME; MoneyLogParam.Count = pDestHuman->m_ExchangBox.m_Money; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); MoneyLogParam.CharGUID = pDestHuman->GetGUID(); MoneyLogParam.TargetGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_EXCHANGE_OUTCOME; MoneyLogParam.Count = pDestHuman->m_ExchangBox.m_Money; MoneyLogParam.SceneID = pDestHuman->getScene()->SceneID(); MoneyLogParam.XPos = pDestHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pDestHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 金钱 [%d]", pDestHuman->GetName(), pHuman->GetName(), pDestHuman->m_ExchangBox.m_Money ); } //给双方发送成功消息 MsgSuccessToMe.SetItemNum(MyItemNum); MsgSuccessToMe.SetItemList(ItemListToMe); pHuman->GetPlayer()->SendPacket(&MsgSuccessToMe); MsgSuccessToOt.SetItemNum(OtItemNum); MsgSuccessToOt.SetItemList(ItemListToOt); pDestHuman->GetPlayer()->SendPacket(&MsgSuccessToOt); g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 与 [%s] 交易成功", pHuman->GetName(), pDestHuman->GetName()) ; //能走到这儿证明所有操作都已完成清空各自的交易盒 pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); } else {//啥也不做,等待对方消息 } } else {//一定出错了 GCExchangeError Msg; Msg.SetID(EXCHANGE_MSG::ERR_ILLEGAL); pHuman->GetPlayer()->SendPacket(&Msg); pHuman->m_ExchangBox.CleanUp(); pDestHuman->GetPlayer()->SendPacket(&Msg); pDestHuman->m_ExchangBox.CleanUp(); return PACKET_EXE_CONTINUE; } return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint CGUseItemHandler::Execute(CGUseItem* pPacket,Player* pPlayer) { __ENTER_FUNCTION USEITEM_RESULT Result ; 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 ; } //检查是否可以使用物品 ID_t BagIndex = pPacket->GetBagIndex(); //检查物品是否合法 Item* pBagItem = HumanItemLogic::GetBagItem(pHuman,BagIndex); if (pBagItem == NULL) { g_pLog->FastSaveLog( LOG_FILE_1, "CGUseItemHandler ERROR BagIndex=%d", BagIndex) ; return PACKET_EXE_ERROR ; } if(pBagItem->IsEmpty()) { //Assert(FALSE) ; //物品得不到 g_pLog->FastSaveLog( LOG_FILE_1, "CGUseItemHandler Can't GetItem BagIndex=%d", BagIndex) ; return PACKET_EXE_CONTINUE ; } ObjID_t Target = pHuman->GetID(); //1.0 当前版本使用物品只处理吃药 //1.1 版本使用物品处理药品,藏宝图,配方 if(!pBagItem->IsRuler(IRL_CANUSE)) { g_pLog->FastSaveLog( LOG_FILE_1, "CGUseItemHandler Can't use item BagIndex=%d", BagIndex); return PACKET_EXE_CONTINUE ; } if(pHuman->GetLevel()>=pBagItem->GetItemLevel()) //级别检查 { switch(pBagItem->GetItemClass()) { case ICLASS_TASKITEM: //任务物品类 case ICLASS_COMITEM: //药品的使用 { ScriptID_t nScript = pBagItem->GetScriptID(); SkillID_t nSkill = pBagItem->GetSkillID(); if(INVALID_ID!= nScript) { if(FALSE == g_ScriptLogic.Item_IsSkillLikeScript(*pHuman, nScript)) { g_ScriptLogic.Item_CallDefaultEvent(*pHuman, nScript, BagIndex); break; } else if(FALSE == g_ScriptLogic.Script_CancelImpacts(*pHuman, nScript)) { //取消效果失败 PET_GUID_t PetGUID = pPacket->GetTargetPetGUID(); Result = (USEITEM_RESULT)pHuman->GetHumanAI()->PushCommand_UseItem( pPacket->GetBagIndex(), pPacket->GetTargetObjID(), *(pPacket->GetTargetPos()), PetGUID, pPacket->GetTargetItem() ); } else { Result = USEITEM_SUCCESS; } } } break; case ICLASS_IDENT: { Result = (USEITEM_RESULT)pHuman->UseIdentScroll(pPacket->GetBagIndex(),pPacket->GetTargetItem()); } break; case ICLASS_STOREMAP://藏宝图 { Result = (USEITEM_RESULT)pHuman->UseStoreMap(BagIndex); } break; case ICLASS_SOUL_BEAD://魂珠 { SOUL_BEAD_INFO_TB* pGet = g_ItemTable.GetSoulBeadTB(pBagItem->GetItemTableIndex()); Assert(NULL != pGet); ImpactID_t nImpactId = pGet->m_nImpactId; //已经有魂珠附体的状态 OWN_IMPACT* pImpact = pHuman->Impact_GetFirstImpactOfSpecificMutexID(nImpactId); if( NULL != pImpact ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGUseItemHandler Can't use item BagIndex=%d", BagIndex); return PACKET_EXE_CONTINUE ; } if(INVALID_ID != nImpactId) { if(g_ImpactCore.SendImpactToUnit(*(Obj_Character*)pHuman, nImpactId, pHuman->GetID(), pGet->m_nValidTime, FALSE, 0, BagIndex)) { Result = USEITEM_SUCCESS; //删除魂珠道具 ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_USE; BOOL bRet = HumanItemLogic::EraseBagItem(&ItemLogParam, pHuman, BagIndex); if (bRet) { SaveItemLog(&ItemLogParam); } } } } break; default: { Result = USEITEM_INVALID; } break; } } else { Result = USEITEM_LEVEL_FAIL; } GCUseItemResult Msg; Msg.SetResult(Result); pGamePlayer->SendPacket(&Msg); g_pLog->FastSaveLog( LOG_FILE_1, "CGUseItemHandler BagIndex=%d Result=%d", BagIndex, Result ) ; return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR; }
uint CGSaveEquipSuitHandler::Execute(CGSaveEquipSuit* 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 nSuitNum = pPacket->getSuitNum(); if(nSuitNum>MAX_EQUIP_SUIT_NUM) { g_pLog->FastSaveLog( LOG_FILE_1, "CGSaveEquipSuitHandler: nSuitNum=%d", nSuitNum ) ; return PACKET_EXE_ERROR ; } ItemContainer* pItemContainer = pHuman->GetEquipContain(); Assert(pItemContainer); BOOL bDataValid = TRUE; BYTE nResult = EQUIPSUIT_EQUIP_FAIL; GCSaveEquipSuitResult Msg; _SUIT_SETTING suitSetting = pPacket->getSuitSetting(); for(INT i=0; i<HEQUIP_NUMBER; ++i) { //有数据 if(!suitSetting.m_EquipData[i].isNull()) { Item* pEquip = pItemContainer->GetItem(i); Assert(pEquip); //装备点有数据 if(!pEquip->IsEmpty()) { if(!(pEquip->GetGUID() == suitSetting.m_EquipData[i])) { //检查背包里有没有 UINT nPos = HumanItemLogic::GetBagItemPosByGUID(pHuman, suitSetting.m_EquipData[i]); //找不到 if(nPos == INVALID_INDEX) { bDataValid = FALSE; break; } //从背包里找到 Item* pUseItem = HumanItemLogic::GetBagItem(pHuman ,nPos); //判断类型 if(pUseItem->GetItemClass() != ICLASS_EQUIP) { g_pLog->FastSaveLog( LOG_FILE_1, "CGSaveEquipSuitHandler: Equip is not ICLASS_EQUIP, EquipPoint=%d", i ) ; return PACKET_EXE_ERROR ; } //判断装备点 if(pUseItem->GetEquipPoint() != i) { if(pUseItem->GetEquipPoint() == HEQUIP_RING1) { if((i != HEQUIP_RING1)&&(i != HEQUIP_RING2)) { g_pLog->FastSaveLog( LOG_FILE_1, "CGSaveEquipSuitHandler: EquipPoint error , pUseItem->GetEquipPoint()=%d", pUseItem->GetEquipPoint() ) ; return PACKET_EXE_ERROR ; } } else if(pUseItem->GetEquipPoint() == HEQUIP_ADORN1) { if((i != HEQUIP_ADORN1)&&(i != HEQUIP_ADORN2)) { g_pLog->FastSaveLog( LOG_FILE_1, "CGSaveEquipSuitHandler: EquipPoint error , pUseItem->GetEquipPoint()=%d", pUseItem->GetEquipPoint() ) ; return PACKET_EXE_ERROR ; } } else { g_pLog->FastSaveLog( LOG_FILE_1, "CGSaveEquipSuitHandler: EquipPoint error , pUseItem->GetEquipPoint()=%d", pUseItem->GetEquipPoint() ) ; return PACKET_EXE_ERROR ; } } //判断等级 if(pUseItem->GetRequireLevel() > pHuman->GetLevel() ) { nResult = EQUIPSUIT_LEVEL; Msg.setResult(nResult); Msg.setSuitNum(0); pGamePlayer->SendPacket(&Msg); g_pLog->FastSaveLog( LOG_FILE_1, "CGSaveEquipSuitHandler: Equiplevel , pUseItem->GetRequireLevel()=%d", pUseItem->GetRequireLevel() ) ; return PACKET_EXE_CONTINUE; } //判断职业 if(!pUseItem->IsWuMenPai()) { if(!pUseItem->InReqJob(pHuman->GetMenPai())) { nResult = EQUIPSUIT_JOB_FAIL; Msg.setResult(nResult); Msg.setSuitNum(0); pGamePlayer->SendPacket(&Msg); g_pLog->FastSaveLog( LOG_FILE_1, "CGSaveEquipSuitHandler: ReqJob , pUseItem->GetReqJob ") ; return PACKET_EXE_CONTINUE; } } //来自背包正常数据,继续下一个查询 continue; } } //装备点没有数据,要检查背包 else { //检查背包里有没有 UINT nPos = HumanItemLogic::GetBagItemPosByGUID(pHuman, suitSetting.m_EquipData[i]); //找不到 if(nPos == INVALID_INDEX) { bDataValid = FALSE; break; } //从背包里找到 Item* pUseItem = HumanItemLogic::GetBagItem(pHuman ,nPos); //判断类型 if(pUseItem->GetItemClass() != ICLASS_EQUIP) { g_pLog->FastSaveLog( LOG_FILE_1, "CGSaveEquipSuitHandler: Equip is not ICLASS_EQUIP, EquipPoint=%d", i ) ; return PACKET_EXE_ERROR ; } //判断装备点 if(pUseItem->GetEquipPoint() != i) { if(pUseItem->GetEquipPoint() == HEQUIP_RING1) { if((i != HEQUIP_RING1)&&(i != HEQUIP_RING2)) { g_pLog->FastSaveLog( LOG_FILE_1, "CGSaveEquipSuitHandler: EquipPoint error , pUseItem->GetEquipPoint()=%d", pUseItem->GetEquipPoint() ) ; return PACKET_EXE_ERROR ; } } else if(pUseItem->GetEquipPoint() == HEQUIP_ADORN1) { if((i != HEQUIP_ADORN1)&&(i != HEQUIP_ADORN2)) { g_pLog->FastSaveLog( LOG_FILE_1, "CGSaveEquipSuitHandler: EquipPoint error , pUseItem->GetEquipPoint()=%d", pUseItem->GetEquipPoint() ) ; return PACKET_EXE_ERROR ; } } else { g_pLog->FastSaveLog( LOG_FILE_1, "CGSaveEquipSuitHandler: EquipPoint error , pUseItem->GetEquipPoint()=%d", pUseItem->GetEquipPoint() ) ; return PACKET_EXE_ERROR ; } } //判断等级 if(pUseItem->GetRequireLevel() > pHuman->GetLevel() ) { nResult = EQUIPSUIT_LEVEL; Msg.setResult(nResult); Msg.setSuitNum(0); pGamePlayer->SendPacket(&Msg); g_pLog->FastSaveLog( LOG_FILE_1, "CGSaveEquipSuitHandler: Equiplevel , pUseItem->GetRequireLevel()=%d", pUseItem->GetRequireLevel() ) ; return PACKET_EXE_CONTINUE; } //判断职业 if(!pUseItem->IsWuMenPai()) { if(!pUseItem->InReqJob(pHuman->GetMenPai())) { nResult = EQUIPSUIT_JOB_FAIL; Msg.setResult(nResult); Msg.setSuitNum(0); pGamePlayer->SendPacket(&Msg); g_pLog->FastSaveLog( LOG_FILE_1, "CGSaveEquipSuitHandler: ReqJob ") ; return PACKET_EXE_CONTINUE; } } } } } //存在无效数据 if(bDataValid == FALSE) { g_pLog->FastSaveLog( LOG_FILE_1, "CGSaveEquipSuitHandler: EQUIP don't exsist " ) ; return PACKET_EXE_CONTINUE; ; } //保存 pHuman->SetEquipSuitSetting(suitSetting, nSuitNum); nResult = EQUIPSUIT_SUCCESS; Msg.setResult(nResult); Msg.setSuitNum(nSuitNum); Msg.setSuitSetting(pHuman->GetEquipSuitSetting(nSuitNum)); pGamePlayer->SendPacket(&Msg); g_pLog->FastSaveLog( LOG_FILE_1, "CGSaveEquipSuitHandler: nSuitNum=%d", nSuitNum ) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
UINT CGEquipRefiningHandler::Execute( CGEquipRefining* 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 iEquipItemPos = pPacket->GetEquipItemPos(); Assert(iEquipItemPos >= 0 ); Assert(iEquipItemPos <= MAX_BAG_SIZE); GCEquipRefining msg; ItemContainer* pBagContainer = HumanItemLogic::GetBagContainer(pHuman, iEquipItemPos); if (pBagContainer == NULL) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRefiningHandler equipment BagIndex is invalid, BagIndex = %d", iEquipItemPos) ; msg.SetResult(EQUIPREFINING_NOT_SUCH_ITEM); pGamePlayer->SendPacket(&msg); return PACKET_EXE_CONTINUE; } Item* pEquipment = pBagContainer->GetItem(pBagContainer->BagIndex2ConIndex(iEquipItemPos)); Assert(NULL != pEquipment); //一些验证:星级,等级... if( NULL == pEquipment || ICLASS_EQUIP != pEquipment->GetItemClass() || !(pEquipment->IsRuler(IRL_DISCARD) ) || pEquipment->IsAdsorbMagic() || pEquipment->GetRequireLevel() < EQUIP_REFINING_MIN_LEVEL //已经附魔或者需求等级小于40 || 0 == pEquipment->GetEquipGemCount()) //没有镶嵌宝石 { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRefiningHandler equipment type is invalid, BagIndex = %d", iEquipItemPos) ; msg.SetResult(EQUIPREFINING_NOT_SUCH_ITEM); pGamePlayer->SendPacket(&msg); return PACKET_EXE_CONTINUE; } //获取炼化神器 BYTE iRefiningItemPos = pPacket->GetRefiningItemPos(); Assert(iRefiningItemPos >= 0 ); Assert(iRefiningItemPos <= MAX_BAG_SIZE); pBagContainer = HumanItemLogic::GetBagContainer(pHuman, iRefiningItemPos); if (pBagContainer == NULL) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRefiningHandler refining BagIndex is invalid, BagIndex = %d", iRefiningItemPos) ; msg.SetResult(EQUIPREFINING_NOT_SUCH_ITEM); pGamePlayer->SendPacket(&msg); return PACKET_EXE_CONTINUE; } Item* pRefiningItem = pBagContainer->GetItem(pBagContainer->BagIndex2ConIndex(iRefiningItemPos)); Assert(NULL != pRefiningItem); if(NULL == pRefiningItem || pRefiningItem->GetItemClass() != ICLASS_COMITEM || pRefiningItem->GetItemType() != COMITEM_EQUIP_REFINING) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipRefiningHandler refining type is invalid, BagIndex = %d", iRefiningItemPos) ; msg.SetResult(EQUIPREFINING_NOT_SUCH_ITEM); pGamePlayer->SendPacket(&msg); return PACKET_EXE_CONTINUE; } //逻辑处理 COMMITEM_INFO_TB* pGet = g_ItemTable.GetCommItemInfoTB(pRefiningItem->GetItemTableIndex()); Assert(NULL != pGet); if ((pEquipment->GetRequireLevel()-1)/10+1 != pGet->m_nLevel)//验证等级 { msg.SetResult(EQUIPREFINING_NOT_SUCH_ITEM); pGamePlayer->SendPacket(&msg); return PACKET_EXE_CONTINUE; } if ( 0 == pEquipment->GetAttrCount())// && pEquipment->GetLevel() { msg.SetResult(EQUIPREFINING_NOT_HAVE_ATTR); pGamePlayer->SendPacket(&msg); return PACKET_EXE_CONTINUE; } //EQUIP_TB* pGet = g_ItemTable.GetEquipTB(pEquipment->GetItemTableIndex()); //Assert(NULL != pGet); //删除装备和炼化神符道具 UINT iPrice = pEquipment->GetSellPrice();//保留将要删除的装备属性给后面用 BYTE iRequireLevel = pEquipment->GetRequireLevel(); BYTE curEquipPoint = pEquipment->GetEquipPoint(); BYTE attrCount = 0; _ITEM_ATTR tmpItemAttr[MAX_ITEM_ATTR]; for (BYTE index=0; index<pEquipment->GetAttrCount(); ++index) { tmpItemAttr[index] = pEquipment->GetEquipAttr(index); if (tmpItemAttr[index].m_AttrType > 0) { attrCount++; } } Assert(attrCount == pEquipment->GetAttrCount()); //开始删除装备和扣除金钱 BOOL bRet = FALSE; ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_EQUIP_REFINING; bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman, pBagContainer->BagIndex2ConIndex(iEquipItemPos)); if(bRet) { SaveItemLog(&ItemLogParam); } else { msg.SetResult(EQUIPREFINING_ERASE_ITEM_FAIL); pGamePlayer->SendPacket(&msg); return PACKET_EXE_CONTINUE; } //删除炼化道具 bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman, pBagContainer->BagIndex2ConIndex(iRefiningItemPos)); if(bRet) { SaveItemLog(&ItemLogParam); } else { msg.SetResult(EQUIPREFINING_ERASE_ITEM_FAIL); pGamePlayer->SendPacket(&msg); return PACKET_EXE_CONTINUE; } UINT iSoulBeadBagIndex = 0; Item* pSoulBeadItem = NULL; //武魂珠 if (HEQUIP_MAINHAND == curEquipPoint) { bRet = HumanItemLogic::CreateItemToBag(&ItemLogParam,pHuman,ITEM_WU_SOUL_BEAD, iSoulBeadBagIndex); if(bRet) { SaveItemLog(&ItemLogParam); } else { msg.SetResult(EQUIPREFINING_ERASE_ITEM_FAIL); pGamePlayer->SendPacket(&msg); return PACKET_EXE_CONTINUE; } pSoulBeadItem = pBagContainer->GetItem(pBagContainer->BagIndex2ConIndex(iSoulBeadBagIndex)); Assert(NULL != pSoulBeadItem); Assert(ICLASS_SOUL_BEAD == pSoulBeadItem->GetItemClass()); pSoulBeadItem->SetSoulBeadPrice(iPrice);//由基本价格计算得出 pSoulBeadItem->SetSoulBeadNeedLevel(iRequireLevel); pSoulBeadItem->SetWuSoulBeadAttr(attrCount, tmpItemAttr); }//器魂珠 else if (EQUIP_CAP == pEquipment->GetItemType()//EQUIP_PIFENG == pEquipment->GetEquipPoint() || || EQUIP_SHOULDER == pEquipment->GetItemType() || EQUIP_HAND == pEquipment->GetItemType() || EQUIP_ARMOR == pEquipment->GetItemType() || EQUIP_BOOT == pEquipment->GetItemType()) { bRet = HumanItemLogic::CreateItemToBag(&ItemLogParam,pHuman,ITEM_WU_SOUL_BEAD, iSoulBeadBagIndex); if(bRet) { SaveItemLog(&ItemLogParam); } else { msg.SetResult(EQUIPREFINING_ERASE_ITEM_FAIL); pGamePlayer->SendPacket(&msg); return PACKET_EXE_CONTINUE; } pSoulBeadItem = pBagContainer->GetItem(pBagContainer->BagIndex2ConIndex(iSoulBeadBagIndex)); Assert(NULL != pSoulBeadItem); Assert(ICLASS_SOUL_BEAD == pSoulBeadItem->GetItemClass()); pSoulBeadItem->SetSoulBeadPrice(iPrice);//由基本价格计算得出 pSoulBeadItem->SetSoulBeadNeedLevel(iRequireLevel); pSoulBeadItem->SetQiSoulBeadAttr(attrCount, tmpItemAttr); } // 通知增加道具到背包 GCNotifyEquip ItemMsg; Assert(pSoulBeadItem); ItemMsg.SetBagIndex(iSoulBeadBagIndex); pSoulBeadItem->SaveValueTo(ItemMsg.GetItem()); pGamePlayer->SendPacket(&ItemMsg); msg.SetResult(EQUIPREFINING_SUCCESS); //pGamePlayer->SendPacket(&msg); 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 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 CGUseEquipHandler::Execute(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->GetPlayerStatus()!=PS_SERVER_NORMAL || !pHuman->IsActiveObj() ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGUseEquipmentHandler: change scene") ; return PACKET_EXE_CONTINUE; } BYTE BagIndex = pPacket->getBagIndex(); if( BagIndex == INVALID_BAG_INDEX ) { Assert(FALSE) ; //包发错了 return PACKET_EXE_CONTINUE ; } Item* pUseItem = HumanItemLogic::GetItem(pHuman,BagIndex); GCUseEquipResult Msg; ////////////////////////////////////////////////////////////////////////// //装配条件判断 UCHAR itemClass = pUseItem->GetItemClass(); if(itemClass == ICLASS_EQUIP) { //需求等级判断 if(pUseItem->GetRequireLevel()>pHuman->GetLevel()) { Msg.setResult(USEEQUIP_IDENT_FAIL); pGamePlayer->SendPacket( &Msg ) ; } //鉴定判断 else if(pUseItem->GetItemQual() == EQUALITY_BLUE && pUseItem->GetItemIdent() == FALSE) { Msg.setResult(USEEQUIP_LEVEL_FAIL); pGamePlayer->SendPacket( &Msg ) ; } else { HUMAN_EQUIP Equip_Point =(HUMAN_EQUIP)pUseItem->GetEquipPoint(); //const _ITEM* pEquip = pHuman->GetEquip(Equip_Point); ItemContainer* pEquipContainer = pHuman->GetEquipContain(); if(!pEquipContainer) { Assert(pEquipContainer); return PACKET_EXE_CONTINUE; } Item* pEquipItem = pEquipContainer->GetItem((UINT)Equip_Point); if(!pEquipItem) { Assert(pEquipItem); return PACKET_EXE_CONTINUE; } BOOL bEquipStatus = (!pEquipItem->IsEmpty()); ItemContainer* pBagContainer = HumanItemLogic::GetContainer(pHuman,BagIndex); if(bEquipStatus) { //装备上物品,替换下来装备点数据 g_ItemOperator.ExchangeItem(pBagContainer, pBagContainer->BagIndex2ConIndex(BagIndex), pEquipContainer, (UINT)Equip_Point); } else { //pHuman->GetDB()->OverWriteBag2Equip(BagIndex,Equip_Point); g_ItemOperator.MoveItem(pBagContainer, pBagContainer->BagIndex2ConIndex(BagIndex), pEquipContainer, (UINT)Equip_Point); } Item* pEquip = pEquipContainer->GetItem((UINT)Equip_Point); if(pEquip&&pEquip->IsCanEquipBind()) { g_ItemOperator.SetItemBind(pEquipContainer,(UINT)Equip_Point); } Msg.setBagIndex(BagIndex); Msg.setEquipPoint(Equip_Point); Msg.setEquipID(pEquipItem->GetGUID()); Msg.setEquipResID(pEquipItem->GetItemTableIndex()); Msg.setItemResID(pUseItem->GetItemTableIndex()); Msg.setBagItemId(pUseItem->GetGUID()); Msg.setResult(USEEQUIP_SUCCESS); pGamePlayer->SendPacket( &Msg ) ; pHuman->SetEquipVer(pHuman->GetEquipVer()+1); //刷新装备对人物的属性影响 pHuman->ItemEffectFlush(); //如果可见 if(pHuman->IsVisualPart(Equip_Point)) { GCCharEquipment OtherMsg; OtherMsg.setObjID(pHuman->GetID()); if(Equip_Point == HEQUIP_WEAPON) { UINT uGemID = GetEquipmentMaxLevelGemID(pEquip); OtherMsg.setID(Equip_Point,pEquip->GetItemTableIndex(), uGemID); } else { OtherMsg.setID(Equip_Point,pEquip->GetItemTableIndex(), -1); } pScene->BroadCast(&OtherMsg,pHuman,TRUE); } WORD RetPart = 0; GCDetailEquipList SelfMsg; SelfMsg.setObjID( pHuman->GetID() ); pEquipItem = HumanItemLogic::GetEquip(pHuman,Equip_Point); if(!pEquipItem) { Assert(FALSE); return PACKET_EXE_CONTINUE; } if(pEquipItem->IsEmpty()) { g_pLog->FastSaveLog( LOG_FILE_1, "CGUseEquipmentHandler: Equip_Point =%d Fail", Equip_Point ) ; return PACKET_EXE_CONTINUE; } pEquipItem->SaveValueTo(SelfMsg.GetEquipData(Equip_Point)); RetPart|=(1<<((INT)Equip_Point)); SelfMsg.SetAskPart(RetPart); pGamePlayer->SendPacket( &SelfMsg ) ; } } else { Msg.setResult(USEEQUIP_TYPE_FAIL); Msg.setBagIndex(0); Msg.setEquipPoint(0); pGamePlayer->SendPacket( &Msg ) ; } g_pLog->FastSaveLog( LOG_FILE_1, "CGUseEquipmentHandler: BagIndex=%d", BagIndex ) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
ORESULT AbilityMachining::CanUseAbility(Obj_Human* pHuman) { __ENTER_FUNCTION Assert( pHuman ); AbilityOpera* pAbilityOpera; pAbilityOpera = pHuman->GetAbilityOpera(); Assert( pAbilityOpera ); switch( pAbilityOpera->m_SubType ) { case NORMAL_TYPE: return AbilityCompound::CanUseAbility(pHuman); case GEM_COMPOUND: { ORESULT res; res = Ability::CanUseAbility(pHuman); if( res != OR_OK ) { return res; } if( (pAbilityOpera->m_BagPos[0] < 0) || (pAbilityOpera->m_BagPos[0] >= MAX_BAG_SIZE) || (pAbilityOpera->m_BagPos[1] < 0) || (pAbilityOpera->m_BagPos[1] >= MAX_BAG_SIZE) ) { Assert(FALSE); return OR_ERROR; } //const _ITEM* pGem1 = pHuman->GetItem(pAbilityOpera->m_BagPos[0]); //const _ITEM* pGem2 = pHuman->GetItem(pAbilityOpera->m_BagPos[1]); Item* pGem1Item = HumanItemLogic::GetBagItem(pHuman,pAbilityOpera->m_BagPos[0]); Item* pGem2Item = HumanItemLogic::GetBagItem(pHuman,pAbilityOpera->m_BagPos[1]); Assert( (pGem1Item != NULL) && (pGem2Item != NULL) ); if( (pGem1Item->GetItemClass() != ICLASS_GEM) || (pGem2Item->GetItemClass() != ICLASS_GEM) ) { return OR_STUFF_LACK; } if((pGem1Item->GetItemIndex() != pGem2Item->GetItemIndex())// (pGem1Item->GetItemQual() != pGem2Item->GetItemQual()) ) { return OR_STUFF_LACK; } //if( >= MAX_GEM_QUALITY ) // pGem1Item->GetItemQual()没法再升了 //{ // return OR_CANNOT_UPGRADE; //} return OR_OK; } break; case GEM_EMBED: { ORESULT res; res = Ability::CanUseAbility(pHuman); if( res != OR_OK ) { return res; } if( (pAbilityOpera->m_BagPos[0] < 0) || (pAbilityOpera->m_BagPos[0] >= MAX_BAG_SIZE) || (pAbilityOpera->m_BagPos[1] < 0) || (pAbilityOpera->m_BagPos[1] >= MAX_BAG_SIZE) ) { Assert(FALSE); return OR_ERROR; } //const _ITEM* pGem = pHuman->GetItem(pAbilityOpera->m_BagPos[0]); //const _ITEM* pEquip = pHuman->GetItem(pAbilityOpera->m_BagPos[1]); Item* pGemItem = HumanItemLogic::GetBagItem(pHuman,pAbilityOpera->m_BagPos[0]); Item* pEquipItem = HumanItemLogic::GetBagItem(pHuman,pAbilityOpera->m_BagPos[1]); Assert( (pGemItem != NULL) && (pEquipItem != NULL) ); if( (pGemItem->GetItemClass() != ICLASS_GEM) || (pEquipItem->GetItemClass() != ICLASS_EQUIP) ) { return OR_STUFF_LACK; } if( IsGemConflict(pHuman, pAbilityOpera->m_BagPos[0], pAbilityOpera->m_BagPos[1]) == FALSE ) { return OR_GEM_CONFLICT; } LuaInterface* pLuaInterface; pLuaInterface = pHuman->getScene()->GetLuaInterface(); if( pEquipItem->GetGemSlotMax() <= pEquipItem->GetEquipGemCount() || pLuaInterface->ExeScript_DDD( ABILITY_LOGIC_SCRIPT, "TooManyGems", (INT)pHuman->getScene()->SceneID(), (INT)pHuman->GetID(), (INT)pAbilityOpera->m_BagPos[1] ) ) { return OR_GEM_SLOT_LACK; } return OR_OK; } break; default: Assert(FALSE); return OR_ERROR; } return OR_WARNING; __LEAVE_FUNCTION return OR_ERROR; }
ORESULT AbilityInlay::CanUseAbility(Obj_Human* pHuman) { __ENTER_FUNCTION Assert( pHuman ); AbilityOpera* pAbilityOpera; pAbilityOpera = pHuman->GetAbilityOpera(); Assert( pAbilityOpera ); ORESULT res; res = Ability::CanUseAbility(pHuman); if( res != OR_OK ) { return res; } CHAR MaterialBagIndex1 = (CHAR)pAbilityOpera->m_BagPos[2]; CHAR MaterialBagIndex2 = (CHAR)pAbilityOpera->m_BagPos[3]; if( (pAbilityOpera->m_BagPos[0] < 0) || (pAbilityOpera->m_BagPos[0] >= MAX_BAG_SIZE) || (pAbilityOpera->m_BagPos[1] < 0) || (pAbilityOpera->m_BagPos[1] >= MAX_BAG_SIZE) || (MaterialBagIndex1>= MAX_BAG_SIZE)|| (MaterialBagIndex2>= MAX_BAG_SIZE) ) { Assert(FALSE); return OR_ERROR; } Item* pGemItem = HumanItemLogic::GetBagItem( pHuman, pAbilityOpera->m_BagPos[0] ); Item* pEquipItem = HumanItemLogic::GetBagItem( pHuman, pAbilityOpera->m_BagPos[1] ); Item* pMaterialItem1 = NULL; Item* pMaterialItem2 = NULL; if( MaterialBagIndex1 != -1 ) { pMaterialItem1 = HumanItemLogic::GetBagItem( pHuman, pAbilityOpera->m_BagPos[2] ); Assert( pMaterialItem1 != NULL ); } if( MaterialBagIndex2 != -1 ) { pMaterialItem2 = HumanItemLogic::GetBagItem( pHuman, pAbilityOpera->m_BagPos[3] ); Assert( pMaterialItem2 != NULL ); } Assert( (pGemItem != NULL) && (pEquipItem != NULL) ); if( (pGemItem->IsLock()) || (pEquipItem->IsLock()) || (pGemItem->IsPWLock()) || (pEquipItem->IsPWLock()) || (pGemItem->GetItemClass() != ICLASS_GEM) || (pEquipItem->GetItemClass() != ICLASS_EQUIP) ) { return OR_STUFF_LACK; } //if( pHuman->__GetAbilityLevel(pAbilityOpera->m_AbilityID) < pGemItem->GetItemQual() ) //{ // return OR_NO_LEVEL; //} if( IsGemConflict(pHuman, pAbilityOpera->m_BagPos[0], pAbilityOpera->m_BagPos[1]) == FALSE ) { return OR_GEM_CONFLICT; } LuaInterface* pLuaInterface; pLuaInterface = pHuman->getScene()->GetLuaInterface(); if( pEquipItem->GetGemSlotMax() <= pEquipItem->GetEquipGemCount() || pLuaInterface->ExeScript_DDD( ABILITY_LOGIC_SCRIPT, DEF_GEM_COUNT_CHECK, (INT)pHuman->getScene()->SceneID(), (INT)pHuman->GetID(), (INT)pAbilityOpera->m_BagPos[1] ) ) { return OR_GEM_SLOT_LACK; } if( pLuaInterface->ExeScript_DDDD( ABILITY_LOGIC_SCRIPT, DEF_IS_GEM_FIT_EQUIP, (INT)pHuman->getScene()->SceneID(), (INT)pHuman->GetID(), pGemItem->GetItemTableIndex(), pAbilityOpera->m_BagPos[1] ) == 0 ) { // 判断宝石和装备是否匹配 return OR_GEM_NOT_FIT_EQUIP; } return OR_OK; __LEAVE_FUNCTION return OR_ERROR; }
uint CGShopSpecialRepairHandler::Execute( CGShopSpecialRepair* 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 ; } BYTE Opt = pPacket->GetOpt(); BYTE BagIndex = pPacket->GetBagIndex(); //包中的位置 Item* pCurItem = NULL; INT MoneySpent = 0; INT MoneyLast = 0; INT MoneyHave = pHuman->GetMoney(); INT RepairedIndex = 0; GCShopSpecialRepairResult MsgResult; GCShopSpecialRepairResult::REPAIRED_ITEM ItemList; if(Opt == CGShopSpecialRepair::FromBag) { //一定是修理单个 ItemContainer* pItemContainer = HumanItemLogic::GetBagContainer(pHuman, BagIndex); if (pItemContainer == NULL) { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopSpecialRepairHandler BagIndex is invalid, BagIndex = %d", BagIndex) ; return PACKET_EXE_ERROR; } if (!pItemContainer->IsCanUse()) { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopSpecialRepairHandler extrabag is invalid time BagIndex = %d", BagIndex) ; return PACKET_EXE_CONTINUE ; } pCurItem = pItemContainer->GetItem(pItemContainer->BagIndex2ConIndex(BagIndex)); if(!pCurItem->IsEmpty()) { if(pCurItem->GetItemClass() != ICLASS_EQUIP) { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopSpecialRepairHandler pCurItem->GetItemClass() != ICLASS_EQUIP ") ; return PACKET_EXE_ERROR ; } EQUIP_SPECIALREPAIR_TB* pSpecialRepair = g_ItemTable.GetSpecialRepairTB(); Assert (pSpecialRepair != NULL); if (!pSpecialRepair) { g_pLog->FastSaveLog( LOG_FILE_1, "[CGShopSpecialRepairHandler::Execute] GetSpecialRepairTB index is error"); return PACKET_EXE_ERROR; } //获得Human背包中对应ItemIndex的物品位置 UINT nItemCount = HumanItemLogic::CalcBagItemCount(pHuman, pSpecialRepair->m_ItemID); if((nItemCount == 0)||(nItemCount < pPacket->GetItemNum())) { MsgResult.SetResult(EQUIPSPECIALREPAIR_ITEM); pGamePlayer->SendPacket(&MsgResult); g_pLog->FastSaveLog( LOG_FILE_1, "CGShopSpecialRepairHandler nItemIndex = %d", pSpecialRepair->m_ItemID) ; return PACKET_EXE_CONTINUE ; } FLOAT fCur = (FLOAT)pCurItem->GetDurPoints(); FLOAT fMax = (FLOAT)pCurItem->GetMaxDurPoint(); FLOAT fCurMax = (FLOAT)pCurItem->GetCurMaxDurPoint(); if(fMax != fCurMax) { UINT nUsedItem = 0; for (UINT i=0; i<pPacket->GetItemNum(); ++i) { ++nUsedItem; fCurMax = pSpecialRepair->m_RecoverPoint + fCurMax; if (fCurMax>=fMax) { fCurMax = fMax; break; } } HumanItemLogic::SetBagItemCurMaxDur(pHuman,(UINT)BagIndex, (INT)fCurMax); HumanItemLogic::SetBagItemDur(pHuman,(UINT)BagIndex, (INT)fCurMax); ITEM_LOG_PARAM LogParam; LogParam.OpType = ITEM_SPECIALREPAIR_CONSUME; LogParam.CharGUID = pHuman->GetGUID(); LogParam.XPos = pHuman->getWorldPos()->m_fX; LogParam.ZPos = pHuman->getWorldPos()->m_fZ; LogParam.SceneID = pHuman->getScene()->SceneID(); BOOL bOK = HumanItemLogic::EraseBagItem(&LogParam,pHuman, pSpecialRepair->m_ItemID, nUsedItem); Assert(bOK); SaveItemLog(&LogParam); ItemList.IsIn = GCShopSpecialRepairResult::BAG; ItemList.nCurDur = pCurItem->GetDurPoints(); ItemList.nCurMaxDur = pCurItem->GetCurMaxDurPoint(); ItemList.BagIndex = BagIndex; MsgResult.SetResult(EQUIPSPECIALREPAIR_SUCCESS); MsgResult.SetReList(&ItemList); pHuman->GetPlayer()->SendPacket(&MsgResult); return PACKET_EXE_CONTINUE ; } else { MsgResult.SetResult(EQUIPSPECIALREPAIR_NOREAPIR); pGamePlayer->SendPacket(&MsgResult); g_pLog->FastSaveLog( LOG_FILE_1, "CGShopSpecialRepairHandler needn't repair") ; return PACKET_EXE_CONTINUE ; } } else { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopSpecialRepairHandler BagIndex = %d", BagIndex) ; return PACKET_EXE_CONTINUE ; } } else if(Opt == CGShopSpecialRepair::FromEquip) { pCurItem = HumanItemLogic::GetEquip(pHuman,(HUMAN_EQUIP)BagIndex); if(!pCurItem->IsEmpty()) {//有东西 if(pCurItem->GetItemClass() != ICLASS_EQUIP) { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopSpecialRepairHandler pCurItem->GetItemClass() != ICLASS_EQUIP ") ; return PACKET_EXE_ERROR ; } EQUIP_SPECIALREPAIR_TB* pSpecialRepair = g_ItemTable.GetSpecialRepairTB(); Assert (pSpecialRepair != NULL); if (!pSpecialRepair) { g_pLog->FastSaveLog( LOG_FILE_1, "[CGShopSpecialRepairHandler::Execute] GetSpecialRepairTB index is error"); return PACKET_EXE_ERROR; } //获得Human背包中对应ItemIndex的物品位置 UINT nItemCount = HumanItemLogic::CalcBagItemCount(pHuman, pSpecialRepair->m_ItemID); if((nItemCount == 0)||(nItemCount < pPacket->GetItemNum())) { MsgResult.SetResult(EQUIPSPECIALREPAIR_ITEM); pGamePlayer->SendPacket(&MsgResult); g_pLog->FastSaveLog( LOG_FILE_1, "CGShopSpecialRepairHandler nItemIndex = %d", pSpecialRepair->m_ItemID) ; return PACKET_EXE_CONTINUE ; } FLOAT fCur = (FLOAT)pCurItem->GetDurPoints(); FLOAT fMax = (FLOAT)pCurItem->GetMaxDurPoint(); FLOAT fCurMax = (FLOAT)pCurItem->GetCurMaxDurPoint(); if(fMax != fCurMax) { UINT nUsedItem = 0; for (UINT i=0; i<pPacket->GetItemNum(); ++i) { ++nUsedItem; fCurMax = pSpecialRepair->m_RecoverPoint + fCurMax; if (fCurMax>=fMax) { fCurMax = fMax; break; } } HumanItemLogic::SetCurEquipMaxDur(pHuman,(HUMAN_EQUIP)BagIndex, (INT)fCurMax); HumanItemLogic::SetEquipDur(pHuman,(HUMAN_EQUIP)BagIndex, (INT)fCurMax); ITEM_LOG_PARAM LogParam; LogParam.OpType = ITEM_SPECIALREPAIR_CONSUME; LogParam.CharGUID = pHuman->GetGUID(); LogParam.XPos = pHuman->getWorldPos()->m_fX; LogParam.ZPos = pHuman->getWorldPos()->m_fZ; LogParam.SceneID = pHuman->getScene()->SceneID(); BOOL bOK = HumanItemLogic::EraseBagItem(&LogParam,pHuman, pSpecialRepair->m_ItemID,nUsedItem); Assert(bOK); SaveItemLog(&LogParam); ItemList.IsIn = GCShopSpecialRepairResult::EQUIP; ItemList.nCurDur = pCurItem->GetDurPoints(); ItemList.nCurMaxDur = pCurItem->GetCurMaxDurPoint(); ItemList.BagIndex = BagIndex; MsgResult.SetResult(EQUIPSPECIALREPAIR_SUCCESS); MsgResult.SetReList(&ItemList); pHuman->GetPlayer()->SendPacket(&MsgResult); if ((INT)fCur == 0) { pHuman->ItemEffectFlush(); } return PACKET_EXE_CONTINUE ; } else { MsgResult.SetResult(EQUIPSPECIALREPAIR_NOREAPIR); pGamePlayer->SendPacket(&MsgResult); g_pLog->FastSaveLog( LOG_FILE_1, "CGShopSpecialRepairHandler needn't repair") ; return PACKET_EXE_CONTINUE ; } } } g_pLog->FastSaveLog( LOG_FILE_1, "ERROR:CGShopSpecialRepairHandler error Opt=", Opt); return PACKET_EXE_ERROR; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint CGShopSellHandler::Execute( CGShopSell* 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 m_nBagIndex = pPacket->GetBagIndex(); //包中的位置 UINT UniqueID = pPacket->GetUniqueID(); SceneID_t SceneID = UniqueID>>16; ObjID_t NpcObjID= UniqueID&0x00ff; if(SceneID != pScene->SceneID()) { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopSellHandler Illegal scene ObjName = %s", pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } //距离判定 Obj* pNpcObj = (Obj*) (pScene->GetObjManager()->GetObj(NpcObjID)); if(pNpcObj == NULL) { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopSellHandler Illegal Obj ObjName = %s", pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } FLOAT fDist = MySqrt(pNpcObj->getWorldPos(), pHuman->getWorldPos()); if(fDist>MAX_NPC_DISTANCE) { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopSellHandler Out Of Range ObjName = %s", pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } Item* pCurrentItem = HumanItemLogic::GetItem(pHuman,m_nBagIndex); if(!pCurrentItem||ConvertSerial2ItemType(pCurrentItem->GetItemTableIndex()).isNull()) { //背包索引不存在 g_pLog->FastSaveLog( LOG_FILE_1, "ERROR:CGShopSellHandler m_nBagIndex=%d PlayerName=s%", m_nBagIndex, pHuman->GetName()) ; return PACKET_EXE_CONTINUE; } //判定这个商人是不是收购这个物品 _SHOP* pShop = pHuman->Shop( ) ; //商店不存在 if(!pShop) { g_pLog->FastSaveLog( LOG_FILE_1, "ERROR:CGShopSellHandler Npc Shop Lose"); return PACKET_EXE_CONTINUE; } //查询收购等级限制 if( pCurrentItem->GetItemClass() == ICLASS_EQUIP ) { if( pCurrentItem->GetRequireLevel() > pShop->m_nBuyLevel ) { return PACKET_EXE_CONTINUE; } } else { if( pCurrentItem->GetItemLevel() > pShop->m_nBuyLevel ) { return PACKET_EXE_CONTINUE; } } BOOL bCanBuy = TRUE; if(pShop->m_nBuyType != SHOP_All) { switch(pShop->m_nBuyType) { case SHOP_All: { } break; case SHOP_DEFENCE: //防具 { if( ICLASS_EQUIP == pCurrentItem->GetItemClass()) { if( pCurrentItem->GetEquipPoint() != HEQUIP_CAP && pCurrentItem->GetEquipPoint() != HEQUIP_ARMOR && pCurrentItem->GetEquipPoint() != HEQUIP_CUFF && pCurrentItem->GetEquipPoint() != HEQUIP_BOOT ) { bCanBuy = FALSE; } } else { bCanBuy = FALSE; } } break; case SHOP_ADORN: //饰物 { if( ICLASS_EQUIP == pCurrentItem->GetItemClass()) { if( pCurrentItem->GetEquipPoint() != HEQUIP_SASH && pCurrentItem->GetEquipPoint() != HEQUIP_RING && pCurrentItem->GetEquipPoint() != HEQUIP_NECKLACE && pCurrentItem->GetEquipPoint() != HEQUIP_RIDER) { bCanBuy = FALSE; } } else { bCanBuy = FALSE; } } break; case SHOP_WEAPON: //武器 { if( ICLASS_EQUIP == pCurrentItem->GetItemClass()) { if( pCurrentItem->GetEquipPoint() != HEQUIP_WEAPON ) { bCanBuy = FALSE; } } else { bCanBuy = FALSE; } } break; case SHOP_FOOD: //食物 { if( ICLASS_COMITEM != pCurrentItem->GetItemClass()) { bCanBuy = FALSE; } } break; case SHOP_MATERIAL: //材料 { if( ICLASS_MATERIAL != pCurrentItem->GetItemClass()) { bCanBuy = FALSE; } } break; case SHOP_COMITEM: //药品 { if( ICLASS_COMITEM != pCurrentItem->GetItemClass()) { bCanBuy = FALSE; } } break; default: { bCanBuy = FALSE; break; } } } //是否返回失败消息??? if(bCanBuy == FALSE) { return PACKET_EXE_CONTINUE; } INT iPrice = ShopMgr::ConvertItemType2Money(ConvertSerial2ItemType(pCurrentItem->GetItemTableIndex())); iPrice *= pCurrentItem->GetLayedNum(); //2006-4-21 //玩家向商店出售已经鉴定过的物品或者无需鉴定的物品按照基础价格*系数A(=1/3) 计算; //若出售未鉴定物品,价格应该更低,设此价格系数为B(=1/10),这个有待于调整,请在config中开放调整A,B的接口。 //耐久衰减系数D=当前耐久/最大耐久 //修理失败衰减次数F=1/(修理失败次数+1) //因此最终的出售价格为V=基础价格B*A*D*F //再乘以商店得价格比例 FLOAT fCur = 1; FLOAT fMax = 1; INT iFailTimes = 0; if(pCurrentItem->GetItemClass() == ICLASS_EQUIP) { fCur = (FLOAT)pCurrentItem->GetDurPoints(); fMax = (FLOAT)pCurrentItem->GetMaxDurPoint(); iFailTimes = pCurrentItem->GetFailTimes(); } if(pCurrentItem->GetItemIdent()) { iPrice = (INT)( ((FLOAT)iPrice/(FLOAT)3.0) * (fCur/fMax) * ((FLOAT)1/(FLOAT)(iFailTimes+1)) * (pShop->m_scale) ); } else { iPrice = (INT)( ((FLOAT)iPrice/(FLOAT)10.0) * (fCur/fMax) * ((FLOAT)1/(FLOAT)(iFailTimes+1)) * (pShop->m_scale) ); } //备份一下,一会儿放到购回列表里 _ITEM tempitem; pCurrentItem->SaveValueTo(&tempitem); //备份到回购列表中 pHuman->AddToSoldList(m_nBagIndex, iPrice); //给钱 pHuman->SetMoney( pHuman->GetMoney() + iPrice); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_SHOP_SELL; MoneyLogParam.Count = iPrice; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); //把这个回购商品显示到界面 GCShopSoldList::_MERCHANDISE_ITEM SoldItem; SoldItem.item_data = tempitem; GCShopSoldList MsgSold; MsgSold.SetMerchadiseNum(1); MsgSold.SetMerchadiseList(&SoldItem); pHuman->GetPlayer()->SendPacket( &MsgSold ); GCShopSell MsgSell; pHuman->GetPlayer()->SendPacket( &MsgSell ); g_pLog->FastSaveLog( LOG_FILE_1, "CGShopSellHandler m_nBagIndex=%d ", m_nBagIndex ) ; return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint CGExchangeSynchItemIIHandler::Execute( CGExchangeSynchItemII* 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 ) ; //验证交易状态 EXCHANGE_CERTIFY_EACH_OTHER(pHuman) // 验证交易双方是否掉线合法 EXCHANGE_CERTIFY_ISLOCK(pHuman) // 验证当前人物的交易状态是否已经上锁 ObjID_t DestID = pHuman->m_ExchangBox.m_ObjID; Obj_Human* pDestHuman = pScene->GetHumanManager()->GetHuman( DestID ); EXCHANGE_CERTIFY_STATUS(pHuman, EXCHANGE_SYNCH_DATA) // 验证当前人物的交易状态是否正确 EXCHANGE_CERTIFY_STATUS(pDestHuman, EXCHANGE_SYNCH_DATA) //操作 BYTE Opt = pPacket->GetOpt(); BYTE FromType = pPacket->GetFromType(); BYTE ToType = pPacket->GetToType(); BYTE FromIndex = pPacket->GetFromIndex(); BYTE ToIndex = pPacket->GetToIndex(); PET_GUID_t PetGuid = pPacket->GetPetGuid(); _ITEM ItemTemp; GCExchangeSynchII Msg; GCExchangeError MsgError; ItemContainer* pExchangeContainer = &(pHuman->m_ExchangBox.m_Container); ItemContainer* pExchangePetContainer = &(pHuman->m_ExchangBox.m_PetContainer); switch(Opt) { case OPT_ERROR: { } break; case OPT_ADDITEM: { switch(FromType) { case POS_BAG: { //验证位置里是否有东西 Item* pItem = HumanItemLogic::GetBagItem(pHuman, FromIndex); if ( pItem != NULL && pItem->GetItemClass() == ICLASS_EQUIP) { if(pItem->GetEquipBindLevel()>0) // 装备绑定 { MsgError.SetID(ERR_ITEM_LOCKED); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 该物品[%d]已绑定,不可交易", pHuman->GetName(), FromIndex ) ; return PACKET_EXE_CONTINUE; } } if (pItem == NULL) { MsgError.SetID(ERR_ILLEGAL); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 背包位置 [%d] 处不存在物品", pHuman->GetName(), FromIndex ) ; return PACKET_EXE_CONTINUE; } if(pItem->IsEmpty() == FALSE) { ItemContainer* pBagContainer = HumanItemLogic::GetBagContainer(pHuman, FromIndex); if ( pBagContainer == NULL ) { MsgError.SetID(ERR_ILLEGAL); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 背包不存在", pHuman->GetName() ) ; return PACKET_EXE_CONTINUE; } //先查一遍交易盒中是不是已经有该物品了 for(INT i = 0; i<EXCHANGE_BOX_SIZE; i++) { _ITEM_GUID guid = (pBagContainer->GetItem(pBagContainer->BagIndex2ConIndex(FromIndex)))->GetGUID() ; if(pExchangeContainer->GetItem(i)->GetGUID() == guid) {//物品已经在交易盒中,丢弃该消息 return PACKET_EXE_CONTINUE ; } } //自动找格 INT result = g_ItemOperator.CopyItem ( pBagContainer, pBagContainer->BagIndex2ConIndex(FromIndex), pExchangeContainer ); if(result>=0) {//拷贝成功, //发送消息给双方客户端 Item* pIt = pExchangeContainer->GetItem(result); g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 加入交易物品 [%d]", pHuman->GetName(), pIt->GetItemTableIndex() ) ; if( pIt != NULL && pIt->IsEmpty() == FALSE ) { INT iConIndex = pBagContainer->BagIndex2ConIndex(FromIndex); //先锁定此物品 g_ItemOperator.LockItem( pBagContainer, iConIndex ); //标示次物品已经放在交易栏中,计算空间用 pBagContainer->GetItem(iConIndex)->SetInExchange(TRUE); //再发 pIt->SaveValueTo(&ItemTemp);//取出实例 /* 先发自己 */ Msg.SetIsMyself(TRUE);//发给自己 Msg.SetOpt(OPT_ADDITEM);//设置操作类型 Msg.SetFromType(POS_BAG);//设置来自类型 Msg.SetFromIndex(FromIndex);//设置来自索引 Msg.SetToIndex(result);//设置目标位置索引 pGamePlayer->SendPacket(&Msg); /* 再发对方 */ Msg.SetIsMyself(FALSE);//发给对方 Msg.SetOpt(OPT_ADDITEM);//设置操作类型 Msg.SetToIndex(result); _EXCHANGE_ITEM Exitem; Exitem.byNumber = ItemTemp.GetItemCount(); Exitem.isBlueEquip = 1; Exitem.item_data = ItemTemp; Exitem.uBagPos = result; Msg.SetItem(&Exitem); pDestHuman->GetPlayer()->SendPacket(&Msg); //改变物品 自己解锁 pHuman->m_ExchangBox.m_IsLocked = FALSE; if(pDestHuman->m_ExchangBox.m_IsLocked == TRUE) {//如果对方已经加锁 pDestHuman->m_ExchangBox.m_IsLocked = FALSE; GCExchangeSynchLock MsgToDes, MsgToSelf; //通知对方,解双方锁 MsgToDes.SetIsBoth(TRUE); MsgToDes.SetIsLocked(FALSE); pDestHuman->GetPlayer()->SendPacket(&MsgToDes); //通知自己解对方锁 MsgToSelf.SetIsMyself(FALSE); MsgToSelf.SetIsLocked(FALSE); pHuman->GetPlayer()->SendPacket(&MsgToSelf); } else {//对方没有加锁,直接同步 GCExchangeSynchLock MsgToDes; MsgToDes.SetIsMyself (FALSE); MsgToDes.SetIsLocked(FALSE); pDestHuman->GetPlayer()->SendPacket(&MsgToDes); } } else { MsgError.SetID(ERR_ILLEGAL); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 加入非法交易物品 [%d]", pHuman->GetName(), pIt->GetItemTableIndex() ) ; return PACKET_EXE_CONTINUE ; }//if( pIt != NULL && pIt->IsEmpty() == FALSE ) } else {//拷贝失败 MsgError.SetID(ERR_NOT_ENOUGHT_EXROOM); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 交易盒没有足够空间", pHuman->GetName() ) ; return PACKET_EXE_CONTINUE ; }//if(result>=0) } else { MsgError.SetID(ERR_ILLEGAL); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 没有获取到所要交易的背包物品", pHuman->GetName() ) ; return PACKET_EXE_CONTINUE ; }//if(pItem->IsEmpty() == FALSE) } break; case POS_EQUIP: { } break; case POS_PET: { } break; default: break; } } break; case OPT_REMOVEITEM: { switch(ToType) { case POS_BAG: { Item* pIt = pExchangeContainer->GetItem(FromIndex); if( pIt != NULL && pIt->IsEmpty() == FALSE ) { INT BagIndex = -1; ItemContainer* pBagContainer = HumanItemLogic::GetBagItemContain( pHuman,&pIt->GetGUID(), BagIndex); if ( pBagContainer == NULL ) { MsgError.SetID(ERR_ILLEGAL); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 背包不存在", pHuman->GetName() ) ; return PACKET_EXE_CONTINUE; } //从交易盒中删掉此物品 if(g_ItemOperator.EraseItem(pExchangeContainer, FromIndex)) { //解锁此物品 g_ItemOperator.UnlockItem( pBagContainer, BagIndex ); //标示次物品已经取消放在交易栏中,计算空间用 pBagContainer->GetItem(BagIndex)->SetInExchange(FALSE); g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 删除交易物品 [%d]", pHuman->GetName(), BagIndex) ; //发消息 if(BagIndex>=0) { /* 先发自己 */ Msg.SetIsMyself(TRUE);//发给自己 Msg.SetOpt(OPT_REMOVEITEM);//设置操作类型 Msg.SetToType(POS_BAG);//设置目的类型 Msg.SetToIndex(BagIndex);//设置目的索引 Msg.SetFromIndex(FromIndex);//设置来源索引 pGamePlayer->SendPacket(&Msg); /* 再发对方 */ Msg.SetIsMyself(FALSE);//发给对方 Msg.SetOpt(OPT_REMOVEITEM);//设置操作类型 Msg.SetFromIndex(FromIndex);//设置来源索引 pDestHuman->GetPlayer()->SendPacket(&Msg); //改变物品 自己解锁 pHuman->m_ExchangBox.m_IsLocked = FALSE; if(pDestHuman->m_ExchangBox.m_IsLocked == TRUE) {//如果对方已经加锁 pDestHuman->m_ExchangBox.m_IsLocked = FALSE; GCExchangeSynchLock MsgToDes, MsgToSelf; //通知对方,解双方锁 MsgToDes.SetIsBoth(TRUE); MsgToDes.SetIsLocked(FALSE); pDestHuman->GetPlayer()->SendPacket(&MsgToDes); //通知自己解对方锁 MsgToSelf.SetIsMyself(FALSE); MsgToSelf.SetIsLocked(FALSE); pHuman->GetPlayer()->SendPacket(&MsgToSelf); } else {//对方没有加锁,直接同步 GCExchangeSynchLock MsgToDes; MsgToDes.SetIsMyself (FALSE); MsgToDes.SetIsLocked(FALSE); pDestHuman->GetPlayer()->SendPacket(&MsgToDes); } } else { MsgError.SetID(ERR_ILLEGAL); pGamePlayer->SendPacket(&MsgError); return PACKET_EXE_CONTINUE; } } else { MsgError.SetID(ERR_ILLEGAL); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 删除交易盒位置 [%d] 处的物品时出错", pHuman->GetName(), FromIndex ) ; return PACKET_EXE_CONTINUE; } } else { MsgError.SetID(ERR_ILLEGAL); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 交易盒位置 [%d] 处不存在物品", pHuman->GetName(), FromIndex ) ; return PACKET_EXE_CONTINUE; } } break; case POS_EQUIP: { } break; case POS_PET: { } break; default: break; } } break; case OPT_ADDPET: { ItemContainer* pPetContainer = pHuman->GetPetContain(); FromIndex = pPetContainer->GetIndexByGUID( &PetGuid ); if (255 == FromIndex) { g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 加入非法交易宠物", pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } //先查一遍交易盒中是不是已经有该物品了 for(INT i = 0; i<EXCHANGE_PET_BOX_SIZE; i++) { if(pExchangePetContainer->GetItem(i)->GetPetGUID() == pPetContainer->GetItem(FromIndex)->GetPetGUID() ) {//物品已经在交易盒中,丢弃该消息 return PACKET_EXE_CONTINUE ; } } //自动找格 INT result = g_ItemOperator.CopyItem ( pPetContainer, FromIndex, pExchangePetContainer ); if(result>=0) {//拷贝成功 Item* pIt = pExchangePetContainer->GetItem(result); g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 加入交易宠物 [%s]", pHuman->GetName(), pIt->GetName() ) ; if(pIt->IsEmpty() == FALSE) { //先锁定此物品 g_ItemOperator.LockItem( pPetContainer, FromIndex ); //标示次物品已经放在交易栏中,计算空间用 pPetContainer->GetItem(FromIndex)->SetInExchange(TRUE); /* 先发自己 */ Msg.SetIsMyself(TRUE);//发给自己 Msg.SetOpt(OPT_ADDPET);//设置操作类型 Msg.SetToIndex(result);//设置目的地位置 Msg.SetPetGuid(PetGuid);//宠物GUID pGamePlayer->SendPacket(&Msg); /* 再发对方 */ GCDetailAttrib_Pet PetMsgDetail; //组装GCDetailAttrib_Pet结构 Obj_Human::CalculatePetDetailAttrib(PetMsgDetail, pIt); PetMsgDetail.SetTradeIndex( result ); PET_EXTRA_STRUCT::GCExchangePetView_t ExtraPetInfo; ExtraPetInfo.m_bFlag = TYPE_EXCHANGE; PetMsgDetail.SetExtraInfoLength(ExtraPetInfo.GetSize()); PetMsgDetail.SetExtraInfoData((BYTE*)&ExtraPetInfo); pDestHuman->GetPlayer()->SendPacket(&PetMsgDetail); //改变金钱 自己解锁 pHuman->m_ExchangBox.m_IsLocked = FALSE; if(pDestHuman->m_ExchangBox.m_IsLocked == TRUE) {//如果对方已经加锁 pDestHuman->m_ExchangBox.m_IsLocked = FALSE; GCExchangeSynchLock MsgToDes, MsgToSelf; //通知对方,解双方锁 MsgToDes.SetIsBoth(TRUE); MsgToDes.SetIsLocked(FALSE); pDestHuman->GetPlayer()->SendPacket(&MsgToDes); //通知自己解对方锁 MsgToSelf.SetIsMyself(FALSE); MsgToSelf.SetIsLocked(FALSE); pHuman->GetPlayer()->SendPacket(&MsgToSelf); } else {//对方没有加锁,直接同步 GCExchangeSynchLock MsgToDes; MsgToDes.SetIsMyself (FALSE); MsgToDes.SetIsLocked(FALSE); pDestHuman->GetPlayer()->SendPacket(&MsgToDes); } } else { MsgError.SetID(ERR_ILLEGAL); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 加入非法交易宠物 [%s]", pHuman->GetName(), pIt->GetName() ) ; return PACKET_EXE_CONTINUE ; } } } break; case OPT_REMOVEPET: { ItemContainer* pPetContainer = pHuman->GetPetContain(); INT nIndexInPet = pPetContainer->GetIndexByGUID(&PetGuid); FromIndex = pExchangePetContainer->GetIndexByGUID(&PetGuid); if(g_ItemOperator.EraseItem(pExchangePetContainer, FromIndex)) { //解锁此物品 g_ItemOperator.UnlockItem( pPetContainer, nIndexInPet ); //标示次物品已经放在交易栏中,计算空间用 pPetContainer->GetItem(nIndexInPet)->SetInExchange(FALSE); //发消息 g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 删除交易宠物 [%s]", pHuman->GetName(), pPetContainer->GetItem(nIndexInPet)->GetName()) ; if(nIndexInPet>=0) { /* 先发自己 */ Msg.SetIsMyself(TRUE);//发给自己 Msg.SetOpt(OPT_REMOVEPET);//设置操作类型 Msg.SetPetGuid(PetGuid);//宠物GUID pGamePlayer->SendPacket(&Msg); /* 再发对方 */ Msg.SetIsMyself(FALSE);//发给对方 Msg.SetOpt(OPT_REMOVEPET);//设置操作类型 Msg.SetPetGuid(PetGuid);//宠物GUID pDestHuman->GetPlayer()->SendPacket(&Msg); //改变金钱 自己解锁 pHuman->m_ExchangBox.m_IsLocked = FALSE; if(pDestHuman->m_ExchangBox.m_IsLocked == TRUE) {//如果对方已经加锁 pDestHuman->m_ExchangBox.m_IsLocked = FALSE; GCExchangeSynchLock MsgToDes, MsgToSelf; //通知对方,解双方锁 MsgToDes.SetIsBoth(TRUE); MsgToDes.SetIsLocked(FALSE); pDestHuman->GetPlayer()->SendPacket(&MsgToDes); //通知自己解对方锁 MsgToSelf.SetIsMyself(FALSE); MsgToSelf.SetIsLocked(FALSE); pHuman->GetPlayer()->SendPacket(&MsgToSelf); } else {//对方没有加锁,直接同步 GCExchangeSynchLock MsgToDes; MsgToDes.SetIsMyself (FALSE); MsgToDes.SetIsLocked(FALSE); pDestHuman->GetPlayer()->SendPacket(&MsgToDes); } } else { MsgError.SetID(ERR_ILLEGAL); pGamePlayer->SendPacket(&MsgError); return PACKET_EXE_CONTINUE; } } else { MsgError.SetID(ERR_ILLEGAL); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 删除交易盒位置 [%d] 处的物品时出错", pHuman->GetName(), FromIndex ) ; return PACKET_EXE_CONTINUE; } } break; default: break; } return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
UINT CGUseItemHandler::Execute(CGUseItem* pPacket,Player* pPlayer) { __ENTER_FUNCTION USEITEM_RESULT Result ; 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 ); //检查是否可以使用物品 ID_t BagIndex = pPacket->GetBagIndex(); Assert(BagIndex<MAX_BAG_SIZE); //检查物品是否合法 Item* pBagItem = HumanItemLogic::GetItem(pHuman,BagIndex); if(pBagItem->IsEmpty()) { //Assert(FALSE) ; //物品得不到 g_pLog->FastSaveLog( LOG_FILE_1, "CGUseItemHandler Can't GetItem BagIndex=%d", BagIndex) ; return PACKET_EXE_CONTINUE ; } ObjID_t Target = pHuman->GetID(); //1.0 当前版本使用物品只处理吃药 //1.1 版本使用物品处理药品,藏宝图,配方 if(!pBagItem->IsRuler(IRL_CANUSE)) { g_pLog->FastSaveLog( LOG_FILE_1, "CGUseItemHandler Can't use item BagIndex=%d", BagIndex); return PACKET_EXE_CONTINUE ; } if(pHuman->GetLevel()>=pBagItem->GetItemLevel()) //级别检查 { switch(pBagItem->GetItemClass()) { case ICLASS_TASKITEM: //任务物品类 case ICLASS_COMITEM: //药品的使用 { if(CLASS_OF_IDENT(pBagItem)) { Result = (USEITEM_RESULT)pHuman->UseIdentScroll(pPacket->GetBagIndex(),pPacket->GetTargetItem()); } else { ScriptID_t nScript = pBagItem->GetScriptID(); SkillID_t nSkill = pBagItem->GetSkillID(); if(INVALID_ID!= nScript) { if(FALSE == g_ScriptLogic.Item_IsSkillLikeScript(*pHuman, nScript)) { g_ScriptLogic.Item_CallDefaultEvent(*pHuman, nScript, BagIndex); break; } else if(FALSE == g_ScriptLogic.Script_CancelImpacts(*pHuman, nScript)) { //取消效果失败 PET_GUID_t PetGUID = pPacket->GetTargetPetGUID(); Result = (USEITEM_RESULT)pHuman->GetHumanAI()->PushCommand_UseItem( pPacket->GetBagIndex(), pPacket->GetTargetObjID(), *(pPacket->GetTargetPos()), PetGUID, pPacket->GetTargetItem() ); } else { Result = USEITEM_SUCCESS; } } } } break; case ICLASS_STOREMAP://藏宝图 { Result = (USEITEM_RESULT)pHuman->UseStoreMap(BagIndex); } break; default: { Result = USEITEM_INVALID; } break; } } else { Result = USEITEM_LEVEL_FAIL; } GCUseItemResult Msg; Msg.SetResult(Result); pGamePlayer->SendPacket(&Msg); g_pLog->FastSaveLog( LOG_FILE_1, "CGUseItemHandler BagIndex=%d Result=%d", BagIndex, Result ) ; return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR; }