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:
hondacrx
2022-01-07 12:44:09 -05:00
parent 0dc38f91cf
commit fcf47da853
4 changed files with 22 additions and 2 deletions
+7 -1
View File
@@ -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))
+2
View File
@@ -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; }
+6 -1
View File
@@ -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);
} }