[svn] Add Unit::IsWithinCombatDist function to check melee range and spell range (now range is related to the attacker's bounding_radius and target's combat_reach, not sure if both should be combat_reach).
--HG-- branch : trunk
This commit is contained in:
@@ -133,7 +133,7 @@ void ScriptedAI::DoMeleeAttackIfReady()
|
|||||||
if( m_creature->isAttackReady() && !m_creature->IsNonMeleeSpellCasted(false))
|
if( m_creature->isAttackReady() && !m_creature->IsNonMeleeSpellCasted(false))
|
||||||
{
|
{
|
||||||
//If we are within range melee the target
|
//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());
|
m_creature->AttackerStateUpdate(m_creature->getVictim());
|
||||||
m_creature->resetAttackTimer();
|
m_creature->resetAttackTimer();
|
||||||
|
|||||||
+2
-2
@@ -1056,7 +1056,7 @@ void Player::Update( uint32 p_time )
|
|||||||
|
|
||||||
if (isAttackReady(BASE_ATTACK))
|
if (isAttackReady(BASE_ATTACK))
|
||||||
{
|
{
|
||||||
if(!IsWithinDistInMap(pVictim, pldistance))
|
if(!IsWithinCombatDist(pVictim, pldistance))
|
||||||
{
|
{
|
||||||
setAttackTimer(BASE_ATTACK,100);
|
setAttackTimer(BASE_ATTACK,100);
|
||||||
if(m_swingErrorMsg != 1) // send single time (client auto repeat)
|
if(m_swingErrorMsg != 1) // send single time (client auto repeat)
|
||||||
@@ -1093,7 +1093,7 @@ void Player::Update( uint32 p_time )
|
|||||||
|
|
||||||
if ( haveOffhandWeapon() && isAttackReady(OFF_ATTACK))
|
if ( haveOffhandWeapon() && isAttackReady(OFF_ATTACK))
|
||||||
{
|
{
|
||||||
if(!IsWithinDistInMap(pVictim, pldistance))
|
if(!IsWithinCombatDist(pVictim, pldistance))
|
||||||
{
|
{
|
||||||
setAttackTimer(OFF_ATTACK,100);
|
setAttackTimer(OFF_ATTACK,100);
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-3
@@ -4337,10 +4337,9 @@ uint8 Spell::CheckRange(bool strict)
|
|||||||
if(target && target != m_caster)
|
if(target && target != m_caster)
|
||||||
{
|
{
|
||||||
// distance from target center in checks
|
// distance from target center in checks
|
||||||
float dist = m_caster->GetDistance(target->GetPositionX(),target->GetPositionY(),target->GetPositionZ());
|
if(!m_caster->IsWithinCombatDist(target, max_range))
|
||||||
if(dist > max_range)
|
|
||||||
return SPELL_FAILED_OUT_OF_RANGE; //0x5A;
|
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;
|
return SPELL_FAILED_TOO_CLOSE;
|
||||||
if( m_caster->GetTypeId() == TYPEID_PLAYER &&
|
if( m_caster->GetTypeId() == TYPEID_PLAYER &&
|
||||||
(m_spellInfo->FacingCasterFlags & SPELL_FACING_FLAG_INFRONT) && !m_caster->HasInArc( M_PI, target ) )
|
(m_spellInfo->FacingCasterFlags & SPELL_FACING_FLAG_INFRONT) && !m_caster->HasInArc( M_PI, target ) )
|
||||||
|
|||||||
@@ -408,6 +408,21 @@ bool Unit::canReachWithAttack(Unit *pVictim) const
|
|||||||
return IsWithinDistInMap(pVictim, reach);
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
void Unit::RemoveSpellsCausingAura(AuraType auraType)
|
void Unit::RemoveSpellsCausingAura(AuraType auraType)
|
||||||
{
|
{
|
||||||
if (auraType >= TOTAL_AURAS) return;
|
if (auraType >= TOTAL_AURAS) return;
|
||||||
|
|||||||
@@ -718,6 +718,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
|
|||||||
bool isAttackReady(WeaponAttackType type = BASE_ATTACK) const { return m_attackTimer[type] == 0; }
|
bool isAttackReady(WeaponAttackType type = BASE_ATTACK) const { return m_attackTimer[type] == 0; }
|
||||||
bool haveOffhandWeapon() const;
|
bool haveOffhandWeapon() const;
|
||||||
bool canReachWithAttack(Unit *pVictim) const;
|
bool canReachWithAttack(Unit *pVictim) const;
|
||||||
|
bool IsWithinCombatDist(Unit *obj, float dist2compare) const;
|
||||||
uint32 m_extraAttacks;
|
uint32 m_extraAttacks;
|
||||||
|
|
||||||
void _addAttacker(Unit *pAttacker) // must be called only from Unit::Attack(Unit*)
|
void _addAttacker(Unit *pAttacker) // must be called only from Unit::Attack(Unit*)
|
||||||
|
|||||||
Reference in New Issue
Block a user