uint CGCityAskAttrHandler::Execute( CGCityAskAttr* 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(pScene->m_SceneInitData.m_nDataType != SCENE_TYPE_CIT) { return PACKET_EXE_CONTINUE; } //当前场景中的建筑物刷过来,将来再整合消息 for(INT i = 0; i<MAX_CITY_BUILDING_NUM; i++) { if(pScene->m_SceneInitData.m_CityData.m_Builds[i].m_BuildingID != INVALID_ID) { GCCityAttr MsgToClient; MsgToClient.SetUpdateAttrib(CITY_UPDATE_BUILDING, TRUE); MsgToClient.SetBuildingIndex(i); MsgToClient.SetBuildingData(pScene->m_SceneInitData.m_CityData.m_Builds[i]); pGamePlayer->SendPacket(&MsgToClient); } } return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint WGCityAttrHandler::Execute( WGCityAttr* pPacket, Player* pPlayer ) { __ENTER_FUNCTION SceneID_t SceneID = pPacket->GetSceneID(); Scene* pScene = g_pSceneManager->GetScene( SceneID ) ; if( pScene==NULL ) return PACKET_EXE_ERROR; if(pScene->m_SceneInitData.m_nDataType != SCENE_TYPE_CIT) { Assert(0); return PACKET_EXE_ERROR; } if( pPlayer ) {//serverplayer线程 Assert( MyGetCurrentThreadID()==g_pServerManager->m_ThreadID ); pScene->SendPacket(pPacket, INVALID_ID_EX); return PACKET_EXE_NOTREMOVE ; } else {//场景线程 Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ; //取出这个场景中所有玩家 ScenePlayerManager* pCurScenePlayerManager = pScene->GetScenePlayerManager(); PlayerID_t PlayerInTheCity[MAX_PLAYER]; INT PlayerNum = 0; for(UINT i =0 ;i<pCurScenePlayerManager->GetPlayerNumber();i++ ) { PlayerInTheCity[PlayerNum++] = pCurScenePlayerManager->GetPlayers()[i]; } if(pPacket->IsUpdateAttrib(CITY_UPDATE_CITY_LEVEL)) { return PACKET_EXE_CONTINUE; } if(pPacket->IsUpdateAttrib(CITY_UPDATE_CITY_NAME)) { return PACKET_EXE_CONTINUE; } if(pPacket->IsUpdateAttrib(CITY_UPDATE_BUILDING)) { //1.更改本地城市属性 pScene->m_SceneInitData.m_CityData.m_Builds[pPacket->GetBuildingIndex()] = pPacket->GetBuildingData(); //2.通知场景中所有玩家,建筑物发生变化 for(INT i =0 ;i<PlayerNum;i++ ) { GamePlayer* pGamePlayer = g_pPlayerPool->GetPlayer(PlayerInTheCity[i]); if( pGamePlayer==NULL ) { Assert(FALSE); return PACKET_EXE_ERROR; } Obj_Human* pHuman = pGamePlayer->GetHuman(); GCCityAttr MsgToClient; MsgToClient.SetUpdateAttrib(CITY_UPDATE_BUILDING, TRUE); MsgToClient.SetBuildingIndex(pPacket->GetBuildingIndex()); MsgToClient.SetBuildingData(pPacket->GetBuildingData()); pGamePlayer->SendPacket(&MsgToClient); } return PACKET_EXE_CONTINUE; } } return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }