diff options
author | megamage <none@none> | 2008-12-05 18:39:31 -0600 |
---|---|---|
committer | megamage <none@none> | 2008-12-05 18:39:31 -0600 |
commit | 3a1293ef183425fe555354c5445b43ff246d33fa (patch) | |
tree | f0ae72dfc6bed7e828a36bfee8832e60c50096b8 | |
parent | d36672cd7e4ae3d328f30c020c5421668ad4cb5e (diff) |
*Update melee range calculation. By QAston.
--HG--
branch : trunk
34 files changed, 92 insertions, 137 deletions
diff --git a/src/bindings/scripts/include/sc_creature.cpp b/src/bindings/scripts/include/sc_creature.cpp index 6061c15ec1b..a3c185391cc 100644 --- a/src/bindings/scripts/include/sc_creature.cpp +++ b/src/bindings/scripts/include/sc_creature.cpp @@ -130,7 +130,7 @@ void ScriptedAI::UpdateAI(const uint32 diff) if (m_creature->isAttackReady() ) { //If we are within range melee the target - if (m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE)) + if (m_creature->IsWithinMeleeRange(m_creature->getVictim())) { m_creature->AttackerStateUpdate(m_creature->getVictim()); m_creature->resetAttackTimer(); @@ -193,7 +193,7 @@ void ScriptedAI::DoMeleeAttackIfReady() if (m_creature->isAttackReady() && !m_creature->hasUnitState(UNIT_STAT_CASTING)) { //If we are within range melee the target - if (m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE)) + if (m_creature->IsWithinMeleeRange(m_creature->getVictim())) { m_creature->AttackerStateUpdate(m_creature->getVictim()); m_creature->resetAttackTimer(); @@ -202,7 +202,7 @@ void ScriptedAI::DoMeleeAttackIfReady() if (m_creature->haveOffhandWeapon() && m_creature->isAttackReady(OFF_ATTACK) && !m_creature->hasUnitState(UNIT_STAT_CASTING)) { //If we are within range melee the target - if (m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE)) + if (m_creature->IsWithinMeleeRange(m_creature->getVictim())) { m_creature->AttackerStateUpdate(m_creature->getVictim(), OFF_ATTACK); m_creature->resetAttackTimer(OFF_ATTACK); diff --git a/src/bindings/scripts/scripts/creature/mob_generic_creature.cpp b/src/bindings/scripts/scripts/creature/mob_generic_creature.cpp index 02e34a8fa1e..1110038f315 100644 --- a/src/bindings/scripts/scripts/creature/mob_generic_creature.cpp +++ b/src/bindings/scripts/scripts/creature/mob_generic_creature.cpp @@ -42,10 +42,10 @@ struct TRINITY_DLL_DECL generic_creatureAI : public ScriptedAI void Aggro(Unit *who) { - if (!m_creature->IsWithinCombatDist(who, ATTACK_DISTANCE)) - { - IsSelfRooted = true; - } + if (!m_creature->IsWithinMeleeRange(who)) + { + IsSelfRooted = true; + } } void UpdateAI(const uint32 diff) @@ -81,7 +81,7 @@ struct TRINITY_DLL_DECL generic_creatureAI : public ScriptedAI return; //If we are within range melee the target - if( m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE)) + if( m_creature->IsWithinMeleeRange(m_creature->getVictim())) { //Make sure our attack is ready and we arn't currently casting if( m_creature->isAttackReady() && !m_creature->IsNonMeleeSpellCasted(false)) @@ -126,7 +126,7 @@ struct TRINITY_DLL_DECL generic_creatureAI : public ScriptedAI //No healing spell available, See if we can cast a ranged spell (Range must be greater than ATTACK_DISTANCE) if (info) Healing = true; - else info = SelectSpell(m_creature->getVictim(), -1, -1, SELECT_TARGET_ANY_ENEMY, 0, 0, ATTACK_DISTANCE, 0, SELECT_EFFECT_DONTCARE); + else info = SelectSpell(m_creature->getVictim(), -1, -1, SELECT_TARGET_ANY_ENEMY, 0, 0, NOMINAL_MELEE_RANGE, 0, SELECT_EFFECT_DONTCARE); //Found a spell, check if we arn't on cooldown if (info && !GlobalCooldown) diff --git a/src/bindings/scripts/scripts/guard/guard_ai.cpp b/src/bindings/scripts/scripts/guard/guard_ai.cpp index cc7aa1a40cf..d1aa58847f7 100644 --- a/src/bindings/scripts/scripts/guard/guard_ai.cpp +++ b/src/bindings/scripts/scripts/guard/guard_ai.cpp @@ -86,7 +86,7 @@ void guardAI::UpdateAI(const uint32 diff) if( m_creature->isAttackReady() && !m_creature->IsNonMeleeSpellCasted(false)) { //If we are within range melee the target - if( m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE)) + if( m_creature->IsWithinMeleeRange(m_creature->getVictim())) { bool Healing = false; SpellEntry const *info = NULL; @@ -128,7 +128,7 @@ void guardAI::UpdateAI(const uint32 diff) //No healing spell available, See if we can cast a ranged spell (Range must be greater than ATTACK_DISTANCE) if (info) Healing = true; - else info = SelectSpell(m_creature->getVictim(), -1, -1, SELECT_TARGET_ANY_ENEMY, 0, 0, ATTACK_DISTANCE, 0, SELECT_EFFECT_DONTCARE); + else info = SelectSpell(m_creature->getVictim(), -1, -1, SELECT_TARGET_ANY_ENEMY, 0, 0, NOMINAL_MELEE_RANGE, 0, SELECT_EFFECT_DONTCARE); //Found a spell, check if we arn't on cooldown if (info && !GlobalCooldown) diff --git a/src/bindings/scripts/scripts/npc/npc_escortAI.cpp b/src/bindings/scripts/scripts/npc/npc_escortAI.cpp index a616fa809c7..4c34c45370f 100644 --- a/src/bindings/scripts/scripts/npc/npc_escortAI.cpp +++ b/src/bindings/scripts/scripts/npc/npc_escortAI.cpp @@ -203,7 +203,7 @@ void npc_escortAI::UpdateAI(const uint32 diff) if( m_creature->isAlive() && m_creature->SelectHostilTarget() && m_creature->getVictim()) { //If we are within range melee the target - if( m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE)) + if( m_creature->IsWithinMeleeRange(m_creature->getVictim())) { if( m_creature->isAttackReady() ) { diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp index a5c387dc317..1d257cc186d 100644 --- a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp +++ b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp @@ -100,7 +100,7 @@ struct TRINITY_DLL_DECL boss_murmurAI : public Scripted_NoMovementAI //Resonance_Timer if (Resonance_Timer < diff) { - if (!m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE)) + if (!m_creature->IsWithinMeleeRange(m_creature->getVictim())) DoCast(m_creature->getVictim(), SPELL_RESONANCE); Resonance_Timer = 5000; }else Resonance_Timer -= diff; diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp index dbce8089dd7..272bd0bd2b0 100644 --- a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp +++ b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp @@ -1741,7 +1741,7 @@ struct TRINITY_DLL_DECL mob_parasitic_shadowfiendAI : public ScriptedAI void DoMeleeAttackIfReady() { - if( m_creature->isAttackReady() && m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE)) + if( m_creature->isAttackReady() && m_creature->IsWithinMeleeRange(m_creature->getVictim())) { if(!m_creature->getVictim()->HasAura(SPELL_PARASITIC_SHADOWFIEND, 0) && !m_creature->getVictim()->HasAura(SPELL_PARASITIC_SHADOWFIEND2, 0)) { diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp index 640977d0eb9..f0ac118f66d 100644 --- a/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp +++ b/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp @@ -129,7 +129,7 @@ struct TRINITY_DLL_DECL boss_supremusAI : public ScriptedAI for (i = m_threatlist.begin(); i!= m_threatlist.end();++i) { Unit* pUnit = Unit::GetUnit((*m_creature), (*i)->getUnitGuid()); - if(pUnit && m_creature->IsWithinCombatDist(pUnit, ATTACK_DISTANCE)) + if(pUnit && m_creature->IsWithinMeleeRange(pUnit)) { if(pUnit->GetHealth() > health) { diff --git a/src/bindings/scripts/scripts/zone/gruuls_lair/boss_gruul.cpp b/src/bindings/scripts/scripts/zone/gruuls_lair/boss_gruul.cpp index 1616d75e376..8205ad42261 100644 --- a/src/bindings/scripts/scripts/zone/gruuls_lair/boss_gruul.cpp +++ b/src/bindings/scripts/scripts/zone/gruuls_lair/boss_gruul.cpp @@ -243,7 +243,7 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI Unit* target = NULL; target = SelectUnit(SELECT_TARGET_TOPAGGRO,1); - if (target && m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE)) + if (target && m_creature->IsWithinMeleeRange(m_creature->getVictim())) DoCast(target,SPELL_HURTFUL_STRIKE); else DoCast(m_creature->getVictim(),SPELL_HURTFUL_STRIKE); diff --git a/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp b/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp index 1d8b1ec2c22..5d235b13d59 100644 --- a/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp +++ b/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp @@ -146,7 +146,7 @@ struct TRINITY_DLL_DECL boss_omor_the_unscarredAI : public Scripted_NoMovementAI else if (OrbitalStrike_Timer < diff) { Unit* temp = NULL; - if (m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE)) + if (m_creature->IsWithinMeleeRange(m_creature->getVictim())) temp = m_creature->getVictim(); else temp = SelectUnit(SELECT_TARGET_RANDOM,0); diff --git a/src/bindings/scripts/scripts/zone/karazhan/boss_prince_malchezaar.cpp b/src/bindings/scripts/scripts/zone/karazhan/boss_prince_malchezaar.cpp index 6d4e75afdb9..1b9ccd570d8 100644 --- a/src/bindings/scripts/scripts/zone/karazhan/boss_prince_malchezaar.cpp +++ b/src/bindings/scripts/scripts/zone/karazhan/boss_prince_malchezaar.cpp @@ -612,7 +612,7 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI void DoMeleeAttacksIfReady() { - if( m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE) && !m_creature->IsNonMeleeSpellCasted(false)) + if( m_creature->IsWithinMeleeRange(m_creature->getVictim()) && !m_creature->IsNonMeleeSpellCasted(false)) { //Check for base attack if( m_creature->isAttackReady() && m_creature->getVictim() ) diff --git a/src/bindings/scripts/scripts/zone/molten_core/boss_ragnaros.cpp b/src/bindings/scripts/scripts/zone/molten_core/boss_ragnaros.cpp index d357d9580e9..38149e336c3 100644 --- a/src/bindings/scripts/scripts/zone/molten_core/boss_ragnaros.cpp +++ b/src/bindings/scripts/scripts/zone/molten_core/boss_ragnaros.cpp @@ -274,7 +274,7 @@ struct TRINITY_DLL_DECL boss_ragnarosAI : public Scripted_NoMovementAI }else Submerge_Timer -= diff; //If we are within range melee the target - if( m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE)) + if( m_creature->IsWithinMeleeRange(m_creature->getVictim())) { //Make sure our attack is ready and we arn't currently casting if( m_creature->isAttackReady() && !m_creature->IsNonMeleeSpellCasted(false)) diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp index 75a2f20db14..b4d7c5e6105 100644 --- a/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp +++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp @@ -171,7 +171,7 @@ struct TRINITY_DLL_DECL boss_sapphironAI : public ScriptedAI }else Beserk_Timer -= diff; } - if( phase!=2 && m_creature->getVictim() && m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE)) + if( phase!=2 && m_creature->getVictim() && m_creature->IsWithinMeleeRange(m_creature->getVictim())) { if( m_creature->isAttackReady() ) { diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_eredar_twins.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_eredar_twins.cpp index 9df47ed30e7..875da760ca1 100644 --- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_eredar_twins.cpp +++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_eredar_twins.cpp @@ -326,7 +326,7 @@ struct TRINITY_DLL_DECL boss_sacrolashAI : public ScriptedAI if( m_creature->isAttackReady() && !m_creature->IsNonMeleeSpellCasted(false)) { //If we are within range melee the target - if( m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE)) + if( m_creature->IsWithinMeleeRange(m_creature->getVictim())) { HandleTouchedSpells(m_creature->getVictim(), SPELL_DARK_TOUCHED); m_creature->AttackerStateUpdate(m_creature->getVictim()); @@ -736,7 +736,7 @@ struct TRINITY_DLL_DECL mob_shadow_imageAI : public ScriptedAI if(!m_creature->IsNonMeleeSpellCasted(false)) { //If we are within range melee the target - if( m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE)) + if( m_creature->IsWithinMeleeRange(m_creature->getVictim())) { DoCast(m_creature->getVictim(),SPELL_DARK_STRIKE); } diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp index 138d3d19f99..7192bd947fe 100644 --- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp +++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp @@ -397,7 +397,7 @@ struct TRINITY_DLL_DECL boss_alarAI : public ScriptedAI { if(m_creature->isAttackReady() && !m_creature->IsNonMeleeSpellCasted(false)) { - if(m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE)) + if(m_creature->IsWithinMeleeRange(m_creature->getVictim())) { m_creature->AttackerStateUpdate(m_creature->getVictim()); m_creature->resetAttackTimer(); diff --git a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_cthun.cpp b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_cthun.cpp index d1dfbf8d79e..c1124116401 100644 --- a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_cthun.cpp +++ b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_cthun.cpp @@ -1036,7 +1036,7 @@ struct TRINITY_DLL_DECL claw_tentacleAI : public Scripted_NoMovementAI return; //EvadeTimer - if (m_creature->GetDistance(m_creature->getVictim()) > ATTACK_DISTANCE) + if (!m_creature->IsWithinMeleeRange(m_creature->getVictim())) if (EvadeTimer < diff) { Unit* p = Unit::GetUnit(*m_creature, Portal); @@ -1133,7 +1133,7 @@ struct TRINITY_DLL_DECL giant_claw_tentacleAI : public Scripted_NoMovementAI return; //EvadeTimer - if (m_creature->GetDistance(m_creature->getVictim()) > ATTACK_DISTANCE) + if (!m_creature->IsWithinMeleeRange(m_creature->getVictim())) if (EvadeTimer < diff) { Unit* p = Unit::GetUnit(*m_creature, Portal); diff --git a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_skeram.cpp b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_skeram.cpp index 9194354ddc0..69af7e1db80 100644 --- a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_skeram.cpp +++ b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_skeram.cpp @@ -148,7 +148,7 @@ struct TRINITY_DLL_DECL boss_skeramAI : public ScriptedAI }else ArcaneExplosion_Timer -= diff; //If we are within range melee the target - if( m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE)) + if( m_creature->IsWithinMeleeRange(m_creature->getVictim())) { //Make sure our attack is ready and we arn't currently casting if( m_creature->isAttackReady() && !m_creature->IsNonMeleeSpellCasted(false)) diff --git a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_twinemperors.cpp b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_twinemperors.cpp index b9b37991629..3a336bfa781 100644 --- a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_twinemperors.cpp +++ b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_twinemperors.cpp @@ -206,55 +206,6 @@ struct TRINITY_DLL_DECL boss_twinemperorsAI : public ScriptedAI } else Heal_Timer -= diff; } - Unit *GetAnyoneCloseEnough(float dist, bool totallyRandom) - { - int cnt = 0; - std::list<HostilReference*>::iterator i; - std::list<HostilReference*> candidates; - - for (i = m_creature->getThreatManager().getThreatList().begin();i != m_creature->getThreatManager().getThreatList().end(); ++i) - { - Unit* pUnit = Unit::GetUnit((*m_creature), (*i)->getUnitGuid()); - if (m_creature->IsWithinDistInMap(pUnit, dist)) - { - if (!totallyRandom) - return pUnit; - candidates.push_back((*i)); - cnt ++; - } - } - if (!cnt) - return NULL; - for (int randomi = rand() % cnt; randomi > 0; randomi --) - candidates.pop_front(); - - i = candidates.begin(); - Unit *ret = Unit::GetUnit((*m_creature), (*i)->getUnitGuid()); - candidates.clear(); - return ret; - } - - Unit *PickNearestPlayer() - { - Unit *nearp = NULL; - float neardist = 0.0f; - std::list<HostilReference*>::iterator i; - for (i = m_creature->getThreatManager().getThreatList().begin();i != m_creature->getThreatManager().getThreatList().end(); ++i) - { - Unit* pUnit = NULL; - pUnit = Unit::GetUnit((*m_creature), (*i)->getUnitGuid()); - if (!pUnit) - continue; - float pudist = pUnit->GetDistance((const Creature *)m_creature); - if (!nearp || (neardist > pudist)) - { - nearp = pUnit; - neardist = pudist; - } - } - return nearp; - } - void TeleportToMyBrother() { if (!pInstance) @@ -313,7 +264,7 @@ struct TRINITY_DLL_DECL boss_twinemperorsAI : public ScriptedAI { AfterTeleport = false; m_creature->clearUnitState(UNIT_STAT_STUNNED); - Unit *nearu = PickNearestPlayer(); + Unit *nearu = m_creature->SelectNearestTarget(100); //DoYell(nearu->GetName(), LANG_UNIVERSAL, 0); AttackStart(nearu); m_creature->getThreatManager().addThreat(nearu, 10000); @@ -520,7 +471,7 @@ struct TRINITY_DLL_DECL boss_veknilashAI : public boss_twinemperorsAI if (UpperCut_Timer < diff) { - Unit* randomMelee = GetAnyoneCloseEnough(ATTACK_DISTANCE, true); + Unit* randomMelee = SelectUnit(SELECT_TARGET_RANDOM, 0, NOMINAL_MELEE_RANGE, true); if (randomMelee) DoCast(randomMelee,SPELL_UPPERCUT); UpperCut_Timer = 15000+rand()%15000; @@ -616,7 +567,7 @@ struct TRINITY_DLL_DECL boss_veklorAI : public boss_twinemperorsAI if (Blizzard_Timer < diff) { Unit* target = NULL; - target = GetAnyoneCloseEnough(45, true); + target = SelectUnit(SELECT_TARGET_RANDOM, 0, 45, true); if (target) DoCast(target,SPELL_BLIZZARD); Blizzard_Timer = 15000+rand()%15000; @@ -625,7 +576,7 @@ struct TRINITY_DLL_DECL boss_veklorAI : public boss_twinemperorsAI if (ArcaneBurst_Timer < diff) { Unit *mvic; - if ((mvic=GetAnyoneCloseEnough(ATTACK_DISTANCE, false))!=NULL) + if ((mvic=SelectUnit(SELECT_TARGET_NEAREST, 0, NOMINAL_MELEE_RANGE, true))!=NULL) { DoCast(mvic,SPELL_ARCANEBURST); ArcaneBurst_Timer = 5000; diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp index 2fa0b83432a..2313af09831 100644 --- a/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp +++ b/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp @@ -268,7 +268,7 @@ struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI { if( !m_creature->IsNonMeleeSpellCasted(false)) { - if(m_creature->isAttackReady() && m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE)) + if(m_creature->isAttackReady() && m_creature->IsWithinMeleeRange(m_creature->getVictim())) { if(Phase == 1 && !Overpower_Timer) { @@ -474,7 +474,7 @@ struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI if(target) { AttackStart(target); - if(m_creature->IsWithinDistInMap(target, ATTACK_DISTANCE)) + if(m_creature->IsWithinMeleeRange(target)) { m_creature->CastSpell(target, SPELL_CLAW_RAGE_DAMAGE, true); Claw_Counter++; @@ -517,7 +517,7 @@ struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI } if(target) { - if(m_creature->IsWithinDistInMap(target, ATTACK_DISTANCE)) + if(m_creature->IsWithinMeleeRange(target)) { m_creature->CastSpell(target, SPELL_LYNX_RUSH_DAMAGE, true); Claw_Counter++; @@ -613,7 +613,7 @@ struct TRINITY_DLL_DECL feather_vortexAI : public ScriptedAI void UpdateAI(const uint32 diff) { //if the vortex reach the target, it change his target to another player - if( m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE)) + if( m_creature->IsWithinMeleeRange(m_creature->getVictim())) AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0)); } }; diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp index a70f39e2210..8a9f7320764 100644 --- a/src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp +++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp @@ -134,7 +134,7 @@ struct TRINITY_DLL_DECL boss_mandokirAI : public ScriptedAI targetZ != pUnit->GetPositionZ() || pUnit->isInCombat())) { - if(m_creature->IsWithinDistInMap(pUnit, ATTACK_DISTANCE)) + if(m_creature->IsWithinMeleeRange(pUnit)) { DoCast(pUnit,24316); } @@ -200,7 +200,7 @@ struct TRINITY_DLL_DECL boss_mandokirAI : public ScriptedAI for(; i != m_creature->getThreatManager().getThreatList().end(); ++i) { Unit* pUnit = Unit::GetUnit(*m_creature, (*i)->getUnitGuid()); - if(pUnit && m_creature->IsWithinDistInMap(pUnit, ATTACK_DISTANCE)) + if(pUnit && m_creature->IsWithinMeleeRange(pUnit)) TargetInRange++; } diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_thekal.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_thekal.cpp index 0eebbc1dda6..47f9588485d 100644 --- a/src/bindings/scripts/scripts/zone/zulgurub/boss_thekal.cpp +++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_thekal.cpp @@ -311,11 +311,11 @@ struct TRINITY_DLL_DECL mob_zealot_lorkhanAI : public ScriptedAI switch(rand()%2) { case 0: - if(m_creature->IsWithinDistInMap(pThekal, ATTACK_DISTANCE)) + if(m_creature->IsWithinMeleeRange(pThekal)) DoCast(pThekal, SPELL_GREATERHEAL); break; case 1: - if(m_creature->IsWithinDistInMap(pZath, ATTACK_DISTANCE)) + if(m_creature->IsWithinMeleeRange(pZath)) DoCast(pZath, SPELL_GREATERHEAL); break; } diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_venoxis.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_venoxis.cpp index 3d8657d1b67..177d270a6ab 100644 --- a/src/bindings/scripts/scripts/zone/zulgurub/boss_venoxis.cpp +++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_venoxis.cpp @@ -116,7 +116,7 @@ struct TRINITY_DLL_DECL boss_venoxisAI : public ScriptedAI { target = SelectUnit(SELECT_TARGET_TOPAGGRO,i); if(target) - if(m_creature->IsWithinDistInMap(target, ATTACK_DISTANCE)) + if(m_creature->IsWithinMeleeRange(target)) TargetInRange++; } diff --git a/src/game/AggressorAI.cpp b/src/game/AggressorAI.cpp index 27c1ad6ee6c..3fd0f63d194 100644 --- a/src/game/AggressorAI.cpp +++ b/src/game/AggressorAI.cpp @@ -126,7 +126,7 @@ AggressorAI::UpdateAI(const uint32 /*diff*/) if( i_creature.isAttackReady() ) { - if( i_creature.IsWithinCombatDist(i_creature.getVictim(), ATTACK_DISTANCE)) + if( i_creature.IsWithinMeleeRange(i_creature.getVictim())) { i_creature.AttackerStateUpdate(i_creature.getVictim()); i_creature.resetAttackTimer(); diff --git a/src/game/GuardAI.cpp b/src/game/GuardAI.cpp index 8c029a5531e..806b4a1a112 100644 --- a/src/game/GuardAI.cpp +++ b/src/game/GuardAI.cpp @@ -117,7 +117,7 @@ void GuardAI::UpdateAI(const uint32 /*diff*/) if( i_creature.isAttackReady() ) { - if( i_creature.IsWithinCombatDist(i_creature.getVictim(), ATTACK_DISTANCE)) + if( i_creature.IsWithinMeleeRange(i_creature.getVictim())) { i_creature.AttackerStateUpdate(i_creature.getVictim()); i_creature.resetAttackTimer(); diff --git a/src/game/Object.h b/src/game/Object.h index b5546c04caa..731e788783f 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -39,7 +39,9 @@ #define DEFAULT_WORLD_OBJECT_SIZE 0.388999998569489f // player size, also currently used (correctly?) for any non Unit world objects #define DEFAULT_COMBAT_REACH 1.5f -#define ATTACK_DISTANCE (5.0f - DEFAULT_COMBAT_REACH * 2) // melee range: center to center for players +#define MIN_MELEE_REACH 2.0f +#define NOMINAL_MELEE_RANGE 5.0f +#define MELEE_RANGE (NOMINAL_MELEE_RANGE - MIN_MELEE_REACH * 2) //center to center for players enum TypeMask { diff --git a/src/game/PetAI.cpp b/src/game/PetAI.cpp index 449d8b9924a..6a87d52cfca 100644 --- a/src/game/PetAI.cpp +++ b/src/game/PetAI.cpp @@ -156,7 +156,7 @@ void PetAI::UpdateAI(const uint32 diff) _stopAttack(); return; } - else if( i_pet.IsStopped() || i_pet.IsWithinDistInMap(i_pet.getVictim(), ATTACK_DISTANCE)) + else if( i_pet.IsStopped() || i_pet.IsWithinMeleeRange(i_pet.getVictim())) { // required to be stopped cases if ( i_pet.IsStopped() && i_pet.IsNonMeleeSpellCasted(false) ) @@ -167,7 +167,7 @@ void PetAI::UpdateAI(const uint32 diff) return; } // not required to be stopped case - else if( i_pet.isAttackReady() && i_pet.IsWithinCombatDist(i_pet.getVictim(), ATTACK_DISTANCE) ) + else if( i_pet.isAttackReady() && i_pet.IsWithinMeleeRange(i_pet.getVictim()) ) { i_pet.AttackerStateUpdate(i_pet.getVictim()); @@ -341,6 +341,6 @@ void PetAI::AttackedBy(Unit *attacker) { //when attacked, fight back in case 1)no victim already AND 2)not set to passive AND 3)not set to stay, unless can it can reach attacker with melee attack anyway if(!i_pet.getVictim() && i_pet.GetCharmInfo() && !i_pet.GetCharmInfo()->HasReactState(REACT_PASSIVE) && - (!i_pet.GetCharmInfo()->HasCommandState(COMMAND_STAY) || i_pet.canReachWithAttack(attacker))) + (!i_pet.GetCharmInfo()->HasCommandState(COMMAND_STAY) || i_pet.IsWithinMeleeRange(attacker))) AttackStart(attacker); } diff --git a/src/game/Player.cpp b/src/game/Player.cpp index d16dac54f54..05204fe9c78 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -1106,11 +1106,9 @@ void Player::Update( uint32 p_time ) // default combat reach 10 // TODO add weapon,skill check - float pldistance = ATTACK_DISTANCE; - if (isAttackReady(BASE_ATTACK)) { - if(!IsWithinCombatDist(pVictim, pldistance)) + if(!IsWithinMeleeRange(pVictim)) { setAttackTimer(BASE_ATTACK,100); if(m_swingErrorMsg != 1) // send single time (client auto repeat) @@ -1147,7 +1145,7 @@ void Player::Update( uint32 p_time ) if ( haveOffhandWeapon() && isAttackReady(OFF_ATTACK)) { - if(!IsWithinCombatDist(pVictim, pldistance)) + if(!IsWithinMeleeRange(pVictim)) { setAttackTimer(OFF_ATTACK,100); } diff --git a/src/game/PossessedAI.cpp b/src/game/PossessedAI.cpp index 17dd28f0b0f..4292a2bd22b 100644 --- a/src/game/PossessedAI.cpp +++ b/src/game/PossessedAI.cpp @@ -95,7 +95,7 @@ void PossessedAI::UpdateAI(const uint32 diff) _stopAttack(); // i_victimGuid == 0 && i_pet.getVictim() == NULL now return; } - else if(i_pet.IsWithinCombatDist(i_pet.getVictim(), ATTACK_DISTANCE) && i_pet.isAttackReady() && !i_pet.GetCharmer()->HasAuraType(SPELL_AURA_MOD_PACIFY)) + else if(i_pet.IsWithinMeleeRange(i_pet.getVictim()) && i_pet.isAttackReady() && !i_pet.GetCharmer()->HasAuraType(SPELL_AURA_MOD_PACIFY)) { i_pet.AttackerStateUpdate(i_pet.getVictim()); diff --git a/src/game/ReactorAI.cpp b/src/game/ReactorAI.cpp index 9d596751075..dd796b74f38 100644 --- a/src/game/ReactorAI.cpp +++ b/src/game/ReactorAI.cpp @@ -76,7 +76,7 @@ ReactorAI::UpdateAI(const uint32 /*time_diff*/) if( i_creature.isAttackReady() ) { - if( i_creature.IsWithinCombatDist(i_creature.getVictim(), ATTACK_DISTANCE)) + if( i_creature.IsWithinMeleeRange(i_creature.getVictim())) { i_creature.AttackerStateUpdate(i_creature.getVictim()); i_creature.resetAttackTimer(); diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 56247e1bcbe..307c7770cae 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -4682,23 +4682,9 @@ uint8 Spell::CheckRange(bool strict) range_mod = 6.25;*/ SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex); - float max_range, min_range; - float range_type = GetSpellRangeType(srange); - if(range_type == SPELL_RANGE_DEFAULT) - { - max_range = GetSpellMaxRange(srange);// + range_mod; - min_range = GetSpellMinRange(srange); - } - else if(range_type == SPELL_RANGE_MELEE) - { - max_range = ATTACK_DISTANCE; - min_range = GetSpellMinRange(srange); - } - else - { - max_range = GetSpellMaxRange(srange);// + range_mod; - min_range = ATTACK_DISTANCE; - } + float max_range = GetSpellMaxRange(srange); // + range_mod; + float min_range = GetSpellMinRange(srange); + uint32 range_type = GetSpellRangeType(srange); if(Player* modOwner = m_caster->GetSpellModOwner()) modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RANGE, max_range, this); @@ -4707,11 +4693,20 @@ uint8 Spell::CheckRange(bool strict) if(target && target != m_caster) { - // distance from target center in checks - if(!m_caster->IsWithinCombatDist(target, max_range)) + if(range_type == SPELL_RANGE_MELEE) + { + if(!m_caster->IsWithinMeleeRange(target)) + return SPELL_FAILED_OUT_OF_RANGE; + } + else if(!m_caster->IsWithinCombatRange(target, max_range)) return SPELL_FAILED_OUT_OF_RANGE; //0x5A; - if(min_range && m_caster->IsWithinCombatDist(target, min_range)) // skip this check if min_range = 0 + if(range_type == SPELL_RANGE_RANGED) + { + if(m_caster->IsWithinMeleeRange(target)) + return SPELL_FAILED_TOO_CLOSE; + } + else if(min_range && m_caster->IsWithinCombatRange(target, min_range)) // skip this check if min_range = 0 return SPELL_FAILED_TOO_CLOSE; if( m_caster->GetTypeId() == TYPEID_PLAYER && diff --git a/src/game/TargetedMovementGenerator.cpp b/src/game/TargetedMovementGenerator.cpp index bd0e7e378fd..9793a81cf14 100644 --- a/src/game/TargetedMovementGenerator.cpp +++ b/src/game/TargetedMovementGenerator.cpp @@ -60,7 +60,7 @@ TargetedMovementGenerator<T>::_setTargetLocation(T &owner) if(!i_offset) { // to nearest random contact position - i_target->GetRandomContactPoint( &owner, x, y, z, 0.5f, ATTACK_DISTANCE - 0.5f ); + i_target->GetRandomContactPoint( &owner, x, y, z, 0, MELEE_RANGE - 0.5f ); } else { @@ -185,7 +185,7 @@ TargetedMovementGenerator<T>::Update(T &owner, const uint32 & time_diff) owner.SetInFront(i_target.getTarget()); owner.StopMoving(); - if(owner.IsWithinCombatDist(i_target.getTarget(), ATTACK_DISTANCE) && !owner.hasUnitState(UNIT_STAT_FOLLOW)) + if(owner.IsWithinMeleeRange(i_target.getTarget()) && !owner.hasUnitState(UNIT_STAT_FOLLOW)) owner.Attack(i_target.getTarget(),true); } } diff --git a/src/game/ThreatManager.cpp b/src/game/ThreatManager.cpp index 94f12f5394a..44bf18d2462 100644 --- a/src/game/ThreatManager.cpp +++ b/src/game/ThreatManager.cpp @@ -302,7 +302,7 @@ HostilReference* ThreatContainer::selectNextVictim(Creature* pAttacker, HostilRe } if( currentRef->getThreat() > 1.3f * pCurrentVictim->getThreat() || - currentRef->getThreat() > 1.1f * pCurrentVictim->getThreat() && pAttacker->IsWithinDistInMap(target, ATTACK_DISTANCE) ) + currentRef->getThreat() > 1.1f * pCurrentVictim->getThreat() && pAttacker->IsWithinMeleeRange(target) ) { //implement 110% threat rule for targets in melee range found = true; //and 130% rule for targets in ranged distances break; //for selecting alive targets diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 2f0e5a1fe43..aa1fb0a5a5d 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -420,13 +420,22 @@ void Unit::resetAttackTimer(WeaponAttackType type) m_attackTimer[type] = uint32(GetAttackTime(type) * m_modAttackSpeedPct[type]); } -bool Unit::canReachWithAttack(Unit *pVictim) const +bool Unit::IsWithinCombatRange(Unit *obj, float dist2compare) const { - assert(pVictim); - return IsWithinDistInMap(pVictim, GetCombatReach()); + 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; + + float sizefactor = GetCombatReach() + obj->GetCombatReach(); + float maxdist = dist2compare + sizefactor; + + return distsq < maxdist * maxdist; } -bool Unit::IsWithinCombatDist(Unit *obj, float dist2compare) const +bool Unit::IsWithinMeleeRange(Unit *obj) const { if (!obj || !IsInMap(obj)) return false; @@ -434,9 +443,9 @@ bool Unit::IsWithinCombatDist(Unit *obj, float dist2compare) const 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 = GetCombatReach() + obj->GetCombatReach(); - float maxdist = dist2compare + sizefactor; + + float sizefactor = GetMeleeReach() + obj->GetMeleeReach(); + float maxdist = MELEE_RANGE + sizefactor; return distsq < maxdist * maxdist; } diff --git a/src/game/Unit.h b/src/game/Unit.h index 24722645eaf..7f93ede83b4 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -771,10 +771,10 @@ class TRINITY_DLL_SPEC Unit : public WorldObject bool haveOffhandWeapon() const; 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; - bool IsWithinMeleeRange(Unit *obj) const { return IsWithinCombatDist(obj, ATTACK_DISTANCE); } + float GetMeleeReach() const { float reach = m_floatValues[UNIT_FIELD_COMBATREACH]; return reach > MIN_MELEE_REACH ? reach : MIN_MELEE_REACH; } + bool IsWithinCombatRange(Unit *obj, float dist2compare) const; + bool IsWithinMeleeRange(Unit *obj) const; void GetRandomContactPoint( const Unit* target, float &x, float &y, float &z, float distance2dMin, float distance2dMax ) const; uint32 m_extraAttacks; bool m_canDualWield; @@ -810,7 +810,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject Unit* getVictim() const { return m_attacking; } void CombatStop(bool cast = false); void CombatStopWithPets(bool cast = false); - Unit* SelectNearbyTarget(float dist = ATTACK_DISTANCE) const; + Unit* SelectNearbyTarget(float dist = NOMINAL_MELEE_RANGE) const; void addUnitState(uint32 f) { m_state |= f; } bool hasUnitState(const uint32 f) const { return (m_state & f); } diff --git a/src/game/World.cpp b/src/game/World.cpp index a7cff4cb686..4cde9683cc3 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -477,11 +477,11 @@ void World::LoadConfigSettings(bool reload) sLog.outError("TargetPosRecalculateRange (%f) must be >= %f. Using %f instead.",rate_values[RATE_TARGET_POS_RECALCULATION_RANGE],CONTACT_DISTANCE,CONTACT_DISTANCE); rate_values[RATE_TARGET_POS_RECALCULATION_RANGE] = CONTACT_DISTANCE; } - else if(rate_values[RATE_TARGET_POS_RECALCULATION_RANGE] > ATTACK_DISTANCE) + else if(rate_values[RATE_TARGET_POS_RECALCULATION_RANGE] > NOMINAL_MELEE_RANGE) { sLog.outError("TargetPosRecalculateRange (%f) must be <= %f. Using %f instead.", - rate_values[RATE_TARGET_POS_RECALCULATION_RANGE],ATTACK_DISTANCE,ATTACK_DISTANCE); - rate_values[RATE_TARGET_POS_RECALCULATION_RANGE] = ATTACK_DISTANCE; + rate_values[RATE_TARGET_POS_RECALCULATION_RANGE],NOMINAL_MELEE_RANGE,NOMINAL_MELEE_RANGE); + rate_values[RATE_TARGET_POS_RECALCULATION_RANGE] = NOMINAL_MELEE_RANGE; } rate_values[RATE_DURABILITY_LOSS_DAMAGE] = sConfig.GetFloatDefault("DurabilityLossChance.Damage",0.5f); |