From fcf47da853f39e1f655f6417140ad2b3b0d66460 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Fri, 7 Jan 2022 12:44:09 -0500 Subject: [PATCH] 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) --- Source/Game/AI/CoreAI/PassiveAI.cs | 8 +++++++- Source/Game/AI/CoreAI/UnitAI.cs | 2 ++ Source/Game/Movement/Generators/MovementGenerators.cs | 7 +++++++ Source/Game/Movement/MotionMaster.cs | 7 ++++++- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Source/Game/AI/CoreAI/PassiveAI.cs b/Source/Game/AI/CoreAI/PassiveAI.cs index cfcc143fa..113221d71 100644 --- a/Source/Game/AI/CoreAI/PassiveAI.cs +++ b/Source/Game/AI/CoreAI/PassiveAI.cs @@ -119,12 +119,18 @@ namespace Game.AI 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)) me.SetControlled(true, UnitState.Fleeing); } + public override void OnMovementGeneratorFinalized(MovementGeneratorType type) + { + if (type == MovementGeneratorType.TimedFleeing) + EnterEvadeMode(EvadeReason.Other); + } + public override void EnterEvadeMode(EvadeReason why) { if (me.HasUnitState(UnitState.Fleeing)) diff --git a/Source/Game/AI/CoreAI/UnitAI.cs b/Source/Game/AI/CoreAI/UnitAI.cs index c0875cc0e..ba4de316e 100644 --- a/Source/Game/AI/CoreAI/UnitAI.cs +++ b/Source/Game/AI/CoreAI/UnitAI.cs @@ -502,6 +502,8 @@ namespace Game.AI /// public virtual void OnGameEvent(bool start, ushort eventId) { } + public virtual void OnMovementGeneratorFinalized(MovementGeneratorType type) { } + public virtual string GetDebugInfo() { return $"Me: {(me != null ? me.GetDebugInfo() : "NULL")}"; diff --git a/Source/Game/Movement/Generators/MovementGenerators.cs b/Source/Game/Movement/Generators/MovementGenerators.cs index 6e12c3ac5..760ca1ce5 100644 --- a/Source/Game/Movement/Generators/MovementGenerators.cs +++ b/Source/Game/Movement/Generators/MovementGenerators.cs @@ -16,6 +16,7 @@ */ using Framework.Constants; +using Game.AI; using Game.Entities; using System; @@ -60,6 +61,12 @@ namespace Game.Movement return false; } + public void NotifyAIOnFinalize(Unit obj) + { + UnitAI ai = obj.GetAI(); + ai?.OnMovementGeneratorFinalized(GetMovementGeneratorType()); + } + public void AddFlag(MovementGeneratorFlags flag) { Flags |= flag; } public bool HasFlag(MovementGeneratorFlags flag) { return (Flags & flag) != 0; } public void RemoveFlag(MovementGeneratorFlags flag) { Flags &= ~flag; } diff --git a/Source/Game/Movement/MotionMaster.cs b/Source/Game/Movement/MotionMaster.cs index 29eae4558..c29db25c8 100644 --- a/Source/Game/Movement/MotionMaster.cs +++ b/Source/Game/Movement/MotionMaster.cs @@ -16,6 +16,7 @@ */ using Framework.Constants; +using Framework.Dynamic; using Game.AI; using Game.DataStorage; using Game.Entities; @@ -23,7 +24,6 @@ using System; using System.Collections.Generic; using System.Linq; using System.Numerics; -using Framework.Dynamic; namespace Game.Movement { @@ -1113,7 +1113,10 @@ namespace Game.Movement { case MovementSlot.Default: if (_defaultGenerator != null) + { _defaultGenerator.Finalize(_owner, _generators.Empty(), false); + _defaultGenerator.NotifyAIOnFinalize(_owner); + } _defaultGenerator = movement; if (IsStatic(movement)) @@ -1151,12 +1154,14 @@ namespace Game.Movement void Delete(MovementGenerator movement, bool active, bool movementInform) { movement.Finalize(_owner, active, movementInform); + movement.NotifyAIOnFinalize(_owner); ClearBaseUnitState(movement); } void DeleteDefault(bool active, bool movementInform) { _defaultGenerator.Finalize(_owner, active, movementInform); + _defaultGenerator.NotifyAIOnFinalize(_owner); _defaultGenerator = GetIdleMovementGenerator(); AddFlag(MotionMasterFlags.StaticInitializationPending); }