701 | | class InAttackDistanceFromAnyHostileCreatureCheck |
702 | | { |
703 | | public: |
704 | | explicit InAttackDistanceFromAnyHostileCreatureCheck(Unit* funit) : i_funit(funit) {} |
705 | | bool operator()(Creature* u) |
706 | | { |
707 | | if(u->isAlive() && u->IsHostileTo(i_funit) && i_funit->IsWithinDistInMap(u, u->GetAttackDistance(i_funit))) |
708 | | return true; |
709 | | |
710 | | return false; |
711 | | } |
712 | | private: |
713 | | Unit* const i_funit; |
| 701 | class NearestHostileUnitInAttackDistanceCheck |
| 702 | { |
| 703 | public: |
| 704 | explicit NearestHostileUnitInAttackDistanceCheck(Creature const* creature, float dist = 0) : m_creature(creature) |
| 705 | { |
| 706 | m_range = (dist == 0 ? 9999 : dist); |
| 707 | m_force = (dist == 0 ? false : true); |
| 708 | } |
| 709 | bool operator()(Unit* u) |
| 710 | { |
| 711 | // TODO: addthreat for every enemy in range? |
| 712 | if(!m_creature->IsWithinDistInMap(u, m_range)) |
| 713 | return false; |
| 714 | |
| 715 | if(m_force) |
| 716 | { |
| 717 | if(!m_creature->canAttack(u)) |
| 718 | return false; |
| 719 | } |
| 720 | else |
| 721 | { |
| 722 | if(!m_creature->canStartAttack(u)) |
| 723 | return false; |
| 724 | } |
| 725 | |
| 726 | m_range = m_creature->GetDistance(u); |
| 727 | return true; |
| 728 | } |
| 729 | float GetLastRange() const { return m_range; } |
| 730 | private: |
| 731 | Creature const *m_creature; |
| 732 | float m_range; |
| 733 | bool m_force; |
| 734 | NearestHostileUnitInAttackDistanceCheck(NearestHostileUnitInAttackDistanceCheck const&); |