diff options
author | ModoX <moardox@gmail.com> | 2025-05-10 18:49:25 +0200 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2025-05-11 11:47:13 +0200 |
commit | fdedb23b56b4d9bcc5f6930ea2110e963bf902f6 (patch) | |
tree | fb1399f4219ad41ee089be3333f763d1c035d44b /src | |
parent | f55d6c5fa0147eaea0a8fca316d93fd0b75d8b51 (diff) |
Core/AreaTrigger: Implement AreaTriggerActionSetFlag::DontDespawnWithCreator (#30832)
(cherry picked from commit c40b6e0b3f1882a9fce8dfd103be4291ca986851)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/DataStores/DBCEnums.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 13 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 9 |
3 files changed, 18 insertions, 6 deletions
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index fdd3562ef53..e241b4b66d4 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -191,7 +191,7 @@ enum class AreaTriggerActionSetFlag : uint32 CreatorsPartyOnly = 0x0100, DontRunOnLeaveWhenExpiring = 0x0200, /*NYI*/ CanAffectUninteractible = 0x0400, - DontDespawnWithCreator = 0x0800, /*NYI*/ + DontDespawnWithCreator = 0x0800, CanAffectBeastmaster = 0x1000, // Can affect GMs RequiresLineOfSight = 0x2000 /*NYI*/ }; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 3ca60e94320..642c68e937c 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -5435,10 +5435,15 @@ void Unit::RemoveAreaTrigger(AuraEffect const* aurEff) } } -void Unit::RemoveAllAreaTriggers() +void Unit::RemoveAllAreaTriggers(AreaTriggerRemoveReason reason /*= AreaTriggerRemoveReason::Default*/) { - while (!m_areaTrigger.empty()) - m_areaTrigger.back()->Remove(); + for (AreaTrigger* at : AreaTriggerList(std::move(m_areaTrigger))) + { + if (reason == AreaTriggerRemoveReason::UnitDespawn && at->GetTemplate()->ActionSetFlags.HasFlag(AreaTriggerActionSetFlag::DontDespawnWithCreator)) + continue; + + at->Remove(); + } } void Unit::SendSpellNonMeleeDamageLog(SpellNonMeleeDamage const* log) @@ -9905,7 +9910,7 @@ void Unit::RemoveFromWorld() RemoveAllGameObjects(); RemoveAllDynObjects(); - RemoveAllAreaTriggers(); + RemoveAllAreaTriggers(AreaTriggerRemoveReason::UnitDespawn); ExitVehicle(); // Remove applied auras with SPELL_AURA_CONTROL_VEHICLE UnsummonAllTotems(); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 1804a8cfb19..f579d8e9b8e 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1613,9 +1613,16 @@ class TC_GAME_API Unit : public WorldObject void _UnregisterAreaTrigger(AreaTrigger* areaTrigger); AreaTrigger* GetAreaTrigger(uint32 spellId) const; std::vector<AreaTrigger*> GetAreaTriggers(uint32 spellId) const; + + enum class AreaTriggerRemoveReason : uint8 + { + Default, + UnitDespawn + }; + void RemoveAreaTrigger(uint32 spellId); void RemoveAreaTrigger(AuraEffect const* aurEff); - void RemoveAllAreaTriggers(); + void RemoveAllAreaTriggers(AreaTriggerRemoveReason reason = AreaTriggerRemoveReason::Default); void ModifyAuraState(AuraStateType flag, bool apply); uint32 BuildAuraStateUpdateForTarget(Unit const* target) const; |