[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:
hondacrx
2022-01-07 09:36:23 -05:00
parent c6186f17bd
commit 63fa8636f4
3 changed files with 15 additions and 4 deletions
+1 -1
View File
@@ -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;
}
+2 -2
View File
@@ -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();
+12 -1
View File
@@ -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>