55 for (BattlegroundPlayerMap::const_iterator itr =
m_Players.begin(); itr !=
m_Players.end(); ++itr)
211 for (BattlegroundPlayerMap::const_iterator itr =
GetPlayers().begin(); itr !=
GetPlayers().end(); ++itr)
215 if (player->IsGameMaster())
222 TC_LOG_DEBUG(
"bg.battleground",
"BATTLEGROUND: Sending {} back to start location (map: {}) (possible exploit)", player->GetName(),
GetMapId());
223 player->TeleportTo(startPos->
Loc);
243 playerPosition.Pos = player->GetPosition();
330 for (BattlegroundPlayerMap::const_iterator itr =
GetPlayers().begin(); itr !=
GetPlayers().end(); ++itr)
332 player->ResetAllPowers();
400 for (BattlegroundPlayerMap::const_iterator itr =
GetPlayers().begin(); itr !=
GetPlayers().end(); ++itr)
405 player->SetArenaFaction(player->GetBGTeam());
408 player->ResetAllPowers();
409 if (!player->IsGameMaster())
431 for (BattlegroundPlayerMap::const_iterator itr =
GetPlayers().begin(); itr !=
GetPlayers().end(); ++itr)
436 player->ResetAllPowers();
459 BattlegroundPlayerMap::iterator itr, next;
479 TC_LOG_ERROR(
"bg.battleground",
"Battleground::{}: player ({}) not found for BG (map: {}, instance id: {})!",
490 Team playerTeam = itr->second.Team;
493 if (playerTeam != team)
518 for (BattlegroundPlayerMap::const_iterator itr =
m_Players.begin(); itr !=
m_Players.end(); ++itr)
520 player->SendDirectMessage(packet);
525 for (BattlegroundPlayerMap::const_iterator itr =
m_Players.begin(); itr !=
m_Players.end(); ++itr)
528 if (player != except)
529 player->SendDirectMessage(packet);
542 TC_LOG_ERROR(
"bg.battleground",
"Battleground::SendBroadcastText: `broadcast_text` (ID: {}) was not found",
id);
563 for (BattlegroundPlayerMap::const_iterator itr =
m_Players.begin(); itr !=
m_Players.end(); ++itr)
565 player->CastSpell(player, SpellID,
true);
570 for (BattlegroundPlayerMap::const_iterator itr =
m_Players.begin(); itr !=
m_Players.end(); ++itr)
572 player->RemoveAura(SpellID);
577 for (BattlegroundPlayerMap::const_iterator itr =
m_Players.begin(); itr !=
m_Players.end(); ++itr)
588 for (BattlegroundPlayerMap::const_iterator itr =
m_Players.begin(); itr !=
m_Players.end(); ++itr)
597 uint32 repGain = Reputation;
613 bool guildAwarded =
false;
624 else if (winner ==
HORDE)
639 uint64 battlegroundId = 1;
647 Field* fields = result->Fetch();
648 battlegroundId = fields[0].
GetUInt64() + 1;
666 pvpMatchComplete.
LogData.emplace();
668 pvpMatchComplete.
Write();
670 for (BattlegroundPlayerMap::iterator itr =
m_Players.begin(); itr !=
m_Players.end(); ++itr)
672 Team team = itr->second.Team;
705 stmt->
setBool (2, team == winner);
706 stmt->
setUInt32(3, score->second->GetKillingBlows());
707 stmt->
setUInt32(4, score->second->GetDeaths());
708 stmt->
setUInt32(5, score->second->GetHonorableKills());
709 stmt->
setUInt32(6, score->second->GetBonusHonor());
710 stmt->
setUInt32(7, score->second->GetDamageDone());
711 stmt->
setUInt32(8, score->second->GetHealingDone());
712 stmt->
setUInt32(9, score->second->GetAttr(0));
713 stmt->
setUInt32(10, score->second->GetAttr(1));
714 stmt->
setUInt32(11, score->second->GetAttr(2));
715 stmt->
setUInt32(12, score->second->GetAttr(3));
716 stmt->
setUInt32(13, score->second->GetAttr(4));
801 bool participant =
false;
803 BattlegroundPlayerMap::iterator itr =
m_Players.find(guid);
807 bgQueueTypeId = itr->second.queueTypeId;
814 BattlegroundScoreMap::iterator itr2 =
PlayerScores.find(guid);
869 if (SendPacket && bgQueueTypeId)
884 if (!group->RemoveMember(guid))
898 playerLeft.
Guid = guid;
915 TC_LOG_DEBUG(
"bg.battleground",
"Removed player {} from Battleground.", player->
GetName());
931 TC_LOG_ERROR(
"bg.battleground",
"Battleground::Reset: one of the counters is not 0 (alliance: {}, horde: {}) for BG (map: {}, instance id: {})!",
988 if (!isInBattleground)
1022 pvpMatchInitialize.
Duration = std::chrono::duration_cast<Seconds>(duration);
1104 if (originalGroup->IsLeader(playerGuid))
1183 uint32 otherTeamInvitedCount;
1184 uint32 thisTeamInvitedCount;
1185 uint32 otherTeamPlayersCount;
1186 uint32 thisTeamPlayersCount;
1209 if (otherTeamInvitedCount == thisTeamInvitedCount)
1212 else if (otherTeamInvitedCount > thisTeamInvitedCount)
1213 diff = otherTeamInvitedCount - thisTeamInvitedCount;
1222 if (otherTeamPlayersCount == thisTeamPlayersCount)
1225 else if (otherTeamPlayersCount > thisTeamPlayersCount)
1226 diff3 = otherTeamPlayersCount - thisTeamPlayersCount;
1234 diff = std::min(diff, diff2);
1236 return std::min(diff, diff3);
1264 score.second->BuildPvPLogPlayerDataPacket(playerData);
1268 playerData.
Sex = player->GetGender();
1269 playerData.
Race = player->GetRace();
1270 playerData.
Class = player->GetClass();
1271 playerData.
HonorLevel = player->GetHonorLevel();
1295 itr->second->UpdateScore(type, value);
1303 score->UpdatePvpStat(pvpStatId, value);
1336 va_start(ap, source);
1354 return playerPosition.Guid == guid;
1377 if (killer == victim)
1386 for (BattlegroundPlayerMap::const_iterator itr =
m_Players.begin(); itr !=
m_Players.end(); ++itr)
1389 if (!creditedPlayer || creditedPlayer == killer)
1408 script->OnPlayerKilled(victim, killer);
1414 script->OnUnitKilled(victim, killer);
1421 BattlegroundPlayerMap::const_iterator itr =
m_Players.find(guid);
1423 return itr->second.Team;
1429 BattlegroundPlayerMap::const_iterator itr =
m_Players.find(guid);
1439 return itr->second.Mercenary;
1458 for (BattlegroundPlayerMap::const_iterator itr =
m_Players.begin(); itr !=
m_Players.end(); ++itr)
1460 if (itr->second.Team == team)
1463 if (player && player->
IsAlive())
1489 Player* killers[] = { killer };
@ BG_QUEUE_INVITATION_TYPE_NO_BALANCE
@ PLAYER_POSITION_UPDATE_INTERVAL
@ TIME_AUTOCLOSE_BATTLEGROUND
@ CHECK_PLAYER_POSITION_INVERVAL
@ BG_TEXT_START_TWO_MINUTES
@ BG_TEXT_BATTLE_HAS_BEGUN
@ BG_TEXT_START_ONE_MINUTE
@ BG_TEXT_START_HALF_MINUTE
@ SPELL_MERCENARY_SHAPESHIFT
@ SPELL_MERCENARY_ALLIANCE_REACTIONS
@ SPELL_MERCENARY_HORDE_REACTIONS
@ SPELL_MERCENARY_HORDE_1
@ SPELL_ARENA_PREPARATION
@ SPELL_HONORABLE_DEFENDER_25Y
@ SPELL_MERCENARY_ALLIANCE_1
@ SPELL_HONORABLE_DEFENDER_60Y
@ BG_STARTING_EVENT_THIRD
@ BG_STARTING_EVENT_SECOND
@ BG_STARTING_EVENT_FIRST
@ BG_STARTING_EVENT_FOURTH
@ CHAR_SEL_PVPSTATS_MAXID
@ CHAR_INS_PVPSTATS_PLAYER
@ CHAR_INS_PVPSTATS_BATTLEGROUND
DB2Storage< BroadcastTextEntry > sBroadcastTextStore("BroadcastText.db2", &BroadcastTextLoadInfo::Instance)
DB2Storage< FactionEntry > sFactionStore("Faction.db2", &FactionLoadInfo::Instance)
@ ParticipateInBattleground
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
std::chrono::seconds Seconds
Seconds shorthand typedef.
@ LANG_BG_STARTED_ANNOUNCE_WORLD
@ LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING
@ LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING_SECS
#define TC_LOG_DEBUG(filterType__, message__,...)
#define TC_LOG_ERROR(filterType__, message__,...)
std::optional< T > Optional
Optional helper class to wrap optional values within.
@ PLAYER_FLAGS_EX_MERCENARY_MODE
constexpr BattlegroundQueueTypeId BATTLEGROUND_QUEUE_NONE
constexpr TeamId GetOtherTeam(TeamId team)
@ SPELL_ATTR0_NO_IMMUNITIES
@ CHAT_MSG_BG_SYSTEM_NEUTRAL
@ SPELL_AURA_MOD_SHAPESHIFT
@ SPELL_AURA_SPIRIT_OF_REDEMPTION
@ SPELL_AURA_MOD_INVISIBILITY
@ SPELL_AURA_MOD_REPUTATION_GAIN
@ SPELL_AURA_MOD_FACTION_REPUTATION_GAIN
@ LeaveArenaOrBattleground
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
int32 GetDuration() const
bool HasEffectType(AuraType type) const
SpellInfo const * GetSpellInfo() const
ObjectGuid const & GetGUID() const
void SetBG(Battleground *bg)
BattlegroundScript * GetBattlegroundScript()
static void BuildBattlegroundStatusNone(WorldPackets::Battleground::BattlefieldStatusNone *battlefieldStatus, Player const *player, uint32 ticketId, uint32 joinTime)
static bool IsRandomBattleground(uint32 battlemasterListId)
static bool IsBGWeekend(BattlegroundTypeId bgTypeId)
virtual void OnPrepareStage1()
virtual void OnEnd(Team winner)
virtual void OnPrepareStage2()
virtual void OnPrepareStage3()
virtual void OnPlayerJoined(Player *player, bool inBattleground)
void UpdatePlayersCountByTeam(Team team, bool remove)
void SetRemainingTime(uint32 Time)
uint32 m_ArenaTeamMMR[PVP_TEAMS_COUNT]
WorldSafeLocsEntry const * GetTeamStartPosition(TeamId teamId) const
Team GetPrematureWinner()
void SendPacketToTeam(Team team, WorldPacket const *packet, Player *except=nullptr) const
char const * GetName() const
PVPDifficultyEntry const * _pvpDifficultyEntry
void SendPacketToAll(WorldPacket const *packet) const
void RemovePlayerPosition(ObjectGuid guid)
uint32 GetMinLevel() const
void ModifyStartDelayTime(int diff)
void SetElapsedTime(uint32 Time)
virtual void HandleKillPlayer(Player *player, Player *killer)
void _ProcessPlayerPositionBroadcast(uint32 diff)
void AddOrSetPlayerToCorrectBgGroup(Player *player, Team team)
std::deque< ObjectGuid > m_OfflineQueue
uint32 GetMinPlayersPerTeam() const
void PlayerAddedToBGCheckIfBGIsRunning(Player *player)
uint8 GetArenaType() const
BattlegroundPlayerMap m_Players
Player * _GetPlayerForTeam(Team team, BattlegroundPlayerMap::const_iterator itr, char const *context) const
uint32 GetMaxPlayersPerTeam() const
time_t _preparationStartTime
uint32 m_ValidStartPositionTimer
Group * GetBgRaid(Team team) const
BattlegroundTemplate const * _battlegroundTemplate
uint32 GetInvitedCount(Team team) const
void SetWinner(PvPTeamId winnerTeamId)
uint8 GetUniqueBracketId() const
void PlaySoundToAll(uint32 SoundID)
uint32 m_ClientInstanceID
void AddToBGFreeSlotQueue()
uint32 GetTeamScore(TeamId teamId) const
uint32 GetPlayerScoresSize() const
void DecreaseInvitedCount(Team team)
void RewardHonorToTeam(uint32 Honor, Team team)
void SetBgMap(BattlegroundMap *map)
virtual void HandleKillUnit(Creature *, Unit *)
uint32 GetMaxPlayers() const
BattlegroundMap * GetBgMap() const
virtual void PostUpdateImpl(uint32)
Post-update hook.
PvPTeamId GetWinner() const
Battleground(BattlegroundTemplate const *battlegroundTemplate)
virtual void RemovePlayer(Player *, ObjectGuid, uint32)
BattlegroundMap * FindBgMap() const
void BlockMovement(Player *player)
uint32 GetRemainingTime() const
Player * _GetPlayer(ObjectGuid guid, bool offlineRemove, char const *context) const
BattlegroundTypeId GetTypeID() const
bool m_PrematureCountDown
uint32 m_PlayersCount[PVP_TEAMS_COUNT]
Group * m_BgRaids[PVP_TEAMS_COUNT]
uint32 m_PrematureCountDownTimer
void RemoveAuraOnTeam(uint32 SpellID, Team team)
virtual WorldSafeLocsEntry const * GetExploitTeleportLocation(Team)
int32 m_TeamScores[PVP_TEAMS_COUNT]
void PSendMessageToAll(uint32 entry, ChatMsg type, Player const *source,...)
void SendMessageToAll(uint32 entry, ChatMsg type, Player const *source=nullptr)
void EventPlayerLoggedOut(Player *player)
void SendChatMessage(Creature *source, uint8 textId, WorldObject *target=nullptr)
BattlegroundPlayer const * GetBattlegroundPlayerData(ObjectGuid const &playerGuid) const
void RewardXPAtKill(Player *killer, Player *victim)
static TeamId GetTeamIndexByTeamId(Team team)
void UpdateWorldState(int32 worldStateId, int32 value, bool hidden=false)
void SetStatus(BattlegroundStatus Status)
bool IsPlayerMercenaryInBattleground(ObjectGuid guid) const
void BroadcastWorker(Do &_do)
virtual void EndBattleground(Team winner)
bool IsPlayerInBattleground(ObjectGuid guid) const
BattlegroundStartTimeIntervals StartDelayTimes[BG_STARTING_EVENT_COUNT]
uint32 m_LastPlayerPositionBroadcast
void SendBroadcastText(uint32 id, ChatMsg msgType, WorldObject const *target=nullptr)
BattlegroundScore const * GetBattlegroundScore(Player *player) const
void AddPlayerPosition(WorldPackets::Battleground::BattlegroundPlayerPosition const &position)
void PlaySoundToTeam(uint32 SoundID, Team team)
void RewardReputationToTeam(uint32 faction_id, uint32 Reputation, Team team)
BattlegroundPlayerMap const & GetPlayers() const
int32 GetStartDelayTime() const
BattlegroundScoreMap PlayerScores
float GetStartMaxDist() const
bool isBattleground() const
bool UpdatePlayerScore(Player *player, uint32 type, uint32 value, bool doAddHonor=true, Optional< HonorGainSource > source={})
std::vector< WorldPackets::Battleground::BattlegroundPlayerPosition > _playerPositions
virtual void AddPlayer(Player *player, BattlegroundQueueTypeId queueId)
BattlegroundStatus GetStatus() const
bool HasFreeSlots() const
uint32 GetPlayersCountByTeam(Team team) const
void _ProcessOfflineQueue()
uint32 GetAlivePlayersCountByTeam(Team team) const
void RemoveFromBGFreeSlotQueue()
void TeleportPlayerToExploitLocation(Player *player)
void _ProcessProgress(uint32 diff)
uint32 GetFreeSlotsForTeam(Team team) const
virtual bool PreUpdateImpl(uint32)
Pre-update hook.
uint32 GetScriptId() const
virtual void CheckWinConditions()
void EventPlayerLoggedIn(Player *player)
void _CheckSafePositions(uint32 diff)
void _ProcessJoin(uint32 diff)
BattlegroundBracketId GetBracketId() const
std::unordered_set< uint32 > const * _pvpStatIds
Team GetPlayerTeam(ObjectGuid guid) const
uint32 GetBonusHonorFromKill(uint32 kills) const
void UpdatePvpStat(Player *player, uint32 pvpStatId, uint32 value)
uint32 GetMaxLevel() const
uint32 GetElapsedTime() const
void CastSpellOnTeam(uint32 SpellID, Team team)
void SetBracket(PVPDifficultyEntry const *bracketEntry)
uint32 GetPlayersSize() const
void SetBgRaid(Team team, Group *bg_raid)
void SetStartDelayTime(int Time)
virtual void BuildPvPLogDataPacket(WorldPackets::Battleground::PVPMatchStatistics &pvpLogData) const
virtual void RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool SendPacket)
uint32 GetMinPlayers() const
void _ProcessLeave(uint32 diff)
BattlegroundStatus m_Status
uint32 StartMessageIds[BG_STARTING_EVENT_COUNT]
Class used to access individual fields of database query result.
uint64 GetUInt64() const noexcept
uint8 GetMemberGroup(ObjectGuid guid) const
bool AddMember(Player *player)
void ChangeLeader(ObjectGuid guid)
void SetBattlegroundGroup(Battleground *bg)
bool IsMember(ObjectGuid guid) const
bool Create(Player *leader)
void StartCountdown(CountdownTimerType timerType, Seconds duration, Optional< time_t > startTime={ })
LowType GetCounter() const
static ObjectGuid const Empty
std::string ToString() const
bool RewardHonor(Unit *victim, uint32 groupsize, int32 honor=-1, HonorGainSource source=HonorGainSource::Kill)
void SetClientControl(Unit *target, bool allowMove)
void SetBGTeam(Team team)
void SetPlayerFlagEx(PlayerFlagsEx flags)
bool HasPlayerFlagEx(PlayerFlagsEx flags) const
void SetBattlegroundId(uint32 val, BattlegroundTypeId bgTypeId, BattlegroundQueueTypeId queueId)
void SendDirectMessage(WorldPacket const *data) const
static void OfflineResurrect(ObjectGuid const &guid, CharacterDatabaseTransaction trans)
void RemovePlayerFlagEx(PlayerFlagsEx flags)
void SpawnCorpseBones(bool triggerSave=true)
Group * GetOriginalGroup() const
uint32 GetBattlegroundQueueJoinTime(BattlegroundQueueTypeId bgQueueTypeId) const
bool IsMercenaryForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId) const
bool IsAtGroupRewardDistance(WorldObject const *pRewardSource) const
void DestroyConjuredItems(bool update)
void UnsummonPetTemporaryIfAny()
void RemoveBattlegroundQueueId(BattlegroundQueueTypeId val)
bool GetRandomWinner() const
void UpdateCriteria(CriteriaType type, uint64 miscValue1=0, uint64 miscValue2=0, uint64 miscValue3=0, WorldObject *ref=nullptr)
void RemovePet(Pet *pet, PetSaveMode mode, bool returnreagent=false)
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, TeleportToOptions options=TELE_TO_NONE, Optional< uint32 > instanceId={}, uint32 teleportSpellId=0)
bool TeleportToBGEntryPoint()
uint32 GetBattlegroundQueueIndex(BattlegroundQueueTypeId bgQueueTypeId) const
Team GetEffectiveTeam() const
void FailCriteria(CriteriaFailEvent condition, int32 failAsset)
void ResummonPetTemporaryUnSummonedIfAny()
void SetBattlegroundOrBattlefieldRaid(Group *group, int8 subgroup=-1)
ReputationMgr & GetReputationMgr()
void RemoveArenaEnchantments(EnchantmentSlot slot)
void SetRandomWinner(bool isWinner)
void ResurrectPlayer(float restore_percent, bool applySickness=false)
void setUInt32(uint8 index, uint32 value)
void setBool(uint8 index, bool value)
void setUInt64(uint8 index, uint64 value)
void setUInt8(uint8 index, uint8 value)
bool ModifyReputation(FactionEntry const *factionEntry, int32 standing, bool spillOverOnly=false, bool noSpillover=false)
bool HasAttribute(SpellAttr0 attribute) const
Utility class to enable range for loop syntax for multimap.equal_range uses.
void RemoveAurasByType(AuraType auraType, std::function< bool(AuraApplication const *)> const &check, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
void CombatStop(bool includingCast=false, bool mutualPvP=true, bool(*unitFilter)(Unit const *otherUnit)=nullptr)
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
void AtEndOfEncounter(EncounterType type)
float GetTotalAuraModifier(AuraType auraType) const
bool HasAuraType(AuraType auraType) const
void RemoveAurasWithInterruptFlags(InterruptFlags flag, SpellInfo const *source=nullptr)
float GetTotalAuraModifierByMiscValue(AuraType auraType, int32 misc_value) const
void SetUnitFlag(UnitFlags flags)
void CombatStopWithPets(bool includingCast=false)
constexpr uint32 GetMapId() const
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
std::string const & GetName() const
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< BattlegroundPlayerPosition > FlagCarriers
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPackets::Duration< Seconds > Duration
Optional< PVPMatchStatistics > LogData
uint32 BattlemasterListID
WorldPackets::Duration< Seconds > Duration
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * GetRawPacket() const
@ CONFIG_BG_REWARD_LOSER_HONOR_LAST
@ CONFIG_BATTLEGROUND_INVITATION_TYPE
@ CONFIG_BG_REWARD_WINNER_HONOR_FIRST
@ CONFIG_BG_REWARD_LOSER_HONOR_FIRST
@ CONFIG_BG_REWARD_WINNER_HONOR_LAST
@ CONFIG_BATTLEGROUND_STORE_STATISTICS_ENABLE
@ CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE
SystemTimePoint GetSystemTime()
Current chrono system_clock time point.
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
auto MapGetValuePtr(M &map, typename M::key_type const &key)
uint32 hk_honor_at_level(uint8 level, float multiplier=1.0f)
TC_GAME_API void SetValue(int32 worldStateId, int32 value, bool hidden, Map *map)
BattlegroundQueueTypeId queueTypeId
uint16 BattlemasterListId
uint8 GetMinLevel() const
BattlemasterListEntry const * BattlemasterEntry
uint16 GetMaxPlayersPerTeam() const
std::vector< int32 > MapIDs
WorldSafeLocsEntry const * StartLocation[PVP_TEAMS_COUNT]
uint16 GetMinPlayersPerTeam() const
uint8 GetMaxLevel() const
BattlegroundBracketId GetBracketId() const
constexpr void GetPosition(float &x, float &y) const
constexpr float GetExactDistSq(float x, float y, float z) const
std::vector< PVPMatchPlayerStatistics > Statistics
std::array< int8, 2 > PlayerCount