diff options
-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; |