aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/DataStores/DBCEnums.h2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp13
-rw-r--r--src/server/game/Entities/Unit/Unit.h9
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;