Core/PlayerAI: Some adjustments

Port From (https://github.com/TrinityCore/TrinityCore/commit/e51960ea45191ed69b4c69cffee212aeb7cb2555)
This commit is contained in:
hondacrx
2020-08-22 15:27:53 -04:00
parent 40330f9bac
commit 5f53919281
+41 -7
View File
@@ -682,16 +682,29 @@ namespace Game.AI
{ {
public SimpleCharmedPlayerAI(Player player) : base(player) public SimpleCharmedPlayerAI(Player player) : base(player)
{ {
_castCheckTimer = 500; _castCheckTimer = 2500;
_chaseCloser = false; _chaseCloser = false;
_forceFacing = true; _forceFacing = true;
} }
public override bool CanAIAttack(Unit who)
{
if (!me.IsValidAttackTarget(who) || who.HasBreakableByDamageCrowdControlAura())
return false;
Unit charmer = me.GetCharmer();
if (charmer != null)
if (!charmer.IsValidAttackTarget(who))
return false;
return base.CanAIAttack(who);
}
public override Unit SelectAttackTarget() public override Unit SelectAttackTarget()
{ {
Unit charmer = me.GetCharmer(); Unit charmer = me.GetCharmer();
if (charmer) if (charmer)
return charmer.IsAIEnabled ? charmer.GetAI().SelectTarget(SelectAggroTarget.Random, 0, new UncontrolledTargetSelectPredicate()) : charmer.GetVictim(); return charmer.IsAIEnabled ? charmer.GetAI().SelectTarget(SelectAggroTarget.Random, 0, new ValidTargetSelectPredicate(this)) : charmer.GetVictim();
return null; return null;
} }
@@ -1246,11 +1259,23 @@ namespace Game.AI
if (charmer.IsEngaged()) if (charmer.IsEngaged())
{ {
Unit target = me.GetVictim(); Unit target = me.GetVictim();
if (!target || !charmer.IsValidAttackTarget(target) || target.HasBreakableByDamageCrowdControlAura()) if (!target || !CanAIAttack(target))
{ {
target = SelectAttackTarget(); target = SelectAttackTarget();
if (!target) if (!target || !CanAIAttack(target))
{
if (!_isFollowing)
{
_isFollowing = true;
me.AttackStop();
me.CastStop();
me.StopMoving();
me.GetMotionMaster().Clear();
me.GetMotionMaster().MoveFollow(charmer, SharedConst.PetFollowDist, SharedConst.PetFollowAngle);
}
return; return;
}
_isFollowing = false;
if (IsRangedAttacker()) if (IsRangedAttacker())
{ {
@@ -1304,8 +1329,9 @@ namespace Game.AI
DoAutoAttackIfReady(); DoAutoAttackIfReady();
} }
else else if (!_isFollowing)
{ {
_isFollowing = true;
me.AttackStop(); me.AttackStop();
me.CastStop(); me.CastStop();
me.StopMoving(); me.StopMoving();
@@ -1337,13 +1363,21 @@ namespace Game.AI
uint _castCheckTimer; uint _castCheckTimer;
bool _chaseCloser; bool _chaseCloser;
bool _forceFacing; bool _forceFacing;
bool _isFollowing;
} }
struct UncontrolledTargetSelectPredicate : ISelector struct ValidTargetSelectPredicate : ISelector
{ {
UnitAI _ai;
public ValidTargetSelectPredicate(UnitAI ai)
{
_ai = ai;
}
public bool Check(Unit target) public bool Check(Unit target)
{ {
return !target.HasBreakableByDamageCrowdControlAura(); return _ai.CanAIAttack(target);
} }
} }
} }