diff options
| -rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTrigger.cpp | 3 | ||||
| -rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTrigger.h | 6 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 14 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 1 | ||||
| -rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 4 |
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); } } |
