diff options
Diffstat (limited to 'src')
28 files changed, 275 insertions, 670 deletions
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index 1ef4003d484..c4b2c34338d 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -1274,6 +1274,11 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_PVP_ITEM, "SELECT ID, ItemID, ItemLevelDelta FROM pvp_item WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_PVP_ITEM, "SELECT MAX(ID) + 1 FROM pvp_item", CONNECTION_SYNCH); + // PvpStat.db2 + PrepareStatement(HOTFIX_SEL_PVP_STAT, "SELECT Description, ID, MapID FROM pvp_stat WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PREPARE_MAX_ID_STMT(HOTFIX_SEL_PVP_STAT, "SELECT MAX(ID) + 1 FROM pvp_stat", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_PVP_STAT, "SELECT ID, Description_lang FROM pvp_stat_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); + // PvpSeason.db2 PrepareStatement(HOTFIX_SEL_PVP_SEASON, "SELECT ID, MilestoneSeason, AllianceAchievementID, HordeAchievementID FROM pvp_season" " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index 8eaa6e0a81d..b56205ce92a 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -729,6 +729,10 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_PVP_ITEM, HOTFIX_SEL_PVP_ITEM_MAX_ID, + HOTFIX_SEL_PVP_STAT, + HOTFIX_SEL_PVP_STAT_MAX_ID, + HOTFIX_SEL_PVP_STAT_LOCALE, + HOTFIX_SEL_PVP_SEASON, HOTFIX_SEL_PVP_SEASON_MAX_ID, diff --git a/src/server/game/Battlegrounds/Arena.cpp b/src/server/game/Battlegrounds/Arena.cpp index c5060c40ce6..6ec0f0f8c1e 100644 --- a/src/server/game/Battlegrounds/Arena.cpp +++ b/src/server/game/Battlegrounds/Arena.cpp @@ -17,6 +17,8 @@ #include "Arena.h" #include "ArenaTeamMgr.h" +#include "BattlegroundPackets.h" +#include "BattlegroundScore.h" #include "GuildMgr.h" #include "Guild.h" #include "Log.h" @@ -41,10 +43,7 @@ Arena::Arena(BattlegroundTemplate const* battlegroundTemplate) : Battleground(ba void Arena::AddPlayer(Player* player, BattlegroundQueueTypeId queueId) { - bool const isInBattleground = IsPlayerInBattleground(player->GetGUID()); Battleground::AddPlayer(player, queueId); - if (!isInBattleground) - PlayerScores[player->GetGUID()] = new ArenaScore(player->GetGUID(), player->GetBGTeam()); if (player->GetBGTeam() == ALLIANCE) // gold { diff --git a/src/server/game/Battlegrounds/ArenaScore.cpp b/src/server/game/Battlegrounds/ArenaScore.cpp index bff65e182c8..7db24f26788 100644 --- a/src/server/game/Battlegrounds/ArenaScore.cpp +++ b/src/server/game/Battlegrounds/ArenaScore.cpp @@ -16,38 +16,6 @@ */ #include "ArenaScore.h" -#include <sstream> - -ArenaScore::ArenaScore(ObjectGuid playerGuid, uint32 team) : BattlegroundScore(playerGuid, team) -{ -} - -void ArenaScore::BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPMatchStatistics::PVPMatchPlayerStatistics& playerData) const -{ - BattlegroundScore::BuildPvPLogPlayerDataPacket(playerData); - - if (PreMatchRating) - playerData.PreMatchRating = PreMatchRating; - - if (PostMatchRating != PreMatchRating) - playerData.RatingChange = int32(PostMatchRating) - PreMatchRating; - - if (PreMatchMMR) - playerData.PreMatchMMR = PreMatchMMR; - - if (PostMatchMMR != PreMatchMMR) - playerData.MmrChange = int32(PostMatchMMR) - PreMatchMMR; -} - -// For Logging purpose -std::string ArenaScore::ToString() const -{ - std::ostringstream stream; - stream << "Damage done: " << DamageDone << ", Healing done: " << HealingDone << ", Killing blows: " << KillingBlows - << ", PreMatchRating: " << PreMatchRating << ", PreMatchMMR: " << PreMatchMMR - << ", PostMatchRating: " << PostMatchRating << ", PostMatchMMR: " << PostMatchMMR; - return stream.str(); -} ArenaTeamScore::ArenaTeamScore() { diff --git a/src/server/game/Battlegrounds/ArenaScore.h b/src/server/game/Battlegrounds/ArenaScore.h index 4d2aa92c0ee..2edd416a80c 100644 --- a/src/server/game/Battlegrounds/ArenaScore.h +++ b/src/server/game/Battlegrounds/ArenaScore.h @@ -18,41 +18,19 @@ #ifndef TRINITY_ARENA_SCORE_H #define TRINITY_ARENA_SCORE_H -#include "BattlegroundScore.h" - -struct TC_GAME_API ArenaScore : public BattlegroundScore -{ - friend class Arena; - - protected: - ArenaScore(ObjectGuid playerGuid, uint32 team); - - void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPMatchStatistics::PVPMatchPlayerStatistics& playerData) const override; - - // For Logging purpose - std::string ToString() const override; - - uint32 PreMatchRating = 0; - uint32 PreMatchMMR = 0; - uint32 PostMatchRating = 0; - uint32 PostMatchMMR = 0; -}; +#include "Define.h" struct TC_GAME_API ArenaTeamScore { - friend class Arena; - friend class Battleground; - - protected: - ArenaTeamScore(); - virtual ~ArenaTeamScore(); + ArenaTeamScore(); + virtual ~ArenaTeamScore(); - void Assign(uint32 preMatchRating, uint32 postMatchRating, uint32 preMatchMMR, uint32 postMatchMMR); + void Assign(uint32 preMatchRating, uint32 postMatchRating, uint32 preMatchMMR, uint32 postMatchMMR); - uint32 PreMatchRating = 0; - uint32 PostMatchRating = 0; - uint32 PreMatchMMR = 0; - uint32 PostMatchMMR = 0; + uint32 PreMatchRating = 0; + uint32 PostMatchRating = 0; + uint32 PreMatchMMR = 0; + uint32 PostMatchMMR = 0; }; #endif // TRINITY_ARENA_SCORE_H diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 56788c7d520..910026e325f 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -35,6 +35,7 @@ #include "Language.h" #include "Log.h" #include "Map.h" +#include "MapUtils.h" #include "MiscPackets.h" #include "ObjectAccessor.h" #include "ObjectMgr.h" @@ -55,7 +56,7 @@ void Battleground::BroadcastWorker(Do& _do) _do(player); } -Battleground::Battleground(BattlegroundTemplate const* battlegroundTemplate) : _battlegroundTemplate(battlegroundTemplate), _pvpDifficultyEntry(nullptr) +Battleground::Battleground(BattlegroundTemplate const* battlegroundTemplate) : _battlegroundTemplate(battlegroundTemplate), _pvpDifficultyEntry(nullptr), _pvpStatIds(nullptr) { ASSERT(_battlegroundTemplate, "Nonexisting Battleground Template passed to battleground ctor!"); @@ -742,11 +743,11 @@ void Battleground::EndBattleground(uint32 winner) stmt->setUInt32(6, score->second->GetBonusHonor()); stmt->setUInt32(7, score->second->GetDamageDone()); stmt->setUInt32(8, score->second->GetHealingDone()); - stmt->setUInt32(9, score->second->GetAttr1()); - stmt->setUInt32(10, score->second->GetAttr2()); - stmt->setUInt32(11, score->second->GetAttr3()); - stmt->setUInt32(12, score->second->GetAttr4()); - stmt->setUInt32(13, score->second->GetAttr5()); + stmt->setUInt32(9, score->second->GetAttr(0)); + stmt->setUInt32(10, score->second->GetAttr(1)); + stmt->setUInt32(11, score->second->GetAttr(2)); + stmt->setUInt32(12, score->second->GetAttr(3)); + stmt->setUInt32(13, score->second->GetAttr(4)); CharacterDatabase.Execute(stmt); } @@ -1013,7 +1014,10 @@ void Battleground::AddPlayer(Player* player, BattlegroundQueueTypeId queueId) m_Players[player->GetGUID()] = bp; if (!isInBattleground) + { UpdatePlayersCountByTeam(team, false); // +1 player + PlayerScores[player->GetGUID()] = new BattlegroundScore(player->GetGUID(), player->GetBGTeam(), _pvpStatIds); + } WorldPackets::Battleground::BattlegroundPlayerJoined playerJoined; playerJoined.Guid = player->GetGUID(); @@ -1285,26 +1289,31 @@ void Battleground::BuildPvPLogDataPacket(WorldPackets::Battleground::PVPMatchSta pvpLogData.Statistics.reserve(GetPlayerScoresSize()); for (auto const& score : PlayerScores) { - WorldPackets::Battleground::PVPMatchStatistics::PVPMatchPlayerStatistics playerData; - score.second->BuildPvPLogPlayerDataPacket(playerData); - - if (Player* player = ObjectAccessor::GetPlayer(GetBgMap(), playerData.PlayerGUID)) + if (Player* player = ObjectAccessor::GetPlayer(GetBgMap(), score.first)) { + WorldPackets::Battleground::PVPMatchStatistics::PVPMatchPlayerStatistics playerData; + score.second->BuildPvPLogPlayerDataPacket(playerData); + playerData.IsInWorld = true; playerData.PrimaryTalentTree = AsUnderlyingType(player->GetPrimarySpecialization()); playerData.Sex = player->GetGender(); playerData.Race = player->GetRace(); playerData.Class = player->GetClass(); playerData.HonorLevel = player->GetHonorLevel(); - } - pvpLogData.Statistics.push_back(playerData); + pvpLogData.Statistics.push_back(playerData); + } } pvpLogData.PlayerCount[PVP_TEAM_HORDE] = int8(GetPlayersCountByTeam(HORDE)); pvpLogData.PlayerCount[PVP_TEAM_ALLIANCE] = int8(GetPlayersCountByTeam(ALLIANCE)); } +BattlegroundScore const* Battleground::GetBattlegroundScore(Player* player) const +{ + return Trinity::Containers::MapGetValuePtr(PlayerScores, player->GetGUID()); +} + bool Battleground::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor) { BattlegroundScoreMap::const_iterator itr = PlayerScores.find(player->GetGUID()); @@ -1319,6 +1328,12 @@ bool Battleground::UpdatePlayerScore(Player* player, uint32 type, uint32 value, return true; } +void Battleground::UpdatePvpStat(Player* player, uint32 pvpStatId, uint32 value) +{ + if (BattlegroundScore* score = Trinity::Containers::MapGetValuePtr(PlayerScores, player->GetGUID())) + score->UpdatePvpStat(pvpStatId, value); +} + bool Battleground::AddObject(uint32 type, uint32 entry, float x, float y, float z, float o, float rotation0, float rotation1, float rotation2, float rotation3, uint32 /*respawnTime*/, GOState goState) { // If the assert is called, means that BgObjects must be resized! @@ -1451,6 +1466,15 @@ uint32 Battleground::GetMapId() const return _battlegroundTemplate->BattlemasterEntry->MapID[0]; } +void Battleground::SetBgMap(BattlegroundMap* map) +{ + m_Map = map; + if (map) + _pvpStatIds = sDB2Manager.GetPVPStatIDsForMap(map->GetId()); + else + _pvpStatIds = nullptr; +} + void Battleground::SpawnBGObject(uint32 type, uint32 respawntime) { if (Map* map = FindBgMap()) diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index 2b5b204732f..92e0d606e6a 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -36,6 +36,7 @@ class Transport; class Unit; class WorldObject; class WorldPacket; +struct BattlegroundPlayerScoreTemplate; struct BattlegroundScore; struct BattlegroundTemplate; struct PVPDifficultyEntry; @@ -309,6 +310,7 @@ class TC_GAME_API Battleground : public ZoneScript void SetRated(bool state) { m_IsRated = state; } void SetArenaType(uint8 type) { m_ArenaType = type; } void SetWinner(PvPTeamId winnerTeamId) { _winnerTeamId = winnerTeamId; } + std::unordered_set<uint32> const* GetPvpStatIds() const { return _pvpStatIds; } void ModifyStartDelayTime(int diff) { m_StartDelayTime -= diff; } void SetStartDelayTime(int Time) { m_StartDelayTime = Time; } @@ -343,7 +345,7 @@ class TC_GAME_API Battleground : public ZoneScript uint32 GetMapId() const; // Map pointers - void SetBgMap(BattlegroundMap* map) { m_Map = map; } + void SetBgMap(BattlegroundMap* map); BattlegroundMap* GetBgMap() const; BattlegroundMap* FindBgMap() const { return m_Map; } @@ -380,7 +382,11 @@ class TC_GAME_API Battleground : public ZoneScript void SetBgRaid(uint32 TeamID, Group* bg_raid); virtual void BuildPvPLogDataPacket(WorldPackets::Battleground::PVPMatchStatistics& pvpLogData) const; + + BattlegroundScore const* GetBattlegroundScore(Player* player) const; + virtual bool UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true); + void UpdatePvpStat(Player* player, uint32 pvpStatId, uint32 value); static TeamId GetTeamIndexByTeamId(uint32 Team) { return Team == ALLIANCE ? TEAM_ALLIANCE : TEAM_HORDE; } uint32 GetPlayersCountByTeam(uint32 Team) const { return m_PlayersCount[GetTeamIndexByTeamId(Team)]; } @@ -601,6 +607,7 @@ class TC_GAME_API Battleground : public ZoneScript BattlegroundTemplate const* _battlegroundTemplate; PVPDifficultyEntry const* _pvpDifficultyEntry; + std::unordered_set<uint32> const* _pvpStatIds; std::vector<WorldPackets::Battleground::BattlegroundPlayerPosition> _playerPositions; }; diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.h b/src/server/game/Battlegrounds/BattlegroundMgr.h index da7f135a42b..ff62461b6c2 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.h +++ b/src/server/game/Battlegrounds/BattlegroundMgr.h @@ -150,6 +150,7 @@ class TC_GAME_API BattlegroundMgr return &itr->second; return nullptr; } + private: uint32 CreateClientVisibleInstanceId(BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id); static bool IsArenaType(BattlegroundTypeId bgTypeId); diff --git a/src/server/game/Battlegrounds/BattlegroundScore.cpp b/src/server/game/Battlegrounds/BattlegroundScore.cpp index ce8ad1015d1..c8c35135e7e 100644 --- a/src/server/game/Battlegrounds/BattlegroundScore.cpp +++ b/src/server/game/Battlegrounds/BattlegroundScore.cpp @@ -16,18 +16,26 @@ */ #include "BattlegroundScore.h" +#include "BattlegroundMgr.h" #include "Errors.h" +#include "Log.h" +#include "ObjectAccessor.h" +#include "Player.h" #include "SharedDefines.h" -BattlegroundScore::BattlegroundScore(ObjectGuid playerGuid, uint32 team) : PlayerGuid(playerGuid), TeamId(team == ALLIANCE ? PVP_TEAM_ALLIANCE : PVP_TEAM_HORDE), - KillingBlows(0), Deaths(0), HonorableKills(0), BonusHonor(0), DamageDone(0), HealingDone(0) -{ -} +#include <sstream> -BattlegroundScore::~BattlegroundScore() +BattlegroundScore::BattlegroundScore(ObjectGuid playerGuid, uint32 team, std::unordered_set<uint32> const* pvpStatIds) : PlayerGuid(playerGuid), TeamId(team == ALLIANCE ? PVP_TEAM_ALLIANCE : PVP_TEAM_HORDE), + KillingBlows(0), Deaths(0), HonorableKills(0), BonusHonor(0), DamageDone(0), HealingDone(0), + PreMatchRating(0), PreMatchMMR(0), PostMatchRating(0), PostMatchMMR(0), _validPvpStatIds(pvpStatIds) { + if (_validPvpStatIds) + for (uint32 pvpStatId : *_validPvpStatIds) + PvpStats[pvpStatId] = 0; } +BattlegroundScore::~BattlegroundScore() = default; + void BattlegroundScore::UpdateScore(uint32 type, uint32 value) { switch (type) @@ -56,6 +64,31 @@ void BattlegroundScore::UpdateScore(uint32 type, uint32 value) } } +void BattlegroundScore::UpdatePvpStat(uint32 pvpStatID, uint32 value) +{ + if (!_validPvpStatIds) + return; + + if (!_validPvpStatIds->contains(pvpStatID)) + { + TC_LOG_WARN("bg.scores", "Tried updating PvpStat {} but this stat is not allowed on this map", pvpStatID); + return; + } + + PvpStats[pvpStatID] += value; + if (Player* player = ObjectAccessor::FindConnectedPlayer(PlayerGuid)) + player->UpdateCriteria(CriteriaType::TrackedWorldStateUIModified, pvpStatID); +} + +uint32 BattlegroundScore::GetAttr(uint8 index) const +{ + auto const& itr = std::next(PvpStats.begin(), index); + if (itr == PvpStats.end()) + return 0; + + return itr->second; +} + void BattlegroundScore::BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPMatchStatistics::PVPMatchPlayerStatistics& playerData) const { playerData.PlayerGUID = PlayerGuid; @@ -71,4 +104,28 @@ void BattlegroundScore::BuildPvPLogPlayerDataPacket(WorldPackets::Battleground:: playerData.DamageDone = DamageDone; playerData.HealingDone = HealingDone; + + if (PreMatchRating) + playerData.PreMatchRating = PreMatchRating; + + if (PostMatchRating != PreMatchRating) + playerData.RatingChange = int32(PostMatchRating) - PreMatchRating; + + if (PreMatchMMR) + playerData.PreMatchMMR = PreMatchMMR; + + if (PostMatchMMR != PreMatchMMR) + playerData.MmrChange = int32(PostMatchMMR) - PreMatchMMR; + + for (const auto& [pvpStatID, value] : PvpStats) + playerData.Stats.emplace_back(pvpStatID, value); +} + +std::string BattlegroundScore::ToString() const +{ + std::ostringstream stream; + stream << "Damage done: " << DamageDone << ", Healing done: " << HealingDone << ", Killing blows: " << KillingBlows + << ", PreMatchRating: " << PreMatchRating << ", PreMatchMMR: " << PreMatchMMR + << ", PostMatchRating: " << PostMatchRating << ", PostMatchMMR: " << PostMatchMMR; + return stream.str(); } diff --git a/src/server/game/Battlegrounds/BattlegroundScore.h b/src/server/game/Battlegrounds/BattlegroundScore.h index 7e7aa2110af..21bccdec608 100644 --- a/src/server/game/Battlegrounds/BattlegroundScore.h +++ b/src/server/game/Battlegrounds/BattlegroundScore.h @@ -20,8 +20,11 @@ #include "BattlegroundPackets.h" #include "ObjectGuid.h" +#include <map> #include <string> +struct BattlegroundPlayerScoreTemplate; + enum ScoreType { // ALL @@ -30,67 +33,53 @@ enum ScoreType SCORE_HONORABLE_KILLS = 3, SCORE_BONUS_HONOR = 4, SCORE_DAMAGE_DONE = 5, - SCORE_HEALING_DONE = 6, - - // WS, EY and TP - 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 + SCORE_HEALING_DONE = 6 }; struct BattlegroundScore { - friend class Arena; - friend class Battleground; - - protected: - BattlegroundScore(ObjectGuid playerGuid, uint32 team); - virtual ~BattlegroundScore(); - - virtual void UpdateScore(uint32 type, uint32 value); - - virtual void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPMatchStatistics::PVPMatchPlayerStatistics& playerData) const; - - // For Logging purpose - virtual std::string ToString() const { return ""; } - - uint32 GetKillingBlows() const { return KillingBlows; } - uint32 GetDeaths() const { return Deaths; } - uint32 GetHonorableKills() const { return HonorableKills; } - uint32 GetBonusHonor() const { return BonusHonor; } - uint32 GetDamageDone() const { return DamageDone; } - uint32 GetHealingDone() const { return HealingDone; } - - virtual uint32 GetAttr1() const { return 0; } - virtual uint32 GetAttr2() const { return 0; } - virtual uint32 GetAttr3() const { return 0; } - virtual uint32 GetAttr4() const { return 0; } - virtual uint32 GetAttr5() const { return 0; } - - ObjectGuid PlayerGuid; - uint8 TeamId; // PvPTeamId - - // Default score, present in every type - uint32 KillingBlows; - uint32 Deaths; - uint32 HonorableKills; - uint32 BonusHonor; - uint32 DamageDone; - uint32 HealingDone; + BattlegroundScore(ObjectGuid playerGuid, uint32 team, std::unordered_set<uint32> const* pvpStatIds); + virtual ~BattlegroundScore(); + + void UpdateScore(uint32 type, uint32 value); + void UpdatePvpStat(uint32 pvpStatID, uint32 value); + + // For Logging purpose + std::string ToString() const; + + uint32 GetKillingBlows() const { return KillingBlows; } + uint32 GetDeaths() const { return Deaths; } + uint32 GetHonorableKills() const { return HonorableKills; } + uint32 GetBonusHonor() const { return BonusHonor; } + uint32 GetDamageDone() const { return DamageDone; } + uint32 GetHealingDone() const { return HealingDone; } + + uint32 GetAttr(uint8 index) const; + + void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPMatchStatistics::PVPMatchPlayerStatistics& playerData) const; + +protected: + + ObjectGuid PlayerGuid; + uint8 TeamId; // PvPTeamId + + // Default score, present in every type + uint32 KillingBlows; + uint32 Deaths; + uint32 HonorableKills; + uint32 BonusHonor; + uint32 DamageDone; + uint32 HealingDone; + + uint32 PreMatchRating; + uint32 PreMatchMMR; + uint32 PostMatchRating; + uint32 PostMatchMMR; + + std::map<uint32 /*pvpStatID*/, uint32 /*value*/> PvpStats; + +private: + std::unordered_set<uint32> const* _validPvpStatIds; }; #endif // TRINITY_BATTLEGROUND_SCORE_H diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp index 489f004b18b..b6a38c7f52c 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp @@ -17,6 +17,8 @@ #include "BattlegroundAB.h" #include "BattlegroundMgr.h" +#include "BattlegroundPackets.h" +#include "BattlegroundScore.h" #include "Creature.h" #include "GameObject.h" #include "Log.h" @@ -25,6 +27,12 @@ #include "Player.h" #include "SpellInfo.h" +enum ArathiBasinPvpStats +{ + PVP_STAT_BASES_ASSAULTED = 926, + PVP_STAT_BASES_DEFENDED = 927, +}; + BattlegroundAB::BattlegroundAB(BattlegroundTemplate const* battlegroundTemplate) : Battleground(battlegroundTemplate) { m_IsInformedNearVictory = false; @@ -131,18 +139,6 @@ void BattlegroundAB::StartingEventOpenDoors() TriggerGameEvent(AB_EVENT_START_BATTLE); } -void BattlegroundAB::AddPlayer(Player* player, BattlegroundQueueTypeId queueId) -{ - bool const isInBattleground = IsPlayerInBattleground(player->GetGUID()); - Battleground::AddPlayer(player, queueId); - if (!isInBattleground) - PlayerScores[player->GetGUID()] = new BattlegroundABScore(player->GetGUID(), player->GetBGTeam()); -} - -void BattlegroundAB::RemovePlayer(Player* /*player*/, ObjectGuid /*guid*/, uint32 /*team*/) -{ -} - void BattlegroundAB::HandleAreaTrigger(Player* player, uint32 trigger, bool entered) { switch (trigger) @@ -241,14 +237,14 @@ void BattlegroundAB::ProcessEvent(WorldObject* /*source*/, uint32 eventId, World UpdateWorldState(BG_AB_WS_BLACKSMITH_HORDE_CONTROL_STATE, 0); PlaySoundToAll(BG_AB_SOUND_NODE_ASSAULTED_ALLIANCE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_ASSAULTED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_ASSAULTED, 1); break; case AB_EVENT_DEFENDED_BLACKSMITH_ALLIANCE: UpdateWorldState(BG_AB_WS_BLACKSMITH_ALLIANCE_CONTROL_STATE, 2); UpdateWorldState(BG_AB_WS_BLACKSMITH_HORDE_CONTROL_STATE, 0); PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_ALLIANCE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_DEFENDED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_DEFENDED, 1); break; case AB_EVENT_CAPTURE_BLACKSMITH_ALLIANCE: UpdateWorldState(BG_AB_WS_BLACKSMITH_ALLIANCE_CONTROL_STATE, 2); @@ -259,14 +255,14 @@ void BattlegroundAB::ProcessEvent(WorldObject* /*source*/, uint32 eventId, World UpdateWorldState(BG_AB_WS_BLACKSMITH_HORDE_CONTROL_STATE, 1); PlaySoundToAll(BG_AB_SOUND_NODE_ASSAULTED_HORDE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_ASSAULTED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_ASSAULTED, 1); break; case AB_EVENT_DEFENDED_BLACKSMITH_HORDE: UpdateWorldState(BG_AB_WS_BLACKSMITH_ALLIANCE_CONTROL_STATE, 0); UpdateWorldState(BG_AB_WS_BLACKSMITH_HORDE_CONTROL_STATE, 2); PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_HORDE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_DEFENDED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_DEFENDED, 1); break; case AB_EVENT_CAPTURE_BLACKSMITH_HORDE: UpdateWorldState(BG_AB_WS_BLACKSMITH_HORDE_CONTROL_STATE, 2); @@ -277,14 +273,14 @@ void BattlegroundAB::ProcessEvent(WorldObject* /*source*/, uint32 eventId, World UpdateWorldState(BG_AB_WS_FARM_HORDE_CONTROL_STATE, 0); PlaySoundToAll(BG_AB_SOUND_NODE_ASSAULTED_ALLIANCE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_ASSAULTED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_ASSAULTED, 1); break; case AB_EVENT_DEFENDED_FARM_ALLIANCE: UpdateWorldState(BG_AB_WS_FARM_ALLIANCE_CONTROL_STATE, 2); UpdateWorldState(BG_AB_WS_FARM_HORDE_CONTROL_STATE, 0); PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_ALLIANCE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_DEFENDED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_DEFENDED, 1); break; case AB_EVENT_CAPTURE_FARM_ALLIANCE: UpdateWorldState(BG_AB_WS_FARM_ALLIANCE_CONTROL_STATE, 2); @@ -295,14 +291,14 @@ void BattlegroundAB::ProcessEvent(WorldObject* /*source*/, uint32 eventId, World UpdateWorldState(BG_AB_WS_FARM_HORDE_CONTROL_STATE, 1); PlaySoundToAll(BG_AB_SOUND_NODE_ASSAULTED_HORDE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_ASSAULTED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_ASSAULTED, 1); break; case AB_EVENT_DEFENDED_FARM_HORDE: UpdateWorldState(BG_AB_WS_FARM_ALLIANCE_CONTROL_STATE, 0); UpdateWorldState(BG_AB_WS_FARM_HORDE_CONTROL_STATE, 2); PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_HORDE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_DEFENDED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_DEFENDED, 1); break; case AB_EVENT_CAPTURE_FARM_HORDE: UpdateWorldState(BG_AB_WS_FARM_HORDE_CONTROL_STATE, 2); @@ -313,14 +309,14 @@ void BattlegroundAB::ProcessEvent(WorldObject* /*source*/, uint32 eventId, World UpdateWorldState(BG_AB_WS_GOLD_MINE_HORDE_CONTROL_STATE, 0); PlaySoundToAll(BG_AB_SOUND_NODE_ASSAULTED_ALLIANCE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_ASSAULTED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_ASSAULTED, 1); break; case AB_EVENT_DEFENDED_GOLD_MINE_ALLIANCE: UpdateWorldState(BG_AB_WS_GOLD_MINE_ALLIANCE_CONTROL_STATE, 2); UpdateWorldState(BG_AB_WS_GOLD_MINE_HORDE_CONTROL_STATE, 0); PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_ALLIANCE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_DEFENDED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_DEFENDED, 1); break; case AB_EVENT_CAPTURE_GOLD_MINE_ALLIANCE: UpdateWorldState(BG_AB_WS_GOLD_MINE_ALLIANCE_CONTROL_STATE, 2); @@ -331,14 +327,14 @@ void BattlegroundAB::ProcessEvent(WorldObject* /*source*/, uint32 eventId, World UpdateWorldState(BG_AB_WS_GOLD_MINE_HORDE_CONTROL_STATE, 1); PlaySoundToAll(BG_AB_SOUND_NODE_ASSAULTED_HORDE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_ASSAULTED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_ASSAULTED, 1); break; case AB_EVENT_DEFENDED_GOLD_MINE_HORDE: UpdateWorldState(BG_AB_WS_GOLD_MINE_ALLIANCE_CONTROL_STATE, 0); UpdateWorldState(BG_AB_WS_GOLD_MINE_HORDE_CONTROL_STATE, 2); PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_HORDE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_DEFENDED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_DEFENDED, 1); break; case AB_EVENT_CAPTURE_GOLD_MINE_HORDE: UpdateWorldState(BG_AB_WS_GOLD_MINE_HORDE_CONTROL_STATE, 2); @@ -349,14 +345,14 @@ void BattlegroundAB::ProcessEvent(WorldObject* /*source*/, uint32 eventId, World UpdateWorldState(BG_AB_WS_LUMBER_MILL_HORDE_CONTROL_STATE, 0); PlaySoundToAll(BG_AB_SOUND_NODE_ASSAULTED_ALLIANCE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_ASSAULTED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_ASSAULTED, 1); break; case AB_EVENT_DEFENDED_LUMBER_MILL_ALLIANCE: UpdateWorldState(BG_AB_WS_LUMBER_MILL_ALLIANCE_CONTROL_STATE, 2); UpdateWorldState(BG_AB_WS_LUMBER_MILL_HORDE_CONTROL_STATE, 0); PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_ALLIANCE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_DEFENDED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_DEFENDED, 1); break; case AB_EVENT_CAPTURE_LUMBER_MILL_ALLIANCE: UpdateWorldState(BG_AB_WS_LUMBER_MILL_ALLIANCE_CONTROL_STATE, 2); @@ -367,14 +363,14 @@ void BattlegroundAB::ProcessEvent(WorldObject* /*source*/, uint32 eventId, World UpdateWorldState(BG_AB_WS_LUMBER_MILL_HORDE_CONTROL_STATE, 1); PlaySoundToAll(BG_AB_SOUND_NODE_ASSAULTED_HORDE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_ASSAULTED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_ASSAULTED, 1); break; case AB_EVENT_DEFENDED_LUMBER_MILL_HORDE: UpdateWorldState(BG_AB_WS_LUMBER_MILL_ALLIANCE_CONTROL_STATE, 0); UpdateWorldState(BG_AB_WS_LUMBER_MILL_HORDE_CONTROL_STATE, 2); PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_HORDE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_DEFENDED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_DEFENDED, 1); break; case AB_EVENT_CAPTURE_LUMBER_MILL_HORDE: UpdateWorldState(BG_AB_WS_LUMBER_MILL_HORDE_CONTROL_STATE, 2); @@ -385,14 +381,14 @@ void BattlegroundAB::ProcessEvent(WorldObject* /*source*/, uint32 eventId, World UpdateWorldState(BG_AB_WS_STABLES_HORDE_CONTROL_STATE, 0); PlaySoundToAll(BG_AB_SOUND_NODE_ASSAULTED_ALLIANCE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_ASSAULTED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_ASSAULTED, 1); break; case AB_EVENT_DEFENDED_STABLES_ALLIANCE: UpdateWorldState(BG_AB_WS_STABLES_ALLIANCE_CONTROL_STATE, 2); UpdateWorldState(BG_AB_WS_STABLES_HORDE_CONTROL_STATE, 0); PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_ALLIANCE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_DEFENDED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_DEFENDED, 1); break; case AB_EVENT_CAPTURE_STABLES_ALLIANCE: UpdateWorldState(BG_AB_WS_STABLES_ALLIANCE_CONTROL_STATE, 2); @@ -403,14 +399,14 @@ void BattlegroundAB::ProcessEvent(WorldObject* /*source*/, uint32 eventId, World UpdateWorldState(BG_AB_WS_STABLES_HORDE_CONTROL_STATE, 1); PlaySoundToAll(BG_AB_SOUND_NODE_ASSAULTED_HORDE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_ASSAULTED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_ASSAULTED, 1); break; case AB_EVENT_DEFENDED_STABLES_HORDE: UpdateWorldState(BG_AB_WS_STABLES_ALLIANCE_CONTROL_STATE, 0); UpdateWorldState(BG_AB_WS_STABLES_HORDE_CONTROL_STATE, 2); PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_HORDE); if (Player* player = invoker->ToPlayer()) - UpdatePlayerScore(player, SCORE_BASES_DEFENDED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_DEFENDED, 1); break; case AB_EVENT_CAPTURE_STABLES_HORDE: UpdateWorldState(BG_AB_WS_STABLES_HORDE_CONTROL_STATE, 2); @@ -508,22 +504,3 @@ WorldSafeLocsEntry const* BattlegroundAB::GetExploitTeleportLocation(Team team) { return sObjectMgr->GetWorldSafeLoc(team == ALLIANCE ? AB_EXPLOIT_TELEPORT_LOCATION_ALLIANCE : AB_EXPLOIT_TELEPORT_LOCATION_HORDE); } - -bool BattlegroundAB::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor) -{ - if (!Battleground::UpdatePlayerScore(player, type, value, doAddHonor)) - return false; - - switch (type) - { - case SCORE_BASES_ASSAULTED: - player->UpdateCriteria(CriteriaType::TrackedWorldStateUIModified, AB_OBJECTIVE_ASSAULT_BASE); - break; - case SCORE_BASES_DEFENDED: - player->UpdateCriteria(CriteriaType::TrackedWorldStateUIModified, AB_OBJECTIVE_DEFEND_BASE); - break; - default: - break; - } - return true; -} diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h index 44d98227a8c..b66fb49cfe0 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h @@ -19,7 +19,6 @@ #define __BATTLEGROUNDAB_H #include "Battleground.h" -#include "BattlegroundScore.h" #include "Object.h" enum BG_AB_WorldStates @@ -138,12 +137,6 @@ enum BG_AB_Sounds BG_AB_SOUND_NEAR_VICTORY_HORDE = 8457 }; -enum BG_AB_Objectives -{ - AB_OBJECTIVE_ASSAULT_BASE = 926, - AB_OBJECTIVE_DEFEND_BASE = 927 -}; - enum BG_AB_ExploitTeleportLocations { AB_EXPLOIT_TELEPORT_LOCATION_ALLIANCE = 7056, @@ -222,53 +215,13 @@ const uint32 BG_AB_GraveyardIds[BG_AB_ALL_NODES_COUNT] = AB_GRAVEYARD_HORDE_BASE }; -struct BattlegroundABScore final : public BattlegroundScore -{ - friend class BattlegroundAB; - - protected: - BattlegroundABScore(ObjectGuid playerGuid, uint32 team) : BattlegroundScore(playerGuid, team), 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 BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPMatchStatistics::PVPMatchPlayerStatistics& playerData) const override - { - BattlegroundScore::BuildPvPLogPlayerDataPacket(playerData); - - playerData.Stats.emplace_back(AB_OBJECTIVE_ASSAULT_BASE, BasesAssaulted); - playerData.Stats.emplace_back(AB_OBJECTIVE_DEFEND_BASE, BasesDefended); - } - - uint32 GetAttr1() const final override { return BasesAssaulted; } - uint32 GetAttr2() const final override { return BasesDefended; } - - uint32 BasesAssaulted; - uint32 BasesDefended; -}; - class BattlegroundAB : public Battleground { public: BattlegroundAB(BattlegroundTemplate const* battlegroundTemplate); ~BattlegroundAB(); - void AddPlayer(Player* player, BattlegroundQueueTypeId queueId) override; void StartingEventOpenDoors() override; - void RemovePlayer(Player* player, ObjectGuid guid, uint32 team) override; void HandleAreaTrigger(Player* source, uint32 trigger, bool entered) override; bool SetupBattleground() override; void Reset() override; @@ -276,9 +229,6 @@ class BattlegroundAB : public Battleground WorldSafeLocsEntry const* GetClosestGraveyard(Player* player) override; WorldSafeLocsEntry const* GetExploitTeleportLocation(Team team) override; - /* Scorekeeping */ - bool UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true) override; - uint32 GetPrematureWinner() override; void ProcessEvent(WorldObject* obj, uint32 eventId, WorldObject* invoker = nullptr) override; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp index 2a5a5aa1ae1..321793f936c 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp @@ -25,6 +25,15 @@ #include "ObjectMgr.h" #include "Player.h" +enum AlteracValleyPvpStats +{ + PVP_STAT_TOWERS_ASSAULTED = 61, + PVP_STAT_GRAVEYARDS_ASSAULTED = 63, + PVP_STAT_TOWERS_DEFENDED = 64, + PVP_STAT_GRAVEYARDS_DEFENDED = 65, + PVP_STAT_SECONDARY_OBJECTIVES = 82 +}; + BattlegroundAV::BattlegroundAV(BattlegroundTemplate const* battlegroundTemplate) : Battleground(battlegroundTemplate) { BgObjects.resize(BG_AV_OBJECT_MAX); @@ -438,14 +447,6 @@ void BattlegroundAV::StartingEventOpenDoors() TriggerGameEvent(BG_AV_EVENT_START_BATTLE); } -void BattlegroundAV::AddPlayer(Player* player, BattlegroundQueueTypeId queueId) -{ - bool const isInBattleground = IsPlayerInBattleground(player->GetGUID()); - Battleground::AddPlayer(player, queueId); - if (!isInBattleground) - PlayerScores[player->GetGUID()] = new BattlegroundAVScore(player->GetGUID(), player->GetBGTeam()); -} - void BattlegroundAV::EndBattleground(uint32 winner) { //calculate bonuskills for both teams: @@ -525,31 +526,6 @@ void BattlegroundAV::HandleAreaTrigger(Player* player, uint32 trigger, bool ente } } -bool BattlegroundAV::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor) -{ - if (!Battleground::UpdatePlayerScore(player, type, value, doAddHonor)) - return false; - - switch (type) - { - case SCORE_GRAVEYARDS_ASSAULTED: - player->UpdateCriteria(CriteriaType::TrackedWorldStateUIModified, AV_OBJECTIVE_ASSAULT_GRAVEYARD); - break; - case SCORE_GRAVEYARDS_DEFENDED: - player->UpdateCriteria(CriteriaType::TrackedWorldStateUIModified, AV_OBJECTIVE_DEFEND_GRAVEYARD); - break; - case SCORE_TOWERS_ASSAULTED: - player->UpdateCriteria(CriteriaType::TrackedWorldStateUIModified, AV_OBJECTIVE_ASSAULT_TOWER); - break; - case SCORE_TOWERS_DEFENDED: - player->UpdateCriteria(CriteriaType::TrackedWorldStateUIModified, AV_OBJECTIVE_DEFEND_TOWER); - break; - default: - break; - } - return true; -} - void BattlegroundAV::EventPlayerDestroyedPoint(BG_AV_Nodes node) { uint32 object = GetObjectThroughNode(node); @@ -924,7 +900,7 @@ void BattlegroundAV::EventPlayerDefendsPoint(Player* player, uint32 object) herold->AI()->Talk(team == ALLIANCE ? nodeInfo->TextIds.AllianceCapture : nodeInfo->TextIds.HordeCapture); // update the statistic for the defending player - UpdatePlayerScore(player, IsTower(node) ? SCORE_TOWERS_DEFENDED : SCORE_GRAVEYARDS_DEFENDED, 1); + UpdatePvpStat(player, IsTower(node) ? PVP_STAT_TOWERS_DEFENDED : PVP_STAT_GRAVEYARDS_DEFENDED, 1); } void BattlegroundAV::EventPlayerAssaultsPoint(Player* player, uint32 object) @@ -1013,7 +989,7 @@ void BattlegroundAV::EventPlayerAssaultsPoint(Player* player, uint32 object) herold->AI()->Talk(team == ALLIANCE ? nodeInfo->TextIds.AllianceAttack : nodeInfo->TextIds.HordeAttack); // update the statistic for the assaulting player - UpdatePlayerScore(player, (IsTower(node)) ? SCORE_TOWERS_ASSAULTED : SCORE_GRAVEYARDS_ASSAULTED, 1); + UpdatePvpStat(player, (IsTower(node)) ? PVP_STAT_TOWERS_ASSAULTED : PVP_STAT_GRAVEYARDS_ASSAULTED, 1); } void BattlegroundAV::UpdateNodeWorldState(BG_AV_Nodes node) diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h index d857773b6eb..d7fdc1d36a6 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h @@ -1501,15 +1501,6 @@ enum BG_AV_QuestIds AV_QUEST_H_RIDER_TAME = 7001 }; -enum BG_AV_Objectives -{ - AV_OBJECTIVE_ASSAULT_TOWER = 61, - AV_OBJECTIVE_ASSAULT_GRAVEYARD = 63, - AV_OBJECTIVE_DEFEND_TOWER = 64, - AV_OBJECTIVE_DEFEND_GRAVEYARD = 65, - AV_OBJECTIVE_SECONDARY_OBJECTIVE= 82 -}; - struct StaticNodeInfo { BG_AV_Nodes NodeId; @@ -1587,62 +1578,6 @@ struct BG_AV_NodeInfo inline BG_AV_Nodes &operator++(BG_AV_Nodes& i) { return i = BG_AV_Nodes(i + 1); } -struct BattlegroundAVScore final : public BattlegroundScore -{ - friend class BattlegroundAV; - - protected: - BattlegroundAVScore(ObjectGuid playerGuid, uint32 team) : BattlegroundScore(playerGuid, team), 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 BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPMatchStatistics::PVPMatchPlayerStatistics& playerData) const override - { - BattlegroundScore::BuildPvPLogPlayerDataPacket(playerData); - - playerData.Stats.emplace_back(AV_OBJECTIVE_ASSAULT_GRAVEYARD, GraveyardsAssaulted); - playerData.Stats.emplace_back(AV_OBJECTIVE_DEFEND_GRAVEYARD, GraveyardsDefended); - playerData.Stats.emplace_back(AV_OBJECTIVE_ASSAULT_TOWER, TowersAssaulted); - playerData.Stats.emplace_back(AV_OBJECTIVE_DEFEND_TOWER, TowersDefended); - playerData.Stats.emplace_back(AV_OBJECTIVE_SECONDARY_OBJECTIVE, MinesCaptured); - } - - uint32 GetAttr1() const final override { return GraveyardsAssaulted; } - uint32 GetAttr2() const final override { return GraveyardsDefended; } - uint32 GetAttr3() const final override { return TowersAssaulted; } - uint32 GetAttr4() const final override { return TowersDefended; } - uint32 GetAttr5() const final override { return MinesCaptured; } - - uint32 GraveyardsAssaulted; - uint32 GraveyardsDefended; - uint32 TowersAssaulted; - uint32 TowersDefended; - uint32 MinesCaptured; -}; - class BattlegroundAV : public Battleground { public: @@ -1650,7 +1585,6 @@ class BattlegroundAV : public Battleground ~BattlegroundAV(); /* inherited from BattlegroundClass */ - void AddPlayer(Player* player, BattlegroundQueueTypeId queueId) override; void StartingEventCloseDoors() override; void StartingEventOpenDoors() override; @@ -1661,7 +1595,6 @@ class BattlegroundAV : public Battleground /*general stuff*/ void UpdateScore(uint16 team, int16 points); - 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) override; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundBFG.h b/src/server/game/Battlegrounds/Zones/BattlegroundBFG.h index db709997b20..58210788737 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundBFG.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundBFG.h @@ -19,7 +19,6 @@ #define __BATTLEGROUNDBFG_H #include "Battleground.h" -#include "BattlegroundScore.h" enum BG_BFG_Objectives { @@ -27,42 +26,6 @@ enum BG_BFG_Objectives BFG_OBJECTIVE_BASES_DEFENDED = 371 }; -class BattlegroundBFGScore final : public BattlegroundScore -{ - protected: - BattlegroundBFGScore(ObjectGuid playerGuid, uint32 team) : BattlegroundScore(playerGuid, team), 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 BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPMatchStatistics::PVPMatchPlayerStatistics& playerData) const override - { - BattlegroundScore::BuildPvPLogPlayerDataPacket(playerData); - - playerData.Stats.emplace_back(BFG_OBJECTIVE_BASES_ASSAULTED, BasesAssaulted); - playerData.Stats.emplace_back(BFG_OBJECTIVE_BASES_DEFENDED, BasesDefended); - } - - uint32 GetAttr1() const final override { return BasesAssaulted; } - uint32 GetAttr2() const final override { return BasesDefended; } - - uint32 BasesAssaulted; - uint32 BasesDefended; -}; - class BattlegroundBFG : public Battleground { public: diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp index 13b8208ecf2..dfbdc5e5f48 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp @@ -31,6 +31,11 @@ #include "SpellInfo.h" #include "Util.h" +enum EyeOfTheStormPvpStats +{ + PVP_STAT_FLAG_CAPTURES = 183 +}; + BattlegroundEY::BattlegroundEY(BattlegroundTemplate const* battlegroundTemplate) : Battleground(battlegroundTemplate) { BgObjects.resize(0); @@ -295,7 +300,7 @@ void BattlegroundEY::OnCaptureFlag(AreaTrigger* areaTrigger, Player* player) UpdateWorldState(NETHERSTORM_FLAG_STATE_HORDE, BG_EY_FLAG_STATE_ON_BASE); UpdateWorldState(NETHERSTORM_FLAG_STATE_ALLIANCE, BG_EY_FLAG_STATE_ON_BASE); - UpdatePlayerScore(player, SCORE_FLAG_CAPTURES, 1); + UpdatePvpStat(player, PVP_STAT_FLAG_CAPTURES, 1); player->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL); player->RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags::PvPActive); @@ -349,14 +354,6 @@ void BattlegroundEY::OnFlagStateChange(GameObject* /*flagInBase*/, FlagState /*o UpdateWorldState(NETHERSTORM_FLAG, AsUnderlyingType(newValue)); } -void BattlegroundEY::AddPlayer(Player* player, BattlegroundQueueTypeId queueId) -{ - bool const isInBattleground = IsPlayerInBattleground(player->GetGUID()); - Battleground::AddPlayer(player, queueId); - if (!isInBattleground) - PlayerScores[player->GetGUID()] = new BattlegroundEYScore(player->GetGUID(), player->GetBGTeam()); -} - void BattlegroundEY::HandleAreaTrigger(Player* player, uint32 trigger, bool entered) { if (!player->IsAlive()) //hack code, must be removed later @@ -453,17 +450,6 @@ void BattlegroundEY::EventTeamCapturedPoint(TeamId teamId, uint32 point, GameObj UpdatePointsCount(teamId); } -bool BattlegroundEY::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor) -{ - if (!Battleground::UpdatePlayerScore(player, type, value, doAddHonor)) - return false; - - if (type == SCORE_FLAG_CAPTURES) - player->UpdateCriteria(CriteriaType::TrackedWorldStateUIModified, EY_OBJECTIVE_CAPTURE_FLAG); - - return true; -} - WorldSafeLocsEntry const* BattlegroundEY::GetExploitTeleportLocation(Team team) { return sObjectMgr->GetWorldSafeLoc(team == ALLIANCE ? EY_EXPLOIT_TELEPORT_LOCATION_ALLIANCE : EY_EXPLOIT_TELEPORT_LOCATION_HORDE); diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h index 159fce83556..99710ab01b8 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h @@ -140,11 +140,6 @@ enum EYBattlegroundPointState EY_POINT_UNDER_CONTROL = 3 }; -enum BG_EY_Objectives -{ - EY_OBJECTIVE_CAPTURE_FLAG = 183 -}; - enum BG_EY_ExploitTeleportLocations { EY_EXPLOIT_TELEPORT_LOCATION_ALLIANCE = 3773, @@ -260,38 +255,6 @@ const std::array<BattlegroundEYCapturingPointStruct, EY_POINTS_MAX> m_CapturingP BattlegroundEYCapturingPointStruct(BG_EY_TEXT_ALLIANCE_TAKEN_MAGE_TOWER, BG_EY_TEXT_HORDE_TAKEN_MAGE_TOWER) }; -struct BattlegroundEYScore final : public BattlegroundScore -{ - friend class BattlegroundEY; - - protected: - BattlegroundEYScore(ObjectGuid playerGuid, uint32 team) : BattlegroundScore(playerGuid, team), 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 BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPMatchStatistics::PVPMatchPlayerStatistics& playerData) const override - { - BattlegroundScore::BuildPvPLogPlayerDataPacket(playerData); - - playerData.Stats.emplace_back(EY_OBJECTIVE_CAPTURE_FLAG, FlagCaptures); - } - - uint32 GetAttr1() const final override { return FlagCaptures; } - - uint32 FlagCaptures; -}; - class BattlegroundEY : public Battleground { public: @@ -299,7 +262,6 @@ class BattlegroundEY : public Battleground ~BattlegroundEY(); /* inherited from BattlegroundClass */ - void AddPlayer(Player* player, BattlegroundQueueTypeId queueId) override; void StartingEventOpenDoors() override; void HandleAreaTrigger(Player* source, uint32 trigger, bool entered) override; @@ -309,7 +271,6 @@ class BattlegroundEY : public Battleground void Reset() override; void UpdateTeamScore(uint32 Team); void EndBattleground(uint32 winner) override; - bool UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true) override; uint32 GetPrematureWinner() override; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp index 12bfcb9ab4d..1a9d53b9ac6 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp @@ -26,6 +26,12 @@ #include "UnitAI.h" #include "Vehicle.h" +enum IsleOfConquestPvpStats +{ + PVP_STAT_BASES_ASSAULTED = 245, + PVP_STAT_BASES_DEFENDED = 246 +}; + BattlegroundIC::BattlegroundIC(BattlegroundTemplate const* battlegroundTemplate) : Battleground(battlegroundTemplate) { BgObjects.resize(MAX_NORMAL_GAMEOBJECTS_SPAWNS + MAX_AIRSHIPS_SPAWNS + MAX_HANGAR_TELEPORTERS_SPAWNS + MAX_FORTRESS_TELEPORTERS_SPAWNS + MAX_HANGAR_TELEPORTER_EFFECTS_SPAWNS + MAX_FORTRESS_TELEPORTER_EFFECTS_SPAWNS); @@ -244,10 +250,7 @@ void BattlegroundIC::StartingEventOpenDoors() void BattlegroundIC::AddPlayer(Player* player, BattlegroundQueueTypeId queueId) { - bool const isInBattleground = IsPlayerInBattleground(player->GetGUID()); Battleground::AddPlayer(player, queueId); - if (!isInBattleground) - PlayerScores[player->GetGUID()] = new BattlegroundICScore(player->GetGUID(), player->GetBGTeam()); if (nodePoint[NODE_TYPE_QUARRY].nodeState == (GetPlayerTeam(player->GetGUID()) == ALLIANCE ? NODE_STATE_CONTROLLED_A : NODE_STATE_CONTROLLED_H)) player->CastSpell(player, SPELL_QUARRY, true); @@ -436,7 +439,7 @@ void BattlegroundIC::EventPlayerClickedOnFlag(Player* player, GameObject* target if (!BgCreatures[BG_IC_NPC_SPIRIT_GUIDE_1 + uint32(nodePoint[i].nodeType) - 2].IsEmpty()) DelCreature(BG_IC_NPC_SPIRIT_GUIDE_1 + uint32(nodePoint[i].nodeType) - 2); - UpdatePlayerScore(player, SCORE_BASES_ASSAULTED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_ASSAULTED, 1); if (nodePoint[i].faction == TEAM_ALLIANCE) SendBroadcastText(ICNodes[i].TextAssaulted, CHAT_MSG_BG_SYSTEM_ALLIANCE, player); @@ -456,7 +459,7 @@ void BattlegroundIC::EventPlayerClickedOnFlag(Player* player, GameObject* target SendBroadcastText(ICNodes[i].TextDefended, CHAT_MSG_BG_SYSTEM_HORDE, player); HandleCapturedNodes(&nodePoint[i], true); - UpdatePlayerScore(player, SCORE_BASES_DEFENDED, 1); + UpdatePvpStat(player, PVP_STAT_BASES_DEFENDED, 1); } GameObject* banner = GetBGObject(nodePoint[i].gameobject_type); diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h index 58cc337a991..cecf59e4607 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h @@ -19,7 +19,6 @@ #define __BATTLEGROUNDIC_H #include "Battleground.h" -#include "BattlegroundScore.h" #include "Object.h" const uint32 BG_IC_Factions[2] = @@ -726,12 +725,6 @@ enum Spells SPELL_LAUNCH_NO_FALLING_DAMAGE = 66251 }; -enum BG_IC_Objectives -{ - IC_OBJECTIVE_ASSAULT_BASE = 245, - IC_OBJECTIVE_DEFEND_BASE = 246 -}; - enum ICWorldStates { BG_IC_ALLIANCE_REINFORCEMENTS_SET = 4221, @@ -920,44 +913,6 @@ enum HonorRewards WINNER_HONOR_AMOUNT = 500 }; -struct BattlegroundICScore final : public BattlegroundScore -{ - friend class BattlegroundIC; - - protected: - BattlegroundICScore(ObjectGuid playerGuid, uint32 team) : BattlegroundScore(playerGuid, team), 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 BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPMatchStatistics::PVPMatchPlayerStatistics& playerData) const override - { - BattlegroundScore::BuildPvPLogPlayerDataPacket(playerData); - - playerData.Stats.emplace_back(IC_OBJECTIVE_ASSAULT_BASE, BasesAssaulted); - playerData.Stats.emplace_back(IC_OBJECTIVE_DEFEND_BASE, BasesDefended); - } - - uint32 GetAttr1() const final override { return BasesAssaulted; } - uint32 GetAttr2() const final override { return BasesDefended; } - - uint32 BasesAssaulted; - uint32 BasesDefended; -}; - class BattlegroundIC : public Battleground { public: diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp index 825fbe3b5c9..ac6e07a4b92 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp @@ -16,6 +16,7 @@ */ #include "BattlegroundSA.h" +#include "BattlegroundScore.h" #include "Creature.h" #include "CreatureAI.h" #include "DB2Stores.h" @@ -30,6 +31,12 @@ #include "UpdateData.h" #include "WorldStateMgr.h" +enum StrandOfTheAncientsPvpStats +{ + PVP_STAT_GATES_DESTROYED = 231, + PVP_STAT_DEMOLISHERS_DESTROYED = 232 +}; + BattlegroundSA::BattlegroundSA(BattlegroundTemplate const* battlegroundTemplate) : Battleground(battlegroundTemplate) { StartMessageIds[BG_STARTING_EVENT_FOURTH] = 0; // handle by Kanrethad @@ -432,8 +439,6 @@ void BattlegroundSA::AddPlayer(Player* player, BattlegroundQueueTypeId queueId) { bool const isInBattleground = IsPlayerInBattleground(player->GetGUID()); Battleground::AddPlayer(player, queueId); - if (!isInBattleground) - PlayerScores[player->GetGUID()] = new BattlegroundSAScore(player->GetGUID(), player->GetBGTeam()); SendTransportInit(player); @@ -565,7 +570,7 @@ void BattlegroundSA::ProcessEvent(WorldObject* obj, uint32 eventId, WorldObject* { if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself()) { - UpdatePlayerScore(player, SCORE_DESTROYED_WALL, 1); + UpdatePvpStat(player, PVP_STAT_GATES_DESTROYED, 1); if (rewardHonor) UpdatePlayerScore(player, SCORE_BONUS_HONOR, GetBonusHonorFromKill(1)); } @@ -591,7 +596,7 @@ void BattlegroundSA::HandleKillUnit(Creature* creature, Player* killer) { if (creature->GetEntry() == NPC_DEMOLISHER_SA) { - UpdatePlayerScore(killer, SCORE_DESTROYED_DEMOLISHER, 1); + UpdatePvpStat(killer, PVP_STAT_DEMOLISHERS_DESTROYED, 1); int32 worldStateId = Attackers == TEAM_HORDE ? BG_SA_DESTROYED_HORDE_VEHICLES : BG_SA_DESTROYED_ALLIANCE_VEHICLES; int32 currentDestroyedVehicles = sWorldStateMgr->GetValue(worldStateId, GetBgMap()); UpdateWorldState(worldStateId, currentDestroyedVehicles + 1); @@ -1014,22 +1019,3 @@ bool BattlegroundSA::IsSpellAllowed(uint32 spellId, Player const* /*player*/) co return true; } - -bool BattlegroundSA::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor /*= true*/) -{ - if (!Battleground::UpdatePlayerScore(player, type, value, doAddHonor)) - return false; - - switch (type) - { - case SCORE_DESTROYED_DEMOLISHER: - player->UpdateCriteria(CriteriaType::TrackedWorldStateUIModified, BG_SA_DEMOLISHERS_DESTROYED); - break; - case SCORE_DESTROYED_WALL: - player->UpdateCriteria(CriteriaType::TrackedWorldStateUIModified, BG_SA_GATES_DESTROYED); - break; - default: - break; - } - return true; -} diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h index bde9e3a298b..15ea441c0ff 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h @@ -19,7 +19,6 @@ #define __BATTLEGROUNDSA_H #include "Battleground.h" -#include "BattlegroundScore.h" #include "Object.h" #define BG_SA_FLAG_AMOUNT 3 @@ -307,12 +306,6 @@ enum BG_SA_Objects BG_SA_MAXOBJ = BG_SA_BOMB+68 }; -enum BG_SA_Objectives -{ - BG_SA_GATES_DESTROYED = 231, - BG_SA_DEMOLISHERS_DESTROYED = 232 -}; - Position const BG_SA_ObjSpawnlocs[BG_SA_MAXOBJ] = { { 1411.57f, 108.163f, 28.692f, 5.441f }, @@ -528,44 +521,6 @@ struct BG_SA_RoundScore uint32 time; }; -struct BattlegroundSAScore final : public BattlegroundScore -{ - friend class BattlegroundSA; - - protected: - BattlegroundSAScore(ObjectGuid playerGuid, uint32 team) : BattlegroundScore(playerGuid, team), 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 BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPMatchStatistics::PVPMatchPlayerStatistics& playerData) const override - { - BattlegroundScore::BuildPvPLogPlayerDataPacket(playerData); - - playerData.Stats.emplace_back(BG_SA_DEMOLISHERS_DESTROYED, DemolishersDestroyed); - playerData.Stats.emplace_back(BG_SA_GATES_DESTROYED, GatesDestroyed); - } - - uint32 GetAttr1() const final override { return DemolishersDestroyed; } - uint32 GetAttr2() const final override { return GatesDestroyed; } - - uint32 DemolishersDestroyed; - uint32 GatesDestroyed; -}; - /// Class for manage Strand of Ancient battleground class BattlegroundSA : public Battleground { @@ -618,8 +573,6 @@ class BattlegroundSA : public Battleground // Control Phase Shift bool IsSpellAllowed(uint32 spellId, Player const* player) const override; - bool UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true) override; - private: /** diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundTP.h b/src/server/game/Battlegrounds/Zones/BattlegroundTP.h index 9dfc9d51ef7..0b1654a616d 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundTP.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundTP.h @@ -27,42 +27,6 @@ enum BG_TP_Objectives BG_TP_FLAG_RETURNS = 291 }; -class BattlegroundTPScore final : public BattlegroundScore -{ - protected: - BattlegroundTPScore(ObjectGuid playerGuid, uint32 team) : BattlegroundScore(playerGuid, team), FlagCaptures(0), FlagReturns(0) { } - - void UpdateScore(uint32 type, uint32 value) override - { - switch (type) - { - case SCORE_FLAG_CAPTURES: - FlagCaptures += value; - break; - case SCORE_FLAG_RETURNS: - FlagReturns += value; - break; - default: - BattlegroundScore::UpdateScore(type, value); - break; - } - } - - void BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPMatchStatistics::PVPMatchPlayerStatistics& playerData) const override - { - BattlegroundScore::BuildPvPLogPlayerDataPacket(playerData); - - playerData.Stats.emplace_back(BG_TP_FLAG_CAPTURES, FlagCaptures); - playerData.Stats.emplace_back(BG_TP_FLAG_RETURNS, FlagReturns); - } - - uint32 GetAttr1() const final override { return FlagCaptures; } - uint32 GetAttr2() const final override { return FlagReturns; } - - uint32 FlagCaptures; - uint32 FlagReturns; -}; - class BattlegroundTP : public Battleground { public: diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp index b41fb4a8966..dbfca6d7729 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp @@ -45,6 +45,12 @@ uint32 BG_WSG_Honor[2][BG_WSG_REWARD_NUM] = {60, 40, 80} // holiday }; +enum WarsongGulchPvpStats +{ + PVP_STAT_FLAG_CAPTURES = 928, + PVP_STAT_FLAG_RETURNS = 929 +}; + BattlegroundWS::BattlegroundWS(BattlegroundTemplate const* battlegroundTemplate) : Battleground(battlegroundTemplate) { BgObjects.resize(0); @@ -181,14 +187,6 @@ void BattlegroundWS::StartingEventOpenDoors() TriggerGameEvent(WS_EVENT_START_BATTLE); } -void BattlegroundWS::AddPlayer(Player* player, BattlegroundQueueTypeId queueId) -{ - bool const isInBattleground = IsPlayerInBattleground(player->GetGUID()); - Battleground::AddPlayer(player, queueId); - if (!isInBattleground) - PlayerScores[player->GetGUID()] = new BattlegroundWGScore(player->GetGUID(), player->GetBGTeam()); -} - FlagState BattlegroundWS::GetFlagState(TeamId team) const { if (GameObject* gameObject = FindBgMap()->GetGameObject(_flags[team])) @@ -314,25 +312,6 @@ void BattlegroundWS::HandleKillPlayer(Player* player, Player* killer) Battleground::HandleKillPlayer(player, killer); } -bool BattlegroundWS::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor) -{ - if (!Battleground::UpdatePlayerScore(player, type, value, doAddHonor)) - return false; - - switch (type) - { - case SCORE_FLAG_CAPTURES: // flags captured - player->UpdateCriteria(CriteriaType::TrackedWorldStateUIModified, WS_OBJECTIVE_CAPTURE_FLAG); - break; - case SCORE_FLAG_RETURNS: // flags returned - player->UpdateCriteria(CriteriaType::TrackedWorldStateUIModified, WS_OBJECTIVE_RETURN_FLAG); - break; - default: - break; - } - return true; -} - WorldSafeLocsEntry const* BattlegroundWS::GetClosestGraveyard(Player* player) { return sObjectMgr->GetClosestGraveyard(*player, player->GetBGTeam(), player); @@ -411,7 +390,7 @@ void BattlegroundWS::OnFlagStateChange(GameObject* flagInBase, FlagState /*oldVa if (player) { // flag got returned to base by player interaction - UpdatePlayerScore(player, SCORE_FLAG_RETURNS, 1); // +1 flag returns + UpdatePvpStat(player, PVP_STAT_FLAG_RETURNS, 1); // +1 flag returns if (team == ALLIANCE) { @@ -548,7 +527,7 @@ void BattlegroundWS::OnCaptureFlag(AreaTrigger* /*areaTrigger*/, Player* player) } // 4. update criteria's for achievement, player score etc. - UpdatePlayerScore(player, SCORE_FLAG_CAPTURES, 1); // +1 flag captures + UpdatePvpStat(player, PVP_STAT_FLAG_CAPTURES, 1); // +1 flag captures // 5. Remove all related auras RemoveAssaultDebuffFromPlayer(player); diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h index 2163ede682a..677867680b2 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h @@ -123,12 +123,6 @@ enum BG_WS_CarrierDebuffs SPELL_CAPTURED_HORDE_COSMETIC_FX = 262512, }; -enum BG_WS_Objectives -{ - WS_OBJECTIVE_CAPTURE_FLAG = 928, - WS_OBJECTIVE_RETURN_FLAG = 929 -}; - enum BG_WS_AreaTriggers { AT_CAPTURE_POINT_ALLIANCE = 30, @@ -140,44 +134,6 @@ static constexpr uint32 WS_EVENT_START_BATTLE = 35912; static constexpr Seconds FLAG_ASSAULT_TIMER = 30s; static constexpr uint16 FLAG_BRUTAL_ASSAULT_STACK_COUNT = 5; -struct BattlegroundWGScore final : public BattlegroundScore -{ - friend class BattlegroundWS; - - protected: - BattlegroundWGScore(ObjectGuid playerGuid, uint32 team) : BattlegroundScore(playerGuid, team), 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 BuildPvPLogPlayerDataPacket(WorldPackets::Battleground::PVPMatchStatistics::PVPMatchPlayerStatistics& playerData) const override - { - BattlegroundScore::BuildPvPLogPlayerDataPacket(playerData); - - playerData.Stats.emplace_back(WS_OBJECTIVE_CAPTURE_FLAG, FlagCaptures); - playerData.Stats.emplace_back(WS_OBJECTIVE_RETURN_FLAG, FlagReturns); - } - - uint32 GetAttr1() const final override { return FlagCaptures; } - uint32 GetAttr2() const final override { return FlagReturns; } - - uint32 FlagCaptures; - uint32 FlagReturns; -}; - class BattlegroundWS : public Battleground { public: @@ -186,7 +142,6 @@ class BattlegroundWS : public Battleground ~BattlegroundWS(); /* inherited from BattlegroundClass */ - void AddPlayer(Player* player, BattlegroundQueueTypeId queueId) override; void StartingEventOpenDoors() override; /* BG Flags */ @@ -204,7 +159,6 @@ class BattlegroundWS : public Battleground void UpdateFlagState(uint32 team, FlagState value); void SetLastFlagCapture(uint32 team) { _lastFlagCaptureTeam = team; } void UpdateTeamScore(uint32 team); - bool UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true) override; /* Scorekeeping */ void AddPoint(uint32 TeamID, uint32 Points = 1) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] += Points; } diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h index 640963ae5af..2a3509c1bd5 100644 --- a/src/server/game/DataStores/DB2LoadInfo.h +++ b/src/server/game/DataStores/DB2LoadInfo.h @@ -4218,6 +4218,18 @@ struct PvpItemLoadInfo static constexpr DB2LoadInfo Instance{ Fields, 3, &PVPItemMeta::Instance, HOTFIX_SEL_PVP_ITEM }; }; +struct PvpStatLoadInfo +{ + static constexpr DB2FieldMeta Fields[3] = + { + { false, FT_STRING, "Description" }, + { false, FT_INT, "ID" }, + { true, FT_INT, "MapID" }, + }; + + static constexpr DB2LoadInfo Instance{ Fields, 3, &PVPStatMeta::Instance, HOTFIX_SEL_PVP_STAT }; +}; + struct PvpSeasonLoadInfo { static constexpr DB2FieldMeta Fields[4] = diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 6b882eb1bcd..ec9455dd343 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -251,6 +251,7 @@ DB2Storage<PowerTypeEntry> sPowerTypeStore("PowerType.db2", DB2Storage<PrestigeLevelInfoEntry> sPrestigeLevelInfoStore("PrestigeLevelInfo.db2", &PrestigeLevelInfoLoadInfo::Instance); DB2Storage<PVPDifficultyEntry> sPVPDifficultyStore("PVPDifficulty.db2", &PvpDifficultyLoadInfo::Instance); DB2Storage<PVPItemEntry> sPVPItemStore("PVPItem.db2", &PvpItemLoadInfo::Instance); +DB2Storage<PVPStatEntry> sPVPStatStore("PVPStat.db2", &PvpStatLoadInfo::Instance); DB2Storage<PvpSeasonEntry> sPvpSeasonStore("PvpSeason.db2", &PvpSeasonLoadInfo::Instance); DB2Storage<PvpTalentEntry> sPvpTalentStore("PvpTalent.db2", &PvpTalentLoadInfo::Instance); DB2Storage<PvpTalentCategoryEntry> sPvpTalentCategoryStore("PvpTalentCategory.db2", &PvpTalentCategoryLoadInfo::Instance); @@ -514,6 +515,7 @@ namespace std::unordered_multimap<int32, UiMapAssignmentEntry const*> _uiMapAssignmentByWmoGroup[MAX_UI_MAP_SYSTEM]; std::unordered_set<int32> _uiMapPhases; WMOAreaTableLookupContainer _wmoAreaTableLookup; + std::unordered_map<uint32, std::unordered_set<uint32>> _pvpStatIdsByMap; } template<typename T> @@ -847,6 +849,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul LOAD_DB2(sPrestigeLevelInfoStore); LOAD_DB2(sPVPDifficultyStore); LOAD_DB2(sPVPItemStore); + LOAD_DB2(sPVPStatStore); LOAD_DB2(sPvpSeasonStore); LOAD_DB2(sPvpTalentStore); LOAD_DB2(sPvpTalentCategoryStore); @@ -1621,6 +1624,9 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul sOldContinentsNodesMask[field] |= submask; } + for (PVPStatEntry const* pvpStat : sPVPStatStore) + _pvpStatIdsByMap[pvpStat->MapID].insert(pvpStat->ID); + TC_LOG_INFO("server.loading", ">> Initialized {} DB2 data stores in {} ms", _stores.size(), GetMSTimeDiffToNow(oldMSTime)); return availableDb2Locales.to_ulong(); @@ -3353,6 +3359,11 @@ WMOAreaTableEntry const* DB2Manager::GetWMOAreaTable(int32 rootId, int32 adtId, return Trinity::Containers::MapGetValuePtr(_wmoAreaTableLookup, WMOAreaTableKey(int16(rootId), int8(adtId), groupId)); } +std::unordered_set<uint32> const* DB2Manager::GetPVPStatIDsForMap(uint32 mapId) const +{ + return Trinity::Containers::MapGetValuePtr(_pvpStatIdsByMap, mapId); +} + bool ChrClassesXPowerTypesEntryComparator::Compare(ChrClassesXPowerTypesEntry const* left, ChrClassesXPowerTypesEntry const* right) { if (left->ClassID != right->ClassID) diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index f7f693002d2..21a0bcf07de 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -27,6 +27,7 @@ #include <set> #include <span> #include <vector> +#include <unordered_set> // temporary hack until includes are sorted out (don't want to pull in Windows.h) #ifdef GetClassName @@ -197,6 +198,7 @@ TC_GAME_API extern DB2Storage<PhaseEntry> sPhaseStore; TC_GAME_API extern DB2Storage<PlayerConditionEntry> sPlayerConditionStore; TC_GAME_API extern DB2Storage<PowerDisplayEntry> sPowerDisplayStore; TC_GAME_API extern DB2Storage<PowerTypeEntry> sPowerTypeStore; +TC_GAME_API extern DB2Storage<PVPStatEntry> sPVPStatStore; TC_GAME_API extern DB2Storage<PvpSeasonEntry> sPvpSeasonStore; TC_GAME_API extern DB2Storage<PvpTalentEntry> sPvpTalentStore; TC_GAME_API extern DB2Storage<PvpTalentCategoryEntry> sPvpTalentCategoryStore; @@ -523,6 +525,7 @@ public: void Map2ZoneCoordinates(uint32 areaId, float& x, float& y) const; bool IsUiMapPhase(uint32 phaseId) const; WMOAreaTableEntry const* GetWMOAreaTable(int32 rootId, int32 adtId, int32 groupId) const; + std::unordered_set<uint32> const* GetPVPStatIDsForMap(uint32 mapId) const; private: friend class DB2HotfixGeneratorBase; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index a63d5c4e82d..acf4c98c77a 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -3130,6 +3130,13 @@ struct PVPItemEntry uint8 ItemLevelDelta; }; +struct PVPStatEntry +{ + LocalizedString Description; + uint32 ID; + int32 MapID; +}; + struct PvpSeasonEntry { uint32 ID; |