aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTeleqraph <nyrdeveloper@gmail.com>2023-05-06 20:56:01 +0200
committerGitHub <noreply@github.com>2023-05-06 20:56:01 +0200
commit15135ce16f76d1635fa5606c99822b60bced94bf (patch)
tree8a5bd8698595338fd0af7a30a9857932351fc5e8
parentca66da1c97acaff18b318b3e856d54127cb96a6b (diff)
Core/Auras: Implement SpellAuraInterruptFlags2::StartOfEncounter (#28938)
Co-authored-by: Shauren <shauren.trinity@gmail.com>
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp4
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp8
-rw-r--r--src/server/game/Entities/Unit/Unit.h3
-rw-r--r--src/server/game/Instances/InstanceScript.cpp3
-rw-r--r--src/server/game/Spells/SpellDefines.h2
5 files changed, 17 insertions, 3 deletions
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