Index: /trunk/src/game/TargetedMovementGenerator.cpp
===================================================================
--- /trunk/src/game/TargetedMovementGenerator.cpp (revision 141)
+++ /trunk/src/game/TargetedMovementGenerator.cpp (revision 143)
@@ -165,5 +165,5 @@
             i_destinationHolder.ResetUpdate(50);
 
-        float dist = owner.GetFloatValue(UNIT_FIELD_COMBATREACH) + i_target.getTarget()->GetFloatValue(UNIT_FIELD_COMBATREACH) + sWorld.getRate(RATE_TARGET_POS_RECALCULATION_RANGE);
+        float dist = owner.GetCombatReach() + i_target.getTarget()->GetCombatReach() + sWorld.getRate(RATE_TARGET_POS_RECALCULATION_RANGE);
 
         //More distance let have better performance, less distance let have more sensitive reaction at target move.
Index: /trunk/src/game/Unit.h
===================================================================
--- /trunk/src/game/Unit.h (revision 142)
+++ /trunk/src/game/Unit.h (revision 143)
@@ -722,4 +722,5 @@
         void SetCanDualWield(bool value) { m_canDualWield = value; }
         bool canReachWithAttack(Unit *pVictim) const;
+        float GetCombatReach() const { return m_floatValues[UNIT_FIELD_COMBATREACH]; }
         bool IsWithinCombatDist(Unit *obj, float dist2compare) const;
         void GetRandomContactPoint( const Unit* target, float &x, float &y, float &z, float distance2dMin, float distance2dMax ) const;
Index: /trunk/src/game/Unit.cpp
===================================================================
--- /trunk/src/game/Unit.cpp (revision 142)
+++ /trunk/src/game/Unit.cpp (revision 143)
@@ -406,8 +406,5 @@
 {
     assert(pVictim);
-    float reach = GetFloatValue(UNIT_FIELD_COMBATREACH);
-    if( reach <= 0.0f )
-        reach = 1.0f;
-    return IsWithinDistInMap(pVictim, reach);
+    return IsWithinDistInMap(pVictim, GetCombatReach());
 }
 
@@ -421,5 +418,5 @@
     float distsq = dx*dx + dy*dy + dz*dz;
     //not sure here, or combatreach + combatreach?
-    float sizefactor = GetFloatValue(UNIT_FIELD_COMBATREACH) + obj->GetFloatValue(UNIT_FIELD_COMBATREACH);
+    float sizefactor = GetCombatReach() + obj->GetCombatReach();
     float maxdist = dist2compare + sizefactor;
 
@@ -431,6 +428,6 @@
 	uint32 attacker_number = getAttackers().size();
     if(attacker_number > 0) --attacker_number;
-	GetNearPoint(obj,x,y,z,obj->GetFloatValue(UNIT_FIELD_COMBATREACH),distance2dMin+(distance2dMax-distance2dMin)*rand_norm()
-        , GetAngle(obj) + (attacker_number ? (M_PI/2 - M_PI * rand_norm()) * (float)attacker_number / GetFloatValue(UNIT_FIELD_COMBATREACH) / 3 : 0));
+	GetNearPoint(obj,x,y,z,obj->GetCombatReach(), distance2dMin+(distance2dMax-distance2dMin)*rand_norm()
+        , GetAngle(obj) + (attacker_number ? (M_PI/2 - M_PI * rand_norm()) * (float)attacker_number / GetCombatReach() / 3 : 0));
 }
 
Index: /trunk/src/game/ObjectMgr.cpp
===================================================================
--- /trunk/src/game/ObjectMgr.cpp (revision 135)
+++ /trunk/src/game/ObjectMgr.cpp (revision 143)
@@ -959,4 +959,18 @@
     sLog.outString( ">> Loaded %u creature model based info", sCreatureModelStorage.RecordCount );
     sLog.outString();
+
+    // check if combat_reach is valid
+    for(uint32 i = 1; i < sCreatureModelStorage.MaxEntry; ++i)
+    {
+        CreatureModelInfo const* mInfo = sCreatureModelStorage.LookupEntry<CreatureModelInfo>(i);
+        if(!mInfo)
+            continue;
+
+        if(mInfo->combat_reach < 0.5f)
+        {
+            sLog.outErrorDb("Creature model (Entry: %u) has invalid combat reach (%f), setting it to 0.5", mInfo->modelid, mInfo->combat_reach);
+            const_cast<CreatureModelInfo*>(mInfo)->combat_reach = 0.5f;
+        }
+    }
 }
 
