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&); |
| 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; |