diff options
| author | leak <leakzx@googlemail.com> | 2011-05-03 15:01:10 +0200 |
|---|---|---|
| committer | leak <leakzx@googlemail.com> | 2011-05-03 15:01:37 +0200 |
| commit | ce01a37c2c69408a9132412ea8a71b2116c57874 (patch) | |
| tree | cf5d3474e8fa16db9bc0d10f8a3489c29251f975 /src/server/game/Battlegrounds/ArenaTeamMgr.cpp | |
| parent | ebcff354a284db3452327ca0d2da55c5ee35fea5 (diff) | |
Core/ObjectMgr: Refactor arena team related functions into dedicated class
Diffstat (limited to 'src/server/game/Battlegrounds/ArenaTeamMgr.cpp')
| -rw-r--r-- | src/server/game/Battlegrounds/ArenaTeamMgr.cpp | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp new file mode 100644 index 00000000000..b3de5d24bc7 --- /dev/null +++ b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp @@ -0,0 +1,179 @@ +/* + * Copyright (C) 2008-2011 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "Common.h" +#include "ArenaTeamMgr.h" + +ArenaTeamMgr::ArenaTeamMgr() +{ + NextArenaTeamId = 1; +} + +ArenaTeamMgr::~ArenaTeamMgr() +{ + for (ArenaTeamContainer::iterator itr = ArenaTeamStore.begin(); itr != ArenaTeamStore.end(); ++itr) + delete itr->second; +} + +// Arena teams collection +ArenaTeam* ArenaTeamMgr::GetArenaTeamById(uint32 arenaTeamId) const +{ + ArenaTeamContainer::const_iterator itr = ArenaTeamStore.find(arenaTeamId); + if (itr != ArenaTeamStore.end()) + return itr->second; + + return NULL; +} + +ArenaTeam* ArenaTeamMgr::GetArenaTeamByName(const std::string& arenaTeamName) const +{ + std::string search = arenaTeamName; + std::transform(search.begin(), search.end(), search.begin(), ::toupper); + for (ArenaTeamContainer::const_iterator itr = ArenaTeamStore.begin(); itr != ArenaTeamStore.end(); ++itr) + { + std::string teamName = itr->second->GetName(); + std::transform(teamName.begin(), teamName.end(), teamName.begin(), ::toupper); + if (search == teamName) + return itr->second; + } + return NULL; +} + +ArenaTeam* ArenaTeamMgr::GetArenaTeamByCaptain(uint64 const& guid) const +{ + for (ArenaTeamContainer::const_iterator itr = ArenaTeamStore.begin(); itr != ArenaTeamStore.end(); ++itr) + if (itr->second->GetCaptain() == guid) + return itr->second; + + return NULL; +} + +void ArenaTeamMgr::AddArenaTeam(ArenaTeam* arenaTeam) +{ + ArenaTeamStore[arenaTeam->GetId()] = arenaTeam; +} + +void ArenaTeamMgr::RemoveArenaTeam(uint32 arenaTeamId) +{ + ArenaTeamStore.erase(arenaTeamId); +} + +uint32 ArenaTeamMgr::GenerateArenaTeamId() +{ + if (NextArenaTeamId >= 0xFFFFFFFE) + { + sLog->outError("Arena team ids overflow!! Can't continue, shutting down server. "); + World::StopNow(ERROR_EXIT_CODE); + } + return NextArenaTeamId++; +} + +void ArenaTeamMgr::LoadArenaTeams() +{ + uint32 oldMSTime = getMSTime(); + + // Clean out the trash before loading anything + CharacterDatabase.Execute("DELETE FROM arena_team_member WHERE arenaTeamId NOT IN (SELECT arenaTeamId FROM arena_team)"); + + // 0 1 2 3 4 5 6 7 8 + QueryResult result = CharacterDatabase.Query("SELECT arena_team.arenaTeamId, name, captainGuid, type, backgroundColor, emblemStyle, emblemColor, borderStyle, borderColor, " + // 9 10 11 12 13 14 + "rating, weekGames, weekWins, seasonGames, seasonWins, rank FROM arena_team ORDER BY arena_team.arenaTeamId ASC"); + + if (!result) + { + sLog->outString(">> Loaded 0 arena teams. DB table `arena_team` is empty!"); + sLog->outString(); + return; + } + + QueryResult result2 = CharacterDatabase.Query( + // 0 1 2 3 4 5 6 7 8 9 + "SELECT arenaTeamId, atm.guid, atm.weekGames, atm.weekWins, atm.seasonGames, atm.seasonWins, c.name, class, personalRating, matchMakerRating FROM arena_team_member atm" + " INNER JOIN arena_team ate USING (arenaTeamId)" + " LEFT JOIN characters AS c ON atm.guid = c.guid" + " LEFT JOIN character_arena_stats AS cas ON c.guid = cas.guid AND (cas.slot = 0 AND ate.type = 2 OR cas.slot = 1 AND ate.type = 3 OR cas.slot = 2 AND ate.type = 5)" + " ORDER BY atm.arenateamid ASC"); + + uint32 count = 0; + do + { + ArenaTeam* newArenaTeam = new ArenaTeam; + + if (!newArenaTeam->LoadArenaTeamFromDB(result) || !newArenaTeam->LoadMembersFromDB(result2)) + { + newArenaTeam->Disband(NULL); + delete newArenaTeam; + continue; + } + + AddArenaTeam(newArenaTeam); + + ++count; + } + while (result->NextRow()); + + sLog->outString(">> Loaded %u arena teams in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + sLog->outString(); +} + +void ArenaTeamMgr::DistributeArenaPoints() +{ + // Used to distribute arena points based on last week's stats + sWorld->SendWorldText(LANG_DIST_ARENA_POINTS_START); + + sWorld->SendWorldText(LANG_DIST_ARENA_POINTS_ONLINE_START); + + // Temporary structure for storing maximum points to add values for all players + std::map<uint32, uint32> PlayerPoints; + + // At first update all points for all team members + for (ArenaTeamContainer::iterator teamItr = GetArenaTeamMapBegin(); teamItr != GetArenaTeamMapEnd(); ++teamItr) + if (ArenaTeam * at = teamItr->second) + at->UpdateArenaPointsHelper(PlayerPoints); + + // Cycle that gives points to all players + for (std::map<uint32, uint32>::iterator playerItr = PlayerPoints.begin(); playerItr != PlayerPoints.end(); ++playerItr) + { + // Update database + CharacterDatabase.PExecute("UPDATE characters SET arenaPoints = arenaPoints + '%u' WHERE guid = '%u'", playerItr->second, playerItr->first); + + // Add points to player if online + Player* pl = sObjectMgr->GetPlayer(playerItr->first); + if (pl) + pl->ModifyArenaPoints(playerItr->second); + } + + PlayerPoints.clear(); + + sWorld->SendWorldText(LANG_DIST_ARENA_POINTS_ONLINE_END); + + sWorld->SendWorldText(LANG_DIST_ARENA_POINTS_TEAM_START); + for (ArenaTeamContainer::iterator titr = GetArenaTeamMapBegin(); titr != GetArenaTeamMapEnd(); ++titr) + { + if (ArenaTeam * at = titr->second) + { + at->FinishWeek(); + at->SaveToDB(); + at->NotifyStatsChanged(); + } + } + + sWorld->SendWorldText(LANG_DIST_ARENA_POINTS_TEAM_END); + + sWorld->SendWorldText(LANG_DIST_ARENA_POINTS_END); +} |
