mirror of
https://github.com/mangosfour/server.git
synced 2025-12-12 01:37:00 +00:00
[11793] Add more features to SelectAttackingTarget
Signed-off-by: Schmoozerd <schmoozerd@scriptdev2.com>
This commit is contained in:
parent
6baf677a63
commit
0eff04c161
6 changed files with 98 additions and 32 deletions
|
|
@ -2027,40 +2027,101 @@ void Creature::SetInCombatWithZone()
|
|||
}
|
||||
}
|
||||
|
||||
Unit* Creature::SelectAttackingTarget(AttackingTarget target, uint32 position) const
|
||||
bool Creature::MeetsSelectAttackingRequirement(Unit* pTarget, SpellEntry const* pSpellInfo, uint32 selectFlags) const
|
||||
{
|
||||
if (selectFlags & SELECT_FLAG_PLAYER && pTarget->GetTypeId() != TYPEID_PLAYER)
|
||||
return false;
|
||||
|
||||
if (selectFlags & SELECT_FLAG_POWER_MANA && pTarget->getPowerType() != POWER_MANA)
|
||||
return false;
|
||||
else if (selectFlags & SELECT_FLAG_POWER_RAGE && pTarget->getPowerType() != POWER_RAGE)
|
||||
return false;
|
||||
else if (selectFlags & SELECT_FLAG_POWER_ENERGY && pTarget->getPowerType() != POWER_ENERGY)
|
||||
return false;
|
||||
else if (selectFlags & SELECT_FLAG_POWER_RUNIC && pTarget->getPowerType() != POWER_RUNIC_POWER)
|
||||
return false;
|
||||
|
||||
if (selectFlags & SELECT_FLAG_IN_MELEE_RANGE && !CanReachWithMeleeAttack(pTarget))
|
||||
return false;
|
||||
|
||||
if (selectFlags & SELECT_FLAG_IN_LOS && !IsWithinLOSInMap(pTarget))
|
||||
return false;
|
||||
|
||||
if (pSpellInfo)
|
||||
{
|
||||
switch (pSpellInfo->rangeIndex)
|
||||
{
|
||||
case SPELL_RANGE_IDX_SELF_ONLY: return false;
|
||||
case SPELL_RANGE_IDX_ANYWHERE: return true;
|
||||
case SPELL_RANGE_IDX_COMBAT: return CanReachWithMeleeAttack(pTarget);
|
||||
}
|
||||
|
||||
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(pSpellInfo->rangeIndex);
|
||||
float max_range = GetSpellMaxRange(srange);
|
||||
float min_range = GetSpellMinRange(srange);
|
||||
float dist = GetCombatDistance(pTarget);
|
||||
|
||||
return dist < max_range && dist >= min_range;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Unit* Creature::SelectAttackingTarget(AttackingTarget target, uint32 position, uint32 uiSpellEntry, uint32 selectFlags) const
|
||||
{
|
||||
return SelectAttackingTarget(target, position, sSpellStore.LookupEntry(uiSpellEntry), selectFlags);
|
||||
}
|
||||
|
||||
Unit* Creature::SelectAttackingTarget(AttackingTarget target, uint32 position, SpellEntry const* pSpellInfo /*= NULL*/, uint32 selectFlags/*= 0*/) const
|
||||
{
|
||||
if (!CanHaveThreatList())
|
||||
return NULL;
|
||||
|
||||
//ThreatList m_threatlist;
|
||||
// ThreatList m_threatlist;
|
||||
ThreatList const& threatlist = getThreatManager().getThreatList();
|
||||
ThreatList::const_iterator i = threatlist.begin();
|
||||
ThreatList::const_reverse_iterator r = threatlist.rbegin();
|
||||
ThreatList::const_iterator itr = threatlist.begin();
|
||||
ThreatList::const_reverse_iterator ritr = threatlist.rbegin();
|
||||
|
||||
if (position >= threatlist.size() || !threatlist.size())
|
||||
return NULL;
|
||||
|
||||
switch(target)
|
||||
switch (target)
|
||||
{
|
||||
case ATTACKING_TARGET_RANDOM:
|
||||
{
|
||||
advance(i, position + (rand() % (threatlist.size() - position)));
|
||||
return GetMap()->GetUnit((*i)->getUnitGuid());
|
||||
std::vector<Unit*> suitableUnits;
|
||||
suitableUnits.reserve(threatlist.size() - position);
|
||||
advance(itr, position);
|
||||
for (itr; itr != threatlist.end(); ++itr)
|
||||
if (Unit* pTarget = GetMap()->GetUnit((*itr)->getUnitGuid()))
|
||||
if (!selectFlags || MeetsSelectAttackingRequirement(pTarget, pSpellInfo, selectFlags))
|
||||
suitableUnits.push_back(pTarget);
|
||||
|
||||
if (!suitableUnits.empty())
|
||||
return suitableUnits[urand(0, suitableUnits.size()-1)];
|
||||
|
||||
break;
|
||||
}
|
||||
case ATTACKING_TARGET_TOPAGGRO:
|
||||
{
|
||||
advance(i, position);
|
||||
return GetMap()->GetUnit((*i)->getUnitGuid());
|
||||
advance(itr, position);
|
||||
for (itr; itr != threatlist.end(); ++itr)
|
||||
if (Unit* pTarget = GetMap()->GetUnit((*itr)->getUnitGuid()))
|
||||
if (!selectFlags || MeetsSelectAttackingRequirement(pTarget, pSpellInfo, selectFlags))
|
||||
return pTarget;
|
||||
|
||||
break;
|
||||
}
|
||||
case ATTACKING_TARGET_BOTTOMAGGRO:
|
||||
{
|
||||
advance(r, position);
|
||||
return GetMap()->GetUnit((*r)->getUnitGuid());
|
||||
advance(ritr, position);
|
||||
for (ritr; ritr != threatlist.rend(); ++ritr)
|
||||
if (Unit* pTarget = GetMap()->GetUnit((*itr)->getUnitGuid()))
|
||||
if (!selectFlags || MeetsSelectAttackingRequirement(pTarget, pSpellInfo, selectFlags))
|
||||
return pTarget;
|
||||
|
||||
break;
|
||||
}
|
||||
// TODO: implement these
|
||||
//case ATTACKING_TARGET_RANDOM_PLAYER:
|
||||
//case ATTACKING_TARGET_TOPAGGRO_PLAYER:
|
||||
//case ATTACKING_TARGET_BOTTOMAGGRO_PLAYER:
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue