Index: trunk/src/game/Unit.h
===================================================================
--- trunk/src/game/Unit.h (revision 61)
+++ trunk/src/game/Unit.h (revision 69)
@@ -719,4 +719,5 @@
         bool haveOffhandWeapon() const;
         bool canReachWithAttack(Unit *pVictim) const;
+        bool IsWithinCombatDist(Unit *obj, float dist2compare) const;
         uint32 m_extraAttacks;
 
Index: trunk/src/game/Unit.cpp
===================================================================
--- trunk/src/game/Unit.cpp (revision 63)
+++ trunk/src/game/Unit.cpp (revision 69)
@@ -407,4 +407,19 @@
         reach = 1.0f;
     return IsWithinDistInMap(pVictim, reach);
+}
+
+bool Unit::IsWithinCombatDist(Unit *obj, float dist2compare) const
+{
+    if (!obj || !IsInMap(obj)) return false;
+
+    float dx = GetPositionX() - obj->GetPositionX();
+    float dy = GetPositionY() - obj->GetPositionY();
+    float dz = GetPositionZ() - obj->GetPositionZ();
+    float distsq = dx*dx + dy*dy + dz*dz;
+    //not sure here, or combatreach + combatreach?
+    float sizefactor = GetObjectSize() + obj->GetFloatValue(UNIT_FIELD_COMBATREACH);
+    float maxdist = dist2compare + sizefactor;
+
+    return distsq < maxdist * maxdist;
 }
 
Index: trunk/src/game/Player.cpp
===================================================================
--- trunk/src/game/Player.cpp (revision 44)
+++ trunk/src/game/Player.cpp (revision 69)
@@ -1057,5 +1057,5 @@
             if (isAttackReady(BASE_ATTACK))
             {
-                if(!IsWithinDistInMap(pVictim, pldistance))
+                if(!IsWithinCombatDist(pVictim, pldistance))
                 {
                     setAttackTimer(BASE_ATTACK,100);
@@ -1094,5 +1094,5 @@
             if ( haveOffhandWeapon() && isAttackReady(OFF_ATTACK))
             {
-                if(!IsWithinDistInMap(pVictim, pldistance))
+                if(!IsWithinCombatDist(pVictim, pldistance))
                 {
                     setAttackTimer(OFF_ATTACK,100);
Index: trunk/src/game/Spell.cpp
===================================================================
--- trunk/src/game/Spell.cpp (revision 55)
+++ trunk/src/game/Spell.cpp (revision 69)
@@ -4338,8 +4338,7 @@
     {
         // distance from target center in checks
-        float dist = m_caster->GetDistance(target->GetPositionX(),target->GetPositionY(),target->GetPositionZ());
-        if(dist > max_range)
+        if(!m_caster->IsWithinCombatDist(target, max_range))
             return SPELL_FAILED_OUT_OF_RANGE;               //0x5A;
-        if(dist < min_range)
+        if(min_range && m_caster->IsWithinCombatDist(target, min_range)) // skip this check if min_range = 0
             return SPELL_FAILED_TOO_CLOSE;
         if( m_caster->GetTypeId() == TYPEID_PLAYER &&
Index: trunk/src/bindings/scripts/include/sc_creature.cpp
===================================================================
--- trunk/src/bindings/scripts/include/sc_creature.cpp (revision 44)
+++ trunk/src/bindings/scripts/include/sc_creature.cpp (revision 69)
@@ -134,5 +134,5 @@
     {
         //If we are within range melee the target
-        if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
+        if( m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE))
         {
             m_creature->AttackerStateUpdate(m_creature->getVictim());
