Core/Battleground: refactored BattlegroundScore
(original code by Machiavelli)
This commit is contained in:
@@ -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
|
||||
@@ -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; }
|
||||
|
||||
@@ -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);
|
||||
|
||||
switch (type)
|
||||
data.Initialize(MSG_PVP_LOG_DATA, 1 + 1 + 4 + 40 * GetPlayerScoresSize());
|
||||
data << uint8(type); // type (battleground = 0 / arena = 1)
|
||||
|
||||
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());
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user