uint CGStallOpenHandler::Execute( CGStallOpen* 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 ) ; ObjID_t ObjId = pPacket->GetObjID(); //临时数组 GCStallOpen::_STALL_ITEM StallItem[STALL_BOX_SIZE+STALL_PET_BOX_SIZE]; if(ObjId == pHuman->GetID()) {//自己打开自己,肯定打开 //摊主container if(pHuman->m_StallBox.GetStallStatus() != ServerStallBox::STALL_OPEN) { GCStallError Msg; Msg.SetID(STALL_MSG::ERR_ILLEGAL); pGamePlayer->SendPacket(&Msg); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallOpenHandler::ObjID=%d, ERR_ILLEGAL: != ServerStallBox::STALL_OPEN" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE; } ItemContainer* pStallContainer = pHuman->m_StallBox.GetContainer(); ItemContainer* pStallPetContainer = pHuman->m_StallBox.GetPetContainer(); //循环写入 UINT k = 0; for(INT i = 0; i<pStallContainer->GetContainerSize(); i++) { if( pHuman->m_StallBox.GetSerialByIndex(i) != 0 ) {//这个格子里的东西更改过,需要通知客户端它的序列号 StallItem[k].nIndex = i; StallItem[k].nPrice = pHuman->m_StallBox.GetPriceByIndex(i); StallItem[k].nSerial = pHuman->m_StallBox.GetSerialByIndex(i); if(pStallContainer->GetItem(i)->IsEmpty() == FALSE) { pStallContainer->GetItem(i)->SaveValueTo(&(StallItem[k].item)); } k++; } } for(INT i = 0; i<pStallPetContainer->GetContainerSize(); i++) { if( pHuman->m_StallBox.GetPetSerialByIndex(i) != 0 ) {//有东西 StallItem[k].bIsPet = TRUE; StallItem[k].nIndex = i; StallItem[k].nPrice = pHuman->m_StallBox.GetPetPriceByIndex(i); StallItem[k].nSerial = pHuman->m_StallBox.GetPetSerialByIndex(i); if(pStallPetContainer->GetItem(i)->IsEmpty() == FALSE) { StallItem[k].PetGuid = pStallPetContainer->GetItem(i)->GetPetGUID(); } k++; } } pHuman->StallNameChanged(); //消息填充 GCStallOpen Msg; Msg.SetFirstPage( pHuman->m_StallBox.GetFirstPage()); Msg.SetMerchadiseNum(k); Msg.SetMerchadiseList(StallItem); Msg.SetShopName(pHuman->m_StallBox.GetStallName(), (UINT)strlen(pHuman->m_StallBox.GetStallName())); Msg.SetObjID(ObjId); Msg.SetGUID(pHuman->GetGUID()); //发还本人Q pGamePlayer->SendPacket(&Msg); } else {//别人 //判断距离是否可以打开 Obj_Human* pTargetHuman = pScene->GetHumanManager()->GetHuman( ObjId ); if( pTargetHuman == NULL ) { GCStallError Msg; Msg.SetID(STALL_MSG::ERR_OWNER_INVALID); pHuman->GetPlayer()->SendPacket(&Msg); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallOpenHandler::ObjName=%s, ERR_OWNER_INVALID: ObjId = %d" ,pHuman->GetName(), ObjId) ; return PACKET_EXE_CONTINUE; } if(pTargetHuman->m_StallBox.GetStallStatus() != ServerStallBox::STALL_OPEN) { GCStallError Msg; Msg.SetID(STALL_MSG::ERR_CLOSE); pGamePlayer->SendPacket(&Msg); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallOpenHandler::ObjName=%s, ERR_CLOSE" ,pHuman->GetName()) ; return PACKET_EXE_CONTINUE; } //摊主container ItemContainer* pStallContainer = pTargetHuman->m_StallBox.GetContainer(); //循环写入 UINT k = 0; for(INT i = 0; i<pStallContainer->GetContainerSize(); i++) { if( pStallContainer->GetItem(i)->IsEmpty() == FALSE ) {//有东西 StallItem[k].nIndex = i; StallItem[k].nPrice = pTargetHuman->m_StallBox.GetPriceByIndex(i); StallItem[k].nSerial = pTargetHuman->m_StallBox.GetSerialByIndex(i); pStallContainer->GetItem(i)->SaveValueTo(&(StallItem[k].item)); k++; } } //消息填充 GCStallOpen Msg; Msg.SetFirstPage( pTargetHuman->m_StallBox.GetFirstPage()); Msg.SetMerchadiseNum(k); Msg.SetMerchadiseList(StallItem); Msg.SetShopName(pTargetHuman->m_StallBox.GetStallName(), MAX_STALL_NAME); Msg.SetObjID(ObjId); Msg.SetGUID(pTargetHuman->GetGUID()); //发还本人 pGamePlayer->SendPacket(&Msg); //宠物列表 ItemContainer* pStallPetContainer = pTargetHuman->m_StallBox.GetPetContainer(); //循环写入 for(INT i = 0; i<pStallPetContainer->GetContainerSize(); i++) { if( pStallPetContainer->GetItem(i)->IsEmpty() == FALSE ) {//有东西 INT nPrice = pTargetHuman->m_StallBox.GetPetPriceByIndex(i); INT nSerial = pTargetHuman->m_StallBox.GetPetSerialByIndex(i); Item* pIt = pStallPetContainer->GetItem(i); GCDetailAttrib_Pet PetMsgDetail; //组装GCDetailAttrib_Pet结构 Obj_Human::CalculatePetDetailAttrib(PetMsgDetail, pIt); PetMsgDetail.SetTradeIndex( i ); PET_EXTRA_STRUCT::GCStallPetView_t ExtraPetInfo; ExtraPetInfo.m_bFlag = TYPE_STALL; ExtraPetInfo.m_nPrice = nPrice; ExtraPetInfo.m_nSerial = nSerial; PetMsgDetail.SetExtraInfoLength(ExtraPetInfo.GetSize()); PetMsgDetail.SetExtraInfoData((BYTE*)&ExtraPetInfo); pGamePlayer->SendPacket( &PetMsgDetail ); } } } g_pLog->FastSaveLog( LOG_FILE_1, "CGStallOpenHandler::ObjID=%d" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint CGManipulatePetHandler::Execute( CGManipulatePet* 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 ) ; Item *pPetItem = pHuman->GetPetItem(pPacket->GetGUID()); if(pPetItem == NULL) return PACKET_EXE_CONTINUE; if(pPetItem->IsLock()) { return PACKET_EXE_CONTINUE; } INT nType = pPacket->GetManipulateType(); switch(nType) { case MANIPULATE_CREATEPET: {// 召唤宠物 ORESULT oResult = pHuman->TestCallUpPet(pPacket->GetGUID() ); if( OR_SUCCEEDED(oResult) ) { AI_Human* pHumanAI = (AI_Human*)(pHuman->GetAIObj()); if (pHumanAI) { ObjID_t idSkill = CALL_UP_PET; oResult = pHumanAI->PushCommand_UseSkill(idSkill, 1, -1, -1.f, -1.f, 0.f, INVALID_GUID); } } if( OR_FAILED(oResult) ) { GCManipulatePetRet msg; msg.SetManipulateRet(GCManipulatePetRet::MANIPULATEPET_RET_CALLUPFALID); pGamePlayer->SendPacket(&msg); pHuman->SendOperateResultMsg(oResult); return PACKET_EXE_CONTINUE; } pHuman->ReCallPet(); pHuman->SetGUIDOfCallUpPet(pPacket->GetGUID()); } break; case MANIPULATE_DELETEPET: {// 收回宠物 ORESULT oResult = pHuman->ReCallPet(); GCManipulatePetRet msg; if (OR_FAILED(oResult)) { msg.SetManipulateRet(GCManipulatePetRet::MANIPULATEPET_RET_RECALLFALID); } else if (OR_SUCCEEDED(oResult)) { msg.SetManipulateRet(GCManipulatePetRet::MANIPULATEPET_RET_RECALLSUCC); } pGamePlayer->SendPacket(&msg); } break; case MANIPULATE_FREEPET: {// 放生宠物 PET_LOG_PARAM PetLogParam; ORESULT oResult = pHuman->FreePetToNature(&PetLogParam,pPacket->GetGUID()); GCManipulatePetRet msg; if (OR_FAILED(oResult)) { msg.SetManipulateRet(GCManipulatePetRet::MANIPULATEPET_RET_FREEFALID); } else if (OR_SUCCEEDED(oResult)) { msg.SetManipulateRet(GCManipulatePetRet::MANIPULATEPET_RET_FREESUCC); } pGamePlayer->SendPacket(&msg); } break; case MANIPULATE_ASKOTHERPETINFO: {// 察看其他玩家的宠物信息 ObjID_t objID = pPacket->GetObjID(); Obj* pObj = pScene->GetObjManager()->GetObj(objID); if (pObj && pObj->GetObjType() == Obj::OBJ_TYPE_PET) { Obj_Human* pCreator = ((Obj_Pet*)pObj)->GetCreator(); if (pCreator) { PET_GUID_t guidpet = ((Obj_Pet*)pObj)->GetPetGUID(); if(guidpet.IsNull()) { return PACKET_EXE_CONTINUE; } Item* pPetItem = pCreator->GetPetItem(guidpet); if(!pPetItem) { return PACKET_EXE_CONTINUE; } GCDetailAttrib_Pet msg; pCreator->CalculatePetDetailAttrib(msg, pPetItem); msg.SetExtraInfoLength(1); BYTE bFlag; bFlag = TYPE_CONTEX_MENU_OTHER_PET; msg.SetExtraInfoData(&bFlag); pHuman->GetPlayer()->SendPacket(&msg); } else { pHuman->SendOperateResultMsg(OR_CANNOT_ASK_PETDETIAL); } } } break; default: break; } 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 ; }