diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp | 803 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Zones/BattlegroundEY.h | 297 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 2 |
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 |