Index: game/Spell.cpp =================================================================== --- game/Spell.cpp (revision 6458) +++ game/Spell.cpp (working copy) @@ -4898,18 +4898,46 @@ { Unit* target = m_targets.getUnitTarget(); - if(target && target->HasAuraType(SPELL_AURA_SPELL_MAGNET) && !(m_spellInfo->Attributes & 0x10)) - { - Unit::AuraList const& magnetAuras = target->GetAurasByType(SPELL_AURA_SPELL_MAGNET); - for(Unit::AuraList::const_iterator itr = magnetAuras.begin(); itr != magnetAuras.end(); ++itr) + if(target) + { + if (m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC) + { + if (target->HasAuraType(SPELL_AURA_SPELL_MAGNET) && !(m_spellInfo->Attributes & 0x10)) + { + Unit::AuraList const& magnetAuars = target->GetAurasByType(SPELL_AURA_SPELL_MAGNET); + for(Unit::AuraList::const_iterator itr = magnetAuars.begin(); itr != magnetAuars.end(); ++itr) + { + if(Unit* magnet = (*itr)->GetCaster()) + { + if(magnet->IsWithinLOSInMap(m_caster)) + { + target = magnet; + m_targets.setUnitTarget(target); + break; + } + } + } + } + } + else if ( m_spellInfo->DmgClass != SPELL_DAMAGE_CLASS_NONE ) { - if(Unit* magnet = (*itr)->GetCaster()) + if (target->HasAuraType(SPELL_AURA_ADD_CASTER_HIT_TRIGGER) && !(m_spellInfo->Attributes & 0x10)) { - if(magnet->IsWithinLOSInMap(m_caster)) + Unit::AuraList const& magnetAuars = target->GetAurasByType(SPELL_AURA_ADD_CASTER_HIT_TRIGGER); + for(Unit::AuraList::const_iterator itr = magnetAuars.begin(); itr != magnetAuars.end(); ++itr) { - target = magnet; - m_targets.setUnitTarget(target); - break; + float radius = GetSpellRadius(sSpellRadiusStore.LookupEntry((*itr)->GetSpellProto()->EffectRadiusIndex[(*itr)->GetEffIndex()])); + + Unit* magnet = (*itr)->GetCaster(); + if(magnet && magnet->IsWithinDistInMap(target,radius)) + { + if(magnet->IsWithinLOSInMap(m_caster)) + { + target = magnet; + m_targets.setUnitTarget(target); + break; + } + } } } } Index: game/Unit.cpp =================================================================== --- game/Unit.cpp (revision 6458) +++ game/Unit.cpp (working copy) @@ -2167,6 +2167,24 @@ return; } + // redirection + if (pVictim->HasAuraType(SPELL_AURA_ADD_CASTER_HIT_TRIGGER)) + { + AuraList const& magnetAuars = pVictim->GetAurasByType(SPELL_AURA_ADD_CASTER_HIT_TRIGGER); + for(AuraList::const_iterator itr = magnetAuars.begin(); itr != magnetAuars.end(); ++itr) + { + if(Unit* magnet = (*itr)->GetCaster()) + { + float radius = GetSpellRadius(sSpellRadiusStore.LookupEntry((*itr)->GetSpellProto()->EffectRadiusIndex[(*itr)->GetEffIndex()])); + if(magnet->IsWithinDistInMap(pVictim,radius) && IsWithinLOSInMap(magnet) && magnet->isAlive()) + { + pVictim = magnet; + break; + } + } + } + } + VictimState victimState = VICTIMSTATE_NORMAL; CleanDamage cleanDamage = CleanDamage(0, BASE_ATTACK, MELEE_HIT_NORMAL );