bool PlayerManager::AddPlayer( PlayerPtr Ptr ) { __ENTER_FUNCTION Assert( Ptr ) ; m_PlayerPtrList.PushBack(Ptr); OnAddPlayer(Ptr, 0); return true ; __LEAVE_FUNCTION return false ; }
void CBattleground::PortPlayer(Player * plr, bool skip_teleport /* = false*/) { m_mainLock.Acquire(); if(m_ended) { sChatHandler.SystemMessage(plr->GetSession(), "You cannot join this battleground as it has already ended."); BattlegroundManager.SendBattlefieldStatus(plr, 0, 0, 0, 0, 0,0); plr->m_pendingBattleground = 0; m_mainLock.Release(); return; } if( plr->m_bgTeam > 1 ) plr->m_bgTeam = plr->GetTeam(); m_pendPlayers[plr->m_bgTeam].erase(plr->GetLowGUID()); if(m_players[plr->m_bgTeam].find(plr->GetLowGUID()) != m_players[plr->m_bgTeam].end()) { m_mainLock.Release(); return; } if ( plr->m_isGmInvisible == false ) { //Do not let everyone know an invisible gm has joined. WorldPacket data(SMSG_BATTLEGROUND_PLAYER_JOINED, 8); data << plr->GetGUID(); DistributePacketToAll(&data); } m_players[plr->m_bgTeam].insert(plr->GetLowGUID()); /* remove from any auto queue remove events */ sEventMgr.RemoveEvents(plr, EVENT_BATTLEGROUND_QUEUE_UPDATE); if( !skip_teleport ) { if( plr->IsInWorld() ) plr->RemoveFromWorld(); } plr->m_pendingBattleground = 0; plr->m_bg = this; if(!plr->IsPvPFlagged()) plr->SetPvPFlag(); /* Reset the score */ memset(&plr->m_bgScore, 0, sizeof(BGScore)); /* send him the world states */ SendWorldStates(plr); /* update pvp data */ UpdatePvPData(); /* add the player to the group */ if(plr->GetGroup() && !Rated()) { // remove them from their group plr->GetGroup()->RemovePlayer( plr->m_playerInfo ); } if(!m_countdownStage) { m_countdownStage = 1; sEventMgr.AddEvent(this, &CBattleground::EventCountdown, EVENT_BATTLEGROUND_COUNTDOWN, 30000, 0,0); sEventMgr.ModifyEventTimeLeft(this, EVENT_BATTLEGROUND_COUNTDOWN, 10000); } sEventMgr.RemoveEvents(this, EVENT_BATTLEGROUND_CLOSE); OnAddPlayer(plr); if(!skip_teleport) { /* This is where we actually teleport the player to the battleground. */ plr->SafeTeleport(m_mapMgr,GetStartingCoords(plr->m_bgTeam)); BattlegroundManager.SendBattlefieldStatus(plr, 3, m_type, m_id, (uint32)UNIXTIME - m_startTime, m_mapMgr->GetMapId(),Rated()); // Elapsed time is the last argument } m_mainLock.Release(); }
void CBattleground::PortPlayer(Player* plr, bool skip_teleport /* = false*/) { m_mainLock.Acquire(); if(m_ended) { sChatHandler.SystemMessage(plr->GetSession(), plr->GetSession()->LocalizedWorldSrv(WORLDSTRING_JOIN_BG_ENDED)); BattlegroundManager.SendBattlefieldStatus(plr, BGSTATUS_NOFLAGS, 0, 0, 0, 0, 0); plr->m_pendingBattleground = NULL; m_mainLock.Release(); return; } m_pendPlayers[plr->m_bgTeam].erase(plr->GetLowGUID()); if(m_players[plr->m_bgTeam].find(plr) != m_players[plr->m_bgTeam].end()) { m_mainLock.Release(); return; } plr->FullHPMP(); plr->SetTeam(plr->m_bgTeam); if(plr->m_isGmInvisible == false) { //Do not let everyone know an invisible gm has joined. WorldPacket data(SMSG_BATTLEGROUND_PLAYER_JOINED, 8); data << plr->GetGUID(); DistributePacketToTeam(&data, plr->m_bgTeam); } else { m_invisGMs++; } m_players[plr->m_bgTeam].insert(plr); /* remove from any auto queue remove events */ sEventMgr.RemoveEvents(plr, EVENT_BATTLEGROUND_QUEUE_UPDATE); if(!skip_teleport) { if(plr->IsInWorld()) plr->RemoveFromWorld(); } plr->m_pendingBattleground = NULL; plr->m_bg = this; if(!plr->IsPvPFlagged()) plr->SetPvPFlag(); plr->RemoveAurasByInterruptFlag(AURA_INTERRUPT_ON_PVP_ENTER); /* Reset the score */ memset(&plr->m_bgScore, 0, sizeof(BGScore)); /* update pvp data */ UpdatePvPData(); /* add the player to the group */ if(plr->GetGroup() && !Rated()) { // remove them from their group plr->GetGroup()->RemovePlayer(plr->getPlayerInfo()); } if(!m_countdownStage) { m_countdownStage = 1; sEventMgr.AddEvent(this, &CBattleground::EventCountdown, EVENT_BATTLEGROUND_COUNTDOWN, 30000, 0, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); sEventMgr.ModifyEventTimeLeft(this, EVENT_BATTLEGROUND_COUNTDOWN, 10000); } sEventMgr.RemoveEvents(this, EVENT_BATTLEGROUND_CLOSE); if(!skip_teleport) { /* This is where we actually teleport the player to the battleground. */ plr->SafeTeleport(m_mapMgr, GetStartingCoords(plr->m_bgTeam)); BattlegroundManager.SendBattlefieldStatus(plr, BGSTATUS_TIME, m_type, m_id, (uint32)UNIXTIME - m_startTime, m_mapMgr->GetMapId(), Rated()); // Elapsed time is the last argument } else { /* If we are not ported, call this immediatelly, otherwise its called after teleportation in Player::OnPushToWorld */ OnAddPlayer(plr); } m_mainLock.Release(); }