[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())
|
if (!me.GetCharmInfo().IsReturning() || me.GetCharmInfo().IsFollowing() || me.GetCharmInfo().IsAtStay())
|
||||||
{
|
{
|
||||||
Unit nearTarget = me.SelectNearestHostileUnitInAggroRange(true);
|
Unit nearTarget = me.SelectNearestHostileUnitInAggroRange(true, true);
|
||||||
if (nearTarget)
|
if (nearTarget)
|
||||||
return nearTarget;
|
return nearTarget;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2858,11 +2858,11 @@ namespace Game.Entities
|
|||||||
return 0.0f;
|
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
|
// Selects nearest hostile target within creature's aggro range. Used primarily by
|
||||||
// pets set to aggressive. Will not return neutral or friendly targets
|
// 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);
|
var searcher = new UnitSearcher(this, u_check);
|
||||||
Cell.VisitGridObjects(this, searcher, SharedConst.MaxAggroRadius);
|
Cell.VisitGridObjects(this, searcher, SharedConst.MaxAggroRadius);
|
||||||
return searcher.GetTarget();
|
return searcher.GetTarget();
|
||||||
|
|||||||
@@ -2246,10 +2246,11 @@ namespace Game.Maps
|
|||||||
|
|
||||||
class NearestHostileUnitInAggroRangeCheck : ICheck<Unit>
|
class NearestHostileUnitInAggroRangeCheck : ICheck<Unit>
|
||||||
{
|
{
|
||||||
public NearestHostileUnitInAggroRangeCheck(Creature creature, bool useLOS = false)
|
public NearestHostileUnitInAggroRangeCheck(Creature creature, bool useLOS = false, bool ignoreCivilians = false)
|
||||||
{
|
{
|
||||||
_me = creature;
|
_me = creature;
|
||||||
_useLOS = useLOS;
|
_useLOS = useLOS;
|
||||||
|
_ignoreCivilians = ignoreCivilians;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Invoke(Unit u)
|
public bool Invoke(Unit u)
|
||||||
@@ -2266,11 +2267,21 @@ namespace Game.Maps
|
|||||||
if (_useLOS && !u.IsWithinLOSInMap(_me))
|
if (_useLOS && !u.IsWithinLOSInMap(_me))
|
||||||
return false;
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Creature _me;
|
Creature _me;
|
||||||
bool _useLOS;
|
bool _useLOS;
|
||||||
|
bool _ignoreCivilians;
|
||||||
}
|
}
|
||||||
|
|
||||||
class AnyAssistCreatureInRangeCheck : ICheck<Creature>
|
class AnyAssistCreatureInRangeCheck : ICheck<Creature>
|
||||||
|
|||||||
Reference in New Issue
Block a user