aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game/UnitAI.cpp138
1 files changed, 52 insertions, 86 deletions
diff --git a/src/game/UnitAI.cpp b/src/game/UnitAI.cpp
index 1938491060e..cb8335fac04 100644
--- a/src/game/UnitAI.cpp
+++ b/src/game/UnitAI.cpp
@@ -120,69 +120,49 @@ struct TargetDistanceOrder : public std::binary_function<const Unit *, const Uni
Unit* UnitAI::SelectTarget(SelectAggroTarget targetType, uint32 position, float dist, bool playerOnly, int32 aura)
{
- if(targetType == SELECT_TARGET_NEAREST || targetType == SELECT_TARGET_FARTHEST)
- {
- std::list<HostilReference*> &m_threatlist = me->getThreatManager().getThreatList();
- if(position >= m_threatlist.size())
- return NULL;
+ const std::list<HostilReference *> &threatlist = me->getThreatManager().getThreatList();
+ std::list<Unit*> targetList;
- std::list<Unit*> targetList;
- for (std::list<HostilReference*>::iterator itr = m_threatlist.begin(); itr!= m_threatlist.end(); ++itr)
- if(SelectTargetHelper(me, (*itr)->getTarget(), playerOnly, dist, aura))
- targetList.push_back((*itr)->getTarget());
+ if (position >= threatlist.size())
+ return NULL;
- if(position >= targetList.size())
- return NULL;
+ for (std::list<HostilReference*>::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
+ if (SelectTargetHelper(me, (*itr)->getTarget(), playerOnly, dist, aura))
+ targetList.push_back((*itr)->getTarget());
+
+ if (position >= targetList.size())
+ return NULL;
+ if (targetType == SELECT_TARGET_NEAREST || targetType == SELECT_TARGET_FARTHEST)
targetList.sort(TargetDistanceOrder(me));
- if(targetType == SELECT_TARGET_NEAREST)
- {
- std::list<Unit*>::iterator i = targetList.begin();
- advance(i, position);
- return *i;
- }
- else
- {
- std::list<Unit*>::reverse_iterator i = targetList.rbegin();
- advance(i, position);
- return *i;
- }
- }
- else
+ switch(targetType)
{
- std::list<HostilReference*> m_threatlist = me->getThreatManager().getThreatList();
- std::list<HostilReference*>::iterator i;
- while(position < m_threatlist.size())
- {
- if(targetType == SELECT_TARGET_BOTTOMAGGRO)
+ case SELECT_TARGET_NEAREST:
+ case SELECT_TARGET_TOPAGGRO:
{
- i = m_threatlist.end();
- advance(i, - (int32)position - 1);
+ std::list<Unit*>::iterator itr = targetList.begin();
+ advance(itr, position);
+ return *itr;
}
- else
+ break;
+
+ case SELECT_TARGET_FARTHEST:
+ case SELECT_TARGET_BOTTOMAGGRO:
{
- i = m_threatlist.begin();
- if(targetType == SELECT_TARGET_TOPAGGRO)
- advance(i, position);
- else // random
- {
- //advance(i, position + rand()%(m_threatlist.size() - position));
- //if we use "random, 1", usually we want random except current victim
- advance(i, rand()%m_threatlist.size());
- if(position && (*i)->getTarget() == me->getVictim())
- {
- m_threatlist.erase(i);
- continue;
- }
- }
+ std::list<Unit*>::reverse_iterator ritr = targetList.rbegin();
+ advance(ritr, position);
+ return *ritr;
}
+ break;
- if(SelectTargetHelper(me, (*i)->getTarget(), playerOnly, dist, aura))
- return (*i)->getTarget();
- else
- m_threatlist.erase(i);
- }
+ case SELECT_TARGET_RANDOM:
+ {
+ std::list<Unit*>::iterator itr = targetList.begin();
+ advance(itr, urand(position, targetList.size()-1));
+ return *itr;
+ }
+ break;
}
return NULL;
@@ -190,47 +170,33 @@ Unit* UnitAI::SelectTarget(SelectAggroTarget targetType, uint32 position, float
void UnitAI::SelectTargetList(std::list<Unit*> &targetList, uint32 num, SelectAggroTarget targetType, float dist, bool playerOnly, int32 aura)
{
- if(targetType == SELECT_TARGET_NEAREST || targetType == SELECT_TARGET_FARTHEST)
- {
- std::list<HostilReference*> &m_threatlist = me->getThreatManager().getThreatList();
- if(m_threatlist.empty())
- return;
+ const std::list<HostilReference*> &threatlist = me->getThreatManager().getThreatList();
+
+ if (threatlist.empty())
+ return;
- for (std::list<HostilReference*>::iterator itr = m_threatlist.begin(); itr!= m_threatlist.end(); ++itr)
- if(SelectTargetHelper(me, (*itr)->getTarget(), playerOnly, dist, aura))
- targetList.push_back((*itr)->getTarget());
+ for (std::list<HostilReference*>::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
+ if (SelectTargetHelper(me, (*itr)->getTarget(), playerOnly, dist, aura))
+ targetList.push_back((*itr)->getTarget());
+ if (targetType == SELECT_TARGET_NEAREST || targetType == SELECT_TARGET_FARTHEST)
+ {
targetList.sort(TargetDistanceOrder(me));
- targetList.resize(num);
- if(targetType == SELECT_TARGET_FARTHEST)
- targetList.reverse();
}
- else
- {
- std::list<HostilReference*> m_threatlist = me->getThreatManager().getThreatList();
- std::list<HostilReference*>::iterator i;
- while(!m_threatlist.empty() && num)
- {
- if(targetType == SELECT_TARGET_BOTTOMAGGRO)
- {
- i = m_threatlist.end();
- --i;
- }
- else
- {
- i = m_threatlist.begin();
- if(targetType == SELECT_TARGET_RANDOM)
- advance(i, rand()%m_threatlist.size());
- }
- if(SelectTargetHelper(me, (*i)->getTarget(), playerOnly, dist, aura))
- {
- targetList.push_back((*i)->getTarget());
- --num;
- }
- m_threatlist.erase(i);
+ if (targetType == SELECT_TARGET_FARTHEST || targetType == SELECT_TARGET_BOTTOMAGGRO)
+ targetList.reverse();
+
+ if (targetType == SELECT_TARGET_RANDOM)
+ {
+ while (num > targetList.size()) {
+ std::list<Unit*>::iterator itr = targetList.begin();
+ advance(itr, urand(0, targetList.size()-1));
+ targetList.erase(itr);
}
}
+ else
+ targetList.resize(num);
}
float UnitAI::DoGetSpellMaxRange(uint32 spellId, bool positive)