diff --git a/src/game/DynamicObject.cpp b/src/game/DynamicObject.cpp index a339e8e7e..762966d7b 100644 --- a/src/game/DynamicObject.cpp +++ b/src/game/DynamicObject.cpp @@ -147,9 +147,40 @@ void DynamicObject::Delete() void DynamicObject::Delay(int32 delaytime) { m_aliveDuration -= delaytime; - for(AffectedSet::iterator iunit= m_affected.begin(); iunit != m_affected.end(); ++iunit) - if (*iunit) - (*iunit)->DelaySpellAuraHolder(m_spellId, delaytime, GetCasterGUID()); + for(AffectedSet::iterator iter = m_affected.begin(); iter != m_affected.end(); ) + { + Unit *target = GetMap()->GetUnit((*iter)); + if (target) + { + SpellAuraHolder *holder = target->GetSpellAuraHolder(m_spellId, GetCasterGUID()); + if (!holder) + { + ++iter; + continue; + } + + bool foundAura = false; + for (int32 i = m_effIndex + 1; i < MAX_EFFECT_INDEX; ++i) + { + if ((holder->GetSpellProto()->Effect[i] == SPELL_EFFECT_PERSISTENT_AREA_AURA || holder->GetSpellProto()->Effect[i] == SPELL_EFFECT_ADD_FARSIGHT) && holder->m_auras[i]) + { + foundAura = true; + break; + } + } + + if (foundAura) + { + ++iter; + continue; + } + + target->DelaySpellAuraHolder(m_spellId, delaytime, GetCasterGUID()); + ++iter; + } + else + m_affected.erase(iter); + } } bool DynamicObject::isVisibleForInState(Player const* u, WorldObject const* viewPoint, bool inVisibleList) const diff --git a/src/game/DynamicObject.h b/src/game/DynamicObject.h index 912229e05..34d00b616 100644 --- a/src/game/DynamicObject.h +++ b/src/game/DynamicObject.h @@ -28,7 +28,7 @@ struct SpellEntry; class DynamicObject : public WorldObject { public: - typedef std::set AffectedSet; + typedef std::set AffectedSet; explicit DynamicObject(); void AddToWorld(); @@ -43,9 +43,9 @@ class DynamicObject : public WorldObject uint64 GetCasterGUID() const { return GetUInt64Value(DYNAMICOBJECT_CASTER); } Unit* GetCaster() const; float GetRadius() const { return m_radius; } - bool IsAffecting(Unit *unit) const { return m_affected.find(unit) != m_affected.end(); } - void AddAffected(Unit *unit) { m_affected.insert(unit); } - void RemoveAffected(Unit *unit) { m_affected.erase(unit); } + bool IsAffecting(Unit *unit) const { return m_affected.find(unit->GetObjectGuid()) != m_affected.end(); } + void AddAffected(Unit *unit) { m_affected.insert(unit->GetObjectGuid()); } + void RemoveAffected(Unit *unit) { m_affected.erase(unit->GetObjectGuid()); } void Delay(int32 delaytime); bool IsHostileTo(Unit const* unit) const; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index ba8cabcf8..cbba1e631 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "10518" + #define REVISION_NR "10519" #endif // __REVISION_NR_H__