diff options
Diffstat (limited to 'src/server')
| -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  | 
