diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/ObjectMgr.cpp | 14 | ||||
-rw-r--r-- | src/game/TargetedMovementGenerator.cpp | 2 | ||||
-rw-r--r-- | src/game/Unit.cpp | 11 | ||||
-rw-r--r-- | src/game/Unit.h | 1 |
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; |