diff options
| author | Spp <spp@jorge.gr> | 2012-10-04 11:31:00 +0200 |
|---|---|---|
| committer | Spp <spp@jorge.gr> | 2012-10-04 11:31:00 +0200 |
| commit | 2a55f2d9e081a3efef4dfe628c7d1496a6f2fb4e (patch) | |
| tree | be1747b6161fcc7a6bce433db92af93ec0508b8b /src/server/game/Battlegrounds/Battleground.cpp | |
| parent | ddf494d78bf342f32d20d747b393fe611060bc69 (diff) | |
Core/Battlegrounds: Minor optimization when checking if player left start zone
Diffstat (limited to 'src/server/game/Battlegrounds/Battleground.cpp')
| -rwxr-xr-x | src/server/game/Battlegrounds/Battleground.cpp | 187 |
1 files changed, 94 insertions, 93 deletions
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 4c11804b278..74fb3b7c878 100755 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -162,6 +162,7 @@ Battleground::Battleground() m_MapId = 0; m_Map = NULL; + m_StartMaxDist = 0.0f; m_TeamStartLocX[TEAM_ALLIANCE] = 0; m_TeamStartLocX[TEAM_HORDE] = 0; @@ -178,8 +179,6 @@ Battleground::Battleground() m_ArenaTeamIds[TEAM_ALLIANCE] = 0; m_ArenaTeamIds[TEAM_HORDE] = 0; - m_StartMaxDist = 0.0f; - m_ArenaTeamRatingChanges[TEAM_ALLIANCE] = 0; m_ArenaTeamRatingChanges[TEAM_HORDE] = 0; @@ -261,7 +260,10 @@ void Battleground::Update(uint32 diff) { case STATUS_WAIT_JOIN: if (GetPlayersSize()) + { _ProcessJoin(diff); + _CheckSafePositions(diff); + } break; case STATUS_IN_PROGRESS: _ProcessOfflineQueue(); @@ -294,11 +296,37 @@ void Battleground::Update(uint32 diff) // Update start time and reset stats timer m_StartTime += diff; m_ResetStatTimer += diff; - m_ValidStartPositionTimer += diff; PostUpdateImpl(diff); } +inline void Battleground::_CheckSafePositions(uint32 diff) +{ + float maxDist = GetStartMaxDist(); + if (!maxDist) + return; + + m_ValidStartPositionTimer += diff; + if (m_ValidStartPositionTimer >= CHECK_PLAYER_POSITION_INVERVAL) + { + m_ValidStartPositionTimer = 0; + + Position pos; + float x, y, z, o; + for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) + if (Player* player = ObjectAccessor::FindPlayer(itr->first)) + { + player->GetPosition(&pos); + GetTeamStartLoc(player->GetBGTeam(), x, y, z, o); + if (pos.GetExactDistSq(x, y, z) > maxDist) + { + sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BATTLEGROUND: Sending %s back to start location (map: %u) (possible exploit)", player->GetName(), GetMapId()); + player->TeleportTo(GetMapId(), x, y, z, o); + } + } + } +} + inline void Battleground::_ProcessOfflineQueue() { // remove offline players from bg after 5 minutes @@ -315,7 +343,6 @@ inline void Battleground::_ProcessOfflineQueue() } } } - } inline void Battleground::_ProcessRessurect(uint32 diff) @@ -530,33 +557,6 @@ inline void Battleground::_ProcessJoin(uint32 diff) sWorld->SendWorldText(LANG_BG_STARTED_ANNOUNCE_WORLD, GetName(), GetMinLevel(), GetMaxLevel()); } } - - // Find if the player left our start zone; if so, teleport it back - if (m_ValidStartPositionTimer > 1000) - { - m_ValidStartPositionTimer = 0; - float maxDist = GetStartMaxDist(); - if (maxDist > 0.0f) - { - for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) - { - if (Player *plr = ObjectAccessor::FindPlayer(itr->first)) - { - float x, y, z, o; - uint32 team = plr->GetBGTeam(); - GetTeamStartLoc(team, x, y, z, o); - - float dist = plr->GetDistance(x, y, z); - - if (dist >= maxDist) - { - sLog->outError(LOG_FILTER_BATTLEGROUND, "BATTLEGROUND: Sending %s back to start location (map: %u) (possible exploit)", plr->GetName(), GetMapId()); - plr->TeleportTo(GetMapId(), x, y, z, o); - } - } - } - } - } } inline void Battleground::_ProcessLeave(uint32 diff) @@ -581,7 +581,7 @@ inline void Battleground::_ProcessLeave(uint32 diff) } } -inline Player* Battleground::_GetPlayer(uint64 guid, bool offlineRemove, const char* context) const +inline Player* Battleground::_GetPlayer(uint64 guid, bool offlineRemove, char const* context) const { Player* player = NULL; if (!offlineRemove) @@ -594,17 +594,17 @@ inline Player* Battleground::_GetPlayer(uint64 guid, bool offlineRemove, const c return player; } -inline Player* Battleground::_GetPlayer(BattlegroundPlayerMap::iterator itr, const char* context) +inline Player* Battleground::_GetPlayer(BattlegroundPlayerMap::iterator itr, char const* context) { return _GetPlayer(itr->first, itr->second.OfflineRemoveTime, context); } -inline Player* Battleground::_GetPlayer(BattlegroundPlayerMap::const_iterator itr, const char* context) const +inline Player* Battleground::_GetPlayer(BattlegroundPlayerMap::const_iterator itr, char const* context) const { return _GetPlayer(itr->first, itr->second.OfflineRemoveTime, context); } -inline Player* Battleground::_GetPlayerForTeam(uint32 teamId, BattlegroundPlayerMap::const_iterator itr, const char* context) const +inline Player* Battleground::_GetPlayerForTeam(uint32 teamId, BattlegroundPlayerMap::const_iterator itr, char const* context) const { Player* player = _GetPlayer(itr, context); if (player) @@ -674,7 +674,7 @@ void Battleground::RemoveAuraOnTeam(uint32 SpellID, uint32 TeamID) player->RemoveAura(SpellID); } -void Battleground::YellToAll(Creature* creature, const char* text, uint32 language) +void Battleground::YellToAll(Creature* creature, char const* text, uint32 language) { for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) if (Player* player = _GetPlayer(itr, "YellToAll")) @@ -718,17 +718,18 @@ void Battleground::EndBattleground(uint32 winner) { RemoveFromBGFreeSlotQueue(); - ArenaTeam* winner_arena_team = NULL; - ArenaTeam* loser_arena_team = NULL; - uint32 loser_team_rating = 0; - uint32 loser_matchmaker_rating = 0; - int32 loser_change = 0; - int32 loser_matchmaker_change = 0; - uint32 winner_team_rating = 0; - uint32 winner_matchmaker_rating = 0; - int32 winner_change = 0; - int32 winner_matchmaker_change = 0; - WorldPacket data; + ArenaTeam* winnerArenaTeam = NULL; + ArenaTeam* loserArenaTeam = NULL; + + uint32 loserTeamRating = 0; + uint32 loserMatchmakerRating = 0; + int32 loserChange = 0; + int32 loserMatchmakerChange = 0; + uint32 winnerTeamRating = 0; + uint32 winnerMatchmakerRating = 0; + int32 winnerChange = 0; + int32 winnerMatchmakerChange = 0; + int32 winmsg_id = 0; if (winner == ALLIANCE) @@ -759,25 +760,26 @@ void Battleground::EndBattleground(uint32 winner) // arena rating calculation if (isArena() && isRated()) { - winner_arena_team = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamIdForTeam(winner)); - loser_arena_team = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamIdForTeam(GetOtherTeam(winner))); - if (winner_arena_team && loser_arena_team && winner_arena_team != loser_arena_team) + winnerArenaTeam = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamIdForTeam(winner)); + loserArenaTeam = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamIdForTeam(GetOtherTeam(winner))); + + if (winnerArenaTeam && loserArenaTeam && winnerArenaTeam != loserArenaTeam) { if (winner != WINNER_NONE) { - loser_team_rating = loser_arena_team->GetRating(); - loser_matchmaker_rating = GetArenaMatchmakerRating(GetOtherTeam(winner)); - winner_team_rating = winner_arena_team->GetRating(); - winner_matchmaker_rating = GetArenaMatchmakerRating(winner); - winner_matchmaker_change = winner_arena_team->WonAgainst(winner_matchmaker_rating, loser_matchmaker_rating, winner_change); - loser_matchmaker_change = loser_arena_team->LostAgainst(loser_matchmaker_rating, winner_matchmaker_rating, loser_change); - sLog->outDebug(LOG_FILTER_ARENAS, "match Type: %u --- Winner: old rating: %u, rating gain: %d, old MMR: %u, MMR gain: %d --- Loser: old rating: %u, rating loss: %d, old MMR: %u, MMR loss: %d ---", m_ArenaType, winner_team_rating, winner_change, winner_matchmaker_rating, - winner_matchmaker_change, loser_team_rating, loser_change, loser_matchmaker_rating, loser_matchmaker_change); - SetArenaMatchmakerRating(winner, winner_matchmaker_rating + winner_matchmaker_change); - SetArenaMatchmakerRating(GetOtherTeam(winner), loser_matchmaker_rating + loser_matchmaker_change); - SetArenaTeamRatingChangeForTeam(winner, winner_change); - SetArenaTeamRatingChangeForTeam(GetOtherTeam(winner), loser_change); - sLog->outDebug(LOG_FILTER_ARENAS, "Arena match Type: %u for Team1Id: %u - Team2Id: %u ended. WinnerTeamId: %u. Winner rating: +%d, Loser rating: %d", m_ArenaType, m_ArenaTeamIds[TEAM_ALLIANCE], m_ArenaTeamIds[TEAM_HORDE], winner_arena_team->GetId(), winner_change, loser_change); + loserTeamRating = loserArenaTeam->GetRating(); + loserMatchmakerRating = GetArenaMatchmakerRating(GetOtherTeam(winner)); + winnerTeamRating = winnerArenaTeam->GetRating(); + winnerMatchmakerRating = GetArenaMatchmakerRating(winner); + winnerMatchmakerChange = winnerArenaTeam->WonAgainst(winnerMatchmakerRating, loserMatchmakerRating, winnerChange); + loserMatchmakerChange = loserArenaTeam->LostAgainst(loserMatchmakerRating, winnerMatchmakerRating, loserChange); + sLog->outDebug(LOG_FILTER_ARENAS, "match Type: %u --- Winner: old rating: %u, rating gain: %d, old MMR: %u, MMR gain: %d --- Loser: old rating: %u, rating loss: %d, old MMR: %u, MMR loss: %d ---", m_ArenaType, winnerTeamRating, winnerChange, winnerMatchmakerRating, + winnerMatchmakerChange, loserTeamRating, loserChange, loserMatchmakerRating, loserMatchmakerChange); + SetArenaMatchmakerRating(winner, winnerMatchmakerRating + winnerMatchmakerChange); + SetArenaMatchmakerRating(GetOtherTeam(winner), loserMatchmakerRating + loserMatchmakerChange); + SetArenaTeamRatingChangeForTeam(winner, winnerChange); + SetArenaTeamRatingChangeForTeam(GetOtherTeam(winner), loserChange); + sLog->outDebug(LOG_FILTER_ARENAS, "Arena match Type: %u for Team1Id: %u - Team2Id: %u ended. WinnerTeamId: %u. Winner rating: +%d, Loser rating: %d", m_ArenaType, m_ArenaTeamIds[TEAM_ALLIANCE], m_ArenaTeamIds[TEAM_HORDE], winnerArenaTeam->GetId(), winnerChange, loserChange); if (sWorld->getBoolConfig(CONFIG_ARENA_LOG_EXTENDED_INFO)) for (Battleground::BattlegroundScoreMap::const_iterator itr = GetPlayerScoresBegin(); itr != GetPlayerScoresEnd(); ++itr) if (Player* player = ObjectAccessor::FindPlayer(itr->first)) @@ -788,8 +790,8 @@ void Battleground::EndBattleground(uint32 winner) { SetArenaTeamRatingChangeForTeam(ALLIANCE, ARENA_TIMELIMIT_POINTS_LOSS); SetArenaTeamRatingChangeForTeam(HORDE, ARENA_TIMELIMIT_POINTS_LOSS); - winner_arena_team->FinishGame(ARENA_TIMELIMIT_POINTS_LOSS); - loser_arena_team->FinishGame(ARENA_TIMELIMIT_POINTS_LOSS); + winnerArenaTeam->FinishGame(ARENA_TIMELIMIT_POINTS_LOSS); + loserArenaTeam->FinishGame(ARENA_TIMELIMIT_POINTS_LOSS); } } else @@ -799,6 +801,11 @@ void Battleground::EndBattleground(uint32 winner) } } + WorldPacket pvpLogData; + sBattlegroundMgr->BuildPvpLogDataPacket(&pvpLogData, this); + + BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetArenaType()); + uint8 aliveWinners = GetAlivePlayersCountByTeam(winner); for (BattlegroundPlayerMap::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) { @@ -807,12 +814,12 @@ void Battleground::EndBattleground(uint32 winner) if (itr->second.OfflineRemoveTime) { //if rated arena match - make member lost! - if (isArena() && isRated() && winner_arena_team && loser_arena_team && winner_arena_team != loser_arena_team) + if (isArena() && isRated() && winnerArenaTeam && loserArenaTeam && winnerArenaTeam != loserArenaTeam) { if (team == winner) - winner_arena_team->OfflineMemberLost(itr->first, loser_matchmaker_rating, winner_matchmaker_change); + winnerArenaTeam->OfflineMemberLost(itr->first, loserMatchmakerRating, winnerMatchmakerChange); else - loser_arena_team->OfflineMemberLost(itr->first, winner_matchmaker_rating, loser_matchmaker_change); + loserArenaTeam->OfflineMemberLost(itr->first, winnerMatchmakerRating, loserMatchmakerChange); } continue; } @@ -841,23 +848,20 @@ void Battleground::EndBattleground(uint32 winner) player->getHostileRefManager().deleteReferences(); } - //this line is obsolete - team is set ALWAYS - //if (!team) team = player->GetTeam(); - // per player calculation - if (isArena() && isRated() && winner_arena_team && loser_arena_team && winner_arena_team != loser_arena_team) + if (isArena() && isRated() && winnerArenaTeam && loserArenaTeam && winnerArenaTeam != loserArenaTeam) { if (team == winner) { // update achievement BEFORE personal rating update - uint32 rating = player->GetArenaPersonalRating(winner_arena_team->GetSlot()); + uint32 rating = player->GetArenaPersonalRating(winnerArenaTeam->GetSlot()); player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, rating ? rating : 1); - winner_arena_team->MemberWon(player, loser_matchmaker_rating, winner_matchmaker_change); + winnerArenaTeam->MemberWon(player, loserMatchmakerRating, winnerMatchmakerChange); } else { - loser_arena_team->MemberLost(player, winner_matchmaker_rating, loser_matchmaker_change); + loserArenaTeam->MemberLost(player, winnerMatchmakerRating, loserMatchmakerChange); // Arena lost => reset the win_rated_arena having the "no_lose" condition player->ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, ACHIEVEMENT_CRITERIA_CONDITION_NO_LOSE); @@ -893,27 +897,23 @@ void Battleground::EndBattleground(uint32 winner) BlockMovement(player); - sBattlegroundMgr->BuildPvpLogDataPacket(&data, this); - player->GetSession()->SendPacket(&data); + player->GetSession()->SendPacket(&pvpLogData); - BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetArenaType()); + WorldPacket data; sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, TIME_TO_AUTOREMOVE, GetStartTime(), GetArenaType()); player->GetSession()->SendPacket(&data); player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND, 1); } - if (isArena() && isRated() && winner_arena_team && loser_arena_team && winner_arena_team != loser_arena_team) + if (isArena() && isRated() && winnerArenaTeam && loserArenaTeam && winnerArenaTeam != loserArenaTeam) { - // update arena points only after increasing the player's match count! - //obsolete: winner_arena_team->UpdateArenaPointsHelper(); - //obsolete: loser_arena_team->UpdateArenaPointsHelper(); // save the stat changes - winner_arena_team->SaveToDB(); - loser_arena_team->SaveToDB(); + winnerArenaTeam->SaveToDB(); + loserArenaTeam->SaveToDB(); // send updated arena team stats to players // this way all arena team members will get notified, not only the ones who participated in this match - winner_arena_team->NotifyStatsChanged(); - loser_arena_team->NotifyStatsChanged(); + winnerArenaTeam->NotifyStatsChanged(); + loserArenaTeam->NotifyStatsChanged(); } if (winmsg_id) @@ -923,7 +923,7 @@ void Battleground::EndBattleground(uint32 winner) uint32 Battleground::GetBonusHonorFromKill(uint32 kills) const { //variable kills means how many honorable kills you scored (so we need kills * honor_for_one_kill) - uint32 maxLevel = std::min(GetMaxLevel(), 80U); + uint32 maxLevel = std::min<uint32>(GetMaxLevel(), 80U); return Trinity::Honor::hk_honor_at_level(maxLevel, float(kills)); } @@ -994,10 +994,10 @@ void Battleground::RemovePlayerAtLeave(uint64 guid, bool Transport, bool SendPac if (isRated() && GetStatus() == STATUS_IN_PROGRESS) { //left a rated match while the encounter was in progress, consider as loser - ArenaTeam* winner_arena_team = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamIdForTeam(GetOtherTeam(team))); - ArenaTeam* loser_arena_team = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamIdForTeam(team)); - if (winner_arena_team && loser_arena_team && winner_arena_team != loser_arena_team) - loser_arena_team->MemberLost(player, GetArenaMatchmakerRating(GetOtherTeam(team))); + ArenaTeam* winnerArenaTeam = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamIdForTeam(GetOtherTeam(team))); + ArenaTeam* loserArenaTeam = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamIdForTeam(team)); + if (winnerArenaTeam && loserArenaTeam && winnerArenaTeam != loserArenaTeam) + loserArenaTeam->MemberLost(player, GetArenaMatchmakerRating(GetOtherTeam(team))); } } if (SendPacket) @@ -1167,6 +1167,7 @@ void Battleground::AddPlayer(Player* player) player->CastSpell(player, SPELL_ARENA_PREPARATION, true); player->ResetAllPowers(); } + WorldPacket teammate; teammate.Initialize(SMSG_ARENA_OPPONENT_UPDATE, 8); teammate << uint64(player->GetGUID()); @@ -1676,7 +1677,7 @@ void Battleground::SendWarningToAll(int32 entry, ...) if (!entry) return; - const char *format = sObjectMgr->GetTrinityStringForDBCLocale(entry); + char const *format = sObjectMgr->GetTrinityStringForDBCLocale(entry); char str[1024]; va_list ap; @@ -1718,7 +1719,7 @@ void Battleground::EndNow() } // To be removed -const char* Battleground::GetTrinityString(int32 entry) +char const* Battleground::GetTrinityString(int32 entry) { // FIXME: now we have different DBC locales and need localized message for each target client return sObjectMgr->GetTrinityStringForDBCLocale(entry); |
