aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/ObjectMgr.cpp14
-rw-r--r--src/game/TargetedMovementGenerator.cpp2
-rw-r--r--src/game/Unit.cpp11
-rw-r--r--src/game/Unit.h1
4 files changed, 20 insertions, 8 deletions
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index 8a49d4dac0c..7513e8e3fa9 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -958,6 +958,20 @@ void ObjectMgr::LoadCreatureModelInfo()
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;
+ }
+ }
}
void ObjectMgr::LoadCreatures()
diff --git a/src/game/TargetedMovementGenerator.cpp b/src/game/TargetedMovementGenerator.cpp
index 283fcfa8343..bd0e7e378fd 100644
--- a/src/game/TargetedMovementGenerator.cpp
+++ b/src/game/TargetedMovementGenerator.cpp
@@ -164,7 +164,7 @@ TargetedMovementGenerator<T>::Update(T &owner, const uint32 & time_diff)
if (owner.GetObjectSize())
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.
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index b594f3c0767..4a618d602f8 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -405,10 +405,7 @@ void Unit::resetAttackTimer(WeaponAttackType type)
bool Unit::canReachWithAttack(Unit *pVictim) const
{
assert(pVictim);
- float reach = GetFloatValue(UNIT_FIELD_COMBATREACH);
- if( reach <= 0.0f )
- reach = 1.0f;
- return IsWithinDistInMap(pVictim, reach);
+ return IsWithinDistInMap(pVictim, GetCombatReach());
}
bool Unit::IsWithinCombatDist(Unit *obj, float dist2compare) const
@@ -420,7 +417,7 @@ bool Unit::IsWithinCombatDist(Unit *obj, float dist2compare) const
float dz = GetPositionZ() - obj->GetPositionZ();
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;
return distsq < maxdist * maxdist;
@@ -430,8 +427,8 @@ void Unit::GetRandomContactPoint( const Unit* obj, float &x, float &y, float &z,
{
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));
}
void Unit::RemoveSpellsCausingAura(AuraType auraType)
diff --git a/src/game/Unit.h b/src/game/Unit.h
index 040e8300a03..8240695cd93 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -721,6 +721,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
bool CanDualWield() const { return m_canDualWield; }
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;
uint32 m_extraAttacks;