Core/PlayerAI: Some adjustments
Port From (https://github.com/TrinityCore/TrinityCore/commit/e51960ea45191ed69b4c69cffee212aeb7cb2555)
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user