UINT CGStallShopNameHandler::Execute( CGStallShopName* 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_StallBox.GetStallStatus() != ServerStallBox::STALL_OPEN) { GCStallError Msg; Msg.SetID(STALL_MSG::ERR_ILLEGAL); pGamePlayer->SendPacket(&Msg); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallShopNameHandler::ObjID=%d, ERR_ILLEGAL: != ServerStallBox::STALL_OPEN" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE; } //修改服务器数据 pHuman->m_StallBox.SetStallName(pPacket->GetStallName(),pPacket->GetStallNameSize()); g_pLog->FastSaveLog( LOG_FILE_1, "CGStallShopNameHandler::ObjID=%d" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR; }
uint CGStallRemoveItemHandler::Execute( CGStallRemoveItem* 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_GUID ItemGuid = pPacket->GetObjGUID(); PET_GUID_t PetGuid = pPacket->GetPetGUID(); BYTE ToType = pPacket->GetToType(); UINT Serial = pPacket->GetSerial(); 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: CGStallRemoveItemHandler::ObjName=%s, ERR_ILLEGAL: != ServerStallBox::STALL_OPEN" ,pHuman->GetName()) ; return PACKET_EXE_CONTINUE; } ItemContainer* pStallContainer = pHuman->m_StallBox.GetContainer(); ItemContainer* pStallPetContainer = pHuman->m_StallBox.GetPetContainer(); GCStallError MsgError; GCStallRemoveItem MsgRemoveItem; switch(ToType) { case STALL_MSG::POS_BAG: { INT IndexInStall = pStallContainer->GetIndexByGUID(&ItemGuid); if(IndexInStall<0) { MsgError.SetID(STALL_MSG::ERR_NEED_NEW_COPY); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallRemoveItemHandler::ObjName=%s, ERR_NEED_NEW_COPY: IndexInStall = %d" ,pHuman->GetName(), IndexInStall) ; return PACKET_EXE_CONTINUE; } if( pHuman->m_StallBox.GetSerialByIndex(IndexInStall) > Serial) { MsgError.SetID(STALL_MSG::ERR_NEED_NEW_COPY); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallRemoveItemHandler::ObjName=%s, ERR_NEED_NEW_COPY: Serial = %d, BoxSerial = %d" ,pHuman->GetName(), Serial, pHuman->m_StallBox.GetSerialByIndex(IndexInStall)) ; return PACKET_EXE_CONTINUE; } Item* pItem = pStallContainer->GetItem(IndexInStall); ItemContainer* pBagContainer = HumanItemLogic::GetItemContain(pHuman, pItem->GetItemTableIndex()); INT IndexInBag = pBagContainer->GetIndexByGUID(&ItemGuid); if(IndexInBag<0) { MsgError.SetID(STALL_MSG::ERR_ILLEGAL); pHuman->m_StallBox.CleanUp(); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallRemoveItemHandler::ObjName=%s, ERR_ILLEGAL: IndexInBag = %d" ,pHuman->GetName(), IndexInBag) ; return PACKET_EXE_CONTINUE; } //解锁原背包中的物品 g_ItemOperator.UnlockItem( pBagContainer, IndexInBag ); //干掉物品 if(g_ItemOperator.EraseItem(pStallContainer, IndexInStall)>0) { pHuman->m_StallBox.IncSerialByIndex(IndexInStall); pHuman->m_StallBox.SetPriceByIndex(IndexInStall, 0); } else { MsgError.SetID(STALL_MSG::ERR_ILLEGAL); pHuman->m_StallBox.CleanUp(); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallRemoveItemHandler::ObjName=%s, ERR_ILLEGAL: IndexInStall = %d" ,pHuman->GetName(), IndexInStall) ; return PACKET_EXE_CONTINUE; } //通知客户端 MsgRemoveItem.SetObjGUID( ItemGuid ); MsgRemoveItem.SetSerial( pHuman->m_StallBox.GetSerialByIndex(IndexInStall) ); MsgRemoveItem.SetToType( STALL_MSG::POS_BAG ); pGamePlayer->SendPacket(&MsgRemoveItem); } break; case STALL_MSG::POS_EQUIP: { } break; case STALL_MSG::POS_PET: { INT IndexInStall = pStallPetContainer->GetIndexByGUID(&PetGuid); if(IndexInStall<0) { MsgError.SetID(STALL_MSG::ERR_NEED_NEW_COPY); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallRemoveItemHandler::ObjName=%s, ERR_NEED_NEW_COPY: IndexInStall = %d" ,pHuman->GetName(), IndexInStall) ; return PACKET_EXE_CONTINUE; } if( pHuman->m_StallBox.GetPetSerialByIndex(IndexInStall) > Serial) { MsgError.SetID(STALL_MSG::ERR_NEED_NEW_COPY); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallRemoveItemHandler::ObjName=%s, ERR_NEED_NEW_COPY: Serial = %d, BoxSerial = %d" ,pHuman->GetName(), Serial, pHuman->m_StallBox.GetPetSerialByIndex(IndexInStall)) ; return PACKET_EXE_CONTINUE; } ItemContainer* pPetContainer = pHuman->GetPetContain(); INT IndexInBag = pPetContainer->GetIndexByGUID(&PetGuid); if(IndexInBag<0) { MsgError.SetID(STALL_MSG::ERR_ILLEGAL); pHuman->m_StallBox.CleanUp(); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallRemoveItemHandler::ObjName=%s, ERR_ILLEGAL: IndexInBag = %d" ,pHuman->GetName(), IndexInBag) ; return PACKET_EXE_CONTINUE; } //解锁原背包中的物品 g_ItemOperator.UnlockItem( pPetContainer, IndexInBag ); //干掉物品 if(g_ItemOperator.EraseItem(pStallPetContainer, IndexInStall)>0) { pHuman->m_StallBox.IncPetSerialByIndex(IndexInStall); pHuman->m_StallBox.SetPetPriceByIndex(IndexInStall, 0); } else { MsgError.SetID(STALL_MSG::ERR_ILLEGAL); pHuman->m_StallBox.CleanUp(); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallRemoveItemHandler::ObjName=%s, ERR_ILLEGAL: IndexInStall = %d" ,pHuman->GetName(), IndexInStall) ; return PACKET_EXE_CONTINUE; } //通知客户端 MsgRemoveItem.SetPetGUID( PetGuid ); MsgRemoveItem.SetSerial( pHuman->m_StallBox.GetPetSerialByIndex(IndexInStall) ); MsgRemoveItem.SetToType( STALL_MSG::POS_PET ); pGamePlayer->SendPacket(&MsgRemoveItem); } break; default: break; } g_pLog->FastSaveLog( LOG_FILE_1, "CGStallRemoveItemHandler::ObjName=%s, m_World = %d, m_Server = %d, m_Serial = %d" ,pHuman->GetName(), ItemGuid.m_World, ItemGuid.m_Server, ItemGuid.m_Serial) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
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 CGBBSSychMessagesHandler::Execute( CGBBSSychMessages* 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(); BYTE Opt = pPacket->GetOpt(); UINT nID = pPacket->GetID(); BYTE nLength = pPacket->GetLength(); CHAR* m_MessageData = pPacket->GetMessage(); if (nLength != strlen(m_MessageData)) { return PACKET_EXE_ERROR; } //请求者一定是人 Obj* pOther = pScene->GetObjManager()->GetObj(ObjID); if (pOther == NULL) { return PACKET_EXE_ERROR; } else { if( pOther->GetObjType() != Obj::OBJ_TYPE_HUMAN ) { return PACKET_EXE_ERROR; } } Obj_Human* pTargetHuman = (Obj_Human*)pOther; if( pTargetHuman == NULL ) { g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGBBSApplyHandler::ObjID=%d, ObjId = %d" ,pHuman->GetID(), 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::ObjID=%d, ERR_CLOSE" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE; } ServerBBS* pBBS = pTargetHuman->m_StallBox.GetBBS(); switch(Opt) { case CGBBSSychMessages::OPT_NEW_MESSAGE: { CHAR szDisplayName[MAX_BBS_MESSAGE_AUTHORLENGTH]; sprintf(szDisplayName, "#{_INFOUSR%s}(%X)", pHuman->GetName(), (UINT)(pHuman->GetGUID())); UINT NewID = pBBS->NewMessageID(); if(pBBS->AddNewMessageByID( NewID, m_MessageData, nLength, szDisplayName ) == FALSE) { g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGBBSSychMessagesHandler::ObjID=%d, NewID = %d" ,pHuman->GetID(), NewID) ; return PACKET_EXE_CONTINUE; } } break; case CGBBSSychMessages::OPT_REPLY_MESSAGE: { if(pBBS->ReplyMessageByID(nID, m_MessageData, nLength) == FALSE) { g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGBBSSychMessagesHandler::ObjID=%d, nID = %d" ,pHuman->GetID(), nID) ; return PACKET_EXE_CONTINUE; } } break; case CGBBSSychMessages::OPT_DEL_MESSAGE: { //... } break; case CGBBSSychMessages::OPT_SET_TITLE: { if(pBBS->SetBBSTitle( m_MessageData, nLength) == FALSE) { g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGBBSSychMessagesHandler::ObjID=%d" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE; } } break; default: { return PACKET_EXE_ERROR; } break; } //发送新的留言板给客户端 MessageEntry_t* pEntry = NULL; GCBBSMessages::_MESSAGE_T MessageList[MAX_BBS_MESSAGE_NUM]; UINT k = 0; GCBBSMessages MsgBBS; UINT CurIndex = pBBS->GetFinalIndex(); for(UINT i = 0; i<MAX_BBS_MESSAGE_NUM; i++) { pEntry = pBBS->GetMessageByIndex(CurIndex); if(pEntry) { MessageList[k].bHasReply = pEntry->bHasReply; MessageList[k].nID = pEntry->nID; MessageList[k].nHour = pEntry->nHour; MessageList[k].nMin = pEntry->nMin; MessageList[k].nMsgLength = pEntry->nMsgLength; MessageList[k].nReplyMsgLength = pEntry->nReplyMsgLength; MessageList[k].nReHour = pEntry->nReHour; MessageList[k].nReMin = pEntry->nReMin; memcpy(MessageList[k].AuthorName, pEntry->szAuthorName, MAX_BBS_MESSAGE_AUTHORLENGTH); memcpy(MessageList[k].szMessage, pEntry->szMessage, pEntry->nMsgLength); memcpy(MessageList[k].szReplyMessage, pEntry->szReplyMessage, pEntry->nReplyMsgLength); k++; } CurIndex++; if(CurIndex == MAX_BBS_MESSAGE_NUM) CurIndex = 0; } INT titleLength = 0; CHAR* pszTitle = pBBS->GetBBSTitle(titleLength); MsgBBS.SetObjID(pTargetHuman->GetID()); MsgBBS.SetSerial(pBBS->GetSerial()); MsgBBS.SetTitleLength(titleLength); MsgBBS.SetTitle(pszTitle); MsgBBS.SetMessageNum(k); MsgBBS.SetMessageData(MessageList); pGamePlayer->SendPacket(&MsgBBS); g_pLog->FastSaveLog( LOG_FILE_1, "CGBBSSychMessagesHandler::ObjID=%d" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
UINT CGBBSApplyHandler::Execute( CGBBSApply* 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(); UINT Serial = pPacket->GetSerial(); Obj_Human* pTargetHuman = pScene->GetHumanManager()->GetHuman( ObjId ); if( pTargetHuman == NULL ) { g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGBBSApplyHandler::ObjID=%d, ObjId = %d" ,pHuman->GetID(), 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::ObjID=%d, ERR_CLOSE" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE; } //从留言板中取出留言,并更新到客户端 //摊主BBS ServerBBS* pBBS = pTargetHuman->m_StallBox.GetBBS(); MessageEntry_t* pEntry = NULL; GCBBSMessages::_MESSAGE_T MessageList[MAX_BBS_MESSAGE_NUM]; UINT k = 0; GCBBSMessages MsgBBS; if(Serial == pBBS->GetSerial()) {//版本号相同,不用发新的了 MsgBBS.SetObjID(pTargetHuman->GetID()); MsgBBS.SetSerial(Serial); } else {//版本号不同发新的 UINT CurIndex = pBBS->GetFinalIndex(); for(UINT i = 0; i<MAX_BBS_MESSAGE_NUM; i++) { pEntry = pBBS->GetMessageByIndex(CurIndex); if(pEntry) { MessageList[k].bHasReply = pEntry->bHasReply; MessageList[k].nID = pEntry->nID; MessageList[k].nHour = pEntry->nHour; MessageList[k].nMin = pEntry->nMin; MessageList[k].nMsgLength = pEntry->nMsgLength; MessageList[k].nReplyMsgLength = pEntry->nReplyMsgLength; MessageList[k].nReHour = pEntry->nReHour; MessageList[k].nReMin = pEntry->nReMin; memcpy(MessageList[k].AuthorName, pEntry->szAuthorName, MAX_BBS_MESSAGE_AUTHORLENGTH); memcpy(MessageList[k].szMessage, pEntry->szMessage, pEntry->nMsgLength); memcpy(MessageList[k].szReplyMessage, pEntry->szReplyMessage, pEntry->nReplyMsgLength); k++; } CurIndex++; if(CurIndex == MAX_BBS_MESSAGE_NUM) CurIndex = 0; } INT titleLength = 0; CHAR* pszTitle = pBBS->GetBBSTitle(titleLength); MsgBBS.SetObjID(pTargetHuman->GetID()); MsgBBS.SetSerial(pBBS->GetSerial()); MsgBBS.SetTitleLength(titleLength); MsgBBS.SetTitle(pszTitle); MsgBBS.SetMessageNum(k); MsgBBS.SetMessageData(MessageList); } pGamePlayer->SendPacket(&MsgBBS); g_pLog->FastSaveLog( LOG_FILE_1, "CGStallOpenHandler::ObjID=%d" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint CGStallItemPriceHandler::Execute( CGStallItemPrice* 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_GUID ItemGuid = pPacket->GetObjGUID(); PET_GUID_t PetGuid = pPacket->GetPetGUID(); UINT ItemPrice = pPacket->GetPrice(); UINT ItemSerial = pPacket->GetSerial(); 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: CGStallItemPriceHandler::ObjName=%s, ERR_ILLEGAL:!= ServerStallBox::STALL_OPEN" ,pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } ItemContainer* pStallContainer = pHuman->m_StallBox.GetContainer(); ItemContainer* pStallPetContainer = pHuman->m_StallBox.GetPetContainer(); GCStallError MsgError; if(PetGuid.IsNull()) {//对物品的价格操作 INT IndexInStall = pStallContainer->GetIndexByGUID(&ItemGuid); if(IndexInStall<0) { MsgError.SetID(STALL_MSG::ERR_NEED_NEW_COPY); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallItemPriceHandler::ObjID=%d, ERR_NEED_NEW_COPY: IndexInStall = %d" ,pHuman->GetID(), IndexInStall) ; return PACKET_EXE_CONTINUE ; } if(pHuman->m_StallBox.GetSerialByIndex(IndexInStall) > ItemSerial) { MsgError.SetID(STALL_MSG::ERR_NEED_NEW_COPY); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallItemPriceHandler::ObjID=%d, ERR_NEED_NEW_COPY: ItemSerial = %d, BoxSerial = %d" ,pHuman->GetID(), ItemSerial, pHuman->m_StallBox.GetSerialByIndex(IndexInStall)) ; return PACKET_EXE_CONTINUE ; } pHuman->m_StallBox.SetPriceByIndex(IndexInStall, ItemPrice); pHuman->m_StallBox.IncSerialByIndex(IndexInStall); //给Client返回一条消息,告诉Client版本号 GCStallItemPrice msg; msg.SetObjGUID(pPacket->GetObjGUID()); msg.SetPrice(pPacket->GetPrice()); msg.SetSerial(pHuman->m_StallBox.GetSerialByIndex(IndexInStall)); pGamePlayer->SendPacket(&msg); g_pLog->FastSaveLog( LOG_FILE_1, "CGStallItemPriceHandler::ObjName=%s, ERR_NEED_NEW_COPY: IndexInStall = %d, ItemPrice = %d" ,pHuman->GetName(), IndexInStall, ItemPrice) ; } else {//改变宠物价格 INT PetIndexInStall = pStallPetContainer->GetIndexByGUID(&PetGuid); if(PetIndexInStall<0) { MsgError.SetID(STALL_MSG::ERR_NEED_NEW_COPY); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallItemPriceHandler::ObjName=%s, ERR_NEED_NEW_COPY: PetIndexInStall = %d" ,pHuman->GetName(), PetIndexInStall) ; return PACKET_EXE_CONTINUE ; } if(pHuman->m_StallBox.GetPetSerialByIndex(PetIndexInStall) != ItemSerial) { MsgError.SetID(STALL_MSG::ERR_NEED_NEW_COPY); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallItemPriceHandler::ObjName=%s, ERR_NEED_NEW_COPY: ItemSerial = %d, BoxSerial = %d" ,pHuman->GetName(), ItemSerial, pHuman->m_StallBox.GetPetSerialByIndex(PetIndexInStall)) ; return PACKET_EXE_CONTINUE ; } pHuman->m_StallBox.SetPetPriceByIndex(PetIndexInStall, ItemPrice); pHuman->m_StallBox.IncPetSerialByIndex(PetIndexInStall); //给Client返回一条消息,告诉Client版本号 GCStallItemPrice msg; msg.SetPetGUID(PetGuid); msg.SetPrice(ItemPrice); msg.SetSerial(pHuman->m_StallBox.GetPetSerialByIndex(PetIndexInStall)); pGamePlayer->SendPacket(&msg); g_pLog->FastSaveLog( LOG_FILE_1, "CGStallItemPriceHandler::ObjName=%s, ERR_NEED_NEW_COPY: IndexInStall = %d, ItemPrice = %d" ,pHuman->GetName(), PetIndexInStall, ItemPrice) ; } return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint CGStallEstablishHandler::Execute( CGStallEstablish* 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 ) ; // 通过AI判断当前状态下能否摆摊 AI_Human* pAIHuman = (AI_Human*)(pHuman->GetAIObj()); if (!pAIHuman) { return PACKET_EXE_ERROR; } ORESULT oResult = pAIHuman->PushCommand_Stall(); if (OR_OK != oResult) { pHuman->SendOperateResultMsg(oResult); return PACKET_EXE_ERROR; } //验证是否有资格摆摊 if(pHuman->m_StallBox.GetStallStatus() != ServerStallBox::STALL_READY) { GCStallError Msg; Msg.SetID(STALL_MSG::ERR_ILLEGAL); pHuman->m_StallBox.CleanUp(); pGamePlayer->SendPacket(&Msg); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallEstablishHandler::ObjID=%d, ERR_ILLEGAL:!= ServerStallBox::STALL_READY" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; } UINT PosTax = 0; BYTE TradeTax = 0; StallInfoManager* pStallInfoMgr = pScene->GetStallInfoManager(); if(pStallInfoMgr) { UINT PosX = (UINT)pHuman->getWorldPos()->m_fX; UINT PosZ = (UINT)pHuman->getWorldPos()->m_fZ; PosTax = pStallInfoMgr->StallPosPayment(PosX, PosZ); TradeTax = pStallInfoMgr->StallExchangeTax(PosX, PosZ); if(pHuman->GetMoney() < PosTax) { GCStallError Msg; Msg.SetID(STALL_MSG::ERR_NOT_ENOUGH_MONEY_TO_OPEN); pHuman->m_StallBox.CleanUp(); pGamePlayer->SendPacket(&Msg); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallEstablishHandler::ObjID=%d, ERR_NOT_ENOUGH_MONEY_TO_OPEN" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; } else { pHuman->SetMoney(pHuman->GetMoney() - PosTax); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_EXCHANGE_STALL_TAX; MoneyLogParam.Count = PosTax; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); } //验证完毕,设置摊位盒 pHuman->m_StallBox.SetStallStatus(ServerStallBox::STALL_OPEN); pHuman->m_StallBox.SetStallIsOpen(TRUE);//这个语句会引起客户端的显示更新 pHuman->m_StallBox.SetPosTax(PosTax); pHuman->m_StallBox.SetTradeTax(TradeTax); //pHuman->m_StallBox.SetFirstPage(0); //占了这格,不准别人再摆摊了 pStallInfoMgr->SetCanStall(PosX, PosZ, FALSE); pHuman->m_StallBox.SetStallPos(PosX, PosZ); //通知自己初始化自己的摊位盒 GCStallEstablish Msg; pGamePlayer->SendPacket(&Msg); g_pLog->FastSaveLog( LOG_FILE_1, "CGStallEstablishHandler::ObjID=%d" ,pHuman->GetID()) ; } else { Assert(0); } return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint CGStallAddItemHandler::Execute( CGStallAddItem* 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_GUID ItemGuid = pPacket->GetObjGUID(); UINT ItemPrice = pPacket->GetPrice(); BYTE FromType = pPacket->GetFromType(); PET_GUID_t PetGuid = pPacket->GetPetGUID(); 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: CGStallAddItemHandler::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(); GCStallError MsgError; GCStallAddItem MsgAddItem; switch(FromType) { case STALL_MSG::POS_BAG : { //ItemContainer* pMatContainer = pHuman->GetMatContain(); ItemContainer* pBaseContainer = pHuman->GetBaseContain(); //ItemContainer* pBagContainer = NULL; //if(pMatContainer->GetIndexByGUID(&ItemGuid) >= 0) //{ // pBagContainer = pMatContainer; //} //else if(pBaseContainer->GetIndexByGUID(&ItemGuid) >=0 ) //{ // pBagContainer = pBaseContainer; //} //else //{//guid非法 // Assert(0); // GCStallError Msg; // Msg.SetID(STALL_MSG::ERR_ILLEGAL); // pGamePlayer->SendPacket(&Msg); // g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallAddItemHandler::ObjID=%d, ERR_ILLEGAL:World = %d, Server = %d, Serial = %d " // ,pHuman->GetID(), ItemGuid.m_World, ItemGuid.m_Server, ItemGuid.m_Serial) ; // return PACKET_EXE_CONTINUE ; //} INT IndexInBag = pBaseContainer->GetIndexByGUID(&ItemGuid); //先查一遍摊位盒中是不是已经有该物品了 for(INT i = 0; i<STALL_BOX_SIZE; i++) { if(pStallContainer->GetItem(i)->GetGUID() == ItemGuid ) {//物品已经在t摊位盒中,丢弃该消息 g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallAddItemHandler::ObjID=%d, Already in box " ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; } } //拷贝到摊位盒 //自动找格 INT result = g_ItemOperator.CopyItem ( pBaseContainer, IndexInBag, pStallContainer ); if(result>=0) {//拷贝成功, //发送消息给双方客户端 Item* pIt = pStallContainer->GetItem(result); if(pIt->IsEmpty() == FALSE) { //先锁定此物品 g_ItemOperator.LockItem( pBaseContainer, IndexInBag ); //设置价格 pHuman->m_StallBox.SetPriceByIndex(result, ItemPrice); //序列号递增 pHuman->m_StallBox.IncSerialByIndex(result); //发送消息给客户端 MsgAddItem.SetFromType( STALL_MSG::POS_BAG ); MsgAddItem.SetToIndex(result); MsgAddItem.SetPrice(ItemPrice); MsgAddItem.SetObjGUID(ItemGuid); MsgAddItem.SetSerial(pHuman->m_StallBox.GetSerialByIndex(result)); pGamePlayer->SendPacket(&MsgAddItem); } else { MsgError.SetID(STALL_MSG::ERR_ILLEGAL); pGamePlayer->SendPacket(&MsgError); pHuman->m_StallBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallAddItemHandler::ObjID=%d, ERR_ILLEGAL: pIt->IsEmpty() == FALSE" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; } } else {//拷贝失败 if(result == ITEMOE_DESTOPERATOR_FULL) { MsgError.SetID(STALL_MSG::ERR_NOT_ENOUGH_ROOM_IN_STALL); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallAddItemHandler::ObjID=%d, ERR_NOT_ENOUGH_ROOM_IN_STALL" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; } else if(result == ITEMOE_SOUROPERATOR_LOCK) { MsgError.SetID(STALL_MSG::ERR_ALREADY_LOCK); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallAddItemHandler::ObjID=%d, ERR_ALREAD_LOCK" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; } } } break; case STALL_MSG::POS_EQUIP : { } break; case STALL_MSG::POS_PET : {//从宠物列表中拿出宠物到交易盒中 ItemContainer* pPetContainer = pHuman->GetPetContain(); BYTE FromIndex = pPetContainer->GetIndexByGUID( &PetGuid ); //先查一遍交易盒中是不是已经有该物品了 for(INT i = 0; i<EXCHANGE_PET_BOX_SIZE; i++) { if(pStallPetContainer->GetItem(i)->GetPetGUID() == pPetContainer->GetItem(FromIndex)->GetPetGUID() ) {//物品已经在交易盒中,丢弃该消息 return PACKET_EXE_CONTINUE ; } } //自动找格 INT result = g_ItemOperator.CopyItem ( pPetContainer, FromIndex, pStallPetContainer ); if(result>=0) {//拷贝成功, //发送消息给双方客户端 Item* pIt = pStallPetContainer->GetItem(result); if(pIt->IsEmpty() == FALSE) { //先锁定此物品 g_ItemOperator.LockItem( pPetContainer, FromIndex ); //设置价格 pHuman->m_StallBox.SetPetPriceByIndex(result, ItemPrice); //序列号递增 pHuman->m_StallBox.IncPetSerialByIndex(result); //发送消息给客户端 MsgAddItem.SetFromType( STALL_MSG::POS_PET ); MsgAddItem.SetToIndex(result); MsgAddItem.SetPrice(ItemPrice); MsgAddItem.SetPetGUID(PetGuid); MsgAddItem.SetSerial(pHuman->m_StallBox.GetPetSerialByIndex(result)); pGamePlayer->SendPacket(&MsgAddItem); } else { MsgError.SetID(STALL_MSG::ERR_ILLEGAL); pGamePlayer->SendPacket(&MsgError); pHuman->m_StallBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallAddItemHandler::ObjName=%s, ERR_ILLEGAL: pIt->IsEmpty() == FALSE" ,pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } } else {//拷贝失败 if(result == ITEMOE_DESTOPERATOR_FULL) { MsgError.SetID(STALL_MSG::ERR_NOT_ENOUGH_ROOM_IN_STALL); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallAddItemHandler::ObjName=%d, ERR_NOT_ENOUGH_ROOM_IN_STALL" ,pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } else if(result == ITEMOE_SOUROPERATOR_LOCK) { MsgError.SetID(STALL_MSG::ERR_ALREADY_LOCK); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallAddItemHandler::ObjName=%d, ERR_ALREAD_LOCK" ,pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } } } break; default: break; } g_pLog->FastSaveLog( LOG_FILE_1, "CGStallAddItemHandler::ObjName=%d" ,pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }