From 15135ce16f76d1635fa5606c99822b60bced94bf Mon Sep 17 00:00:00 2001 From: Teleqraph Date: Sat, 6 May 2023 20:56:01 +0200 Subject: Core/Auras: Implement SpellAuraInterruptFlags2::StartOfEncounter (#28938) Co-authored-by: Shauren --- src/server/game/Battlegrounds/Battleground.cpp | 4 ++++ src/server/game/Entities/Unit/Unit.cpp | 8 ++++++++ src/server/game/Entities/Unit/Unit.h | 3 +++ src/server/game/Instances/InstanceScript.cpp | 3 +-- src/server/game/Spells/SpellDefines.h | 2 +- 5 files changed, 17 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index a8a94b88733..21ca45d99db 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -481,6 +481,10 @@ inline void Battleground::_ProcessJoin(uint32 diff) SetStatus(STATUS_IN_PROGRESS); SetStartDelayTime(StartDelayTimes[BG_STARTING_EVENT_FOURTH]); + for (auto const& [guid, _] : GetPlayers()) + if (Player* player = ObjectAccessor::FindPlayer(guid)) + player->AtStartOfEncounter(); + // Remove preparation if (isArena()) { diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 502186b35d8..e4e24b34ce4 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -536,6 +536,14 @@ void Unit::MonsterMoveWithSpeed(float x, float y, float z, float speed, bool gen GetMotionMaster()->LaunchMoveSpline(std::move(initializer), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); } +void Unit::AtStartOfEncounter() +{ + RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags2::StartOfEncounter); + + if (IsAlive()) + Unit::ProcSkillsAndAuras(this, nullptr, PROC_FLAG_ENCOUNTER_START, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_NONE, PROC_HIT_NONE, nullptr, nullptr, nullptr); +} + void Unit::UpdateSplineMovement(uint32 t_diff) { if (movespline->Finalized()) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 9fcb05b9ab1..e48e920f056 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -2017,6 +2017,9 @@ class TC_GAME_API Unit : public WorldObject virtual void AtEngage(Unit* /*target*/) {} virtual void AtDisengage() {} + public: + void AtStartOfEncounter(); + private: void UpdateSplineMovement(uint32 t_diff); diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index b261e31d7aa..9abe63e469f 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -409,8 +409,7 @@ bool InstanceScript::SetBossState(uint32 id, EncounterState state) instance->DoOnPlayers([](Player* player) { - if (player->IsAlive()) - Unit::ProcSkillsAndAuras(player, nullptr, PROC_FLAG_ENCOUNTER_START, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_NONE, PROC_HIT_NONE, nullptr, nullptr, nullptr); + player->AtStartOfEncounter(); }); break; } diff --git a/src/server/game/Spells/SpellDefines.h b/src/server/game/Spells/SpellDefines.h index aceff5a7ccd..0af891cbdb3 100644 --- a/src/server/game/Spells/SpellDefines.h +++ b/src/server/game/Spells/SpellDefines.h @@ -124,7 +124,7 @@ enum class SpellAuraInterruptFlags2 : uint32 Jump = 0x00000020, ChangeSpec = 0x00000040, AbandonVehicle = 0x00000080, // Implemented in Unit::_ExitVehicle - StartOfEncounter = 0x00000100, // NYI + StartOfEncounter = 0x00000100, // Implemented in InstanceScript::SetBossState and Battleground::_ProcessJoin EndOfEncounter = 0x00000200, // NYI Disconnect = 0x00000400, // NYI EnteringInstance = 0x00000800, // Implemented in Map::AddPlayerToMap -- cgit v1.2.3