Core/AI: Make critters flee as soon as engaged in combat and make them evade after they stop running in fear
Port From (https://github.com/TrinityCore/TrinityCore/commit/934c320d4b0da40691be7449f860447fe79b4083)
This commit is contained in:
@@ -119,12 +119,18 @@ namespace Game.AI
|
|||||||
me.SetReactState(ReactStates.Passive);
|
me.SetReactState(ReactStates.Passive);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void DamageTaken(Unit done_by, ref uint damage)
|
public override void JustEngagedWith(Unit who)
|
||||||
{
|
{
|
||||||
if (!me.HasUnitState(UnitState.Fleeing))
|
if (!me.HasUnitState(UnitState.Fleeing))
|
||||||
me.SetControlled(true, UnitState.Fleeing);
|
me.SetControlled(true, UnitState.Fleeing);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void OnMovementGeneratorFinalized(MovementGeneratorType type)
|
||||||
|
{
|
||||||
|
if (type == MovementGeneratorType.TimedFleeing)
|
||||||
|
EnterEvadeMode(EvadeReason.Other);
|
||||||
|
}
|
||||||
|
|
||||||
public override void EnterEvadeMode(EvadeReason why)
|
public override void EnterEvadeMode(EvadeReason why)
|
||||||
{
|
{
|
||||||
if (me.HasUnitState(UnitState.Fleeing))
|
if (me.HasUnitState(UnitState.Fleeing))
|
||||||
|
|||||||
@@ -502,6 +502,8 @@ namespace Game.AI
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public virtual void OnGameEvent(bool start, ushort eventId) { }
|
public virtual void OnGameEvent(bool start, ushort eventId) { }
|
||||||
|
|
||||||
|
public virtual void OnMovementGeneratorFinalized(MovementGeneratorType type) { }
|
||||||
|
|
||||||
public virtual string GetDebugInfo()
|
public virtual string GetDebugInfo()
|
||||||
{
|
{
|
||||||
return $"Me: {(me != null ? me.GetDebugInfo() : "NULL")}";
|
return $"Me: {(me != null ? me.GetDebugInfo() : "NULL")}";
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
using Framework.Constants;
|
using Framework.Constants;
|
||||||
|
using Game.AI;
|
||||||
using Game.Entities;
|
using Game.Entities;
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
@@ -60,6 +61,12 @@ namespace Game.Movement
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void NotifyAIOnFinalize(Unit obj)
|
||||||
|
{
|
||||||
|
UnitAI ai = obj.GetAI();
|
||||||
|
ai?.OnMovementGeneratorFinalized(GetMovementGeneratorType());
|
||||||
|
}
|
||||||
|
|
||||||
public void AddFlag(MovementGeneratorFlags flag) { Flags |= flag; }
|
public void AddFlag(MovementGeneratorFlags flag) { Flags |= flag; }
|
||||||
public bool HasFlag(MovementGeneratorFlags flag) { return (Flags & flag) != 0; }
|
public bool HasFlag(MovementGeneratorFlags flag) { return (Flags & flag) != 0; }
|
||||||
public void RemoveFlag(MovementGeneratorFlags flag) { Flags &= ~flag; }
|
public void RemoveFlag(MovementGeneratorFlags flag) { Flags &= ~flag; }
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
using Framework.Constants;
|
using Framework.Constants;
|
||||||
|
using Framework.Dynamic;
|
||||||
using Game.AI;
|
using Game.AI;
|
||||||
using Game.DataStorage;
|
using Game.DataStorage;
|
||||||
using Game.Entities;
|
using Game.Entities;
|
||||||
@@ -23,7 +24,6 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
using Framework.Dynamic;
|
|
||||||
|
|
||||||
namespace Game.Movement
|
namespace Game.Movement
|
||||||
{
|
{
|
||||||
@@ -1113,7 +1113,10 @@ namespace Game.Movement
|
|||||||
{
|
{
|
||||||
case MovementSlot.Default:
|
case MovementSlot.Default:
|
||||||
if (_defaultGenerator != null)
|
if (_defaultGenerator != null)
|
||||||
|
{
|
||||||
_defaultGenerator.Finalize(_owner, _generators.Empty(), false);
|
_defaultGenerator.Finalize(_owner, _generators.Empty(), false);
|
||||||
|
_defaultGenerator.NotifyAIOnFinalize(_owner);
|
||||||
|
}
|
||||||
|
|
||||||
_defaultGenerator = movement;
|
_defaultGenerator = movement;
|
||||||
if (IsStatic(movement))
|
if (IsStatic(movement))
|
||||||
@@ -1151,12 +1154,14 @@ namespace Game.Movement
|
|||||||
void Delete(MovementGenerator movement, bool active, bool movementInform)
|
void Delete(MovementGenerator movement, bool active, bool movementInform)
|
||||||
{
|
{
|
||||||
movement.Finalize(_owner, active, movementInform);
|
movement.Finalize(_owner, active, movementInform);
|
||||||
|
movement.NotifyAIOnFinalize(_owner);
|
||||||
ClearBaseUnitState(movement);
|
ClearBaseUnitState(movement);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeleteDefault(bool active, bool movementInform)
|
void DeleteDefault(bool active, bool movementInform)
|
||||||
{
|
{
|
||||||
_defaultGenerator.Finalize(_owner, active, movementInform);
|
_defaultGenerator.Finalize(_owner, active, movementInform);
|
||||||
|
_defaultGenerator.NotifyAIOnFinalize(_owner);
|
||||||
_defaultGenerator = GetIdleMovementGenerator();
|
_defaultGenerator = GetIdleMovementGenerator();
|
||||||
AddFlag(MotionMasterFlags.StaticInitializationPending);
|
AddFlag(MotionMasterFlags.StaticInitializationPending);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user