[c12616] Simplify use of CombatReach

This commit is contained in:
Schmoozerd 2013-05-31 12:11:23 +01:00 committed by Antz
parent e478b27dcc
commit dc3de04d62
6 changed files with 36 additions and 22 deletions

View file

@ -1683,7 +1683,7 @@ SpellEntry const* Creature::ReachWithSpellAttack(Unit* pVictim)
float range = GetSpellMaxRange(srange);
float minrange = GetSpellMinRange(srange);
float dist = GetCombatDistance(pVictim);
float dist = GetCombatDistance(pVictim, spellInfo->rangeIndex == SPELL_RANGE_IDX_COMBAT);
// if(!isInFront( pVictim, range ) && spellInfo->AttributesEx )
// continue;
@ -1739,7 +1739,7 @@ SpellEntry const* Creature::ReachWithSpellCure(Unit* pVictim)
float range = GetSpellMaxRange(srange);
float minrange = GetSpellMinRange(srange);
float dist = GetCombatDistance(pVictim);
float dist = GetCombatDistance(pVictim, spellInfo->rangeIndex == SPELL_RANGE_IDX_COMBAT);
// if(!isInFront( pVictim, range ) && spellInfo->AttributesEx )
// continue;
@ -2096,7 +2096,7 @@ bool Creature::MeetsSelectAttackingRequirement(Unit* pTarget, SpellEntry const*
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(pSpellInfo->rangeIndex);
float max_range = GetSpellMaxRange(srange);
float min_range = GetSpellMinRange(srange);
float dist = GetCombatDistance(pTarget);
float dist = GetCombatDistance(pTarget, false);
return dist < max_range && dist >= min_range;
}

View file

@ -56,7 +56,7 @@ CanCastResult CreatureAI::CanCastSpell(Unit* pTarget, const SpellEntry* pSpell,
if (pTarget != m_creature)
{
// pTarget is out of range of this spell (also done by Spell::CheckCast())
float fDistance = m_creature->GetCombatDistance(pTarget);
float fDistance = m_creature->GetCombatDistance(pTarget, pSpell->rangeIndex == SPELL_RANGE_IDX_COMBAT);
if (fDistance > (m_creature->IsHostileTo(pTarget) ? pSpellRange->maxRange : pSpellRange->maxRangeFriendly))
return CAST_FAIL_TOO_FAR;

View file

@ -6554,7 +6554,7 @@ SpellCastResult Spell::CheckRange(bool strict)
if (target && target != m_caster)
{
// distance from target in checks
float dist = m_caster->GetCombatDistance(target);
float dist = m_caster->GetCombatDistance(target, m_spellInfo->rangeIndex == SPELL_RANGE_IDX_COMBAT);
if (dist > max_range)
return SPELL_FAILED_OUT_OF_RANGE;

View file

@ -738,17 +738,36 @@ void Unit::resetAttackTimer(WeaponAttackType type)
m_attackTimer[type] = uint32(GetAttackTime(type) * m_modAttackSpeedPct[type]);
}
bool Unit::CanReachWithMeleeAttack(Unit* pVictim, float flat_mod /*= 0.0f*/) const
float Unit::GetCombatReach(Unit const* pVictim, bool forMeleeRange /*=true*/, float flat_mod /*=0.0f*/) const
{
MANGOS_ASSERT(pVictim);
// The measured values show BASE_MELEE_OFFSET in (1.3224, 1.342)
float reach = GetFloatValue(UNIT_FIELD_COMBATREACH) + pVictim->GetFloatValue(UNIT_FIELD_COMBATREACH) +
BASE_MELEERANGE_OFFSET + flat_mod;
if (reach < ATTACK_DISTANCE)
if (forMeleeRange && reach < ATTACK_DISTANCE)
reach = ATTACK_DISTANCE;
return reach;
}
float Unit::GetCombatDistance(Unit const* target, bool forMeleeRange) const
{
float radius = GetCombatReach(target, forMeleeRange);
float dx = GetPositionX() - target->GetPositionX();
float dy = GetPositionY() - target->GetPositionY();
float dz = GetPositionZ() - target->GetPositionZ();
float dist = sqrt((dx * dx) + (dy * dy) + (dz * dz)) - radius;
return (dist > 0.0f ? dist : 0.0f);
}
bool Unit::CanReachWithMeleeAttack(Unit const* pVictim, float flat_mod /*= 0.0f*/) const
{
MANGOS_ASSERT(pVictim);
float reach = GetCombatReach(pVictim, true, flat_mod);
// This check is not related to bounding radius
float dx = GetPositionX() - pVictim->GetPositionX();
float dy = GetPositionY() - pVictim->GetPositionY();
@ -6330,16 +6349,6 @@ void Unit::Uncharm()
}
}
float Unit::GetCombatDistance(const Unit* target) const
{
float radius = target->GetFloatValue(UNIT_FIELD_COMBATREACH) + GetFloatValue(UNIT_FIELD_COMBATREACH);
float dx = GetPositionX() - target->GetPositionX();
float dy = GetPositionY() - target->GetPositionY();
float dz = GetPositionZ() - target->GetPositionZ();
float dist = sqrt((dx * dx) + (dy * dy) + (dz * dz)) - radius;
return (dist > 0 ? dist : 0);
}
void Unit::SetPet(Pet* pet)
{
SetPetGuid(pet ? pet->GetObjectGuid() : ObjectGuid());

View file

@ -1187,7 +1187,13 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
return !HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_DISARM_RANGED);
}
}
bool CanReachWithMeleeAttack(Unit* pVictim, float flat_mod = 0.0f) const;
/// Returns the combined combat reach of two mobs
float GetCombatReach(Unit const* pVictim, bool forMeleeRange = true, float flat_mod = 0.0f) const;
/// Returns the remaining combat distance between two mobs (CombatReach substracted)
float GetCombatDistance(Unit const* target, bool forMeleeRange) const;
/// Returns if the Unit can reach a victim with Melee Attack
bool CanReachWithMeleeAttack(Unit const* pVictim, float flat_mod = 0.0f) const;
uint32 m_extraAttacks;
void _addAttacker(Unit* pAttacker) // must be called only from Unit::Attack(Unit*)
@ -1540,7 +1546,6 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
bool IsCharmerOrOwnerPlayerOrPlayerItself() const;
Player* GetCharmerOrOwnerPlayerOrPlayerItself();
Player const* GetCharmerOrOwnerPlayerOrPlayerItself() const;
float GetCombatDistance(const Unit* target) const;
void SetPet(Pet* pet);
void SetCharm(Unit* pet);

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "12615"
#define REVISION_NR "12616"
#endif // __REVISION_NR_H__