aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp3
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.h6
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp14
-rw-r--r--src/server/game/Entities/Unit/Unit.h1
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp4
5 files changed, 24 insertions, 4 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
index 555a3aa581f..56b3ac259e6 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
@@ -74,9 +74,10 @@ void AreaTrigger::RemoveFromWorld()
}
}
-bool AreaTrigger::CreateAreaTrigger(uint32 spellMiscId, Unit* caster, Unit* target, SpellInfo const* spell, Position const& pos, int32 duration, uint32 spellXSpellVisualId, ObjectGuid const& castId /*= ObjectGuid::Empty*/)
+bool AreaTrigger::CreateAreaTrigger(uint32 spellMiscId, Unit* caster, Unit* target, SpellInfo const* spell, Position const& pos, int32 duration, uint32 spellXSpellVisualId, ObjectGuid const& castId /*= ObjectGuid::Empty*/, AuraEffect const* aurEff)
{
_targetGuid = target ? target->GetGUID() : ObjectGuid::Empty;
+ _aurEff = aurEff;
SetMap(caster->GetMap());
Relocate(pos);
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.h b/src/server/game/Entities/AreaTrigger/AreaTrigger.h
index 1b6bf9952b6..f1284754600 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.h
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h
@@ -27,6 +27,7 @@ class AreaTriggerMiscTemplate;
class SpellInfo;
class Unit;
class AreaTriggerAI;
+class AuraEffect;
struct AreaTriggerPolygonVertice;
@@ -44,11 +45,12 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge
AreaTriggerAI* AI() { return _ai.get(); }
- bool CreateAreaTrigger(uint32 triggerEntry, Unit* caster, Unit* target, SpellInfo const* spell, Position const& pos, int32 duration, uint32 spellXSpellVisualId, ObjectGuid const& castId = ObjectGuid::Empty);
+ bool CreateAreaTrigger(uint32 triggerEntry, Unit* caster, Unit* target, SpellInfo const* spell, Position const& pos, int32 duration, uint32 spellXSpellVisualId, ObjectGuid const& castId = ObjectGuid::Empty, AuraEffect const* aurEff = nullptr);
void Update(uint32 p_time) override;
void Remove();
bool IsRemoved() const { return _isRemoved; }
uint32 GetSpellId() const { return GetUInt32Value(AREATRIGGER_SPELLID); }
+ AuraEffect const* GetAuraEffect() const { return _aurEff; }
uint32 GetTimeSinceCreated() const { return _timeSinceCreated; }
uint32 GetTimeToTarget() const { return GetUInt32Value(AREATRIGGER_TIME_TO_TARGET); }
uint32 GetTimeToTargetScale() const { return GetUInt32Value(AREATRIGGER_TIME_TO_TARGET_SCALE); }
@@ -99,6 +101,8 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge
ObjectGuid _targetGuid;
+ AuraEffect const* _aurEff;
+
int32 _duration;
int32 _totalDuration;
uint32 _timeSinceCreated;
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 2fb733523c5..1bf845f750d 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -5010,6 +5010,20 @@ void Unit::RemoveAreaTrigger(uint32 spellId)
}
}
+void Unit::RemoveAreaTrigger(AuraEffect const* aurEff)
+{
+ if (m_areaTrigger.empty())
+ return;
+ for (AreaTrigger* areaTrigger : m_areaTrigger)
+ {
+ if (areaTrigger->GetAuraEffect() == aurEff)
+ {
+ areaTrigger->Remove();
+ break; // There can only be one AreaTrigger per AuraEffect
+ }
+ }
+}
+
void Unit::RemoveAllAreaTriggers()
{
while (!m_areaTrigger.empty())
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index a6dbb3f6e94..177defa83e0 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1773,6 +1773,7 @@ class TC_GAME_API Unit : public WorldObject
AreaTrigger* GetAreaTrigger(uint32 spellId) const;
std::vector<AreaTrigger*> GetAreaTriggers(uint32 spellId) const;
void RemoveAreaTrigger(uint32 spellId);
+ void RemoveAreaTrigger(AuraEffect const* aurEff);
void RemoveAllAreaTriggers();
void ModifyAuraState(AuraStateType flag, bool apply);
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index d53558df96e..a9550666167 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -6466,12 +6466,12 @@ void AuraEffect::HandleCreateAreaTrigger(AuraApplication const* aurApp, uint8 mo
if (apply)
{
AreaTrigger* areaTrigger = new AreaTrigger();
- if (!areaTrigger->CreateAreaTrigger(GetMiscValue(), GetCaster(), target, GetSpellInfo(), *target, GetBase()->GetDuration(), GetBase()->GetSpellXSpellVisualId()))
+ if (!areaTrigger->CreateAreaTrigger(GetMiscValue(), GetCaster(), target, GetSpellInfo(), *target, GetBase()->GetDuration(), GetBase()->GetSpellXSpellVisualId(), ObjectGuid::Empty, this))
delete areaTrigger;
}
else
{
if (Unit* caster = GetCaster())
- caster->RemoveAreaTrigger(GetSpellInfo()->Id);
+ caster->RemoveAreaTrigger(this);
}
}