Index: src/game/EventMgr.h =================================================================== --- src/game/EventMgr.h (revision 87) +++ src/game/EventMgr.h (working copy) @@ -165,7 +165,7 @@ EVENT_AURA_PERIODIC_REGEN, EVENT_AURA_PERIODIC_HEALPERC, EVENT_ATTACK_TIMEOUT, - + EVENT_AURA_ADD, }; struct TimedEvent Index: src/game/Spell.cpp =================================================================== --- src/game/Spell.cpp (revision 87) +++ src/game/Spell.cpp (working copy) @@ -1935,7 +1935,11 @@ Target->RemoveAurasByBuffType(m_spellInfo->buffType, m_caster->GetGUID()); // spells that proc on spell cast, some talents if(p_caster) + { + float dist = p_caster->CalcDistance(Target); + float time = ((dist*1000.0)/m_spellInfo->speed); p_caster->HandleProc(PROC_ON_CAST_SPECIFIC_SPELL,Target, m_spellInfo); + } std::map::iterator itr=Target->tmpAura.find(m_spellInfo->Id); if(itr!=Target->tmpAura.end()) { @@ -1947,7 +1951,10 @@ for(int i=0;isecond->GetSpellProto()->procCharges-1;i++) { aur = new Aura(itr->second->GetSpellProto(),itr->second->GetDuration(),itr->second->GetCaster(),itr->second->GetTarget()); - Target->AddAura(aur); + if(time<=100) + Target->AddAura(aur); + else + sEventMgr.AddEvent(Target, &Unit::AddAura, aur, EVENT_AURA_ADD, uint32(time), 1); aur=NULL; } SpellCharge charge; @@ -1957,8 +1964,11 @@ charge.lastproc = 0;charge.FromProc=false; Target->m_chargeSpells.insert(make_pair(itr->second->GetSpellId(),charge)); } - Target->AddAura(itr->second); // the real spell is added last so the modifier is removed last - Target->tmpAura.erase(itr); + if(time<=100) + Target->AddAura(itr->second); // the real spell is added last so the modifier is removed last + else + sEventMgr.AddEvent(Target, &Unit::AddAura, itr->second, EVENT_AURA_ADD, uint32(time), 1); + Target->tmpAura.erase(itr); } } uint32 spellid = 0;