[WIP] Core/AI: Pets musn't attack civilian NPC in aggressive mode (#24121)

* Core/AI: Pets musn't attack civilian NPC in aggressive mode

* Move decision to ignore civilians to PetAI, keeping the check in GridNotifiers

Co-authored-by: Giacomo Pozzoni <giacomopoz@gmail.com>
This commit is contained in:
Sorikoff
2020-02-16 17:00:54 +02:00
committed by GitHub
parent 6176ce92ea
commit 5f20715e2f
4 changed files with 12 additions and 5 deletions

View File

@@ -349,7 +349,7 @@ Unit* PetAI::SelectNextTarget(bool allowAutoSelect) const
if (me->HasReactState(REACT_AGGRESSIVE) && allowAutoSelect)
{
if (!me->GetCharmInfo()->IsReturning() || me->GetCharmInfo()->IsFollowing() || me->GetCharmInfo()->IsAtStay())
if (Unit* nearTarget = me->SelectNearestHostileUnitInAggroRange(true))
if (Unit* nearTarget = me->SelectNearestHostileUnitInAggroRange(true, true))
return nearTarget;
}

View File

@@ -2990,14 +2990,14 @@ float Creature::GetAggroRange(Unit const* target) const
return 0.0f;
}
Unit* Creature::SelectNearestHostileUnitInAggroRange(bool useLOS) const
Unit* Creature::SelectNearestHostileUnitInAggroRange(bool useLOS, bool ignoreCivilians) const
{
// Selects nearest hostile target within creature's aggro range. Used primarily by
// pets set to aggressive. Will not return neutral or friendly targets.
Unit* target = nullptr;
Trinity::NearestHostileUnitInAggroRangeCheck u_check(this, useLOS);
Trinity::NearestHostileUnitInAggroRangeCheck u_check(this, useLOS, ignoreCivilians);
Trinity::UnitSearcher<Trinity::NearestHostileUnitInAggroRangeCheck> searcher(this, target, u_check);
Cell::VisitGridObjects(this, searcher, MAX_AGGRO_RADIUS);

View File

@@ -232,7 +232,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma
Unit* SelectNearestTarget(float dist = 0, bool playerOnly = false) const;
Unit* SelectNearestTargetInAttackDistance(float dist = 0) const;
Unit* SelectNearestHostileUnitInAggroRange(bool useLOS = false) const;
Unit* SelectNearestHostileUnitInAggroRange(bool useLOS = false, bool ignoreCivilians = false) const;
void DoFleeToGetAssistance();
void CallForHelp(float fRadius);

View File

@@ -1180,7 +1180,7 @@ namespace Trinity
class NearestHostileUnitInAggroRangeCheck
{
public:
explicit NearestHostileUnitInAggroRangeCheck(Creature const* creature, bool useLOS = false) : _me(creature), _useLOS(useLOS) { }
explicit NearestHostileUnitInAggroRangeCheck(Creature const* creature, bool useLOS = false, bool ignoreCivilians = false) : _me(creature), _useLOS(useLOS), _ignoreCivilians(ignoreCivilians) { }
bool operator()(Unit* u) const
{
@@ -1196,12 +1196,19 @@ namespace Trinity
if (_useLOS && !u->IsWithinLOSInMap(_me))
return false;
// pets in aggressive do not attack civilians
if (_ignoreCivilians)
if (Creature* c = u->ToCreature())
if (c->IsCivilian())
return false;
return true;
}
private:
Creature const* _me;
bool _useLOS;
bool _ignoreCivilians;
NearestHostileUnitInAggroRangeCheck(NearestHostileUnitInAggroRangeCheck const&) = delete;
};