aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Battlegrounds/ArenaScore.h93
-rw-r--r--src/server/game/Battlegrounds/ArenaTeam.h2
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp133
-rw-r--r--src/server/game/Battlegrounds/Battleground.h59
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.cpp170
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.h1
-rw-r--r--src/server/game/Battlegrounds/BattlegroundScore.h120
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp21
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAB.h39
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp35
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAV.h60
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundBE.cpp13
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundBE.h3
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp3
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp17
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundEY.h33
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp23
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundIC.h40
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundNA.cpp3
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundRL.cpp3
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp3
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp18
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundSA.h45
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp16
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundWS.h39
-rw-r--r--src/server/game/Entities/Player/Player.cpp1
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp4
-rw-r--r--src/server/game/Handlers/BattleGroundHandler.cpp2
28 files changed, 545 insertions, 454 deletions
diff --git a/src/server/game/Battlegrounds/ArenaScore.h b/src/server/game/Battlegrounds/ArenaScore.h
new file mode 100644
index 00000000000..7b25427c078
--- /dev/null
+++ b/src/server/game/Battlegrounds/ArenaScore.h
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2008-2014 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/>.
+ */
+
+#ifndef TRINITY_ARENA_SCORE_H
+#define TRINITY_ARENA_SCORE_H
+
+#include "BattlegroundScore.h"
+#include "SharedDefines.h"
+
+struct ArenaScore : public BattlegroundScore
+{
+ friend class BattlegroundBE;
+ friend class BattlegroundDS;
+ friend class BattlegroundNA;
+ friend class BattlegroundRL;
+ friend class BattlegroundRV;
+
+ protected:
+ ArenaScore(uint64 playerGuid, uint32 team) : BattlegroundScore(playerGuid), TeamId(team == ALLIANCE ? 1 : 0) { }
+
+ void AppendToPacket(WorldPacket& data) final
+ {
+ data << uint64(PlayerGuid);
+
+ data << uint32(KillingBlows);
+ data << uint8(TeamId);
+ data << uint32(DamageDone);
+ data << uint32(HealingDone);
+ data << uint32(0); // Objectives Count
+ }
+
+ // For Logging purpose
+ std::string ToString() const override
+ {
+ std::ostringstream stream;
+ stream << "Damage done: " << DamageDone << ", Healing done: " << HealingDone << ", Killing blows: " << KillingBlows;
+ return stream.str();
+ }
+
+ uint8 TeamId; // TEAM_ALLIANCE or TEAM_HORDE
+};
+
+struct ArenaTeamScore
+{
+ friend class Battleground;
+
+ protected:
+ ArenaTeamScore() : RatingChange(0), MatchmakerRating(0) { }
+
+ virtual ~ArenaTeamScore() { }
+
+ void Assign(int32 ratingChange, uint32 matchMakerRating, std::string const& teamName)
+ {
+ RatingChange = ratingChange;
+ MatchmakerRating = matchMakerRating;
+ TeamName = teamName;
+ }
+
+ void BuildRatingInfoBlock(WorldPacket& data)
+ {
+ uint32 ratingLost = std::abs(std::min(RatingChange, 0));
+ uint32 ratingWon = std::max(RatingChange, 0);
+
+ data << uint32(ratingLost);
+ data << uint32(ratingWon);
+ data << uint32(MatchmakerRating);
+ }
+
+ void BuildTeamInfoBlock(WorldPacket& data)
+ {
+ data << TeamName;
+ }
+
+ int32 RatingChange;
+ uint32 MatchmakerRating;
+ std::string TeamName;
+};
+
+#endif // TRINITY_ARENA_SCORE_H
diff --git a/src/server/game/Battlegrounds/ArenaTeam.h b/src/server/game/Battlegrounds/ArenaTeam.h
index cd9e2be4318..c977a137c2a 100644
--- a/src/server/game/Battlegrounds/ArenaTeam.h
+++ b/src/server/game/Battlegrounds/ArenaTeam.h
@@ -130,7 +130,7 @@ class ArenaTeam
uint8 GetSlot() const { return GetSlotByType(GetType()); }
static uint8 GetSlotByType(uint32 type);
uint64 GetCaptain() const { return CaptainGuid; }
- std::string const& GetName() const { return TeamName; }
+ std::string const& GetName() const { return TeamName; }
const ArenaTeamStats& GetStats() const { return Stats; }
uint32 GetRating() const { return Stats.Rating; }
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index ca48ffb3a14..96911cfedac 100644
--- a/src/server/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
@@ -16,10 +16,12 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "ArenaScore.h"
#include "ArenaTeam.h"
#include "ArenaTeamMgr.h"
#include "Battleground.h"
#include "BattlegroundMgr.h"
+#include "BattlegroundScore.h"
#include "Creature.h"
#include "CreatureTextMgr.h"
#include "Chat.h"
@@ -165,12 +167,13 @@ Battleground::Battleground()
m_ArenaTeamIds[TEAM_ALLIANCE] = 0;
m_ArenaTeamIds[TEAM_HORDE] = 0;
- m_ArenaTeamRatingChanges[TEAM_ALLIANCE] = 0;
- m_ArenaTeamRatingChanges[TEAM_HORDE] = 0;
-
m_ArenaTeamMMR[TEAM_ALLIANCE] = 0;
m_ArenaTeamMMR[TEAM_HORDE] = 0;
+ // Iterate this way for consistency's sake - client expects it to be sent in this order
+ for (int8 i = WINNER_ALLIANCE; i >= WINNER_HORDE; --i)
+ _arenaTeamScores[i] = new ArenaTeamScore();
+
m_BgRaids[TEAM_ALLIANCE] = NULL;
m_BgRaids[TEAM_HORDE] = NULL;
@@ -222,6 +225,10 @@ Battleground::~Battleground()
for (BattlegroundScoreMap::const_iterator itr = PlayerScores.begin(); itr != PlayerScores.end(); ++itr)
delete itr->second;
+
+ // Iterate this way for consistency's sake - client expects it to be sent in this order
+ for (int8 i = WINNER_ALLIANCE; i >= WINNER_HORDE; --i)
+ delete _arenaTeamScores[i];
}
void Battleground::Update(uint32 diff)
@@ -771,49 +778,50 @@ void Battleground::EndBattleground(uint32 winner)
if (winnerArenaTeam && loserArenaTeam && winnerArenaTeam != loserArenaTeam)
{
+ loserTeamRating = loserArenaTeam->GetRating();
+ loserMatchmakerRating = GetArenaMatchmakerRating(GetOtherTeam(winner));
+ winnerTeamRating = winnerArenaTeam->GetRating();
+ winnerMatchmakerRating = GetArenaMatchmakerRating(winner);
+
if (winner != WINNER_NONE)
{
- 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);
TC_LOG_DEBUG("bg.arena", "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);
+
+ uint8 winnerId = GetWinner();
+ uint8 loserId = winnerId == WINNER_ALLIANCE ? WINNER_HORDE : winnerId;
+
+ _arenaTeamScores[winnerId]->Assign(winnerChange, winnerMatchmakerRating + winnerMatchmakerChange, winnerArenaTeam->GetName());
+ _arenaTeamScores[loserId]->Assign(loserChange, loserMatchmakerRating + loserMatchmakerChange, loserArenaTeam->GetName());
+
TC_LOG_DEBUG("bg.arena", "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))
+ for (auto const& score : PlayerScores)
+ if (Player* player = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(score.first, 0, HIGHGUID_PLAYER)))
{
- TC_LOG_DEBUG("bg.arena", "Statistics match Type: %u for %s (GUID: " UI64FMTD ", Team: %d, IP: %s): %u damage, %u healing, %u killing blows",
- m_ArenaType, player->GetName().c_str(), itr->first, player->GetArenaTeamId(m_ArenaType == 5 ? 2 : m_ArenaType == 3),
- player->GetSession()->GetRemoteAddress().c_str(), itr->second->DamageDone, itr->second->HealingDone,
- itr->second->KillingBlows);
+ TC_LOG_DEBUG("bg.arena", "Statistics match Type: %u for %s (GUID: %u, Team: %d, IP: %s): %s",
+ m_ArenaType, player->GetName().c_str(), score.first, player->GetArenaTeamId(m_ArenaType == 5 ? 2 : m_ArenaType == 3),
+ player->GetSession()->GetRemoteAddress().c_str(), score.second->ToString().c_str());
}
}
// Deduct 16 points from each teams arena-rating if there are no winners after 45+2 minutes
else
{
- SetArenaTeamRatingChangeForTeam(ALLIANCE, ARENA_TIMELIMIT_POINTS_LOSS);
- SetArenaTeamRatingChangeForTeam(HORDE, ARENA_TIMELIMIT_POINTS_LOSS);
+ _arenaTeamScores[WINNER_ALLIANCE]->Assign(ARENA_TIMELIMIT_POINTS_LOSS, winnerMatchmakerRating + winnerMatchmakerChange, winnerArenaTeam->GetName());
+ _arenaTeamScores[WINNER_HORDE]->Assign(ARENA_TIMELIMIT_POINTS_LOSS, loserMatchmakerRating + loserMatchmakerChange, loserArenaTeam->GetName());
+
winnerArenaTeam->FinishGame(ARENA_TIMELIMIT_POINTS_LOSS);
loserArenaTeam->FinishGame(ARENA_TIMELIMIT_POINTS_LOSS);
}
}
- else
- {
- SetArenaTeamRatingChangeForTeam(ALLIANCE, 0);
- SetArenaTeamRatingChangeForTeam(HORDE, 0);
- }
}
WorldPacket pvpLogData;
- sBattlegroundMgr->BuildPvpLogDataPacket(&pvpLogData, this);
+ BuildPvPLogDataPacket(pvpLogData);
BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetArenaType());
@@ -958,7 +966,7 @@ void Battleground::RemovePlayerAtLeave(uint64 guid, bool Transport, bool SendPac
participant = true;
}
- BattlegroundScoreMap::iterator itr2 = PlayerScores.find(guid);
+ BattlegroundScoreMap::iterator itr2 = PlayerScores.find(GUID_LOPART(guid));
if (itr2 != PlayerScores.end())
{
delete itr2->second; // delete player's score
@@ -1349,47 +1357,48 @@ bool Battleground::HasFreeSlots() const
return GetPlayersSize() < GetMaxPlayers();
}
-void Battleground::UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor)
+void Battleground::BuildPvPLogDataPacket(WorldPacket& data)
{
- //this procedure is called from virtual function implemented in bg subclass
- BattlegroundScoreMap::const_iterator itr = PlayerScores.find(Source->GetGUID());
- if (itr == PlayerScores.end()) // player not found...
- return;
+ uint8 type = (isArena() ? 1 : 0);
+
+ data.Initialize(MSG_PVP_LOG_DATA, 1 + 1 + 4 + 40 * GetPlayerScoresSize());
+ data << uint8(type); // type (battleground = 0 / arena = 1)
- switch (type)
+ if (type) // arena
{
- case SCORE_KILLING_BLOWS: // Killing blows
- itr->second->KillingBlows += value;
- break;
- case SCORE_DEATHS: // Deaths
- itr->second->Deaths += value;
- break;
- case SCORE_HONORABLE_KILLS: // Honorable kills
- itr->second->HonorableKills += value;
- break;
- case SCORE_BONUS_HONOR: // Honor bonus
- // do not add honor in arenas
- if (isBattleground())
- {
- // reward honor instantly
- if (doAddHonor)
- Source->RewardHonor(NULL, 1, value); // RewardHonor calls UpdatePlayerScore with doAddHonor = false
- else
- itr->second->BonusHonor += value;
- }
- break;
- // used only in EY, but in MSG_PVP_LOG_DATA opcode
- case SCORE_DAMAGE_DONE: // Damage Done
- itr->second->DamageDone += value;
- break;
- case SCORE_HEALING_DONE: // Healing Done
- itr->second->HealingDone += value;
- break;
- default:
- TC_LOG_ERROR("bg.battleground", "Battleground::UpdatePlayerScore: unknown score type (%u) for BG (map: %u, instance id: %u)!",
- type, m_MapId, m_InstanceID);
- break;
+ // it seems this must be according to BG_WINNER_A/H and _NOT_ TEAM_A/H
+ for (int8 i = WINNER_ALLIANCE; i >= WINNER_HORDE; --i)
+ _arenaTeamScores[i]->BuildRatingInfoBlock(data);
+
+ for (int8 i = WINNER_ALLIANCE; i >= WINNER_HORDE; --i)
+ _arenaTeamScores[i]->BuildTeamInfoBlock(data);
}
+
+ if (GetStatus() == STATUS_WAIT_LEAVE)
+ {
+ data << uint8(1); // bg ended
+ data << uint8(GetWinner()); // who win
+ }
+ else
+ data << uint8(0); // bg not ended
+
+ data << uint32(GetPlayerScoresSize());
+ for (auto const& score : PlayerScores)
+ score.second->AppendToPacket(data);
+}
+
+bool Battleground::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)
+{
+ BattlegroundScoreMap::const_iterator itr = PlayerScores.find(player->GetGUIDLow());
+ if (itr == PlayerScores.end()) // player not found...
+ return false;
+
+ itr->second->UpdateScore(type, value);
+
+ if (type == SCORE_BONUS_HONOR && doAddHonor && isBattleground())
+ player->RewardHonor(NULL, 1, value); // RewardHonor calls UpdatePlayerScore with doAddHonor = false
+
+ return true;
}
void Battleground::AddPlayerToResurrectQueue(uint64 npc_guid, uint64 player_guid)
@@ -1868,7 +1877,7 @@ void Battleground::PlayerAddedToBGCheckIfBGIsRunning(Player* player)
BlockMovement(player);
- sBattlegroundMgr->BuildPvpLogDataPacket(&data, this);
+ BuildPvPLogDataPacket(data);
player->SendDirectMessage(&data);
sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, GetEndTime(), GetStartTime(), GetArenaType(), player->GetBGTeam());
diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h
index 4256e2fc094..7d1bf550695 100644
--- a/src/server/game/Battlegrounds/Battleground.h
+++ b/src/server/game/Battlegrounds/Battleground.h
@@ -32,6 +32,8 @@ class WorldObject;
class WorldPacket;
class BattlegroundMap;
+struct ArenaTeamScore;
+struct BattlegroundScore;
struct Position;
struct PvPDifficultyEntry;
struct WorldSafeLocsEntry;
@@ -171,34 +173,6 @@ struct BattlegroundObjectInfo
uint32 spellid;
};
-enum ScoreType
-{
- SCORE_KILLING_BLOWS = 1,
- SCORE_DEATHS = 2,
- SCORE_HONORABLE_KILLS = 3,
- SCORE_BONUS_HONOR = 4,
- //EY, but in MSG_PVP_LOG_DATA opcode!
- SCORE_DAMAGE_DONE = 5,
- SCORE_HEALING_DONE = 6,
- //WS
- SCORE_FLAG_CAPTURES = 7,
- SCORE_FLAG_RETURNS = 8,
- //AB and IC
- SCORE_BASES_ASSAULTED = 9,
- SCORE_BASES_DEFENDED = 10,
- //AV
- SCORE_GRAVEYARDS_ASSAULTED = 11,
- SCORE_GRAVEYARDS_DEFENDED = 12,
- SCORE_TOWERS_ASSAULTED = 13,
- SCORE_TOWERS_DEFENDED = 14,
- SCORE_MINES_CAPTURED = 15,
- SCORE_LEADERS_KILLED = 16,
- SCORE_SECONDARY_OBJECTIVES = 17,
- //SOTA
- SCORE_DESTROYED_DEMOLISHER = 18,
- SCORE_DESTROYED_WALL = 19
-};
-
enum ArenaType
{
ARENA_TYPE_2v2 = 2,
@@ -239,22 +213,6 @@ enum BattlegroundStartingEventsIds
};
#define BG_STARTING_EVENT_COUNT 4
-struct BattlegroundScore
-{
- BattlegroundScore() : KillingBlows(0), Deaths(0), HonorableKills(0), BonusHonor(0),
- DamageDone(0), HealingDone(0)
- { }
-
- virtual ~BattlegroundScore() { } //virtual destructor is used when deleting score from scores map
-
- uint32 KillingBlows;
- uint32 Deaths;
- uint32 HonorableKills;
- uint32 BonusHonor;
- uint32 DamageDone;
- uint32 HealingDone;
-};
-
enum BGHonorMode
{
BG_NORMAL = 0,
@@ -369,9 +327,7 @@ class Battleground
BattlegroundPlayerMap const& GetPlayers() const { return m_Players; }
uint32 GetPlayersSize() const { return m_Players.size(); }
- typedef std::map<uint64, BattlegroundScore*> BattlegroundScoreMap;
- BattlegroundScoreMap::const_iterator GetPlayerScoresBegin() const { return PlayerScores.begin(); }
- BattlegroundScoreMap::const_iterator GetPlayerScoresEnd() const { return PlayerScores.end(); }
+ typedef std::map<uint32, BattlegroundScore*> BattlegroundScoreMap;
uint32 GetPlayerScoresSize() const { return PlayerScores.size(); }
uint32 GetReviveQueueSize() const { return m_ReviveQueue.size(); }
@@ -443,7 +399,8 @@ class Battleground
Group* GetBgRaid(uint32 TeamID) const { return TeamID == ALLIANCE ? m_BgRaids[TEAM_ALLIANCE] : m_BgRaids[TEAM_HORDE]; }
void SetBgRaid(uint32 TeamID, Group* bg_raid);
- virtual void UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true);
+ void BuildPvPLogDataPacket(WorldPacket& data);
+ virtual bool UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true);
static TeamId GetTeamIndexByTeamId(uint32 Team) { return Team == ALLIANCE ? TEAM_ALLIANCE : TEAM_HORDE; }
uint32 GetPlayersCountByTeam(uint32 Team) const { return m_PlayersCount[GetTeamIndexByTeamId(Team)]; }
@@ -460,12 +417,8 @@ class Battleground
void SetArenaTeamIdForTeam(uint32 Team, uint32 ArenaTeamId) { m_ArenaTeamIds[GetTeamIndexByTeamId(Team)] = ArenaTeamId; }
uint32 GetArenaTeamIdForTeam(uint32 Team) const { return m_ArenaTeamIds[GetTeamIndexByTeamId(Team)]; }
uint32 GetArenaTeamIdByIndex(uint32 index) const { return m_ArenaTeamIds[index]; }
- void SetArenaTeamRatingChangeForTeam(uint32 Team, int32 RatingChange) { m_ArenaTeamRatingChanges[GetTeamIndexByTeamId(Team)] = RatingChange; }
- int32 GetArenaTeamRatingChangeForTeam(uint32 Team) const { return m_ArenaTeamRatingChanges[GetTeamIndexByTeamId(Team)]; }
- int32 GetArenaTeamRatingChangeByIndex(uint32 index) const { return m_ArenaTeamRatingChanges[index]; }
void SetArenaMatchmakerRating(uint32 Team, uint32 MMR){ m_ArenaTeamMMR[GetTeamIndexByTeamId(Team)] = MMR; }
uint32 GetArenaMatchmakerRating(uint32 Team) const { return m_ArenaTeamMMR[GetTeamIndexByTeamId(Team)]; }
- uint32 GetArenaMatchmakerRatingByIndex(uint32 index) const { return m_ArenaTeamMMR[index]; }
void CheckArenaAfterTimerConditions();
void CheckArenaWinConditions();
void UpdateArenaWorldState();
@@ -657,8 +610,8 @@ class Battleground
// Arena team ids by team
uint32 m_ArenaTeamIds[BG_TEAMS_COUNT];
- int32 m_ArenaTeamRatingChanges[BG_TEAMS_COUNT];
uint32 m_ArenaTeamMMR[BG_TEAMS_COUNT];
+ ArenaTeamScore* _arenaTeamScores[BG_TEAMS_COUNT];
// Limits
uint32 m_LevelMin;
diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
index ab69c950ff4..ef78594626a 100644
--- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp
+++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
@@ -216,176 +216,6 @@ void BattlegroundMgr::BuildBattlegroundStatusPacket(WorldPacket* data, Battlegro
}
}
-void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg)
-{
- uint8 type = (bg->isArena() ? 1 : 0);
-
- data->Initialize(MSG_PVP_LOG_DATA, (1+1+4+40*bg->GetPlayerScoresSize()));
- *data << uint8(type); // type (battleground=0/arena=1)
-
- if (type) // arena
- {
- // it seems this must be according to BG_WINNER_A/H and _NOT_ TEAM_A/H
- for (int8 i = 1; i >= 0; --i)
- {
- int32 rating_change = bg->GetArenaTeamRatingChangeByIndex(i);
-
- uint32 pointsLost = rating_change < 0 ? -rating_change : 0;
- uint32 pointsGained = rating_change > 0 ? rating_change : 0;
- uint32 MatchmakerRating = bg->GetArenaMatchmakerRatingByIndex(i);
-
- *data << uint32(pointsLost); // Rating Lost
- *data << uint32(pointsGained); // Rating gained
- *data << uint32(MatchmakerRating); // Matchmaking Value
- TC_LOG_DEBUG("bg.battleground", "rating change: %d", rating_change);
- }
- for (int8 i = 1; i >= 0; --i)
- {
- if (ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(bg->GetArenaTeamIdByIndex(i)))
- *data << at->GetName();
- else
- *data << uint8(0);
- }
- }
-
- if (bg->GetStatus() != STATUS_WAIT_LEAVE)
- *data << uint8(0); // bg not ended
- else
- {
- *data << uint8(1); // bg ended
- *data << uint8(bg->GetWinner()); // who win
- }
-
- size_t wpos = data->wpos();
- uint32 scoreCount = 0;
- *data << uint32(scoreCount); // placeholder
-
- Battleground::BattlegroundScoreMap::const_iterator itr2 = bg->GetPlayerScoresBegin();
- for (Battleground::BattlegroundScoreMap::const_iterator itr = itr2; itr != bg->GetPlayerScoresEnd();)
- {
- itr2 = itr++;
- BattlegroundScore* score = itr2->second;
- if (!bg->IsPlayerInBattleground(itr2->first))
- {
- TC_LOG_ERROR("bg.battleground", "Player " UI64FMTD " has scoreboard entry for battleground %u but is not in battleground!", itr->first, bg->GetTypeID(true));
- continue;
- }
-
- *data << uint64(itr2->first);
- *data << uint32(score->KillingBlows);
- if (type == 0)
- {
- *data << uint32(score->HonorableKills);
- *data << uint32(score->Deaths);
- *data << uint32(score->BonusHonor);
- }
- else
- {
- Player* player = ObjectAccessor::FindPlayer(itr2->first);
- uint32 team = bg->GetPlayerTeam(itr2->first);
- if (!team && player)
- team = player->GetBGTeam();
- *data << uint8(team == ALLIANCE ? 1 : 0); // green or yellow
- }
- *data << uint32(score->DamageDone); // damage done
- *data << uint32(score->HealingDone); // healing done
- switch (bg->GetTypeID(true)) // battleground specific things
- {
- case BATTLEGROUND_RB:
- switch (bg->GetMapId())
- {
- case 489:
- *data << uint32(0x00000002); // count of next fields
- *data << uint32(((BattlegroundWGScore*)score)->FlagCaptures); // flag captures
- *data << uint32(((BattlegroundWGScore*)score)->FlagReturns); // flag returns
- break;
- case 566:
- *data << uint32(0x00000001); // count of next fields
- *data << uint32(((BattlegroundEYScore*)score)->FlagCaptures); // flag captures
- break;
- case 529:
- *data << uint32(0x00000002); // count of next fields
- *data << uint32(((BattlegroundABScore*)score)->BasesAssaulted); // bases asssulted
- *data << uint32(((BattlegroundABScore*)score)->BasesDefended); // bases defended
- break;
- case 30:
- *data << uint32(0x00000005); // count of next fields
- *data << uint32(((BattlegroundAVScore*)score)->GraveyardsAssaulted); // GraveyardsAssaulted
- *data << uint32(((BattlegroundAVScore*)score)->GraveyardsDefended); // GraveyardsDefended
- *data << uint32(((BattlegroundAVScore*)score)->TowersAssaulted); // TowersAssaulted
- *data << uint32(((BattlegroundAVScore*)score)->TowersDefended); // TowersDefended
- *data << uint32(((BattlegroundAVScore*)score)->MinesCaptured); // MinesCaptured
- break;
- case 607:
- *data << uint32(0x00000002); // count of next fields
- *data << uint32(((BattlegroundSAScore*)score)->demolishers_destroyed);
- *data << uint32(((BattlegroundSAScore*)score)->gates_destroyed);
- break;
- case 628: // IC
- *data << uint32(0x00000002); // count of next fields
- *data << uint32(((BattlegroundICScore*)score)->BasesAssaulted); // bases asssulted
- *data << uint32(((BattlegroundICScore*)score)->BasesDefended); // bases defended
- default:
- *data << uint32(0);
- break;
- }
- break;
- case BATTLEGROUND_AV:
- *data << uint32(0x00000005); // count of next fields
- *data << uint32(((BattlegroundAVScore*)score)->GraveyardsAssaulted); // GraveyardsAssaulted
- *data << uint32(((BattlegroundAVScore*)score)->GraveyardsDefended); // GraveyardsDefended
- *data << uint32(((BattlegroundAVScore*)score)->TowersAssaulted); // TowersAssaulted
- *data << uint32(((BattlegroundAVScore*)score)->TowersDefended); // TowersDefended
- *data << uint32(((BattlegroundAVScore*)score)->MinesCaptured); // MinesCaptured
- break;
- case BATTLEGROUND_WS:
- *data << uint32(0x00000002); // count of next fields
- *data << uint32(((BattlegroundWGScore*)score)->FlagCaptures); // flag captures
- *data << uint32(((BattlegroundWGScore*)score)->FlagReturns); // flag returns
- break;
- case BATTLEGROUND_AB:
- *data << uint32(0x00000002); // count of next fields
- *data << uint32(((BattlegroundABScore*)score)->BasesAssaulted); // bases assaulted
- *data << uint32(((BattlegroundABScore*)score)->BasesDefended); // bases defended
- break;
- case BATTLEGROUND_EY:
- *data << uint32(0x00000001); // count of next fields
- *data << uint32(((BattlegroundEYScore*)score)->FlagCaptures); // flag captures
- break;
- case BATTLEGROUND_SA:
- *data << uint32(0x00000002); // count of next fields
- *data << uint32(((BattlegroundSAScore*)score)->demolishers_destroyed);
- *data << uint32(((BattlegroundSAScore*)score)->gates_destroyed);
- break;
- case BATTLEGROUND_IC:
- *data << uint32(0x00000002); // count of next fields
- *data << uint32(((BattlegroundICScore*)score)->BasesAssaulted); // bases assaulted
- *data << uint32(((BattlegroundICScore*)score)->BasesDefended); // bases defended
- break;
- case BATTLEGROUND_NA:
- case BATTLEGROUND_BE:
- case BATTLEGROUND_AA:
- case BATTLEGROUND_RL:
- case BATTLEGROUND_DS:
- case BATTLEGROUND_RV:
- *data << uint32(0);
- break;
- default:
- TC_LOG_DEBUG("network", "Unhandled MSG_PVP_LOG_DATA for BG id %u", bg->GetTypeID());
- *data << uint32(0);
- break;
- }
- // should never happen
- if (++scoreCount >= bg->GetMaxPlayers() && itr != bg->GetPlayerScoresEnd())
- {
- TC_LOG_ERROR("bg.battleground", "Battleground %u scoreboard has more entries (%u) than allowed players in this bg (%u)", bg->GetTypeID(true), bg->GetPlayerScoresSize(), bg->GetMaxPlayers());
- break;
- }
- }
-
- data->put(wpos, scoreCount);
-}
-
void BattlegroundMgr::BuildGroupJoinedBattlegroundPacket(WorldPacket* data, GroupJoinBattlegroundResult result)
{
data->Initialize(SMSG_GROUP_JOINED_BATTLEGROUND, 4);
diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.h b/src/server/game/Battlegrounds/BattlegroundMgr.h
index 786e664c3f3..b57efc045d8 100644
--- a/src/server/game/Battlegrounds/BattlegroundMgr.h
+++ b/src/server/game/Battlegrounds/BattlegroundMgr.h
@@ -79,7 +79,6 @@ class BattlegroundMgr
void BuildBattlegroundListPacket(WorldPacket* data, uint64 guid, Player* player, BattlegroundTypeId bgTypeId, uint8 fromWhere);
void BuildGroupJoinedBattlegroundPacket(WorldPacket* data, GroupJoinBattlegroundResult result);
void BuildUpdateWorldStatePacket(WorldPacket* data, uint32 field, uint32 value);
- void BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg);
void BuildBattlegroundStatusPacket(WorldPacket* data, Battleground* bg, uint8 queueSlot, uint8 statusId, uint32 time1, uint32 time2, uint8 arenaType, uint32 arenaFaction);
void BuildPlaySoundPacket(WorldPacket* data, uint32 soundId);
void SendAreaSpiritHealerQueryOpcode(Player* player, Battleground* bg, uint64 guid);
diff --git a/src/server/game/Battlegrounds/BattlegroundScore.h b/src/server/game/Battlegrounds/BattlegroundScore.h
new file mode 100644
index 00000000000..7fedc4dbc4d
--- /dev/null
+++ b/src/server/game/Battlegrounds/BattlegroundScore.h
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2008-2014 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/>.
+ */
+
+#ifndef TRINITY_BATTLEGROUND_SCORE_H
+#define TRINITY_BATTLEGROUND_SCORE_H
+
+#include "WorldPacket.h"
+
+enum ScoreType
+{
+ SCORE_KILLING_BLOWS = 1,
+ SCORE_DEATHS = 2,
+ SCORE_HONORABLE_KILLS = 3,
+ SCORE_BONUS_HONOR = 4,
+ SCORE_DAMAGE_DONE = 5,
+ SCORE_HEALING_DONE = 6,
+
+ // WS and EY
+ SCORE_FLAG_CAPTURES = 7,
+ SCORE_FLAG_RETURNS = 8,
+
+ // AB and IC
+ SCORE_BASES_ASSAULTED = 9,
+ SCORE_BASES_DEFENDED = 10,
+
+ // AV
+ SCORE_GRAVEYARDS_ASSAULTED = 11,
+ SCORE_GRAVEYARDS_DEFENDED = 12,
+ SCORE_TOWERS_ASSAULTED = 13,
+ SCORE_TOWERS_DEFENDED = 14,
+ SCORE_MINES_CAPTURED = 15,
+
+ // SOTA
+ SCORE_DESTROYED_DEMOLISHER = 16,
+ SCORE_DESTROYED_WALL = 17
+};
+
+struct BattlegroundScore
+{
+ friend class Battleground;
+
+ protected:
+ BattlegroundScore(uint64 playerGuid) : PlayerGuid(playerGuid), KillingBlows(0), Deaths(0),
+ HonorableKills(0), BonusHonor(0), DamageDone(0), HealingDone(0) { }
+
+ virtual ~BattlegroundScore() { }
+
+ virtual void UpdateScore(uint32 type, uint32 value)
+ {
+ switch (type)
+ {
+ case SCORE_KILLING_BLOWS: // Killing blows
+ KillingBlows += value;
+ break;
+ case SCORE_DEATHS: // Deaths
+ Deaths += value;
+ break;
+ case SCORE_HONORABLE_KILLS: // Honorable kills
+ HonorableKills += value;
+ break;
+ case SCORE_BONUS_HONOR: // Honor bonus
+ BonusHonor += value;
+ break;
+ case SCORE_DAMAGE_DONE: // Damage Done
+ DamageDone += value;
+ break;
+ case SCORE_HEALING_DONE: // Healing Done
+ HealingDone += value;
+ break;
+ default:
+ ASSERT(false && "Not implemented Battleground score type!");
+ break;
+ }
+ }
+
+ virtual void AppendToPacket(WorldPacket& data)
+ {
+ data << uint64(PlayerGuid);
+
+ data << uint32(KillingBlows);
+ data << uint32(HonorableKills);
+ data << uint32(Deaths);
+ data << uint32(BonusHonor);
+ data << uint32(DamageDone);
+ data << uint32(HealingDone);
+
+ BuildObjectivesBlock(data);
+ }
+
+ virtual void BuildObjectivesBlock(WorldPacket& /*data*/) { }
+
+ // For Logging purpose
+ virtual std::string ToString() const { return ""; }
+
+ uint64 PlayerGuid;
+
+ // Default score, present in every type
+ uint32 KillingBlows;
+ uint32 Deaths;
+ uint32 HonorableKills;
+ uint32 BonusHonor;
+ uint32 DamageDone;
+ uint32 HealingDone;
+};
+
+#endif // TRINITY_BATTLEGROUND_SCORE_H
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
index 38b0e3e084b..2622ab9501f 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
@@ -224,15 +224,11 @@ void BattlegroundAB::StartingEventOpenDoors()
void BattlegroundAB::AddPlayer(Player* player)
{
Battleground::AddPlayer(player);
- //create score and add it to map, default values are set in the constructor
- BattlegroundABScore* sc = new BattlegroundABScore;
-
- PlayerScores[player->GetGUID()] = sc;
+ PlayerScores[player->GetGUIDLow()] = new BattlegroundABScore(player->GetGUID());
}
void BattlegroundAB::RemovePlayer(Player* /*player*/, uint64 /*guid*/, uint32 /*team*/)
{
-
}
void BattlegroundAB::HandleAreaTrigger(Player* player, uint32 trigger)
@@ -696,26 +692,23 @@ WorldSafeLocsEntry const* BattlegroundAB::GetClosestGraveYard(Player* player)
return good_entry;
}
-void BattlegroundAB::UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor)
+bool BattlegroundAB::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)
{
- BattlegroundScoreMap::iterator itr = PlayerScores.find(Source->GetGUID());
- if (itr == PlayerScores.end()) // player not found...
- return;
+ if (!Battleground::UpdatePlayerScore(player, type, value, doAddHonor))
+ return false;
switch (type)
{
case SCORE_BASES_ASSAULTED:
- ((BattlegroundABScore*)itr->second)->BasesAssaulted += value;
- Source->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AB_OBJECTIVE_ASSAULT_BASE);
+ player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AB_OBJECTIVE_ASSAULT_BASE);
break;
case SCORE_BASES_DEFENDED:
- ((BattlegroundABScore*)itr->second)->BasesDefended += value;
- Source->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AB_OBJECTIVE_DEFEND_BASE);
+ player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AB_OBJECTIVE_DEFEND_BASE);
break;
default:
- Battleground::UpdatePlayerScore(Source, type, value, doAddHonor);
break;
}
+ return true;
}
bool BattlegroundAB::IsAllNodesControlledByTeam(uint32 team) const
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h
index 9abc7627b24..a6b4be10fdf 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h
@@ -20,6 +20,7 @@
#define __BATTLEGROUNDAB_H
#include "Battleground.h"
+#include "BattlegroundScore.h"
#include "Object.h"
enum BG_AB_WorldStates
@@ -236,12 +237,38 @@ struct BG_AB_BannerTimer
uint8 teamIndex;
};
-struct BattlegroundABScore : public BattlegroundScore
+struct BattlegroundABScore final : public BattlegroundScore
{
- BattlegroundABScore(): BasesAssaulted(0), BasesDefended(0) { }
- ~BattlegroundABScore() { }
- uint32 BasesAssaulted;
- uint32 BasesDefended;
+ friend class BattlegroundAB;
+
+ protected:
+ BattlegroundABScore(uint64 playerGuid) : BattlegroundScore(playerGuid), BasesAssaulted(0), BasesDefended(0) { }
+
+ void UpdateScore(uint32 type, uint32 value) override
+ {
+ switch (type)
+ {
+ case SCORE_BASES_ASSAULTED:
+ BasesAssaulted += value;
+ break;
+ case SCORE_BASES_DEFENDED:
+ BasesDefended += value;
+ break;
+ default:
+ BattlegroundScore::UpdateScore(type, value);
+ break;
+ }
+ }
+
+ void BuildObjectivesBlock(WorldPacket& data) final
+ {
+ data << uint32(2);
+ data << uint32(BasesAssaulted);
+ data << uint32(BasesDefended);
+ }
+
+ uint32 BasesAssaulted;
+ uint32 BasesDefended;
};
class BattlegroundAB : public Battleground
@@ -261,7 +288,7 @@ class BattlegroundAB : public Battleground
WorldSafeLocsEntry const* GetClosestGraveYard(Player* player);
/* Scorekeeping */
- void UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor = true);
+ bool UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true) override;
void FillInitialWorldStates(WorldPacket& data);
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
index 16576aa888e..070d79bc8e4 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
@@ -459,9 +459,8 @@ void BattlegroundAV::StartingEventOpenDoors()
void BattlegroundAV::AddPlayer(Player* player)
{
Battleground::AddPlayer(player);
- //create score and add it to map, default values are set in constructor
- BattlegroundAVScore* sc = new BattlegroundAVScore;
- PlayerScores[player->GetGUID()] = sc;
+ PlayerScores[player->GetGUIDLow()] = new BattlegroundAVScore(player->GetGUID());
+
if (m_MaxLevel == 0)
m_MaxLevel=(player->getLevel()%10 == 0)? player->getLevel() : (player->getLevel()-(player->getLevel()%10))+10; /// @todo just look at the code \^_^/ --but queue-info should provide this information..
}
@@ -553,43 +552,29 @@ void BattlegroundAV::HandleAreaTrigger(Player* player, uint32 trigger)
}
}
-void BattlegroundAV::UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor)
+bool BattlegroundAV::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)
{
- BattlegroundScoreMap::iterator itr = PlayerScores.find(Source->GetGUID());
- if (itr == PlayerScores.end()) // player not found...
- return;
+ if (!Battleground::UpdatePlayerScore(player, type, value, doAddHonor))
+ return false;
switch (type)
{
case SCORE_GRAVEYARDS_ASSAULTED:
- ((BattlegroundAVScore*)itr->second)->GraveyardsAssaulted += value;
- Source->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_ASSAULT_GRAVEYARD);
+ player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_ASSAULT_GRAVEYARD);
break;
case SCORE_GRAVEYARDS_DEFENDED:
- ((BattlegroundAVScore*)itr->second)->GraveyardsDefended += value;
- Source->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_DEFEND_GRAVEYARD);
+ player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_DEFEND_GRAVEYARD);
break;
case SCORE_TOWERS_ASSAULTED:
- ((BattlegroundAVScore*)itr->second)->TowersAssaulted += value;
- Source->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_ASSAULT_TOWER);
+ player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_ASSAULT_TOWER);
break;
case SCORE_TOWERS_DEFENDED:
- ((BattlegroundAVScore*)itr->second)->TowersDefended += value;
- Source->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_DEFEND_TOWER);
- break;
- case SCORE_MINES_CAPTURED:
- ((BattlegroundAVScore*)itr->second)->MinesCaptured += value;
- break;
- case SCORE_LEADERS_KILLED:
- ((BattlegroundAVScore*)itr->second)->LeadersKilled += value;
- break;
- case SCORE_SECONDARY_OBJECTIVES:
- ((BattlegroundAVScore*)itr->second)->SecondaryObjectives += value;
+ player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_DEFEND_TOWER);
break;
default:
- Battleground::UpdatePlayerScore(Source, type, value, doAddHonor);
break;
}
+ return true;
}
void BattlegroundAV::EventPlayerDestroyedPoint(BG_AV_Nodes node)
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h
index 03dd0ffcf5c..b84b1460048 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h
@@ -20,6 +20,7 @@
#define __BATTLEGROUNDAV_H
#include "Battleground.h"
+#include "BattlegroundScore.h"
#include "Object.h"
#define LANG_BG_AV_A_CAPTAIN_BUFF "Begone. Uncouth scum! The Alliance shall prevail in Alterac Valley!"
@@ -1525,18 +1526,53 @@ struct BG_AV_NodeInfo
inline BG_AV_Nodes &operator++(BG_AV_Nodes &i){ return i = BG_AV_Nodes(i + 1); }
-struct BattlegroundAVScore : public BattlegroundScore
+struct BattlegroundAVScore final : public BattlegroundScore
{
- BattlegroundAVScore() : GraveyardsAssaulted(0), GraveyardsDefended(0), TowersAssaulted(0),
- TowersDefended(0), MinesCaptured(0), LeadersKilled(0), SecondaryObjectives(0) { }
- ~BattlegroundAVScore() { }
- uint32 GraveyardsAssaulted;
- uint32 GraveyardsDefended;
- uint32 TowersAssaulted;
- uint32 TowersDefended;
- uint32 MinesCaptured;
- uint32 LeadersKilled;
- uint32 SecondaryObjectives;
+ friend class BattlegroundAV;
+
+ protected:
+ BattlegroundAVScore(uint64 playerGuid) : BattlegroundScore(playerGuid), GraveyardsAssaulted(0), GraveyardsDefended(0), TowersAssaulted(0), TowersDefended(0), MinesCaptured(0) { }
+
+ void UpdateScore(uint32 type, uint32 value) override
+ {
+ switch (type)
+ {
+ case SCORE_GRAVEYARDS_ASSAULTED:
+ GraveyardsAssaulted += value;
+ break;
+ case SCORE_GRAVEYARDS_DEFENDED:
+ GraveyardsDefended += value;
+ break;
+ case SCORE_TOWERS_ASSAULTED:
+ TowersAssaulted += value;
+ break;
+ case SCORE_TOWERS_DEFENDED:
+ TowersDefended += value;
+ break;
+ case SCORE_MINES_CAPTURED:
+ MinesCaptured += value;
+ break;
+ default:
+ BattlegroundScore::UpdateScore(type, value);
+ break;
+ }
+ }
+
+ void BuildObjectivesBlock(WorldPacket& data) final
+ {
+ data << uint32(5); // Objectives Count
+ data << uint32(GraveyardsAssaulted);
+ data << uint32(GraveyardsDefended);
+ data << uint32(TowersAssaulted);
+ data << uint32(TowersDefended);
+ data << uint32(MinesCaptured);
+ }
+
+ uint32 GraveyardsAssaulted;
+ uint32 GraveyardsDefended;
+ uint32 TowersAssaulted;
+ uint32 TowersDefended;
+ uint32 MinesCaptured;
};
class BattlegroundAV : public Battleground
@@ -1557,7 +1593,7 @@ class BattlegroundAV : public Battleground
/*general stuff*/
void UpdateScore(uint16 team, int16 points);
- void UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true);
+ bool UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true) override;
/*handlestuff*/ //these are functions which get called from extern
void EventPlayerClickedOnFlag(Player* source, GameObject* target_obj);
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundBE.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundBE.cpp
index c89fc57b8aa..548e0bf463b 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundBE.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundBE.cpp
@@ -16,6 +16,7 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "ArenaScore.h"
#include "BattlegroundBE.h"
#include "Language.h"
#include "Object.h"
@@ -64,7 +65,7 @@ void BattlegroundBE::StartingEventOpenDoors()
void BattlegroundBE::AddPlayer(Player* player)
{
Battleground::AddPlayer(player);
- PlayerScores[player->GetGUID()] = new BattlegroundScore;
+ PlayerScores[player->GetGUIDLow()] = new ArenaScore(player->GetGUID(), player->GetBGTeam());
UpdateArenaWorldState();
}
@@ -139,13 +140,3 @@ bool BattlegroundBE::SetupBattleground()
return true;
}
-
-void BattlegroundBE::UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor)
-{
- BattlegroundScoreMap::iterator itr = PlayerScores.find(Source->GetGUID());
- if (itr == PlayerScores.end()) // player not found...
- return;
-
- //there is nothing special in this score
- Battleground::UpdatePlayerScore(Source, type, value, doAddHonor);
-}
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundBE.h b/src/server/game/Battlegrounds/Zones/BattlegroundBE.h
index be801dfff2b..6fd4dc37fc8 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundBE.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundBE.h
@@ -59,8 +59,5 @@ class BattlegroundBE : public Battleground
void Reset();
void FillInitialWorldStates(WorldPacket &d);
void HandleKillPlayer(Player* player, Player* killer);
-
- /* Scorekeeping */
- void UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor = true);
};
#endif
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp
index 9e9e82b32b8..1d6970f8317 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp
@@ -16,6 +16,7 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "ArenaScore.h"
#include "BattlegroundDS.h"
#include "Creature.h"
#include "GameObject.h"
@@ -152,7 +153,7 @@ void BattlegroundDS::StartingEventOpenDoors()
void BattlegroundDS::AddPlayer(Player* player)
{
Battleground::AddPlayer(player);
- PlayerScores[player->GetGUID()] = new BattlegroundScore;
+ PlayerScores[player->GetGUIDLow()] = new ArenaScore(player->GetGUID(), player->GetBGTeam());
UpdateArenaWorldState();
}
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp
index 213a91bea88..ca96140f5da 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp
@@ -363,12 +363,9 @@ void BattlegroundEY::UpdatePointsIcons(uint32 Team, uint32 Point)
void BattlegroundEY::AddPlayer(Player* player)
{
Battleground::AddPlayer(player);
- //create score and add it to map
- BattlegroundEYScore* sc = new BattlegroundEYScore;
+ PlayerScores[player->GetGUIDLow()] = new BattlegroundEYScore(player->GetGUID());
m_PlayersNearPoint[EY_POINTS_MAX].push_back(player->GetGUID());
-
- PlayerScores[player->GetGUID()] = sc;
}
void BattlegroundEY::RemovePlayer(Player* player, uint64 guid, uint32 /*team*/)
@@ -832,22 +829,20 @@ void BattlegroundEY::EventPlayerCapturedFlag(Player* player, uint32 BgObjectType
UpdatePlayerScore(player, SCORE_FLAG_CAPTURES, 1);
}
-void BattlegroundEY::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)
+bool BattlegroundEY::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)
{
- BattlegroundScoreMap::iterator itr = PlayerScores.find(player->GetGUID());
- if (itr == PlayerScores.end()) // player not found
- return;
+ if (!Battleground::UpdatePlayerScore(player, type, value, doAddHonor))
+ return false;
switch (type)
{
- case SCORE_FLAG_CAPTURES: // flags captured
- ((BattlegroundEYScore*)itr->second)->FlagCaptures += value;
+ case SCORE_FLAG_CAPTURES:
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, EY_OBJECTIVE_CAPTURE_FLAG);
break;
default:
- Battleground::UpdatePlayerScore(player, type, value, doAddHonor);
break;
}
+ return true;
}
void BattlegroundEY::FillInitialWorldStates(WorldPacket& data)
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
index 9e5088d7ba5..056deb3498b 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
@@ -20,6 +20,7 @@
#define __BATTLEGROUNDEY_H
#include "Battleground.h"
+#include "BattlegroundScore.h"
#include "Language.h"
#include "Object.h"
@@ -322,11 +323,33 @@ const BattlegroundEYCapturingPointStruct m_CapturingPointTypes[EY_POINTS_MAX] =
BattlegroundEYCapturingPointStruct(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_CENTER, BG_EY_OBJECT_A_BANNER_MAGE_TOWER_CENTER, LANG_BG_EY_HAS_TAKEN_A_M_TOWER, BG_EY_OBJECT_H_BANNER_MAGE_TOWER_CENTER, LANG_BG_EY_HAS_TAKEN_H_M_TOWER, EY_GRAVEYARD_MAGE_TOWER)
};
-struct BattlegroundEYScore : public BattlegroundScore
+struct BattlegroundEYScore final : public BattlegroundScore
{
- BattlegroundEYScore() : FlagCaptures(0) { }
- ~BattlegroundEYScore() { }
- uint32 FlagCaptures;
+ friend class BattlegroundEY;
+
+ protected:
+ BattlegroundEYScore(uint64 playerGuid) : BattlegroundScore(playerGuid), FlagCaptures(0) { }
+
+ void UpdateScore(uint32 type, uint32 value) override
+ {
+ switch (type)
+ {
+ case SCORE_FLAG_CAPTURES: // Flags captured
+ FlagCaptures += value;
+ break;
+ default:
+ BattlegroundScore::UpdateScore(type, value);
+ break;
+ }
+ }
+
+ void BuildObjectivesBlock(WorldPacket& data) final
+ {
+ data << uint32(1); // Objectives Count
+ data << uint32(FlagCaptures);
+ }
+
+ uint32 FlagCaptures;
};
class BattlegroundEY : public Battleground
@@ -357,7 +380,7 @@ class BattlegroundEY : public Battleground
void Reset();
void UpdateTeamScore(uint32 Team);
void EndBattleground(uint32 winner);
- void UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor = true);
+ bool UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true) override;
void FillInitialWorldStates(WorldPacket& data);
void SetDroppedFlagGUID(uint64 guid, int32 /*TeamID*/ = -1) { m_DroppedFlagGUID = guid;}
uint64 GetDroppedFlagGUID() const { return m_DroppedFlagGUID;}
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
index faa71fd2ffa..da0b00af40f 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
@@ -273,7 +273,7 @@ void BattlegroundIC::StartingEventOpenDoors()
void BattlegroundIC::AddPlayer(Player* player)
{
Battleground::AddPlayer(player);
- PlayerScores[player->GetGUID()] = new BattlegroundICScore;
+ PlayerScores[player->GetGUIDLow()] = new BattlegroundICScore(player->GetGUID());
if (nodePoint[NODE_TYPE_QUARRY].nodeState == (player->GetTeamId() == TEAM_ALLIANCE ? NODE_STATE_CONTROLLED_A : NODE_STATE_CONTROLLED_H))
player->CastSpell(player, SPELL_QUARRY, true);
@@ -314,27 +314,6 @@ void BattlegroundIC::HandleAreaTrigger(Player* player, uint32 trigger)
}
}
-void BattlegroundIC::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)
-{
- std::map<uint64, BattlegroundScore*>::iterator itr = PlayerScores.find(player->GetGUID());
-
- if (itr == PlayerScores.end()) // player not found...
- return;
-
- switch (type)
- {
- case SCORE_BASES_ASSAULTED:
- ((BattlegroundICScore*)itr->second)->BasesAssaulted += value;
- break;
- case SCORE_BASES_DEFENDED:
- ((BattlegroundICScore*)itr->second)->BasesDefended += value;
- break;
- default:
- Battleground::UpdatePlayerScore(player, type, value, doAddHonor);
- break;
- }
-}
-
void BattlegroundIC::FillInitialWorldStates(WorldPacket& data)
{
data << uint32(BG_IC_ALLIANCE_RENFORT_SET) << uint32(1);
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h
index 091a75e7449..0b317cabef3 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h
@@ -20,6 +20,7 @@
#define __BATTLEGROUNDIC_H
#include "Battleground.h"
+#include "BattlegroundScore.h"
#include "Language.h"
#include "Object.h"
@@ -847,12 +848,38 @@ enum HonorRewards
WINNER_HONOR_AMOUNT = 500
};
-struct BattlegroundICScore : public BattlegroundScore
+struct BattlegroundICScore final : public BattlegroundScore
{
- BattlegroundICScore() : BasesAssaulted(0), BasesDefended(0) { }
- ~BattlegroundICScore() { }
- uint32 BasesAssaulted;
- uint32 BasesDefended;
+ friend class BattlegroundIC;
+
+ protected:
+ BattlegroundICScore(uint64 playerGuid) : BattlegroundScore(playerGuid), BasesAssaulted(0), BasesDefended(0) { }
+
+ void UpdateScore(uint32 type, uint32 value) override
+ {
+ switch (type)
+ {
+ case SCORE_BASES_ASSAULTED:
+ BasesAssaulted += value;
+ break;
+ case SCORE_BASES_DEFENDED:
+ BasesDefended += value;
+ break;
+ default:
+ BattlegroundScore::UpdateScore(type, value);
+ break;
+ }
+ }
+
+ void BuildObjectivesBlock(WorldPacket& data) final
+ {
+ data << uint32(2); // Objectives Count
+ data << uint32(BasesAssaulted);
+ data << uint32(BasesDefended);
+ }
+
+ uint32 BasesAssaulted;
+ uint32 BasesDefended;
};
class BattlegroundIC : public Battleground
@@ -881,8 +908,6 @@ class BattlegroundIC : public Battleground
WorldSafeLocsEntry const* GetClosestGraveYard(Player* player);
/* Scorekeeping */
- void UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true);
-
void FillInitialWorldStates(WorldPacket& data);
void DoAction(uint32 action, uint64 var);
@@ -894,6 +919,7 @@ class BattlegroundIC : public Battleground
bool IsAllNodesControlledByTeam(uint32 team) const;
bool IsSpellAllowed(uint32 spellId, Player const* player) const;
+
private:
uint32 closeFortressDoorsTimer;
bool doorsClosed;
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundNA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundNA.cpp
index 70a940ec853..82fcb2f6f91 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundNA.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundNA.cpp
@@ -16,6 +16,7 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "ArenaScore.h"
#include "BattlegroundNA.h"
#include "Language.h"
#include "Object.h"
@@ -61,7 +62,7 @@ void BattlegroundNA::StartingEventOpenDoors()
void BattlegroundNA::AddPlayer(Player* player)
{
Battleground::AddPlayer(player);
- PlayerScores[player->GetGUID()] = new BattlegroundScore;
+ PlayerScores[player->GetGUIDLow()] = new ArenaScore(player->GetGUID(), player->GetBGTeam());
UpdateArenaWorldState();
}
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundRL.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundRL.cpp
index 5f77c57c064..712d9a6e296 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundRL.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundRL.cpp
@@ -16,6 +16,7 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "ArenaScore.h"
#include "BattlegroundRL.h"
#include "Language.h"
#include "Object.h"
@@ -61,7 +62,7 @@ void BattlegroundRL::StartingEventOpenDoors()
void BattlegroundRL::AddPlayer(Player* player)
{
Battleground::AddPlayer(player);
- PlayerScores[player->GetGUID()] = new BattlegroundScore;
+ PlayerScores[player->GetGUIDLow()] = new ArenaScore(player->GetGUID(), player->GetBGTeam());
UpdateArenaWorldState();
}
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp
index dd61b8b9e6f..1059124d041 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp
@@ -16,6 +16,7 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "ArenaScore.h"
#include "Battleground.h"
#include "BattlegroundRV.h"
#include "ObjectAccessor.h"
@@ -99,7 +100,7 @@ void BattlegroundRV::StartingEventOpenDoors()
void BattlegroundRV::AddPlayer(Player* player)
{
Battleground::AddPlayer(player);
- PlayerScores[player->GetGUID()] = new BattlegroundScore;
+ PlayerScores[player->GetGUIDLow()] = new ArenaScore(player->GetGUID(), player->GetBGTeam());
UpdateWorldState(BG_RV_WORLD_STATE_A, GetAlivePlayersCountByTeam(ALLIANCE));
UpdateWorldState(BG_RV_WORLD_STATE_H, GetAlivePlayersCountByTeam(HORDE));
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
index 0966ddd19bd..7e90c0b3db0 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
@@ -454,9 +454,7 @@ void BattlegroundSA::FillInitialWorldStates(WorldPacket& data)
void BattlegroundSA::AddPlayer(Player* player)
{
Battleground::AddPlayer(player);
- //create score and add it to map, default values are set in constructor
- BattlegroundSAScore* sc = new BattlegroundSAScore;
- PlayerScores[player->GetGUID()] = sc;
+ PlayerScores[player->GetGUIDLow()] = new BattlegroundSAScore(player->GetGUID());
SendTransportInit(player);
@@ -493,20 +491,6 @@ void BattlegroundSA::HandleAreaTrigger(Player* /*Source*/, uint32 /*Trigger*/)
return;
}
-void BattlegroundSA::UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor)
-{
- BattlegroundScoreMap::iterator itr = PlayerScores.find(Source->GetGUID());
- if (itr == PlayerScores.end()) // player not found...
- return;
-
- if (type == SCORE_DESTROYED_DEMOLISHER)
- ((BattlegroundSAScore*)itr->second)->demolishers_destroyed += value;
- else if (type == SCORE_DESTROYED_WALL)
- ((BattlegroundSAScore*)itr->second)->gates_destroyed += value;
- else
- Battleground::UpdatePlayerScore(Source, type, value, doAddHonor);
-}
-
void BattlegroundSA::TeleportPlayers()
{
for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h
index 880da0735f4..6c15b56d287 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h
@@ -20,16 +20,9 @@
#define __BATTLEGROUNDSA_H
#include "Battleground.h"
+#include "BattlegroundScore.h"
#include "Object.h"
-struct BattlegroundSAScore : public BattlegroundScore
-{
- BattlegroundSAScore() : demolishers_destroyed(0), gates_destroyed(0) { }
- ~BattlegroundSAScore() { }
- uint8 demolishers_destroyed;
- uint8 gates_destroyed;
-};
-
#define BG_SA_FLAG_AMOUNT 3
#define BG_SA_DEMOLISHER_AMOUNT 4
@@ -515,6 +508,40 @@ struct BG_SA_RoundScore
uint32 time;
};
+struct BattlegroundSAScore final : public BattlegroundScore
+{
+ friend class BattlegroundSA;
+
+ protected:
+ BattlegroundSAScore(uint64 playerGuid) : BattlegroundScore(playerGuid), DemolishersDestroyed(0), GatesDestroyed(0) { }
+
+ void UpdateScore(uint32 type, uint32 value) override
+ {
+ switch (type)
+ {
+ case SCORE_DESTROYED_DEMOLISHER:
+ DemolishersDestroyed += value;
+ break;
+ case SCORE_DESTROYED_WALL:
+ GatesDestroyed += value;
+ break;
+ default:
+ BattlegroundScore::UpdateScore(type, value);
+ break;
+ }
+ }
+
+ void BuildObjectivesBlock(WorldPacket& data) final
+ {
+ data << uint32(2); // Objectives Count
+ data << uint32(DemolishersDestroyed);
+ data << uint32(GatesDestroyed);
+ }
+
+ uint32 DemolishersDestroyed;
+ uint32 GatesDestroyed;
+};
+
/// Class for manage Strand of Ancient battleground
class BattlegroundSA : public Battleground
{
@@ -568,8 +595,6 @@ class BattlegroundSA : public Battleground
void HandleAreaTrigger(Player* Source, uint32 Trigger);
/* Scorekeeping */
- /// Update score board
- void UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor = true);
// Achievement: Not Even a Scratch
bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* source, Unit const* target = NULL, uint32 miscValue = 0) override;
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
index fcd55e2e16a..1faa3361975 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
@@ -229,10 +229,7 @@ void BattlegroundWS::StartingEventOpenDoors()
void BattlegroundWS::AddPlayer(Player* player)
{
Battleground::AddPlayer(player);
- //create score and add it to map, default values are set in constructor
- BattlegroundWGScore* sc = new BattlegroundWGScore;
-
- PlayerScores[player->GetGUID()] = sc;
+ PlayerScores[player->GetGUIDLow()] = new BattlegroundWGScore(player->GetGUID());
}
void BattlegroundWS::RespawnFlag(uint32 Team, bool captured)
@@ -790,26 +787,23 @@ void BattlegroundWS::HandleKillPlayer(Player* player, Player* killer)
Battleground::HandleKillPlayer(player, killer);
}
-void BattlegroundWS::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)
+bool BattlegroundWS::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)
{
- BattlegroundScoreMap::iterator itr = PlayerScores.find(player->GetGUID());
- if (itr == PlayerScores.end()) // player not found
- return;
+ if (!Battleground::UpdatePlayerScore(player, type, value, doAddHonor))
+ return false;
switch (type)
{
case SCORE_FLAG_CAPTURES: // flags captured
- ((BattlegroundWGScore*)itr->second)->FlagCaptures += value;
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, WS_OBJECTIVE_CAPTURE_FLAG);
break;
case SCORE_FLAG_RETURNS: // flags returned
- ((BattlegroundWGScore*)itr->second)->FlagReturns += value;
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, WS_OBJECTIVE_RETURN_FLAG);
break;
default:
- Battleground::UpdatePlayerScore(player, type, value, doAddHonor);
break;
}
+ return true;
}
WorldSafeLocsEntry const* BattlegroundWS::GetClosestGraveYard(Player* player)
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h
index c6c25ec52de..3d449580fb9 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h
@@ -20,6 +20,7 @@
#define __BATTLEGROUNDWS_H
#include "Battleground.h"
+#include "BattlegroundScore.h"
enum BG_WS_TimerOrScore
{
@@ -146,12 +147,38 @@ enum BG_WS_Objectives
#define WS_EVENT_START_BATTLE 8563
-struct BattlegroundWGScore : public BattlegroundScore
+struct BattlegroundWGScore final : public BattlegroundScore
{
- BattlegroundWGScore() : FlagCaptures(0), FlagReturns(0) { }
- ~BattlegroundWGScore() { }
- uint32 FlagCaptures;
- uint32 FlagReturns;
+ friend class BattlegroundWS;
+
+ protected:
+ BattlegroundWGScore(uint64 playerGuid) : BattlegroundScore(playerGuid), FlagCaptures(0), FlagReturns(0) { }
+
+ void UpdateScore(uint32 type, uint32 value) override
+ {
+ switch (type)
+ {
+ case SCORE_FLAG_CAPTURES: // Flags captured
+ FlagCaptures += value;
+ break;
+ case SCORE_FLAG_RETURNS: // Flags returned
+ FlagReturns += value;
+ break;
+ default:
+ BattlegroundScore::UpdateScore(type, value);
+ break;
+ }
+ }
+
+ void BuildObjectivesBlock(WorldPacket& data) final
+ {
+ data << uint32(2); // Objectives Count
+ data << uint32(FlagCaptures);
+ data << uint32(FlagReturns);
+ }
+
+ uint32 FlagCaptures;
+ uint32 FlagReturns;
};
class BattlegroundWS : public Battleground
@@ -197,7 +224,7 @@ class BattlegroundWS : public Battleground
void UpdateFlagState(uint32 team, uint32 value);
void SetLastFlagCapture(uint32 team) { _lastFlagCaptureTeam = team; }
void UpdateTeamScore(uint32 team);
- void UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true);
+ bool UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true) override;
void SetDroppedFlagGUID(uint64 guid, int32 team = -1)
{
if (team == TEAM_ALLIANCE || team == TEAM_HORDE)
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 8d0223d2247..8653106a865 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -26,6 +26,7 @@
#include "BattlefieldWG.h"
#include "Battleground.h"
#include "BattlegroundMgr.h"
+#include "BattlegroundScore.h"
#include "CellImpl.h"
#include "Channel.h"
#include "ChannelMgr.h"
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 363738f96ef..ca4780b787e 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -21,6 +21,7 @@
#include "Battlefield.h"
#include "BattlefieldMgr.h"
#include "Battleground.h"
+#include "BattlegroundScore.h"
#include "CellImpl.h"
#include "ConditionMgr.h"
#include "CreatureAI.h"
@@ -3845,8 +3846,7 @@ void Unit::RemoveAurasByType(AuraType auraType, uint64 casterGUID, Aura* except,
{
Aura* aura = (*iter)->GetBase();
AuraApplication * aurApp = aura->GetApplicationOfTarget(GetGUID());
- if (!aurApp)
- continue;
+ ASSERT(aurApp);
++iter;
if (aura != except && (!casterGUID || aura->GetCasterGUID() == casterGUID)
diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp
index 0dfe396b65a..7def6b0f467 100644
--- a/src/server/game/Handlers/BattleGroundHandler.cpp
+++ b/src/server/game/Handlers/BattleGroundHandler.cpp
@@ -309,7 +309,7 @@ void WorldSession::HandlePVPLogDataOpcode(WorldPacket & /*recvData*/)
return;
WorldPacket data;
- sBattlegroundMgr->BuildPvpLogDataPacket(&data, bg);
+ bg->BuildPvPLogDataPacket(data);
SendPacket(&data);
TC_LOG_DEBUG("network", "WORLD: Sent MSG_PVP_LOG_DATA Message");