aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp803
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundEY.h297
-rw-r--r--src/server/game/Spells/SpellInfo.cpp2
3 files changed, 326 insertions, 776 deletions
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp
index d05e2473ed0..13b8208ecf2 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp
@@ -16,6 +16,7 @@
*/
#include "BattlegroundEY.h"
+#include "AreaTrigger.h"
#include "BattlegroundMgr.h"
#include "BattlegroundPackets.h"
#include "Creature.h"
@@ -26,40 +27,21 @@
#include "ObjectMgr.h"
#include "Player.h"
#include "Random.h"
+#include "SpellAuras.h"
#include "SpellInfo.h"
#include "Util.h"
BattlegroundEY::BattlegroundEY(BattlegroundTemplate const* battlegroundTemplate) : Battleground(battlegroundTemplate)
{
- BgObjects.resize(BG_EY_OBJECT_MAX);
- BgCreatures.resize(BG_EY_CREATURES_MAX);
- m_Points_Trigger[FEL_REAVER] = TR_FEL_REAVER_BUFF;
- m_Points_Trigger[BLOOD_ELF] = TR_BLOOD_ELF_BUFF;
- m_Points_Trigger[DRAENEI_RUINS] = TR_DRAENEI_RUINS_BUFF;
- m_Points_Trigger[MAGE_TOWER] = TR_MAGE_TOWER_BUFF;
- m_HonorScoreTics[TEAM_ALLIANCE] = 0;
- m_HonorScoreTics[TEAM_HORDE] = 0;
- m_TeamPointsCount[TEAM_ALLIANCE] = 0;
- m_TeamPointsCount[TEAM_HORDE] = 0;
- m_FlagKeeper.Clear();
- m_DroppedFlagGUID.Clear();
+ BgObjects.resize(0);
+ BgCreatures.resize(0);
+ m_HonorScoreTics = { 0, 0 };
m_FlagCapturedBgObjectType = 0;
- m_FlagState = BG_EY_FLAG_STATE_ON_BASE;
- m_FlagsTimer = 0;
- m_TowerCapCheckTimer = 0;
- m_PointAddingTimer = 0;
m_HonorTics = 0;
-
- for (uint8 i = 0; i < EY_POINTS_MAX; ++i)
- {
- m_PointOwnedByTeam[i] = EY_POINT_NO_OWNER;
- m_PointState[i] = EY_POINT_STATE_UNCONTROLLED;
- m_PointBarStatus[i] = BG_EY_PROGRESS_BAR_STATE_MIDDLE;
- m_LastPointCaptureStatus[i] = BattlegroundPointCaptureStatus::Neutral;
- }
-
- for (uint8 i = 0; i < 2 * EY_POINTS_MAX; ++i)
- m_CurrentPointPlayersCount[i] = 0;
+ _pointsTimer.Reset(POINTS_TICK_TIME);
+ _assaultEnabled = false;
+ _assaultStackCount = 0;
+ _flagAssaultTimer.Reset(BG_EY_FLAG_ASSAULT_TIMER);
}
BattlegroundEY::~BattlegroundEY() { }
@@ -68,53 +50,46 @@ void BattlegroundEY::PostUpdateImpl(uint32 diff)
{
if (GetStatus() == STATUS_IN_PROGRESS)
{
- m_PointAddingTimer -= diff;
- if (m_PointAddingTimer <= 0)
+ _pointsTimer.Update(diff);
+ if (_pointsTimer.Passed())
{
- m_PointAddingTimer = BG_EY_FPOINTS_TICK_TIME;
- if (m_TeamPointsCount[TEAM_ALLIANCE] > 0)
- AddPoints(ALLIANCE, BG_EY_TickPoints[m_TeamPointsCount[TEAM_ALLIANCE] - 1]);
- if (m_TeamPointsCount[TEAM_HORDE] > 0)
- AddPoints(HORDE, BG_EY_TickPoints[m_TeamPointsCount[TEAM_HORDE] - 1]);
+ _pointsTimer.Reset(POINTS_TICK_TIME);
+
+ uint8 baseCountAlliance = GetControlledBaseCount(TEAM_ALLIANCE);
+ uint8 baseCountHorde = GetControlledBaseCount(TEAM_HORDE);
+ if (baseCountAlliance > 0)
+ AddPoints(ALLIANCE, BG_EY_TickPoints[baseCountAlliance - 1]);
+ if (baseCountHorde > 0)
+ AddPoints(HORDE, BG_EY_TickPoints[baseCountHorde - 1]);
}
- if (m_FlagState == BG_EY_FLAG_STATE_WAIT_RESPAWN || m_FlagState == BG_EY_FLAG_STATE_ON_GROUND)
+ if (_assaultEnabled)
{
- m_FlagsTimer -= diff;
-
- if (m_FlagsTimer < 0)
+ _flagAssaultTimer.Update(diff);
+ if (_flagAssaultTimer.Passed())
{
- m_FlagsTimer = 0;
- if (m_FlagState == BG_EY_FLAG_STATE_WAIT_RESPAWN)
- RespawnFlag(true);
- else
- RespawnFlagAfterDrop();
+ _flagAssaultTimer.Reset(BG_EY_FLAG_ASSAULT_TIMER);
+ _assaultStackCount++;
+
+ // update assault debuff stacks
+ DoForFlagKeepers([&](Player* player) -> void
+ {
+ ApplyAssaultDebuffToPlayer(player);
+ });
}
}
}
}
-void BattlegroundEY::StartingEventCloseDoors()
-{
- SpawnBGObject(BG_EY_OBJECT_DOOR_A, RESPAWN_IMMEDIATELY);
- SpawnBGObject(BG_EY_OBJECT_DOOR_H, RESPAWN_IMMEDIATELY);
-
- for (uint32 i = BG_EY_OBJECT_A_BANNER_FEL_REAVER_CENTER; i < BG_EY_OBJECT_MAX; ++i)
- SpawnBGObject(i, RESPAWN_ONE_DAY);
-}
-
void BattlegroundEY::StartingEventOpenDoors()
{
- SpawnBGObject(BG_EY_OBJECT_DOOR_A, RESPAWN_ONE_DAY);
- SpawnBGObject(BG_EY_OBJECT_DOOR_H, RESPAWN_ONE_DAY);
-
- for (uint32 i = BG_EY_OBJECT_N_BANNER_FEL_REAVER_CENTER; i <= BG_EY_OBJECT_FLAG_NETHERSTORM; ++i)
- SpawnBGObject(i, RESPAWN_IMMEDIATELY);
- for (uint32 i = 0; i < EY_POINTS_MAX; ++i)
+ for (ObjectGuid const& door : _doorGUIDs)
{
- //randomly spawn buff
- uint8 buff = urand(0, 2);
- SpawnBGObject(BG_EY_OBJECT_SPEEDBUFF_FEL_REAVER + buff + i * 3, RESPAWN_IMMEDIATELY);
+ if (GameObject* gameObject = GetBgMap()->GetGameObject(door))
+ {
+ gameObject->UseDoorOrButton();
+ gameObject->DespawnOrUnsummon(3s);
+ }
}
// Achievement: Flurry
@@ -134,20 +109,76 @@ void BattlegroundEY::AddPoints(uint32 Team, uint32 Points)
UpdateTeamScore(team_index);
}
-BattlegroundPointCaptureStatus BattlegroundEY::GetPointCaptureStatus(uint32 point) const
+uint8 BattlegroundEY::GetControlledBaseCount(TeamId teamId) const
+{
+ uint8 baseCount = 0;
+ for (auto const& controlZoneHandler : _controlZoneHandlers)
+ {
+ uint32 point = controlZoneHandler.second->GetPoint();
+ switch (teamId)
+ {
+ case TEAM_ALLIANCE:
+ if (GetBgMap()->GetWorldStateValue(m_PointsIconStruct[point].WorldStateAllianceControlledIndex) == 1)
+ baseCount++;
+ break;
+ case TEAM_HORDE:
+ if (GetBgMap()->GetWorldStateValue(m_PointsIconStruct[point].WorldStateHordeControlledIndex) == 1)
+ baseCount++;
+ break;
+ default:
+ break;
+ }
+ }
+ return baseCount;
+}
+
+void BattlegroundEY::DoForFlagKeepers(std::function<void(Player*)> action) const
+{
+ if (GameObject* flag = GetBgMap()->GetGameObject(_flagGUID))
+ {
+ if (Player* carrier = ObjectAccessor::FindPlayer(flag->GetFlagCarrierGUID()))
+ action(carrier);
+ }
+}
+
+void BattlegroundEY::ResetAssaultDebuff()
{
- if (m_PointBarStatus[point] >= BG_EY_PROGRESS_BAR_ALI_CONTROLLED)
- return BattlegroundPointCaptureStatus::AllianceControlled;
+ _assaultEnabled = false;
+ _assaultStackCount = 0;
+ _flagAssaultTimer.Reset(BG_EY_FLAG_ASSAULT_TIMER);
+ DoForFlagKeepers([&](Player* player) -> void
+ {
+ RemoveAssaultDebuffFromPlayer(player);
+ });
+}
+
+void BattlegroundEY::ApplyAssaultDebuffToPlayer(Player* player)
+{
+ if (_assaultStackCount == 0)
+ return;
+
+ uint32 spellId = BG_EY_FOCUSED_ASSAULT_SPELL;
+ if (_assaultStackCount >= BG_EY_FLAG_BRUTAL_ASSAULT_STACK_COUNT)
+ {
+ player->RemoveAurasDueToSpell(BG_EY_FOCUSED_ASSAULT_SPELL);
+ spellId = BG_EY_BRUTAL_ASSAULT_SPELL;
+ }
- if (m_PointBarStatus[point] <= BG_EY_PROGRESS_BAR_HORDE_CONTROLLED)
- return BattlegroundPointCaptureStatus::HordeControlled;
+ Aura* aura = player->GetAura(spellId);
+ if (!aura)
+ {
+ player->CastSpell(player, spellId, true);
+ aura = player->GetAura(spellId);
+ }
- if (m_CurrentPointPlayersCount[2 * point] == m_CurrentPointPlayersCount[2 * point + 1])
- return BattlegroundPointCaptureStatus::Neutral;
+ if (aura)
+ aura->SetStackAmount(_assaultStackCount);
+}
- return m_CurrentPointPlayersCount[2 * point] > m_CurrentPointPlayersCount[2 * point + 1]
- ? BattlegroundPointCaptureStatus::AllianceCapturing
- : BattlegroundPointCaptureStatus::HordeCapturing;
+void BattlegroundEY::RemoveAssaultDebuffFromPlayer(Player* player)
+{
+ player->RemoveAurasDueToSpell(BG_EY_FOCUSED_ASSAULT_SPELL);
+ player->RemoveAurasDueToSpell(BG_EY_BRUTAL_ASSAULT_SPELL);
}
void BattlegroundEY::UpdateTeamScore(uint32 Team)
@@ -176,6 +207,7 @@ void BattlegroundEY::EndBattleground(uint32 winner)
RewardHonorToTeam(GetBonusHonorFromKill(1), ALLIANCE);
if (winner == HORDE)
RewardHonorToTeam(GetBonusHonorFromKill(1), HORDE);
+
// Complete map reward
RewardHonorToTeam(GetBonusHonorFromKill(1), ALLIANCE);
RewardHonorToTeam(GetBonusHonorFromKill(1), HORDE);
@@ -183,67 +215,146 @@ void BattlegroundEY::EndBattleground(uint32 winner)
Battleground::EndBattleground(winner);
}
-void BattlegroundEY::UpdatePointsCount(uint32 Team)
+void BattlegroundEY::UpdatePointsCount(TeamId teamId)
{
- if (Team == ALLIANCE)
- UpdateWorldState(EY_ALLIANCE_BASE, m_TeamPointsCount[TEAM_ALLIANCE]);
+ if (teamId == TEAM_ALLIANCE)
+ UpdateWorldState(EY_ALLIANCE_BASE, GetControlledBaseCount(TEAM_ALLIANCE));
else
- UpdateWorldState(EY_HORDE_BASE, m_TeamPointsCount[TEAM_HORDE]);
+ UpdateWorldState(EY_HORDE_BASE, GetControlledBaseCount(TEAM_HORDE));
}
-void BattlegroundEY::UpdatePointsIcons(uint32 Team, uint32 Point)
+void BattlegroundEY::OnGameObjectCreate(GameObject* gameObject)
{
- //we MUST firstly send 0, after that we can send 1!!!
- if (m_PointState[Point] == EY_POINT_UNDER_CONTROL)
- {
- UpdateWorldState(m_PointsIconStruct[Point].WorldStateControlIndex, 0);
- if (Team == ALLIANCE)
- UpdateWorldState(m_PointsIconStruct[Point].WorldStateAllianceControlledIndex, 1);
- else
- UpdateWorldState(m_PointsIconStruct[Point].WorldStateHordeControlledIndex, 1);
- }
- else
+ switch (gameObject->GetEntry())
{
- if (Team == ALLIANCE)
- UpdateWorldState(m_PointsIconStruct[Point].WorldStateAllianceControlledIndex, 0);
- else
- UpdateWorldState(m_PointsIconStruct[Point].WorldStateHordeControlledIndex, 0);
- UpdateWorldState(m_PointsIconStruct[Point].WorldStateControlIndex, 1);
+ case BG_OBJECT_A_DOOR_EY_ENTRY:
+ case BG_OBJECT_H_DOOR_EY_ENTRY:
+ _doorGUIDs.insert(gameObject->GetGUID());
+ break;
+ case BG_OBJECT_FLAG2_EY_ENTRY:
+ _flagGUID = gameObject->GetGUID();
+ break;
+ default:
+ break;
}
}
-void BattlegroundEY::AddPlayer(Player* player, BattlegroundQueueTypeId queueId)
+bool BattlegroundEY::CanCaptureFlag(AreaTrigger* areaTrigger, Player* player)
{
- bool const isInBattleground = IsPlayerInBattleground(player->GetGUID());
- Battleground::AddPlayer(player, queueId);
- if (!isInBattleground)
- PlayerScores[player->GetGUID()] = new BattlegroundEYScore(player->GetGUID(), player->GetBGTeam());
+ if (areaTrigger->GetEntry() != AREATRIGGER_CAPTURE_FLAG)
+ return false;
- m_PlayersNearPoint[EY_POINTS_MAX].push_back(player->GetGUID());
+ if (GameObject* flag = GetBgMap()->GetGameObject(_flagGUID))
+ {
+ if (flag->GetFlagCarrierGUID() != player->GetGUID())
+ return false;
+ }
+
+ if (GameObject* controlzone = player->FindNearestGameObjectWithOptions(40.0f, { .StringId = "bg_eye_of_the_storm_control_zone" }))
+ {
+ uint32 point = _controlZoneHandlers[controlzone->GetEntry()]->GetPoint();
+ switch (GetPlayerTeam(player->GetGUID()))
+ {
+ case ALLIANCE:
+ return GetBgMap()->GetWorldStateValue(m_PointsIconStruct[point].WorldStateAllianceControlledIndex) == 1;
+ case HORDE:
+ return GetBgMap()->GetWorldStateValue(m_PointsIconStruct[point].WorldStateHordeControlledIndex) == 1;
+ default:
+ return false;
+ }
+ }
+
+ return false;
}
-void BattlegroundEY::RemovePlayer(Player* player, ObjectGuid guid, uint32 /*team*/)
+void BattlegroundEY::OnCaptureFlag(AreaTrigger* areaTrigger, Player* player)
{
- // sometimes flag aura not removed :(
- for (int j = EY_POINTS_MAX; j >= 0; --j)
+ if (areaTrigger->GetEntry() != AREATRIGGER_CAPTURE_FLAG)
+ return;
+
+ uint32 baseCount = GetControlledBaseCount(GetTeamIndexByTeamId(GetPlayerTeam(player->GetGUID())));
+
+ if (GameObject* gameObject = GetBgMap()->GetGameObject(_flagGUID))
+ gameObject->HandleCustomTypeCommand(GameObjectType::SetNewFlagState(FlagState::Respawning, player));
+
+ Team team = Team(GetPlayerTeam(player->GetGUID()));
+ if (team == ALLIANCE)
{
- for (size_t i = 0; i < m_PlayersNearPoint[j].size(); ++i)
- if (m_PlayersNearPoint[j][i] == guid)
- m_PlayersNearPoint[j].erase(m_PlayersNearPoint[j].begin() + i);
+ SendBroadcastText(BG_EY_TEXT_ALLIANCE_CAPTURED_FLAG, CHAT_MSG_BG_SYSTEM_ALLIANCE, player);
+ PlaySoundToAll(BG_EY_SOUND_FLAG_CAPTURED_ALLIANCE);
}
- if (IsFlagPickedup())
+ else
{
- if (m_FlagKeeper == guid)
- {
- if (player)
- EventPlayerDroppedFlag(player);
+ SendBroadcastText(BG_EY_TEXT_HORDE_CAPTURED_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, player);
+ PlaySoundToAll(BG_EY_SOUND_FLAG_CAPTURED_HORDE);
+ }
+
+ if (baseCount > 0)
+ AddPoints(team, BG_EY_FlagPoints[baseCount - 1]);
+
+ 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);
+
+ player->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL);
+ player->RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags::PvPActive);
+}
+
+void BattlegroundEY::OnFlagStateChange(GameObject* /*flagInBase*/, FlagState /*oldValue*/, FlagState newValue, Player* player)
+{
+ switch (newValue)
+ {
+ case FlagState::InBase:
+ ResetAssaultDebuff();
+ break;
+ case FlagState::Dropped:
+ player->CastSpell(player, SPELL_RECENTLY_DROPPED_NEUTRAL_FLAG, true);
+ RemoveAssaultDebuffFromPlayer(player);
+
+ UpdateWorldState(NETHERSTORM_FLAG_STATE_HORDE, BG_EY_FLAG_STATE_WAIT_RESPAWN);
+ UpdateWorldState(NETHERSTORM_FLAG_STATE_ALLIANCE, BG_EY_FLAG_STATE_WAIT_RESPAWN);
+
+ if (GetPlayerTeam(player->GetGUID()) == ALLIANCE)
+ SendBroadcastText(BG_EY_TEXT_FLAG_DROPPED, CHAT_MSG_BG_SYSTEM_ALLIANCE);
else
+ SendBroadcastText(BG_EY_TEXT_FLAG_DROPPED, CHAT_MSG_BG_SYSTEM_HORDE);
+ break;
+ case FlagState::Taken:
+ if (GetPlayerTeam(player->GetGUID()) == ALLIANCE)
{
- SetFlagPicker(ObjectGuid::Empty);
- RespawnFlag(true);
+ UpdateWorldState(NETHERSTORM_FLAG_STATE_ALLIANCE, BG_EY_FLAG_STATE_ON_PLAYER);
+ PlaySoundToAll(BG_EY_SOUND_FLAG_PICKED_UP_ALLIANCE);
+ SendBroadcastText(BG_EY_TEXT_TAKEN_FLAG, CHAT_MSG_BG_SYSTEM_ALLIANCE, player);
}
- }
+ else
+ {
+ UpdateWorldState(NETHERSTORM_FLAG_STATE_HORDE, BG_EY_FLAG_STATE_ON_PLAYER);
+ PlaySoundToAll(BG_EY_SOUND_FLAG_PICKED_UP_HORDE);
+ SendBroadcastText(BG_EY_TEXT_TAKEN_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, player);
+ }
+
+ ApplyAssaultDebuffToPlayer(player);
+ _assaultEnabled = true;
+
+ player->RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags::PvPActive);
+ break;
+ case FlagState::Respawning:
+ ResetAssaultDebuff();
+ break;
+ default:
+ break;
}
+
+ 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)
@@ -258,26 +369,6 @@ void BattlegroundEY::HandleAreaTrigger(Player* player, uint32 trigger, bool ente
if (GetStatus() == STATUS_WAIT_JOIN && !entered)
TeleportPlayerToExploitLocation(player);
break;
- case TR_BLOOD_ELF_POINT:
- if (m_PointState[BLOOD_ELF] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[BLOOD_ELF] == GetPlayerTeam(player->GetGUID()))
- if (m_FlagState && GetFlagPickerGUID() == player->GetGUID())
- EventPlayerCapturedFlag(player, BG_EY_OBJECT_FLAG_BLOOD_ELF);
- break;
- case TR_FEL_REAVER_POINT:
- if (m_PointState[FEL_REAVER] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[FEL_REAVER] == GetPlayerTeam(player->GetGUID()))
- if (m_FlagState && GetFlagPickerGUID() == player->GetGUID())
- EventPlayerCapturedFlag(player, BG_EY_OBJECT_FLAG_FEL_REAVER);
- break;
- case TR_MAGE_TOWER_POINT:
- if (m_PointState[MAGE_TOWER] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[MAGE_TOWER] == GetPlayerTeam(player->GetGUID()))
- if (m_FlagState && GetFlagPickerGUID() == player->GetGUID())
- EventPlayerCapturedFlag(player, BG_EY_OBJECT_FLAG_MAGE_TOWER);
- break;
- case TR_DRAENEI_RUINS_POINT:
- if (m_PointState[DRAENEI_RUINS] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[DRAENEI_RUINS] == GetPlayerTeam(player->GetGUID()))
- if (m_FlagState && GetFlagPickerGUID() == player->GetGUID())
- EventPlayerCapturedFlag(player, BG_EY_OBJECT_FLAG_DRAENEI_RUINS);
- break;
case 4512:
case 4515:
case 4517:
@@ -296,98 +387,12 @@ void BattlegroundEY::HandleAreaTrigger(Player* player, uint32 trigger, bool ente
bool BattlegroundEY::SetupBattleground()
{
- // doors
- if (!AddObject(BG_EY_OBJECT_DOOR_A, BG_OBJECT_A_DOOR_EY_ENTRY, 2527.59716796875f, 1596.90625f, 1238.4544677734375f, 3.159139871597290039f, 0.173641681671142578f, 0.001514434814453125f, -0.98476982116699218f, 0.008638577535748481f, RESPAWN_IMMEDIATELY)
- || !AddObject(BG_EY_OBJECT_DOOR_H, BG_OBJECT_H_DOOR_EY_ENTRY, 1803.2066650390625f, 1539.486083984375f, 1238.4544677734375f, 3.13898324966430664f, 0.173647880554199218, 0.0f, 0.984807014465332031f, 0.001244877814315259f, RESPAWN_IMMEDIATELY)
- // banners (alliance)
- || !AddObject(BG_EY_OBJECT_A_BANNER_FEL_REAVER_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2057.47265625f, 1735.109130859375f, 1188.065673828125f, 5.305802345275878906f, 0.0f, 0.0f, -0.46947097778320312f, 0.882947921752929687f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_A_BANNER_FEL_REAVER_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2032.248291015625f, 1729.546875f, 1191.2296142578125f, 1.797688722610473632f, 0.0f, 0.0f, 0.7826080322265625f, 0.622514784336090087f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_A_BANNER_FEL_REAVER_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2092.338623046875f, 1775.4739990234375f, 1187.504150390625f, 5.811946868896484375f, 0.0f, 0.0f, -0.2334451675415039f, 0.972369968891143798f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_A_BANNER_BLOOD_ELF_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2047.1910400390625f, 1349.1927490234375f, 1189.0032958984375f, 4.660029888153076171f, 0.0f, 0.0f, -0.72537422180175781f, 0.688354730606079101f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_A_BANNER_BLOOD_ELF_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2074.319580078125f, 1385.779541015625f, 1194.7203369140625f, 0.488691210746765136f, 0.0f, 0.0f, 0.241921424865722656f, 0.970295846462249755f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_A_BANNER_BLOOD_ELF_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2025.125f, 1386.123291015625f, 1192.7354736328125f, 2.391098499298095703f, 0.0f, 0.0f, 0.930417060852050781f, 0.366502493619918823f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2276.796875f, 1400.407958984375f, 1196.333740234375f, 2.44346022605895996f, 0.0f, 0.0f, 0.939692497253417968f, 0.34202045202255249f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2305.776123046875f, 1404.5572509765625f, 1199.384765625f, 1.745326757431030273f, 0.0f, 0.0f, 0.766043663024902343f, 0.642788589000701904f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2245.395751953125f, 1366.4132080078125f, 1195.27880859375f, 2.216565132141113281f, 0.0f, 0.0f, 0.894933700561523437f, 0.44619917869567871f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_A_BANNER_MAGE_TOWER_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2270.8359375f, 1784.080322265625f, 1186.757080078125f, 2.426007747650146484f, 0.0f, 0.0f, 0.936672210693359375f, 0.350207358598709106f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_A_BANNER_MAGE_TOWER_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2269.126708984375f, 1737.703125f, 1186.8145751953125f, 0.994837164878845214f, 0.0f, 0.0f, 0.477158546447753906f, 0.878817260265350341f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_A_BANNER_MAGE_TOWER_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2300.85595703125f, 1741.24658203125f, 1187.793212890625f, 5.497788906097412109f, 0.0f, 0.0f, -0.38268280029296875f, 0.923879802227020263f, RESPAWN_ONE_DAY)
- // banners (horde)
- || !AddObject(BG_EY_OBJECT_H_BANNER_FEL_REAVER_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2057.45654296875f, 1735.07470703125f, 1187.9063720703125f, 5.35816192626953125f, 0.0f, 0.0f, -0.446197509765625f, 0.894934535026550292f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_H_BANNER_FEL_REAVER_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2032.251708984375f, 1729.532958984375f, 1190.3251953125f, 1.867502212524414062f, 0.0f, 0.0f, 0.803856849670410156f, 0.594822824001312255f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_H_BANNER_FEL_REAVER_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2092.354248046875f, 1775.4583740234375f, 1187.079345703125f, 5.881760597229003906f, 0.0f, 0.0f, -0.19936752319335937f, 0.979924798011779785f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_H_BANNER_BLOOD_ELF_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2047.1978759765625f, 1349.1875f, 1188.5650634765625f, 4.625123500823974609f, 0.0f, 0.0f, -0.73727703094482421f, 0.67559051513671875f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_H_BANNER_BLOOD_ELF_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2074.3056640625f, 1385.7725830078125f, 1194.4686279296875f, 0.471238493919372558f, 0.0f, 0.0f, 0.233445167541503906f, 0.972369968891143798f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_H_BANNER_BLOOD_ELF_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2025.09375f, 1386.12158203125f, 1192.6536865234375f, 2.373644113540649414f, 0.0f, 0.0f, 0.927183151245117187f, 0.37460830807685852f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2276.798583984375f, 1400.4410400390625f, 1196.2200927734375f, 2.495818138122558593f, 0.0f, 0.0f, 0.948323249816894531f, 0.317305892705917358f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2305.763916015625f, 1404.5972900390625f, 1199.3333740234375f, 1.640606880187988281f, 0.0f, 0.0f, 0.731352806091308593f, 0.6819993257522583f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2245.382080078125f, 1366.454833984375f, 1195.1815185546875f, 2.373644113540649414f, 0.0f, 0.0f, 0.927183151245117187f, 0.37460830807685852f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_H_BANNER_MAGE_TOWER_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2270.869873046875f, 1784.0989990234375f, 1186.4384765625f, 2.356194972991943359f, 0.0f, 0.0f, 0.923879623413085937f, 0.382683247327804565f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_H_BANNER_MAGE_TOWER_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2268.59716796875f, 1737.0191650390625f, 1186.75390625f, 0.942476630210876464f, 0.0f, 0.0f, 0.453989982604980468f, 0.891006767749786376f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_H_BANNER_MAGE_TOWER_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2301.01904296875f, 1741.4930419921875f, 1187.48974609375f, 5.375615119934082031f, 0.0f, 0.0f, -0.4383707046508789f, 0.898794233798980712f, RESPAWN_ONE_DAY)
- // banners (natural)
- || !AddObject(BG_EY_OBJECT_N_BANNER_FEL_REAVER_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2057.4931640625f, 1735.111083984375f, 1187.675537109375f, 5.340708732604980468f, 0.0f, 0.0f, -0.45398998260498046f, 0.891006767749786376f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_N_BANNER_FEL_REAVER_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2032.2569580078125f, 1729.5572509765625f, 1191.0802001953125f, 1.797688722610473632f, 0.0f, 0.0f, 0.7826080322265625f, 0.622514784336090087f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_N_BANNER_FEL_REAVER_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2092.395751953125f, 1775.451416015625f, 1186.965576171875f, 5.89921426773071289f, 0.0f, 0.0f, -0.19080829620361328f, 0.981627285480499267f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2047.1875f, 1349.1944580078125f, 1188.5731201171875f, 4.642575740814208984f, 0.0f, 0.0f, -0.731353759765625f, 0.681998312473297119f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2074.3212890625f, 1385.76220703125f, 1194.362060546875f, 0.488691210746765136f, 0.0f, 0.0f, 0.241921424865722656f, 0.970295846462249755f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2025.13720703125f, 1386.1336669921875f, 1192.5482177734375f, 2.391098499298095703f, 0.0f, 0.0f, 0.930417060852050781f, 0.366502493619918823f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2276.833251953125f, 1400.4375f, 1196.146728515625f, 2.478367090225219726f, 0.0f, 0.0f, 0.94551849365234375f, 0.325568377971649169f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2305.77783203125f, 1404.5364990234375f, 1199.246337890625f, 1.570795774459838867f, 0.0f, 0.0f, 0.707106590270996093f, 0.707106947898864746f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2245.40966796875f, 1366.4410400390625f, 1195.1107177734375f, 2.356194972991943359f, 0.0f, 0.0f, 0.923879623413085937f, 0.382683247327804565f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2270.84033203125f, 1784.1197509765625f, 1186.1473388671875f, 2.303830623626708984f, 0.0f, 0.0f, 0.913544654846191406f, 0.406738430261611938f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2268.46533203125f, 1736.8385009765625f, 1186.742919921875f, 0.942476630210876464f, 0.0f, 0.0f, 0.453989982604980468f, 0.891006767749786376f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2300.9931640625f, 1741.5504150390625f, 1187.10693359375f, 5.375615119934082031f, 0.0f, 0.0f, -0.4383707046508789f, 0.898794233798980712f, RESPAWN_ONE_DAY)
- // flags
- || !AddObject(BG_EY_OBJECT_FLAG_NETHERSTORM, BG_OBJECT_FLAG2_EY_ENTRY, 2174.444580078125f, 1569.421875f, 1159.852783203125f, 4.625123500823974609f, 0.0f, 0.0f, -0.73727703094482421f, 0.67559051513671875f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_FLAG_FEL_REAVER, BG_OBJECT_FLAG1_EY_ENTRY, 2044.28f, 1729.68f, 1189.96f, -0.017453f, 0, 0, 0.008727f, -0.999962f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_FLAG_BLOOD_ELF, BG_OBJECT_FLAG1_EY_ENTRY, 2048.83f, 1393.65f, 1194.49f, 0.20944f, 0, 0, 0.104528f, 0.994522f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_FLAG_DRAENEI_RUINS, BG_OBJECT_FLAG1_EY_ENTRY, 2286.56f, 1402.36f, 1197.11f, 3.72381f, 0, 0, 0.957926f, -0.287016f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_FLAG_MAGE_TOWER, BG_OBJECT_FLAG1_EY_ENTRY, 2284.48f, 1731.23f, 1189.99f, 2.89725f, 0, 0, 0.992546f, 0.121869f, RESPAWN_ONE_DAY)
- // tower cap
- || !AddObject(BG_EY_OBJECT_TOWER_CAP_FEL_REAVER, BG_OBJECT_FR_TOWER_CAP_EY_ENTRY, 2024.600708f, 1742.819580f, 1195.157715f, 2.443461f, 0, 0, 0.939693f, 0.342020f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_TOWER_CAP_BLOOD_ELF, BG_OBJECT_BE_TOWER_CAP_EY_ENTRY, 2050.493164f, 1372.235962f, 1194.563477f, 1.710423f, 0, 0, 0.754710f, 0.656059f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_TOWER_CAP_DRAENEI_RUINS, BG_OBJECT_DR_TOWER_CAP_EY_ENTRY, 2301.010498f, 1386.931641f, 1197.183472f, 1.570796f, 0, 0, 0.707107f, 0.707107f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_TOWER_CAP_MAGE_TOWER, BG_OBJECT_HU_TOWER_CAP_EY_ENTRY, 2282.121582f, 1760.006958f, 1189.707153f, 1.919862f, 0, 0, 0.819152f, 0.573576f, RESPAWN_ONE_DAY)
- // buffs
- || !AddObject(BG_EY_OBJECT_SPEEDBUFF_FEL_REAVER, BG_OBJECT_SPEED_BUFF_FEL_REAVER_EY_ENTRY, 2046.462646484375f, 1749.1666259765625f, 1190.010498046875f, 5.410521507263183593f, 0.0f, 0.0f, -0.42261791229248046f, 0.906307935714721679f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_REGENBUFF_FEL_REAVER, BG_OBJECT_RESTORATION_BUFF_FEL_REAVER_EY_ENTRY, 2046.462646484375f, 1749.1666259765625f, 1190.010498046875f, 5.410521507263183593f, 0.0f, 0.0f, -0.42261791229248046f, 0.906307935714721679f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_BERSERKBUFF_FEL_REAVER, BG_OBJECT_BERSERK_BUFF_FEL_REAVER_EY_ENTRY, 2046.462646484375f, 1749.1666259765625f, 1190.010498046875f, 5.410521507263183593f, 0.0f, 0.0f, -0.42261791229248046f, 0.906307935714721679f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_SPEEDBUFF_BLOOD_ELF, BG_OBJECT_SPEED_BUFF_BLOOD_ELF_EY_ENTRY, 2050.46826171875f, 1372.2020263671875f, 1194.5634765625f, 1.675513744354248046f, 0.0f, 0.0f, 0.743144035339355468f, 0.669131457805633544f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_REGENBUFF_BLOOD_ELF, BG_OBJECT_RESTORATION_BUFF_BLOOD_ELF_EY_ENTRY, 2050.46826171875f, 1372.2020263671875f, 1194.5634765625f, 1.675513744354248046f, 0.0f, 0.0f, 0.743144035339355468f, 0.669131457805633544f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_BERSERKBUFF_BLOOD_ELF, BG_OBJECT_BERSERK_BUFF_BLOOD_ELF_EY_ENTRY, 2050.46826171875f, 1372.2020263671875f, 1194.5634765625f, 1.675513744354248046f, 0.0f, 0.0f, 0.743144035339355468f, 0.669131457805633544f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_SPEEDBUFF_DRAENEI_RUINS, BG_OBJECT_SPEED_BUFF_DRAENEI_RUINS_EY_ENTRY, 2302.4765625f, 1391.244873046875f, 1197.7364501953125f, 1.762782454490661621f, 0.0f, 0.0f, 0.771624565124511718f, 0.636078238487243652f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_REGENBUFF_DRAENEI_RUINS, BG_OBJECT_RESTORATION_BUFF_DRAENEI_RUINS_EY_ENTRY, 2302.4765625f, 1391.244873046875f, 1197.7364501953125f, 1.762782454490661621f, 0.0f, 0.0f, 0.771624565124511718f, 0.636078238487243652f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_BERSERKBUFF_DRAENEI_RUINS, BG_OBJECT_BERSERK_BUFF_DRAENEI_RUINS_EY_ENTRY, 2302.4765625f, 1391.244873046875f, 1197.7364501953125f, 1.762782454490661621f, 0.0f, 0.0f, 0.771624565124511718f, 0.636078238487243652f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_SPEEDBUFF_MAGE_TOWER, BG_OBJECT_SPEED_BUFF_MAGE_TOWER_EY_ENTRY, 2283.7099609375f, 1748.8699951171875f, 1189.7071533203125f, 4.782202720642089843f, 0.0f, 0.0f, -0.68199825286865234f, 0.731353819370269775f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_REGENBUFF_MAGE_TOWER, BG_OBJECT_RESTORATION_BUFF_MAGE_TOWER_EY_ENTRY, 2283.7099609375f, 1748.8699951171875f, 1189.7071533203125f, 4.782202720642089843f, 0.0f, 0.0f, -0.68199825286865234f, 0.731353819370269775f, RESPAWN_ONE_DAY)
- || !AddObject(BG_EY_OBJECT_BERSERKBUFF_MAGE_TOWER, BG_OBJECT_BERSERK_BUFF_MAGE_TOWER_EY_ENTRY, 2283.7099609375f, 1748.8699951171875f, 1189.7071533203125f, 4.782202720642089843f, 0.0f, 0.0f, -0.68199825286865234f, 0.731353819370269775f, RESPAWN_ONE_DAY)
- )
- {
- TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn some objects. The battleground was not created.");
- return false;
- }
-
- WorldSafeLocsEntry const* sg = sObjectMgr->GetWorldSafeLoc(EY_GRAVEYARD_MAIN_ALLIANCE);
- if (!sg || !AddSpiritGuide(EY_SPIRIT_MAIN_ALLIANCE, sg->Loc.GetPositionX(), sg->Loc.GetPositionY(), sg->Loc.GetPositionZ(), 3.124139f, TEAM_ALLIANCE))
- {
- TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn spirit guide. The battleground was not created.");
- return false;
- }
-
- sg = sObjectMgr->GetWorldSafeLoc(EY_GRAVEYARD_MAIN_HORDE);
- if (!sg || !AddSpiritGuide(EY_SPIRIT_MAIN_HORDE, sg->Loc.GetPositionX(), sg->Loc.GetPositionY(), sg->Loc.GetPositionZ(), 3.193953f, TEAM_HORDE))
- {
- TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn spirit guide. The battleground was not created.");
- return false;
- }
-
UpdateWorldState(EY_MAX_RESOURCES, BG_EY_MAX_TEAM_SCORE);
- ControlZoneHandlers[BG_OBJECT_FR_TOWER_CAP_EY_ENTRY] = std::make_unique<BattlegroundEYControlZoneHandler>(this, FEL_REAVER);
- ControlZoneHandlers[BG_OBJECT_BE_TOWER_CAP_EY_ENTRY] = std::make_unique<BattlegroundEYControlZoneHandler>(this, BLOOD_ELF);
- ControlZoneHandlers[BG_OBJECT_DR_TOWER_CAP_EY_ENTRY] = std::make_unique<BattlegroundEYControlZoneHandler>(this, DRAENEI_RUINS);
- ControlZoneHandlers[BG_OBJECT_HU_TOWER_CAP_EY_ENTRY] = std::make_unique<BattlegroundEYControlZoneHandler>(this, MAGE_TOWER);
+ _controlZoneHandlers[BG_OBJECT_FR_TOWER_CAP_EY_ENTRY] = std::make_unique<BattlegroundEYControlZoneHandler>(this, FEL_REAVER);
+ _controlZoneHandlers[BG_OBJECT_BE_TOWER_CAP_EY_ENTRY] = std::make_unique<BattlegroundEYControlZoneHandler>(this, BLOOD_ELF);
+ _controlZoneHandlers[BG_OBJECT_DR_TOWER_CAP_EY_ENTRY] = std::make_unique<BattlegroundEYControlZoneHandler>(this, DRAENEI_RUINS);
+ _controlZoneHandlers[BG_OBJECT_HU_TOWER_CAP_EY_ENTRY] = std::make_unique<BattlegroundEYControlZoneHandler>(this, MAGE_TOWER);
return true;
}
@@ -399,60 +404,10 @@ void BattlegroundEY::Reset()
m_TeamScores[TEAM_ALLIANCE] = 0;
m_TeamScores[TEAM_HORDE] = 0;
- m_TeamPointsCount[TEAM_ALLIANCE] = 0;
- m_TeamPointsCount[TEAM_HORDE] = 0;
- m_HonorScoreTics[TEAM_ALLIANCE] = 0;
- m_HonorScoreTics[TEAM_HORDE] = 0;
- m_FlagState = BG_EY_FLAG_STATE_ON_BASE;
+ m_HonorScoreTics = { 0, 0 };
m_FlagCapturedBgObjectType = 0;
- m_FlagKeeper.Clear();
- m_DroppedFlagGUID.Clear();
- m_PointAddingTimer = 0;
- m_TowerCapCheckTimer = 0;
bool isBGWeekend = sBattlegroundMgr->IsBGWeekend(GetTypeID());
m_HonorTics = (isBGWeekend) ? BG_EY_EYWeekendHonorTicks : BG_EY_NotEYWeekendHonorTicks;
-
- for (uint8 i = 0; i < EY_POINTS_MAX; ++i)
- {
- m_PointOwnedByTeam[i] = EY_POINT_NO_OWNER;
- m_PointState[i] = EY_POINT_STATE_UNCONTROLLED;
- m_PointBarStatus[i] = BG_EY_PROGRESS_BAR_STATE_MIDDLE;
- m_PlayersNearPoint[i].clear();
- m_PlayersNearPoint[i].reserve(15); //tip size
- }
- m_PlayersNearPoint[EY_PLAYERS_OUT_OF_POINTS].clear();
- m_PlayersNearPoint[EY_PLAYERS_OUT_OF_POINTS].reserve(30);
-}
-
-void BattlegroundEY::RespawnFlag(bool send_message)
-{
- if (m_FlagCapturedBgObjectType > 0)
- SpawnBGObject(m_FlagCapturedBgObjectType, RESPAWN_ONE_DAY);
-
- m_FlagCapturedBgObjectType = 0;
- m_FlagState = BG_EY_FLAG_STATE_ON_BASE;
- SpawnBGObject(BG_EY_OBJECT_FLAG_NETHERSTORM, RESPAWN_IMMEDIATELY);
-
- if (send_message)
- {
- SendBroadcastText(BG_EY_TEXT_FLAG_RESET, CHAT_MSG_BG_SYSTEM_NEUTRAL);
- PlaySoundToAll(BG_EY_SOUND_FLAG_RESET); // flags respawned sound...
- }
-
- UpdateWorldState(NETHERSTORM_FLAG, 1);
-}
-
-void BattlegroundEY::RespawnFlagAfterDrop()
-{
- RespawnFlag(true);
-
- GameObject* obj = GetBgMap()->GetGameObject(GetDroppedFlagGUID());
- if (obj)
- obj->Delete();
- else
- TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Unknown dropped flag ({}).", GetDroppedFlagGUID().ToString());
-
- SetDroppedFlagGUID(ObjectGuid::Empty);
}
void BattlegroundEY::HandleKillPlayer(Player* player, Player* killer)
@@ -464,217 +419,38 @@ void BattlegroundEY::HandleKillPlayer(Player* player, Player* killer)
EventPlayerDroppedFlag(player);
}
-void BattlegroundEY::EventPlayerDroppedFlag(Player* player)
-{
- if (GetStatus() != STATUS_IN_PROGRESS)
- {
- // if not running, do not cast things at the dropper player, neither send unnecessary messages
- // just take off the aura
- if (IsFlagPickedup() && GetFlagPickerGUID() == player->GetGUID())
- {
- SetFlagPicker(ObjectGuid::Empty);
- player->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL);
- }
- return;
- }
-
- if (!IsFlagPickedup())
- return;
-
- if (GetFlagPickerGUID() != player->GetGUID())
- return;
-
- SetFlagPicker(ObjectGuid::Empty);
- player->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL);
- m_FlagState = BG_EY_FLAG_STATE_ON_GROUND;
- m_FlagsTimer = BG_EY_FLAG_RESPAWN_TIME;
- player->CastSpell(player, SPELL_RECENTLY_DROPPED_NEUTRAL_FLAG, true);
- player->CastSpell(player, BG_EY_PLAYER_DROPPED_FLAG_SPELL, true);
- //this does not work correctly :((it should remove flag carrier name)
- UpdateWorldState(NETHERSTORM_FLAG_STATE_HORDE, BG_EY_FLAG_STATE_WAIT_RESPAWN);
- UpdateWorldState(NETHERSTORM_FLAG_STATE_ALLIANCE, BG_EY_FLAG_STATE_WAIT_RESPAWN);
-
- if (GetPlayerTeam(player->GetGUID()) == ALLIANCE)
- SendBroadcastText(BG_EY_TEXT_FLAG_DROPPED, CHAT_MSG_BG_SYSTEM_ALLIANCE);
- else
- SendBroadcastText(BG_EY_TEXT_FLAG_DROPPED, CHAT_MSG_BG_SYSTEM_HORDE);
-}
-
-void BattlegroundEY::EventPlayerClickedOnFlag(Player* player, GameObject* target_obj)
-{
- if (GetStatus() != STATUS_IN_PROGRESS || IsFlagPickedup() || !player->IsWithinDistInMap(target_obj, 10))
- return;
-
- if (GetPlayerTeam(player->GetGUID()) == ALLIANCE)
- {
- UpdateWorldState(NETHERSTORM_FLAG_STATE_ALLIANCE, BG_EY_FLAG_STATE_ON_PLAYER);
- PlaySoundToAll(BG_EY_SOUND_FLAG_PICKED_UP_ALLIANCE);
- }
- else
- {
- UpdateWorldState(NETHERSTORM_FLAG_STATE_HORDE, BG_EY_FLAG_STATE_ON_PLAYER);
- PlaySoundToAll(BG_EY_SOUND_FLAG_PICKED_UP_HORDE);
- }
-
- if (m_FlagState == BG_EY_FLAG_STATE_ON_BASE)
- UpdateWorldState(NETHERSTORM_FLAG, 0);
- m_FlagState = BG_EY_FLAG_STATE_ON_PLAYER;
-
- SpawnBGObject(BG_EY_OBJECT_FLAG_NETHERSTORM, RESPAWN_ONE_DAY);
- SetFlagPicker(player->GetGUID());
- //get flag aura on player
- player->CastSpell(player, BG_EY_NETHERSTORM_FLAG_SPELL, true);
- player->RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags::PvPActive);
-
- if (GetPlayerTeam(player->GetGUID()) == ALLIANCE)
- SendBroadcastText(BG_EY_TEXT_TAKEN_FLAG, CHAT_MSG_BG_SYSTEM_ALLIANCE, player);
- else
- SendBroadcastText(BG_EY_TEXT_TAKEN_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, player);
-}
-
-void BattlegroundEY::EventTeamLostPoint(Team team, uint32 point, WorldObject* controlZone)
+void BattlegroundEY::EventTeamLostPoint(TeamId teamId, uint32 point, GameObject* controlZone)
{
- if (GetStatus() != STATUS_IN_PROGRESS)
- return;
-
- //Natural point
-
- if (!team)
- return;
-
- if (team == ALLIANCE)
+ if (teamId == TEAM_ALLIANCE)
{
- m_TeamPointsCount[TEAM_ALLIANCE]--;
- SpawnBGObject(m_LosingPointTypes[point].DespawnObjectTypeAlliance, RESPAWN_ONE_DAY);
- SpawnBGObject(m_LosingPointTypes[point].DespawnObjectTypeAlliance + 1, RESPAWN_ONE_DAY);
- SpawnBGObject(m_LosingPointTypes[point].DespawnObjectTypeAlliance + 2, RESPAWN_ONE_DAY);
- }
- else
- {
- m_TeamPointsCount[TEAM_HORDE]--;
- SpawnBGObject(m_LosingPointTypes[point].DespawnObjectTypeHorde, RESPAWN_ONE_DAY);
- SpawnBGObject(m_LosingPointTypes[point].DespawnObjectTypeHorde + 1, RESPAWN_ONE_DAY);
- SpawnBGObject(m_LosingPointTypes[point].DespawnObjectTypeHorde + 2, RESPAWN_ONE_DAY);
- }
-
- SpawnBGObject(m_LosingPointTypes[point].SpawnNeutralObjectType, RESPAWN_IMMEDIATELY);
- SpawnBGObject(m_LosingPointTypes[point].SpawnNeutralObjectType + 1, RESPAWN_IMMEDIATELY);
- SpawnBGObject(m_LosingPointTypes[point].SpawnNeutralObjectType + 2, RESPAWN_IMMEDIATELY);
-
- //buff isn't despawned
-
- m_PointOwnedByTeam[point] = EY_POINT_NO_OWNER;
- m_PointState[point] = EY_POINT_NO_OWNER;
-
- if (team == ALLIANCE)
SendBroadcastText(m_LosingPointTypes[point].MessageIdAlliance, CHAT_MSG_BG_SYSTEM_ALLIANCE, controlZone);
- else
- SendBroadcastText(m_LosingPointTypes[point].MessageIdHorde, CHAT_MSG_BG_SYSTEM_HORDE, controlZone);
-
- UpdatePointsIcons(team, point);
- UpdatePointsCount(team);
-
- //remove bonus honor aura trigger creature when node is lost
- DelCreature(point + 6);//NULL checks are in DelCreature! 0-5 spirit guides
-}
-
-void BattlegroundEY::EventTeamCapturedPoint(Team team, uint32 point, WorldObject* controlZone)
-{
- if (GetStatus() != STATUS_IN_PROGRESS)
- return;
-
- SpawnBGObject(m_CapturingPointTypes[point].DespawnNeutralObjectType, RESPAWN_ONE_DAY);
- SpawnBGObject(m_CapturingPointTypes[point].DespawnNeutralObjectType + 1, RESPAWN_ONE_DAY);
- SpawnBGObject(m_CapturingPointTypes[point].DespawnNeutralObjectType + 2, RESPAWN_ONE_DAY);
-
- if (team == ALLIANCE)
- {
- m_TeamPointsCount[TEAM_ALLIANCE]++;
- SpawnBGObject(m_CapturingPointTypes[point].SpawnObjectTypeAlliance, RESPAWN_IMMEDIATELY);
- SpawnBGObject(m_CapturingPointTypes[point].SpawnObjectTypeAlliance + 1, RESPAWN_IMMEDIATELY);
- SpawnBGObject(m_CapturingPointTypes[point].SpawnObjectTypeAlliance + 2, RESPAWN_IMMEDIATELY);
+ UpdateWorldState(m_PointsIconStruct[point].WorldStateAllianceControlledIndex, 0);
}
- else
+ else if (teamId == TEAM_HORDE)
{
- m_TeamPointsCount[TEAM_HORDE]++;
- SpawnBGObject(m_CapturingPointTypes[point].SpawnObjectTypeHorde, RESPAWN_IMMEDIATELY);
- SpawnBGObject(m_CapturingPointTypes[point].SpawnObjectTypeHorde + 1, RESPAWN_IMMEDIATELY);
- SpawnBGObject(m_CapturingPointTypes[point].SpawnObjectTypeHorde + 2, RESPAWN_IMMEDIATELY);
+ SendBroadcastText(m_LosingPointTypes[point].MessageIdHorde, CHAT_MSG_BG_SYSTEM_HORDE, controlZone);
+ UpdateWorldState(m_PointsIconStruct[point].WorldStateHordeControlledIndex, 0);
}
- //buff isn't respawned
-
- m_PointOwnedByTeam[point] = team;
- m_PointState[point] = EY_POINT_UNDER_CONTROL;
-
- if (team == ALLIANCE)
- SendBroadcastText(m_CapturingPointTypes[point].MessageIdAlliance, CHAT_MSG_BG_SYSTEM_ALLIANCE, controlZone);
- else
- SendBroadcastText(m_CapturingPointTypes[point].MessageIdHorde, CHAT_MSG_BG_SYSTEM_HORDE, controlZone);
-
- if (!BgCreatures[point].IsEmpty())
- DelCreature(point);
-
- WorldSafeLocsEntry const* sg = sObjectMgr->GetWorldSafeLoc(m_CapturingPointTypes[point].GraveyardId);
- if (!sg || !AddSpiritGuide(point, sg->Loc.GetPositionX(), sg->Loc.GetPositionY(), sg->Loc.GetPositionZ(), 3.124139f, GetTeamIndexByTeamId(team)))
- TC_LOG_ERROR("bg.battleground", "BatteGroundEY: Failed to spawn spirit guide. point: {}, team: {}, graveyard_id: {}",
- point, team, m_CapturingPointTypes[point].GraveyardId);
-
-// SpawnBGCreature(Point, RESPAWN_IMMEDIATELY);
-
- UpdatePointsIcons(team, point);
- UpdatePointsCount(team);
-
- Creature* trigger = GetBGCreature(point + 6, false);//0-5 spirit guides
- if (!trigger)
- trigger = AddCreature(WORLD_TRIGGER, point+6, BG_EY_TriggerPositions[point], GetTeamIndexByTeamId(team));
-
- //add bonus honor aura trigger creature when node is accupied
- //cast bonus aura (+50% honor in 25yards)
- //aura should only apply to players who have accupied the node, set correct faction for trigger
- if (trigger)
- {
- trigger->SetFaction(team == ALLIANCE ? FACTION_ALLIANCE_GENERIC : FACTION_HORDE_GENERIC);
- trigger->CastSpell(trigger, SPELL_HONORABLE_DEFENDER_25Y, false);
- }
+ UpdateWorldState(m_PointsIconStruct[point].WorldStateControlIndex, 1);
+ UpdatePointsCount(teamId);
}
-void BattlegroundEY::EventPlayerCapturedFlag(Player* player, uint32 BgObjectType)
+void BattlegroundEY::EventTeamCapturedPoint(TeamId teamId, uint32 point, GameObject* controlZone)
{
- if (GetStatus() != STATUS_IN_PROGRESS || GetFlagPickerGUID() != player->GetGUID())
- return;
-
- SetFlagPicker(ObjectGuid::Empty);
- m_FlagState = BG_EY_FLAG_STATE_WAIT_RESPAWN;
- player->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL);
-
- player->RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags::PvPActive);
-
- uint32 team = GetPlayerTeam(player->GetGUID());
- if (team == ALLIANCE)
+ if (teamId == TEAM_ALLIANCE)
{
- SendBroadcastText(BG_EY_TEXT_ALLIANCE_CAPTURED_FLAG, CHAT_MSG_BG_SYSTEM_ALLIANCE, player);
- PlaySoundToAll(BG_EY_SOUND_FLAG_CAPTURED_ALLIANCE);
+ SendBroadcastText(m_CapturingPointTypes[point].MessageIdAlliance, CHAT_MSG_BG_SYSTEM_ALLIANCE, controlZone);
+ UpdateWorldState(m_PointsIconStruct[point].WorldStateAllianceControlledIndex, 1);
}
- else
+ else if (teamId == TEAM_HORDE)
{
- SendBroadcastText(BG_EY_TEXT_HORDE_CAPTURED_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, player);
- PlaySoundToAll(BG_EY_SOUND_FLAG_CAPTURED_HORDE);
+ SendBroadcastText(m_CapturingPointTypes[point].MessageIdHorde, CHAT_MSG_BG_SYSTEM_HORDE, controlZone);
+ UpdateWorldState(m_PointsIconStruct[point].WorldStateHordeControlledIndex, 1);
}
- SpawnBGObject(BgObjectType, RESPAWN_IMMEDIATELY);
-
- m_FlagsTimer = BG_EY_FLAG_RESPAWN_TIME;
- m_FlagCapturedBgObjectType = BgObjectType;
-
- uint8 team_id = GetTeamIndexByTeamId(team);
- if (m_TeamPointsCount[team_id] > 0)
- AddPoints(team, BG_EY_FlagPoints[m_TeamPointsCount[team_id] - 1]);
-
- 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);
+ UpdateWorldState(m_PointsIconStruct[point].WorldStateControlIndex, 0);
+ UpdatePointsCount(teamId);
}
bool BattlegroundEY::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)
@@ -682,73 +458,10 @@ bool BattlegroundEY::UpdatePlayerScore(Player* player, uint32 type, uint32 value
if (!Battleground::UpdatePlayerScore(player, type, value, doAddHonor))
return false;
- switch (type)
- {
- case SCORE_FLAG_CAPTURES:
- player->UpdateCriteria(CriteriaType::TrackedWorldStateUIModified, EY_OBJECTIVE_CAPTURE_FLAG);
- break;
- default:
- break;
- }
- return true;
-}
-
-WorldSafeLocsEntry const* BattlegroundEY::GetClosestGraveyard(Player* player)
-{
- uint32 g_id = 0;
-
- uint32 team = GetPlayerTeam(player->GetGUID());
- switch (team)
- {
- case ALLIANCE: g_id = EY_GRAVEYARD_MAIN_ALLIANCE; break;
- case HORDE: g_id = EY_GRAVEYARD_MAIN_HORDE; break;
- default: return nullptr;
- }
-
- float distance, nearestDistance;
+ if (type == SCORE_FLAG_CAPTURES)
+ player->UpdateCriteria(CriteriaType::TrackedWorldStateUIModified, EY_OBJECTIVE_CAPTURE_FLAG);
- WorldSafeLocsEntry const* entry = nullptr;
- WorldSafeLocsEntry const* nearestEntry = nullptr;
- entry = sObjectMgr->GetWorldSafeLoc(g_id);
- nearestEntry = entry;
-
- if (!entry)
- {
- TC_LOG_ERROR("bg.battleground", "BattlegroundEY: The main team graveyard could not be found. The graveyard system will not be operational!");
- return nullptr;
- }
-
- float plr_x = player->GetPositionX();
- float plr_y = player->GetPositionY();
- float plr_z = player->GetPositionZ();
-
- distance = (entry->Loc.GetPositionX() - plr_x) * (entry->Loc.GetPositionX() - plr_x)
- + (entry->Loc.GetPositionY() - plr_y) * (entry->Loc.GetPositionY() - plr_y)
- + (entry->Loc.GetPositionZ() - plr_z) * (entry->Loc.GetPositionZ() - plr_z);
- nearestDistance = distance;
-
- for (uint8 i = 0; i < EY_POINTS_MAX; ++i)
- {
- if (m_PointOwnedByTeam[i] == team && m_PointState[i] == EY_POINT_UNDER_CONTROL)
- {
- entry = sObjectMgr->GetWorldSafeLoc(m_CapturingPointTypes[i].GraveyardId);
- if (!entry)
- TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Graveyard {} could not be found.", m_CapturingPointTypes[i].GraveyardId);
- else
- {
- distance = (entry->Loc.GetPositionX() - plr_x) * (entry->Loc.GetPositionX() - plr_x)
- + (entry->Loc.GetPositionY() - plr_y) * (entry->Loc.GetPositionY() - plr_y)
- + (entry->Loc.GetPositionZ() - plr_z) * (entry->Loc.GetPositionZ() - plr_z);
- if (distance < nearestDistance)
- {
- nearestDistance = distance;
- nearestEntry = entry;
- }
- }
- }
- }
-
- return nearestEntry;
+ return true;
}
WorldSafeLocsEntry const* BattlegroundEY::GetExploitTeleportLocation(Team team)
@@ -776,20 +489,12 @@ void BattlegroundEY::ProcessEvent(WorldObject* target, uint32 eventId, WorldObje
{
if (gameobject->GetGoType() == GAMEOBJECT_TYPE_CONTROL_ZONE)
{
- if (!ControlZoneHandlers.contains(gameobject->GetEntry()))
+ if (!_controlZoneHandlers.contains(gameobject->GetEntry()))
return;
auto controlzone = gameobject->GetGOInfo()->controlZone;
- BattlegroundEYControlZoneHandler& handler = *ControlZoneHandlers[invoker->GetEntry()];
- if (eventId == controlzone.CaptureEventAlliance)
- handler.HandleCaptureEventAlliance(gameobject);
- else if (eventId == controlzone.CaptureEventHorde)
- handler.HandleCaptureEventHorde(gameobject);
- else if (eventId == controlzone.ContestedEventAlliance)
- handler.HandleContestedEventAlliance(gameobject);
- else if (eventId == controlzone.ContestedEventHorde)
- handler.HandleContestedEventHorde(gameobject);
- else if (eventId == controlzone.NeutralEventAlliance)
+ BattlegroundEYControlZoneHandler& handler = *_controlZoneHandlers[invoker->GetEntry()];
+ if (eventId == controlzone.NeutralEventAlliance)
handler.HandleNeutralEventAlliance(gameobject);
else if (eventId == controlzone.NeutralEventHorde)
handler.HandleNeutralEventHorde(gameobject);
@@ -809,20 +514,20 @@ BattlegroundEYControlZoneHandler::BattlegroundEYControlZoneHandler(BattlegroundE
void BattlegroundEYControlZoneHandler::HandleProgressEventHorde(GameObject* controlZone)
{
- _battleground->EventTeamCapturedPoint(HORDE, _point, controlZone);
+ _battleground->EventTeamCapturedPoint(TEAM_HORDE, _point, controlZone);
}
void BattlegroundEYControlZoneHandler::HandleProgressEventAlliance(GameObject* controlZone)
{
- _battleground->EventTeamCapturedPoint(ALLIANCE, _point, controlZone);
+ _battleground->EventTeamCapturedPoint(TEAM_ALLIANCE, _point, controlZone);
}
void BattlegroundEYControlZoneHandler::HandleNeutralEventHorde(GameObject* controlZone)
{
- _battleground->EventTeamLostPoint(HORDE, _point, controlZone);
+ _battleground->EventTeamLostPoint(TEAM_HORDE, _point, controlZone);
}
void BattlegroundEYControlZoneHandler::HandleNeutralEventAlliance(GameObject* controlZone)
{
- _battleground->EventTeamLostPoint(ALLIANCE, _point, controlZone);
+ _battleground->EventTeamLostPoint(TEAM_ALLIANCE, _point, controlZone);
}
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
index 3b5576fc703..159fce83556 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
@@ -21,12 +21,15 @@
#include "Battleground.h"
#include "BattlegroundScore.h"
#include "Object.h"
+#include "Timer.h"
+
+static constexpr Seconds POINTS_TICK_TIME = 2s;
+static constexpr Seconds BG_EY_FLAG_ASSAULT_TIMER = 30s;
+static constexpr uint16 BG_EY_FLAG_BRUTAL_ASSAULT_STACK_COUNT = 5;
enum BG_EY_Misc
{
- BG_EY_EVENT_START_BATTLE = 13180, // Achievement: Flurry
- BG_EY_FLAG_RESPAWN_TIME = (8*IN_MILLISECONDS),
- BG_EY_FPOINTS_TICK_TIME = (2*IN_MILLISECONDS)
+ BG_EY_EVENT_START_BATTLE = 13180 // Achievement: Flurry
};
enum BG_EY_WorldStates
@@ -66,20 +69,6 @@ enum BG_EY_WorldStates
BLOOD_ELF_ALLIANCE_CONTROL_STATE = 17365,
};
-enum BG_EY_ProgressBarConsts
-{
- BG_EY_POINT_MAX_CAPTURERS_COUNT = 5,
- BG_EY_POINT_RADIUS = 70,
- BG_EY_PROGRESS_BAR_DONT_SHOW = 0,
- BG_EY_PROGRESS_BAR_SHOW = 1,
- BG_EY_PROGRESS_BAR_PERCENT_GREY = 40,
- BG_EY_PROGRESS_BAR_STATE_MIDDLE = 50,
- BG_EY_PROGRESS_BAR_HORDE_CONTROLLED = 0,
- BG_EY_PROGRESS_BAR_NEUTRAL_LOW = 30,
- BG_EY_PROGRESS_BAR_NEUTRAL_HIGH = 70,
- BG_EY_PROGRESS_BAR_ALI_CONTROLLED = 100
-};
-
enum BG_EY_Sounds
{
//strange ids, but sure about them
@@ -93,61 +82,32 @@ enum BG_EY_Sounds
enum BG_EY_Spells
{
BG_EY_NETHERSTORM_FLAG_SPELL = 34976,
- BG_EY_PLAYER_DROPPED_FLAG_SPELL = 34991
+ BG_EY_PLAYER_DROPPED_FLAG_SPELL = 34991,
+
+ // Focused/Brutal Assault
+ BG_EY_FOCUSED_ASSAULT_SPELL = 46392,
+ BG_EY_BRUTAL_ASSAULT_SPELL = 46393
};
enum EYBattlegroundObjectEntry
{
BG_OBJECT_A_DOOR_EY_ENTRY = 184719, //Alliance door
BG_OBJECT_H_DOOR_EY_ENTRY = 184720, //Horde door
- BG_OBJECT_FLAG1_EY_ENTRY = 184493, //Netherstorm flag (generic)
BG_OBJECT_FLAG2_EY_ENTRY = 208977, //Netherstorm flag (flagstand)
- BG_OBJECT_A_BANNER_EY_ENTRY = 184381, //Visual Banner (Alliance)
- BG_OBJECT_H_BANNER_EY_ENTRY = 184380, //Visual Banner (Horde)
- BG_OBJECT_N_BANNER_EY_ENTRY = 184382, //Visual Banner (Neutral)
BG_OBJECT_BE_TOWER_CAP_EY_ENTRY = 184080, //BE Tower Cap Pt
BG_OBJECT_FR_TOWER_CAP_EY_ENTRY = 184081, //Fel Reaver Cap Pt
BG_OBJECT_HU_TOWER_CAP_EY_ENTRY = 184082, //Human Tower Cap Pt
BG_OBJECT_DR_TOWER_CAP_EY_ENTRY = 184083, //Draenei Tower Cap Pt
- BG_OBJECT_SPEED_BUFF_FEL_REAVER_EY_ENTRY = 184970,
- BG_OBJECT_RESTORATION_BUFF_FEL_REAVER_EY_ENTRY = 184971,
- BG_OBJECT_BERSERK_BUFF_FEL_REAVER_EY_ENTRY = 184972,
- BG_OBJECT_SPEED_BUFF_BLOOD_ELF_EY_ENTRY = 184964,
- BG_OBJECT_RESTORATION_BUFF_BLOOD_ELF_EY_ENTRY = 184965,
- BG_OBJECT_BERSERK_BUFF_BLOOD_ELF_EY_ENTRY = 184966,
- BG_OBJECT_SPEED_BUFF_DRAENEI_RUINS_EY_ENTRY = 184976,
- BG_OBJECT_RESTORATION_BUFF_DRAENEI_RUINS_EY_ENTRY = 184977,
- BG_OBJECT_BERSERK_BUFF_DRAENEI_RUINS_EY_ENTRY = 184978,
- BG_OBJECT_SPEED_BUFF_MAGE_TOWER_EY_ENTRY = 184973,
- BG_OBJECT_RESTORATION_BUFF_MAGE_TOWER_EY_ENTRY = 184974,
- BG_OBJECT_BERSERK_BUFF_MAGE_TOWER_EY_ENTRY = 184975,
};
enum EYBattlegroundPointsTrigger
{
- TR_BLOOD_ELF_POINT = 4476,
- TR_FEL_REAVER_POINT = 4514,
- TR_MAGE_TOWER_POINT = 4516,
- TR_DRAENEI_RUINS_POINT = 4518,
- TR_BLOOD_ELF_BUFF = 4568,
- TR_FEL_REAVER_BUFF = 4569,
- TR_MAGE_TOWER_BUFF = 4570,
- TR_DRAENEI_RUINS_BUFF = 4571
-};
-
-enum EYBattlegroundGaveyards
-{
- EY_GRAVEYARD_MAIN_ALLIANCE = 1103,
- EY_GRAVEYARD_MAIN_HORDE = 1104,
- EY_GRAVEYARD_FEL_REAVER = 1105,
- EY_GRAVEYARD_BLOOD_ELF = 1106,
- EY_GRAVEYARD_DRAENEI_RUINS = 1107,
- EY_GRAVEYARD_MAGE_TOWER = 1108
+ AREATRIGGER_CAPTURE_FLAG = 33
};
enum EYBattlegroundPoints
{
- FEL_REAVER = 0,
+ FEL_REAVER = 0,
BLOOD_ELF = 1,
DRAENEI_RUINS = 2,
MAGE_TOWER = 3,
@@ -156,94 +116,12 @@ enum EYBattlegroundPoints
EY_POINTS_MAX = 4
};
-enum EYBattlegroundCreaturesTypes
-{
- EY_SPIRIT_FEL_REAVER = 0,
- EY_SPIRIT_BLOOD_ELF = 1,
- EY_SPIRIT_DRAENEI_RUINS = 2,
- EY_SPIRIT_MAGE_TOWER = 3,
- EY_SPIRIT_MAIN_ALLIANCE = 4,
- EY_SPIRIT_MAIN_HORDE = 5,
-
- EY_TRIGGER_FEL_REAVER = 6,
- EY_TRIGGER_BLOOD_ELF = 7,
- EY_TRIGGER_DRAENEI_RUINS = 8,
- EY_TRIGGER_MAGE_TOWER = 9,
-
- BG_EY_CREATURES_MAX = 10
-};
-
-enum EYBattlegroundObjectTypes
-{
- BG_EY_OBJECT_DOOR_A = 0,
- BG_EY_OBJECT_DOOR_H = 1,
- BG_EY_OBJECT_A_BANNER_FEL_REAVER_CENTER = 2,
- BG_EY_OBJECT_A_BANNER_FEL_REAVER_LEFT = 3,
- BG_EY_OBJECT_A_BANNER_FEL_REAVER_RIGHT = 4,
- BG_EY_OBJECT_A_BANNER_BLOOD_ELF_CENTER = 5,
- BG_EY_OBJECT_A_BANNER_BLOOD_ELF_LEFT = 6,
- BG_EY_OBJECT_A_BANNER_BLOOD_ELF_RIGHT = 7,
- BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_CENTER = 8,
- BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_LEFT = 9,
- BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_RIGHT = 10,
- BG_EY_OBJECT_A_BANNER_MAGE_TOWER_CENTER = 11,
- BG_EY_OBJECT_A_BANNER_MAGE_TOWER_LEFT = 12,
- BG_EY_OBJECT_A_BANNER_MAGE_TOWER_RIGHT = 13,
- BG_EY_OBJECT_H_BANNER_FEL_REAVER_CENTER = 14,
- BG_EY_OBJECT_H_BANNER_FEL_REAVER_LEFT = 15,
- BG_EY_OBJECT_H_BANNER_FEL_REAVER_RIGHT = 16,
- BG_EY_OBJECT_H_BANNER_BLOOD_ELF_CENTER = 17,
- BG_EY_OBJECT_H_BANNER_BLOOD_ELF_LEFT = 18,
- BG_EY_OBJECT_H_BANNER_BLOOD_ELF_RIGHT = 19,
- BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_CENTER = 20,
- BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_LEFT = 21,
- BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_RIGHT = 22,
- BG_EY_OBJECT_H_BANNER_MAGE_TOWER_CENTER = 23,
- BG_EY_OBJECT_H_BANNER_MAGE_TOWER_LEFT = 24,
- BG_EY_OBJECT_H_BANNER_MAGE_TOWER_RIGHT = 25,
- BG_EY_OBJECT_N_BANNER_FEL_REAVER_CENTER = 26,
- BG_EY_OBJECT_N_BANNER_FEL_REAVER_LEFT = 27,
- BG_EY_OBJECT_N_BANNER_FEL_REAVER_RIGHT = 28,
- BG_EY_OBJECT_N_BANNER_BLOOD_ELF_CENTER = 29,
- BG_EY_OBJECT_N_BANNER_BLOOD_ELF_LEFT = 30,
- BG_EY_OBJECT_N_BANNER_BLOOD_ELF_RIGHT = 31,
- BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_CENTER = 32,
- BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_LEFT = 33,
- BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_RIGHT = 34,
- BG_EY_OBJECT_N_BANNER_MAGE_TOWER_CENTER = 35,
- BG_EY_OBJECT_N_BANNER_MAGE_TOWER_LEFT = 36,
- BG_EY_OBJECT_N_BANNER_MAGE_TOWER_RIGHT = 37,
- BG_EY_OBJECT_TOWER_CAP_FEL_REAVER = 38,
- BG_EY_OBJECT_TOWER_CAP_BLOOD_ELF = 39,
- BG_EY_OBJECT_TOWER_CAP_DRAENEI_RUINS = 40,
- BG_EY_OBJECT_TOWER_CAP_MAGE_TOWER = 41,
- BG_EY_OBJECT_FLAG_NETHERSTORM = 42,
- BG_EY_OBJECT_FLAG_FEL_REAVER = 43,
- BG_EY_OBJECT_FLAG_BLOOD_ELF = 44,
- BG_EY_OBJECT_FLAG_DRAENEI_RUINS = 45,
- BG_EY_OBJECT_FLAG_MAGE_TOWER = 46,
- //buffs
- BG_EY_OBJECT_SPEEDBUFF_FEL_REAVER = 47,
- BG_EY_OBJECT_REGENBUFF_FEL_REAVER = 48,
- BG_EY_OBJECT_BERSERKBUFF_FEL_REAVER = 49,
- BG_EY_OBJECT_SPEEDBUFF_BLOOD_ELF = 50,
- BG_EY_OBJECT_REGENBUFF_BLOOD_ELF = 51,
- BG_EY_OBJECT_BERSERKBUFF_BLOOD_ELF = 52,
- BG_EY_OBJECT_SPEEDBUFF_DRAENEI_RUINS = 53,
- BG_EY_OBJECT_REGENBUFF_DRAENEI_RUINS = 54,
- BG_EY_OBJECT_BERSERKBUFF_DRAENEI_RUINS = 55,
- BG_EY_OBJECT_SPEEDBUFF_MAGE_TOWER = 56,
- BG_EY_OBJECT_REGENBUFF_MAGE_TOWER = 57,
- BG_EY_OBJECT_BERSERKBUFF_MAGE_TOWER = 58,
- BG_EY_OBJECT_MAX = 59
-};
-
#define BG_EY_NotEYWeekendHonorTicks 260
#define BG_EY_EYWeekendHonorTicks 160
enum BG_EY_Score
{
- BG_EY_WARNING_NEAR_VICTORY_SCORE = 1400,
+ BG_EY_WARNING_NEAR_VICTORY_SCORE = 1200,
BG_EY_MAX_TEAM_SCORE = 1500
};
@@ -269,31 +147,31 @@ enum BG_EY_Objectives
enum BG_EY_ExploitTeleportLocations
{
- EY_EXPLOIT_TELEPORT_LOCATION_ALLIANCE = 3773,
- EY_EXPLOIT_TELEPORT_LOCATION_HORDE = 3772
+ EY_EXPLOIT_TELEPORT_LOCATION_ALLIANCE = 3773,
+ EY_EXPLOIT_TELEPORT_LOCATION_HORDE = 3772
};
enum BG_EY_BroadcastTexts
{
BG_EY_TEXT_ALLIANCE_TAKEN_FEL_REAVER_RUINS = 17828,
BG_EY_TEXT_HORDE_TAKEN_FEL_REAVER_RUINS = 17829,
- BG_EY_TEXT_ALLIANCE_LOST_FEL_REAVER_RUINS = 17835,
- BG_EY_TEXT_HORDE_LOST_FEL_REAVER_RUINS = 17836,
+ BG_EY_TEXT_ALLIANCE_LOST_FEL_REAVER_RUINS = 91961,
+ BG_EY_TEXT_HORDE_LOST_FEL_REAVER_RUINS = 91962,
BG_EY_TEXT_ALLIANCE_TAKEN_BLOOD_ELF_TOWER = 17819,
BG_EY_TEXT_HORDE_TAKEN_BLOOD_ELF_TOWER = 17823,
- BG_EY_TEXT_ALLIANCE_LOST_BLOOD_ELF_TOWER = 17831,
- BG_EY_TEXT_HORDE_LOST_BLOOD_ELF_TOWER = 17832,
+ BG_EY_TEXT_ALLIANCE_LOST_BLOOD_ELF_TOWER = 91957,
+ BG_EY_TEXT_HORDE_LOST_BLOOD_ELF_TOWER = 91958,
BG_EY_TEXT_ALLIANCE_TAKEN_DRAENEI_RUINS = 17827,
- BG_EY_TEXT_HORDE_TAKEN_DRAENEI_RUINS = 17826,
- BG_EY_TEXT_ALLIANCE_LOST_DRAENEI_RUINS = 17833,
- BG_EY_TEXT_HORDE_LOST_DRAENEI_RUINS = 17834,
+ BG_EY_TEXT_HORDE_TAKEN_DRAENEI_RUINS = 91917,
+ BG_EY_TEXT_ALLIANCE_LOST_DRAENEI_RUINS = 91959,
+ BG_EY_TEXT_HORDE_LOST_DRAENEI_RUINS = 91960,
BG_EY_TEXT_ALLIANCE_TAKEN_MAGE_TOWER = 17824,
BG_EY_TEXT_HORDE_TAKEN_MAGE_TOWER = 17825,
- BG_EY_TEXT_ALLIANCE_LOST_MAGE_TOWER = 17837,
- BG_EY_TEXT_HORDE_LOST_MAGE_TOWER = 17838,
+ BG_EY_TEXT_ALLIANCE_LOST_MAGE_TOWER = 91963,
+ BG_EY_TEXT_HORDE_LOST_MAGE_TOWER = 91964,
BG_EY_TEXT_TAKEN_FLAG = 18359,
BG_EY_TEXT_FLAG_DROPPED = 18361,
@@ -315,44 +193,24 @@ struct BattlegroundEYPointIconsStruct
uint32 WorldStateHordeStatusBarIcon;
};
-Position const BG_EY_TriggerPositions[EY_POINTS_MAX] =
-{
- {2044.28f, 1729.68f, 1189.96f, 0.017453f}, // FEL_REAVER center
- {2048.83f, 1393.65f, 1194.49f, 0.20944f}, // BLOOD_ELF center
- {2286.56f, 1402.36f, 1197.11f, 3.72381f}, // DRAENEI_RUINS center
- {2284.48f, 1731.23f, 1189.99f, 2.89725f} // MAGE_TOWER center
-};
-
struct BattlegroundEYLosingPointStruct
{
- BattlegroundEYLosingPointStruct(uint32 _SpawnNeutralObjectType, uint32 _DespawnObjectTypeAlliance, uint32 _MessageIdAlliance, uint32 _DespawnObjectTypeHorde, uint32 _MessageIdHorde)
- : SpawnNeutralObjectType(_SpawnNeutralObjectType),
- DespawnObjectTypeAlliance(_DespawnObjectTypeAlliance), MessageIdAlliance(_MessageIdAlliance),
- DespawnObjectTypeHorde(_DespawnObjectTypeHorde), MessageIdHorde(_MessageIdHorde)
+ BattlegroundEYLosingPointStruct(uint32 _MessageIdAlliance, uint32 _MessageIdHorde)
+ : MessageIdAlliance(_MessageIdAlliance), MessageIdHorde(_MessageIdHorde)
{ }
- uint32 SpawnNeutralObjectType;
- uint32 DespawnObjectTypeAlliance;
uint32 MessageIdAlliance;
- uint32 DespawnObjectTypeHorde;
uint32 MessageIdHorde;
};
struct BattlegroundEYCapturingPointStruct
{
- BattlegroundEYCapturingPointStruct(uint32 _DespawnNeutralObjectType, uint32 _SpawnObjectTypeAlliance, uint32 _MessageIdAlliance, uint32 _SpawnObjectTypeHorde, uint32 _MessageIdHorde, uint32 _GraveyardId)
- : DespawnNeutralObjectType(_DespawnNeutralObjectType),
- SpawnObjectTypeAlliance(_SpawnObjectTypeAlliance), MessageIdAlliance(_MessageIdAlliance),
- SpawnObjectTypeHorde(_SpawnObjectTypeHorde), MessageIdHorde(_MessageIdHorde),
- GraveyardId(_GraveyardId)
+ BattlegroundEYCapturingPointStruct(uint32 _MessageIdAlliance, uint32 _MessageIdHorde)
+ : MessageIdAlliance(_MessageIdAlliance), MessageIdHorde(_MessageIdHorde)
{ }
- uint32 DespawnNeutralObjectType;
- uint32 SpawnObjectTypeAlliance;
uint32 MessageIdAlliance;
- uint32 SpawnObjectTypeHorde;
uint32 MessageIdHorde;
- uint32 GraveyardId;
};
class BattlegroundEY;
@@ -367,35 +225,39 @@ public:
void HandleNeutralEventHorde(GameObject* controlZone) override;
void HandleNeutralEventAlliance(GameObject* controlZone) override;
+ uint32 GetPoint() const { return _point; }
+
private:
BattlegroundEY* _battleground;
uint32 _point;
};
-const uint8 BG_EY_TickPoints[EY_POINTS_MAX] = {1, 2, 5, 10};
-const uint32 BG_EY_FlagPoints[EY_POINTS_MAX] = {75, 85, 100, 500};
+const std::array<uint8, EY_POINTS_MAX> BG_EY_TickPoints = { 1, 2, 5, 10 };
+const std::array<uint32, EY_POINTS_MAX> BG_EY_FlagPoints = { 75, 85, 100, 500 };
//constant arrays:
-const BattlegroundEYPointIconsStruct m_PointsIconStruct[EY_POINTS_MAX] =
+const std::array<BattlegroundEYPointIconsStruct, EY_POINTS_MAX> m_PointsIconStruct =
{
BattlegroundEYPointIconsStruct(FEL_REAVER_UNCONTROL, FEL_REAVER_ALLIANCE_CONTROL, FEL_REAVER_HORDE_CONTROL, FEL_REAVER_ALLIANCE_CONTROL_STATE, FEL_REAVER_HORDE_CONTROL_STATE),
BattlegroundEYPointIconsStruct(BLOOD_ELF_UNCONTROL, BLOOD_ELF_ALLIANCE_CONTROL, BLOOD_ELF_HORDE_CONTROL, BLOOD_ELF_ALLIANCE_CONTROL_STATE, BLOOD_ELF_HORDE_CONTROL_STATE),
BattlegroundEYPointIconsStruct(DRAENEI_RUINS_UNCONTROL, DRAENEI_RUINS_ALLIANCE_CONTROL, DRAENEI_RUINS_HORDE_CONTROL, DRAENEI_RUINS_ALLIANCE_CONTROL_STATE, DRAENEI_RUINS_HORDE_CONTROL_STATE),
BattlegroundEYPointIconsStruct(MAGE_TOWER_UNCONTROL, MAGE_TOWER_ALLIANCE_CONTROL, MAGE_TOWER_HORDE_CONTROL, MAGE_TOWER_ALLIANCE_CONTROL_STATE, MAGE_TOWER_HORDE_CONTROL_STATE)
};
-const BattlegroundEYLosingPointStruct m_LosingPointTypes[EY_POINTS_MAX] =
+
+const std::array<BattlegroundEYLosingPointStruct, EY_POINTS_MAX> m_LosingPointTypes =
{
- BattlegroundEYLosingPointStruct(BG_EY_OBJECT_N_BANNER_FEL_REAVER_CENTER, BG_EY_OBJECT_A_BANNER_FEL_REAVER_CENTER, BG_EY_TEXT_ALLIANCE_LOST_FEL_REAVER_RUINS, BG_EY_OBJECT_H_BANNER_FEL_REAVER_CENTER, BG_EY_TEXT_HORDE_LOST_FEL_REAVER_RUINS),
- BattlegroundEYLosingPointStruct(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_CENTER, BG_EY_OBJECT_A_BANNER_BLOOD_ELF_CENTER, BG_EY_TEXT_ALLIANCE_LOST_BLOOD_ELF_TOWER, BG_EY_OBJECT_H_BANNER_BLOOD_ELF_CENTER, BG_EY_TEXT_HORDE_LOST_BLOOD_ELF_TOWER),
- BattlegroundEYLosingPointStruct(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_CENTER, BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_CENTER, BG_EY_TEXT_ALLIANCE_LOST_DRAENEI_RUINS, BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_CENTER, BG_EY_TEXT_HORDE_LOST_DRAENEI_RUINS),
- BattlegroundEYLosingPointStruct(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_CENTER, BG_EY_OBJECT_A_BANNER_MAGE_TOWER_CENTER, BG_EY_TEXT_ALLIANCE_LOST_MAGE_TOWER, BG_EY_OBJECT_H_BANNER_MAGE_TOWER_CENTER, BG_EY_TEXT_HORDE_LOST_MAGE_TOWER)
+ BattlegroundEYLosingPointStruct(BG_EY_TEXT_ALLIANCE_LOST_FEL_REAVER_RUINS, BG_EY_TEXT_HORDE_LOST_FEL_REAVER_RUINS),
+ BattlegroundEYLosingPointStruct(BG_EY_TEXT_ALLIANCE_LOST_BLOOD_ELF_TOWER, BG_EY_TEXT_HORDE_LOST_BLOOD_ELF_TOWER),
+ BattlegroundEYLosingPointStruct(BG_EY_TEXT_ALLIANCE_LOST_DRAENEI_RUINS, BG_EY_TEXT_HORDE_LOST_DRAENEI_RUINS),
+ BattlegroundEYLosingPointStruct(BG_EY_TEXT_ALLIANCE_LOST_MAGE_TOWER, BG_EY_TEXT_HORDE_LOST_MAGE_TOWER)
};
-const BattlegroundEYCapturingPointStruct m_CapturingPointTypes[EY_POINTS_MAX] =
+
+const std::array<BattlegroundEYCapturingPointStruct, EY_POINTS_MAX> m_CapturingPointTypes =
{
- BattlegroundEYCapturingPointStruct(BG_EY_OBJECT_N_BANNER_FEL_REAVER_CENTER, BG_EY_OBJECT_A_BANNER_FEL_REAVER_CENTER, BG_EY_TEXT_ALLIANCE_TAKEN_FEL_REAVER_RUINS, BG_EY_OBJECT_H_BANNER_FEL_REAVER_CENTER, BG_EY_TEXT_HORDE_TAKEN_FEL_REAVER_RUINS, EY_GRAVEYARD_FEL_REAVER),
- BattlegroundEYCapturingPointStruct(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_CENTER, BG_EY_OBJECT_A_BANNER_BLOOD_ELF_CENTER, BG_EY_TEXT_ALLIANCE_TAKEN_BLOOD_ELF_TOWER, BG_EY_OBJECT_H_BANNER_BLOOD_ELF_CENTER, BG_EY_TEXT_HORDE_TAKEN_BLOOD_ELF_TOWER, EY_GRAVEYARD_BLOOD_ELF),
- BattlegroundEYCapturingPointStruct(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_CENTER, BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_CENTER, BG_EY_TEXT_ALLIANCE_TAKEN_DRAENEI_RUINS, BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_CENTER, BG_EY_TEXT_HORDE_TAKEN_DRAENEI_RUINS, EY_GRAVEYARD_DRAENEI_RUINS),
- BattlegroundEYCapturingPointStruct(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_CENTER, BG_EY_OBJECT_A_BANNER_MAGE_TOWER_CENTER, BG_EY_TEXT_ALLIANCE_TAKEN_MAGE_TOWER, BG_EY_OBJECT_H_BANNER_MAGE_TOWER_CENTER, BG_EY_TEXT_HORDE_TAKEN_MAGE_TOWER, EY_GRAVEYARD_MAGE_TOWER)
+ BattlegroundEYCapturingPointStruct(BG_EY_TEXT_ALLIANCE_TAKEN_FEL_REAVER_RUINS, BG_EY_TEXT_HORDE_TAKEN_FEL_REAVER_RUINS),
+ BattlegroundEYCapturingPointStruct(BG_EY_TEXT_ALLIANCE_TAKEN_BLOOD_ELF_TOWER, BG_EY_TEXT_HORDE_TAKEN_BLOOD_ELF_TOWER),
+ BattlegroundEYCapturingPointStruct(BG_EY_TEXT_ALLIANCE_TAKEN_DRAENEI_RUINS, BG_EY_TEXT_HORDE_TAKEN_DRAENEI_RUINS),
+ BattlegroundEYCapturingPointStruct(BG_EY_TEXT_ALLIANCE_TAKEN_MAGE_TOWER, BG_EY_TEXT_HORDE_TAKEN_MAGE_TOWER)
};
struct BattlegroundEYScore final : public BattlegroundScore
@@ -438,44 +300,31 @@ class BattlegroundEY : public Battleground
/* inherited from BattlegroundClass */
void AddPlayer(Player* player, BattlegroundQueueTypeId queueId) override;
- void StartingEventCloseDoors() override;
void StartingEventOpenDoors() override;
- /* BG Flags */
- ObjectGuid GetFlagPickerGUID(int32 /*team*/ = -1) const override { return m_FlagKeeper; }
- void SetFlagPicker(ObjectGuid guid) { m_FlagKeeper = guid; }
- bool IsFlagPickedup() const { return !m_FlagKeeper.IsEmpty(); }
- uint8 GetFlagState() const { return m_FlagState; }
- void RespawnFlag(bool send_message);
- void RespawnFlagAfterDrop();
-
- void RemovePlayer(Player* player, ObjectGuid guid, uint32 team) override;
void HandleAreaTrigger(Player* source, uint32 trigger, bool entered) override;
void HandleKillPlayer(Player* player, Player* killer) override;
- WorldSafeLocsEntry const* GetClosestGraveyard(Player* player) override;
WorldSafeLocsEntry const* GetExploitTeleportLocation(Team team) override;
bool SetupBattleground() override;
void Reset() override;
void UpdateTeamScore(uint32 Team);
void EndBattleground(uint32 winner) override;
bool UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true) override;
- void SetDroppedFlagGUID(ObjectGuid guid, int32 /*TeamID*/ = -1) override { m_DroppedFlagGUID = guid; }
- ObjectGuid GetDroppedFlagGUID() const { return m_DroppedFlagGUID; }
-
- /* Battleground Events */
- void EventPlayerClickedOnFlag(Player* Source, GameObject* target_obj) override;
- void EventPlayerDroppedFlag(Player* Source) override;
uint32 GetPrematureWinner() override;
void ProcessEvent(WorldObject* target, uint32 eventId, WorldObject* invoker) override;
void PostUpdateImpl(uint32 diff) override;
- void EventPlayerCapturedFlag(Player* Source, uint32 BgObjectType);
- void EventTeamCapturedPoint(Team team, uint32 point, WorldObject* controlZone);
- void EventTeamLostPoint(Team team, uint32 point, WorldObject* controlZone);
- void UpdatePointsCount(uint32 Team);
- void UpdatePointsIcons(uint32 Team, uint32 Point);
+ void EventTeamCapturedPoint(TeamId teamId, uint32 point, GameObject* controlZone);
+ void EventTeamLostPoint(TeamId teamId, uint32 point, GameObject* controlZone);
+ void UpdatePointsCount(TeamId teamId);
+
+ void OnGameObjectCreate(GameObject* gameObject) override;
+
+ bool CanCaptureFlag([[maybe_unused]] AreaTrigger* areaTrigger, [[maybe_unused]] Player* player) override;
+ void OnCaptureFlag([[maybe_unused]] AreaTrigger* areaTrigger, [[maybe_unused]] Player* player) override;
+ void OnFlagStateChange(GameObject* flagInBase, FlagState oldValue, FlagState newValue, Player* player) override;
private:
/* Scorekeeping */
@@ -483,30 +332,28 @@ class BattlegroundEY : public Battleground
void RemovePoint(uint32 TeamID, uint32 Points = 1) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] -= Points; }
void SetTeamPoint(uint32 TeamID, uint32 Points = 0) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] = Points; }
- BattlegroundPointCaptureStatus GetPointCaptureStatus(uint32 point) const;
- uint32 m_HonorScoreTics[2];
- uint32 m_TeamPointsCount[2];
+ uint8 GetControlledBaseCount(TeamId teamId) const;
- uint32 m_Points_Trigger[EY_POINTS_MAX];
+ std::array<uint32, PVP_TEAMS_COUNT> m_HonorScoreTics;
- ObjectGuid m_FlagKeeper; // keepers guid
- ObjectGuid m_DroppedFlagGUID;
uint32 m_FlagCapturedBgObjectType; // type that should be despawned when flag is captured
- uint8 m_FlagState; // for checking flag state
- int32 m_FlagsTimer;
- int32 m_TowerCapCheckTimer;
-
- uint32 m_PointOwnedByTeam[EY_POINTS_MAX];
- uint8 m_PointState[EY_POINTS_MAX];
- int32 m_PointBarStatus[EY_POINTS_MAX];
- BattlegroundPointCaptureStatus m_LastPointCaptureStatus[EY_POINTS_MAX];
- GuidVector m_PlayersNearPoint[EY_POINTS_MAX + 1];
- uint8 m_CurrentPointPlayersCount[2*EY_POINTS_MAX];
-
- int32 m_PointAddingTimer;
+
+ TimeTracker _pointsTimer;
uint32 m_HonorTics;
- std::unordered_map<uint32, std::unique_ptr<BattlegroundEYControlZoneHandler>> ControlZoneHandlers;
+ std::unordered_map<uint32, std::unique_ptr<BattlegroundEYControlZoneHandler>> _controlZoneHandlers;
+ GuidUnorderedSet _doorGUIDs;
+ ObjectGuid _flagGUID;
+
+ // Focused/Brutal Assault
+ bool _assaultEnabled;
+ TimeTracker _flagAssaultTimer;
+ uint16 _assaultStackCount;
+
+ void DoForFlagKeepers(std::function<void(Player*)> action) const;
+ void ResetAssaultDebuff();
+ void ApplyAssaultDebuffToPlayer(Player* player);
+ void RemoveAssaultDebuffFromPlayer(Player* player);
};
#endif
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 1fd65ec5199..5e8d9c56732 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -2052,8 +2052,6 @@ SpellCastResult SpellInfo::CheckLocation(uint32 map_id, uint32 zone_id, uint32 a
case 23333: // Warsong Flag
case 23335: // Silverwing Flag
return map_id == 489 && player && player->InBattleground() ? SPELL_CAST_OK : SPELL_FAILED_REQUIRES_AREA;
- case 34976: // Netherstorm Flag
- return map_id == 566 && player && player->InBattleground() ? SPELL_CAST_OK : SPELL_FAILED_REQUIRES_AREA;
case 2584: // Waiting to Resurrect
case 42792: // Recently Dropped Flag
case 43681: // Inactive