[WIP] Core/AI: Pets musn't attack civilian NPC in aggressive mode
Port From (https://github.com/TrinityCore/TrinityCore/commit/1e932109996a0ce2117f3d5268064ee882267e84)
This commit is contained in:
@@ -336,7 +336,7 @@ namespace Game.AI
|
||||
{
|
||||
if (!me.GetCharmInfo().IsReturning() || me.GetCharmInfo().IsFollowing() || me.GetCharmInfo().IsAtStay())
|
||||
{
|
||||
Unit nearTarget = me.SelectNearestHostileUnitInAggroRange(true);
|
||||
Unit nearTarget = me.SelectNearestHostileUnitInAggroRange(true, true);
|
||||
if (nearTarget)
|
||||
return nearTarget;
|
||||
}
|
||||
|
||||
@@ -2858,11 +2858,11 @@ namespace Game.Entities
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
public Unit SelectNearestHostileUnitInAggroRange(bool useLOS = false)
|
||||
public Unit SelectNearestHostileUnitInAggroRange(bool useLOS = false, bool ignoreCivilians = false)
|
||||
{
|
||||
// Selects nearest hostile target within creature's aggro range. Used primarily by
|
||||
// pets set to aggressive. Will not return neutral or friendly targets
|
||||
var u_check = new NearestHostileUnitInAggroRangeCheck(this, useLOS);
|
||||
var u_check = new NearestHostileUnitInAggroRangeCheck(this, useLOS, ignoreCivilians);
|
||||
var searcher = new UnitSearcher(this, u_check);
|
||||
Cell.VisitGridObjects(this, searcher, SharedConst.MaxAggroRadius);
|
||||
return searcher.GetTarget();
|
||||
|
||||
@@ -2246,10 +2246,11 @@ namespace Game.Maps
|
||||
|
||||
class NearestHostileUnitInAggroRangeCheck : ICheck<Unit>
|
||||
{
|
||||
public NearestHostileUnitInAggroRangeCheck(Creature creature, bool useLOS = false)
|
||||
public NearestHostileUnitInAggroRangeCheck(Creature creature, bool useLOS = false, bool ignoreCivilians = false)
|
||||
{
|
||||
_me = creature;
|
||||
_useLOS = useLOS;
|
||||
_ignoreCivilians = ignoreCivilians;
|
||||
}
|
||||
|
||||
public bool Invoke(Unit u)
|
||||
@@ -2266,11 +2267,21 @@ namespace Game.Maps
|
||||
if (_useLOS && !u.IsWithinLOSInMap(_me))
|
||||
return false;
|
||||
|
||||
// pets in aggressive do not attack civilians
|
||||
if (_ignoreCivilians)
|
||||
{
|
||||
Creature c = u.ToCreature();
|
||||
if (c != null)
|
||||
if (c.IsCivilian())
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Creature _me;
|
||||
bool _useLOS;
|
||||
bool _ignoreCivilians;
|
||||
}
|
||||
|
||||
class AnyAssistCreatureInRangeCheck : ICheck<Creature>
|
||||
|
||||
Reference in New Issue
Block a user