Scripts: Removed duplicate target selection function (SelectUnit), there is only SelectTarget now

This commit is contained in:
Shauren
2011-03-09 21:32:04 +01:00
parent 6e1e6957e2
commit c2c40a4750
169 changed files with 420 additions and 523 deletions
+1 -29
View File
@@ -87,35 +87,7 @@ 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)
{
const std::list<HostileReference*> &threatlist = me->getThreatManager().getThreatList();
if (threatlist.empty())
return;
DefaultTargetSelector targetSelector(me, dist,playerOnly, aura);
for (std::list<HostileReference*>::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
if (targetSelector((*itr)->getTarget()))
targetList.push_back((*itr)->getTarget());
if (targetType == SELECT_TARGET_NEAREST || targetType == SELECT_TARGET_FARTHEST)
targetList.sort(Trinity::ObjectDistanceOrderPred(me));
if (targetType == SELECT_TARGET_FARTHEST || targetType == SELECT_TARGET_BOTTOMAGGRO)
targetList.reverse();
if (targetList.size() < num)
return;
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);
SelectTargetList(targetList, DefaultTargetSelector(me, dist, playerOnly, aura), num, targetType);
}
float UnitAI::DoGetSpellMaxRange(uint32 spellId, bool positive)
+26 -66
View File
@@ -126,20 +126,16 @@ class UnitAI
Unit* SelectTarget(SelectAggroTarget targetType, uint32 position = 0, float dist = 0.0f, bool playerOnly = false, int32 aura = 0);
// Select the targets satifying the predicate.
// predicate shall extend std::unary_function<Unit *, bool>
template<class PREDICATE> Unit* SelectTarget(SelectAggroTarget targetType, uint32 position, PREDICATE predicate)
template <class PREDICATE> Unit* SelectTarget(SelectAggroTarget targetType, uint32 position, PREDICATE predicate)
{
const std::list<HostileReference *> &threatlist = me->getThreatManager().getThreatList();
std::list<Unit*> targetList;
if (position >= threatlist.size())
return NULL;
std::list<Unit*> targetList;
for (std::list<HostileReference*>::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
{
HostileReference* ref = (*itr);
if (predicate(ref->getTarget()))
targetList.push_back(ref->getTarget());
}
if (predicate((*itr)->getTarget()))
targetList.push_back((*itr)->getTarget());
if (position >= targetList.size())
return NULL;
@@ -147,33 +143,30 @@ class UnitAI
if (targetType == SELECT_TARGET_NEAREST || targetType == SELECT_TARGET_FARTHEST)
targetList.sort(Trinity::ObjectDistanceOrderPred(me));
switch(targetType)
switch (targetType)
{
case SELECT_TARGET_NEAREST:
case SELECT_TARGET_TOPAGGRO:
{
std::list<Unit*>::iterator itr = targetList.begin();
advance(itr, position);
std::advance(itr, position);
return *itr;
}
break;
case SELECT_TARGET_FARTHEST:
case SELECT_TARGET_BOTTOMAGGRO:
{
std::list<Unit*>::reverse_iterator ritr = targetList.rbegin();
advance(ritr, position);
std::advance(ritr, position);
return *ritr;
}
break;
case SELECT_TARGET_RANDOM:
{
std::list<Unit*>::iterator itr = targetList.begin();
advance(itr, urand(position, targetList.size()-1));
std::advance(itr, urand(position, targetList.size()-1));
return *itr;
}
break;
default:
break;
}
return NULL;
@@ -182,62 +175,29 @@ class UnitAI
void SelectTargetList(std::list<Unit*> &targetList, uint32 num, SelectAggroTarget targetType, float dist = 0.0f, bool playerOnly = false, int32 aura = 0);
// Select the targets satifying the predicate.
// predicate shall extend std::unary_function<Unit *, bool>
template<class PREDICATE> void SelectTargetList(std::list<Unit*> &targetList, PREDICATE predicate, uint32 maxTargets, SelectAggroTarget targetType)
template <class PREDICATE> void SelectTargetList(std::list<Unit*> &targetList, PREDICATE predicate, uint32 maxTargets, SelectAggroTarget targetType)
{
std::list<HostileReference *> const &threatlist = me->getThreatManager().getThreatList();
std::list<HostileReference*>::const_iterator itr;
std::list<HostileReference*> const& threatlist = me->getThreatManager().getThreatList();
if (threatlist.empty())
return;
for (itr = threatlist.begin(); itr != threatlist.end(); ++itr)
{
HostileReference* ref = (*itr);
if (predicate(ref->getTarget()))
targetList.push_back(ref->getTarget());
}
for (std::list<HostileReference*>::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
if (predicate((*itr)->getTarget()))
targetList.push_back((*itr)->getTarget());
if (targetList.size() < maxTargets)
return;
if (targetType == SELECT_TARGET_NEAREST || targetType == SELECT_TARGET_FARTHEST)
targetList.sort(Trinity::ObjectDistanceOrderPred(me));
switch(targetType)
{
case SELECT_TARGET_NEAREST:
case SELECT_TARGET_TOPAGGRO:
{
// Already sorted
if (!maxTargets || maxTargets >= targetList.size()) // Do not filter
return;
if (targetType == SELECT_TARGET_FARTHEST || targetType == SELECT_TARGET_BOTTOMAGGRO)
targetList.reverse();
std::list<Unit*>::iterator itr = targetList.begin();
advance(itr, maxTargets);
for (; itr != targetList.end();)
targetList.erase(itr++); // Filter out any element more than maxTargets
}
break;
case SELECT_TARGET_FARTHEST:
case SELECT_TARGET_BOTTOMAGGRO:
{
if (maxTargets >= targetList.size()) // Do not filter
return;
// Sort (reverse)
targetList.reverse();
std::list<Unit*>::iterator itr = targetList.begin();
for (uint32 i = 0; i < maxTargets; ++i)
targetList.pop_back(); // Filter out any element more than maxTarget
}
break;
case SELECT_TARGET_RANDOM:
{
while (maxTargets < targetList.size())
{
std::list<Unit*>::iterator itr = targetList.begin();
advance(itr, urand(0, targetList.size()-1));
targetList.erase(itr);
}
}
break;
}
if (targetType == SELECT_TARGET_RANDOM)
Trinity::RandomResizeList(targetList, maxTargets);
else
targetList.resize(maxTargets);
}
// Called at any Damage to any victim (before damage apply)
@@ -192,38 +192,6 @@ Creature* ScriptedAI::DoSpawnCreature(uint32 uiId, float fX, float fY, float fZ,
return me->SummonCreature(uiId, me->GetPositionX()+fX, me->GetPositionY()+fY, me->GetPositionZ()+fZ, fAngle, (TempSummonType)uiType, uiDespawntime);
}
Unit* ScriptedAI::SelectUnit(SelectAggroTarget pTarget, uint32 uiPosition)
{
//ThreatList m_threatlist;
std::list<HostileReference*>& threatlist = me->getThreatManager().getThreatList();
std::list<HostileReference*>::iterator itr = threatlist.begin();
std::list<HostileReference*>::reverse_iterator ritr = threatlist.rbegin();
if (uiPosition >= threatlist.size() || !threatlist.size())
return NULL;
switch (pTarget)
{
case SELECT_TARGET_RANDOM:
advance (itr , uiPosition + (rand() % (threatlist.size() - uiPosition)));
return Unit::GetUnit((*me),(*itr)->getUnitGuid());
break;
case SELECT_TARGET_TOPAGGRO:
advance (itr , uiPosition);
return Unit::GetUnit((*me),(*itr)->getUnitGuid());
break;
case SELECT_TARGET_BOTTOMAGGRO:
advance (ritr , uiPosition);
return Unit::GetUnit((*me),(*ritr)->getUnitGuid());
break;
default:
return UnitAI::SelectTarget(pTarget, uiPosition);
}
}
SpellEntry const* ScriptedAI::SelectSpell(Unit* pTarget, uint32 uiSchool, uint32 uiMechanic, SelectTargetType selectTargets, uint32 uiPowerCostMin, uint32 uiPowerCostMax, float fRangeMin, float fRangeMax, SelectEffect selectEffects)
{
//No target so we can't cast
@@ -152,9 +152,6 @@ struct ScriptedAI : public CreatureAI
//Spawns a creature relative to me
Creature* DoSpawnCreature(uint32 uiId, float fX, float fY, float fZ, float fAngle, uint32 uiType, uint32 uiDespawntime);
//Selects a unit from the creature's current aggro list
Unit* SelectUnit(SelectAggroTarget pTarget, uint32 uiPosition);
bool HealthBelowPct(uint32 pct) const { return me->HealthBelowPct(pct); }
bool HealthAbovePct(uint32 pct) const { return me->HealthAbovePct(pct); }
@@ -134,13 +134,13 @@ void SimpleAI::KilledUnit(Unit *victim)
pTarget = me->getVictim();
break;
case CAST_HOSTILE_SECOND_AGGRO:
pTarget = SelectUnit(SELECT_TARGET_TOPAGGRO,1);
pTarget = SelectTarget(SELECT_TARGET_TOPAGGRO,1);
break;
case CAST_HOSTILE_LAST_AGGRO:
pTarget = SelectUnit(SELECT_TARGET_BOTTOMAGGRO,0);
pTarget = SelectTarget(SELECT_TARGET_BOTTOMAGGRO,0);
break;
case CAST_HOSTILE_RANDOM:
pTarget = SelectUnit(SELECT_TARGET_RANDOM,0);
pTarget = SelectTarget(SELECT_TARGET_RANDOM,0);
break;
case CAST_KILLEDUNIT_VICTIM:
pTarget = victim;
@@ -182,13 +182,13 @@ void SimpleAI::DamageTaken(Unit *killer, uint32 &damage)
pTarget = me->getVictim();
break;
case CAST_HOSTILE_SECOND_AGGRO:
pTarget = SelectUnit(SELECT_TARGET_TOPAGGRO,1);
pTarget = SelectTarget(SELECT_TARGET_TOPAGGRO,1);
break;
case CAST_HOSTILE_LAST_AGGRO:
pTarget = SelectUnit(SELECT_TARGET_BOTTOMAGGRO,0);
pTarget = SelectTarget(SELECT_TARGET_BOTTOMAGGRO,0);
break;
case CAST_HOSTILE_RANDOM:
pTarget = SelectUnit(SELECT_TARGET_RANDOM,0);
pTarget = SelectTarget(SELECT_TARGET_RANDOM,0);
break;
case CAST_JUSTDIED_KILLER:
pTarget = killer;
@@ -233,13 +233,13 @@ void SimpleAI::UpdateAI(const uint32 diff)
pTarget = me->getVictim();
break;
case CAST_HOSTILE_SECOND_AGGRO:
pTarget = SelectUnit(SELECT_TARGET_TOPAGGRO,1);
pTarget = SelectTarget(SELECT_TARGET_TOPAGGRO,1);
break;
case CAST_HOSTILE_LAST_AGGRO:
pTarget = SelectUnit(SELECT_TARGET_BOTTOMAGGRO,0);
pTarget = SelectTarget(SELECT_TARGET_BOTTOMAGGRO,0);
break;
case CAST_HOSTILE_RANDOM:
pTarget = SelectUnit(SELECT_TARGET_RANDOM,0);
pTarget = SelectTarget(SELECT_TARGET_RANDOM,0);
break;
}