From de23266f04e549e363df6bf89281364d382669a3 Mon Sep 17 00:00:00 2001 From: Axel Cocat Date: Mon, 3 May 2021 13:14:22 +0200 Subject: [PATCH] fix(Core/Battlegrounds): fix Warsong Gulch flags not capping when standing on capture area (#5482) * fix(Core/Battlegrounds): fix Warsong Gulch flags not capping when standing on capture area * Added BG_WS_Trigger enum * add missing brackets --- .../Battlegrounds/Zones/BattlegroundWS.cpp | 40 +++++++++++++++---- .../game/Battlegrounds/Zones/BattlegroundWS.h | 16 ++++++++ 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp index 3399feb48..f7907b735 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp @@ -142,6 +142,26 @@ void BattlegroundWS::RespawnFlagAfterDrop(TeamId teamId) _bgEvents.CancelEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT10); _bgEvents.CancelEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT15); RemoveAssaultAuras(); + + CheckFlagKeeperInArea(teamId == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE); +} + +void BattlegroundWS::CheckFlagKeeperInArea(TeamId teamId) +{ + if (GetStatus() != STATUS_IN_PROGRESS || GetFlagState(teamId) != BG_WS_FLAG_STATE_ON_PLAYER) + { + return; + } + + uint32 triggerId = teamId == TEAM_ALLIANCE ? BG_WS_TRIGGER_HORDE_FLAG_SPAWN : BG_WS_TRIGGER_ALLIANCE_FLAG_SPAWN; + AreaTrigger const* areaTrigger = sObjectMgr->GetAreaTrigger(triggerId); + if (Player* player = ObjectAccessor::GetPlayer(FindBgMap(), GetFlagPickerGUID(teamId))) + { + if (areaTrigger && player->IsInAreaTriggerRadius(areaTrigger)) + { + HandleAreaTrigger(player, triggerId); + } + } } void BattlegroundWS::EventPlayerCapturedFlag(Player* player) @@ -287,6 +307,8 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* player, GameObject* gameOb _bgEvents.CancelEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT10); _bgEvents.CancelEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT15); RemoveAssaultAuras(); + + CheckFlagKeeperInArea(TEAM_HORDE); return; } else @@ -318,6 +340,8 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* player, GameObject* gameOb _bgEvents.CancelEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT10); _bgEvents.CancelEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT15); RemoveAssaultAuras(); + + CheckFlagKeeperInArea(TEAM_ALLIANCE); return; } else @@ -354,11 +378,11 @@ void BattlegroundWS::HandleAreaTrigger(Player* player, uint32 trigger) switch (trigger) { - case 3646: // Alliance Flag spawn + case BG_WS_TRIGGER_ALLIANCE_FLAG_SPAWN: // Alliance Flag spawn if (GetFlagState(TEAM_ALLIANCE) == BG_WS_FLAG_STATE_ON_BASE && GetFlagPickerGUID(TEAM_HORDE) == player->GetGUID()) EventPlayerCapturedFlag(player); break; - case 3647: // Horde Flag spawn + case BG_WS_TRIGGER_HORDE_FLAG_SPAWN: // Horde Flag spawn if (GetFlagState(TEAM_HORDE) == BG_WS_FLAG_STATE_ON_BASE && GetFlagPickerGUID(TEAM_ALLIANCE) == player->GetGUID()) EventPlayerCapturedFlag(player); break; @@ -366,12 +390,12 @@ void BattlegroundWS::HandleAreaTrigger(Player* player, uint32 trigger) case 3688: // Not used case 4628: // Not used case 4629: // Not used - case 3686: // Alliance elixir of speed spawn - case 3687: // Horde elixir of speed spawn - case 3706: // Alliance elixir of regeneration spawn - case 3708: // Horde elixir of regeneration spawn - case 3707: // Alliance elixir of berserk spawn - case 3709: // Horde elixir of berserk spawn + case BG_WS_TRIGGER_ALLIANCE_ELIXIR_SPEED_SPAWN: // Alliance elixir of speed spawn + case BG_WS_TRIGGER_HORDE_ELIXIR_SPEED_SPAWN: // Horde elixir of speed spawn + case BG_WS_TRIGGER_ALLIANCE_ELIXIR_REGEN_SPAWN: // Alliance elixir of regeneration spawn + case BG_WS_TRIGGER_HORDE_ELIXIR_REGEN_SPAWN: // Horde elixir of regeneration spawn + case BG_WS_TRIGGER_ALLIANCE_ELIXIR_BERSERK_SPAWN: // Alliance elixir of berserk spawn + case BG_WS_TRIGGER_HORDE_ELIXIR_BERSERK_SPAWN: // Horde elixir of berserk spawn break; } } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h index 31c55431c..46f9d91dd 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h @@ -135,6 +135,21 @@ enum BG_WS_Objectives WS_EVENT_START_BATTLE = 8563 }; +enum BG_WS_Trigger +{ + BG_WS_TRIGGER_ALLIANCE_FLAG_SPAWN = 3646, + BG_WS_TRIGGER_HORDE_FLAG_SPAWN = 3647, + + BG_WS_TRIGGER_ALLIANCE_ELIXIR_SPEED_SPAWN = 3686, + BG_WS_TRIGGER_HORDE_ELIXIR_SPEED_SPAWN = 3687, + + BG_WS_TRIGGER_ALLIANCE_ELIXIR_REGEN_SPAWN = 3706, + BG_WS_TRIGGER_HORDE_ELIXIR_REGEN_SPAWN = 3708, + + BG_WS_TRIGGER_ALLIANCE_ELIXIR_BERSERK_SPAWN = 3707, + BG_WS_TRIGGER_HORDE_ELIXIR_BERSERK_SPAWN = 3709, +}; + struct BattlegroundWGScore : public BattlegroundScore { BattlegroundWGScore(Player* player): BattlegroundScore(player), FlagCaptures(0), FlagReturns(0) { } @@ -163,6 +178,7 @@ public: void SetFlagPicker(ObjectGuid guid, TeamId teamId) { _flagKeepers[teamId] = guid; } void RespawnFlagAfterDrop(TeamId teamId); uint8 GetFlagState(TeamId teamId) const { return _flagState[teamId]; } + void CheckFlagKeeperInArea(TeamId teamId); /* Battleground Events */ void EventPlayerDroppedFlag(Player* player) override;