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* 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 | if(!u->isAlive() || !m_creature->IsHostileTo(u)) |
| 712 | return false; |
| 713 | |
| 714 | float dist; |
| 715 | if(m_force) dist = m_range; |
| 716 | else |
| 717 | { |
| 718 | dist = m_creature->GetAttackDistance(u); |
| 719 | if(dist > m_range) dist = m_range; |
| 720 | } |
| 721 | if(!m_creature->IsWithinDistInMap(u, dist)) |
| 722 | return false; |
| 723 | |
| 724 | if(!m_creature->canSeeOrDetect(u, true, false)) |
| 725 | return false; |
| 726 | |
| 727 | m_range = m_creature->GetDistance(u); |
| 728 | return true; |
| 729 | } |
| 730 | float GetLastRange() const { return m_range; } |
| 731 | private: |
| 732 | Creature* const m_creature; |
| 733 | float m_range; |
| 734 | bool m_force; |
| 735 | NearestHostileUnitInAttackDistanceCheck(NearestHostileUnitInAttackDistanceCheck const&); |