From fdedb23b56b4d9bcc5f6930ea2110e963bf902f6 Mon Sep 17 00:00:00 2001 From: ModoX Date: Sat, 10 May 2025 18:49:25 +0200 Subject: Core/AreaTrigger: Implement AreaTriggerActionSetFlag::DontDespawnWithCreator (#30832) (cherry picked from commit c40b6e0b3f1882a9fce8dfd103be4291ca986851) --- src/server/game/DataStores/DBCEnums.h | 2 +- src/server/game/Entities/Unit/Unit.cpp | 13 +++++++++---- src/server/game/Entities/Unit/Unit.h | 9 ++++++++- 3 files changed, 18 insertions(+), 6 deletions(-) (limited to 'src') 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 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; -- cgit v1.2.3