diff options
author | Giacomo Pozzoni <giacomopoz@gmail.com> | 2020-03-17 18:58:07 +0000 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-12-23 22:32:41 +0100 |
commit | 934c320d4b0da40691be7449f860447fe79b4083 (patch) | |
tree | e1a143498b408c85ef752a412196c3c2096c594c /src | |
parent | 103f7f5e77c5d5724f7d7bea79e4295b405d4617 (diff) |
Core/AI: Make critters flee as soon as engaged in combat and make them evade after they stop running in fear (#24320)
* Core/AI: Make critters flee as soon as engaged in combat and make them evade after they stop running in fear
* Warning and no-pch build fix
(cherry picked from commit 6fde051e4e52d98d1a6cf31b8ad3fcf95e0e83fd)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/AI/CoreAI/PassiveAI.cpp | 9 | ||||
-rw-r--r-- | src/server/game/AI/CoreAI/PassiveAI.h | 4 | ||||
-rw-r--r-- | src/server/game/AI/CoreAI/UnitAI.h | 3 | ||||
-rw-r--r-- | src/server/game/Movement/MotionMaster.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Movement/MovementGenerator.cpp | 7 | ||||
-rwxr-xr-x | src/server/game/Movement/MovementGenerator.h | 2 |
6 files changed, 28 insertions, 2 deletions
diff --git a/src/server/game/AI/CoreAI/PassiveAI.cpp b/src/server/game/AI/CoreAI/PassiveAI.cpp index 78d60fdb4b2..6ded1919862 100644 --- a/src/server/game/AI/CoreAI/PassiveAI.cpp +++ b/src/server/game/AI/CoreAI/PassiveAI.cpp @@ -17,6 +17,7 @@ #include "PassiveAI.h" #include "Creature.h" +#include "MovementDefines.h" PassiveAI::PassiveAI(Creature* c, uint32 scriptId) : CreatureAI(c, scriptId) { @@ -79,12 +80,18 @@ void PossessedAI::KilledUnit(Unit* victim) me->RemoveDynamicFlag(UNIT_DYNFLAG_LOOTABLE); } -void CritterAI::DamageTaken(Unit* /*done_by*/, uint32&) +void CritterAI::JustEngagedWith(Unit* /*who*/) { if (!me->HasUnitState(UNIT_STATE_FLEEING)) me->SetControlled(true, UNIT_STATE_FLEEING); } +void CritterAI::OnMovementGeneratorFinalized(MovementGeneratorType type) +{ + if (type == TIMED_FLEEING_MOTION_TYPE) + EnterEvadeMode(EVADE_REASON_OTHER); +} + void CritterAI::EnterEvadeMode(EvadeReason why) { if (me->HasUnitState(UNIT_STATE_FLEEING)) diff --git a/src/server/game/AI/CoreAI/PassiveAI.h b/src/server/game/AI/CoreAI/PassiveAI.h index 039a5293036..272ab21cbbd 100644 --- a/src/server/game/AI/CoreAI/PassiveAI.h +++ b/src/server/game/AI/CoreAI/PassiveAI.h @@ -73,9 +73,11 @@ class TC_GAME_API CritterAI : public PassiveAI public: using PassiveAI::PassiveAI; - void DamageTaken(Unit* done_by, uint32& /*damage*/) override; + void JustEngagedWith(Unit* /*who*/) override; void EnterEvadeMode(EvadeReason why) override; + void OnMovementGeneratorFinalized(MovementGeneratorType type) override; + static int32 Permissible(Creature const* creature); }; diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h index 7aa770cfcb9..0f9817cb5aa 100644 --- a/src/server/game/AI/CoreAI/UnitAI.h +++ b/src/server/game/AI/CoreAI/UnitAI.h @@ -44,6 +44,7 @@ class Unit; struct AISpellInfoType; enum DamageEffectType : uint8; enum Difficulty : uint8; +enum MovementGeneratorType : uint8; enum SpellEffIndex : uint8; //Selection method used by SelectTarget @@ -328,6 +329,8 @@ class TC_GAME_API UnitAI // Called when a game event starts or ends virtual void OnGameEvent(bool /*start*/, uint16 /*eventId*/) { } + virtual void OnMovementGeneratorFinalized(MovementGeneratorType /*type*/) { } + virtual std::string GetDebugInfo() const; private: diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 28c991a3c8d..3b21d0b4dec 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -1198,7 +1198,10 @@ void MotionMaster::DirectAdd(MovementGenerator* movement, MovementSlot slot/* = { case MOTION_SLOT_DEFAULT: if (_defaultGenerator) + { _defaultGenerator->Finalize(_owner, _generators.empty(), false); + _defaultGenerator->NotifyAIOnFinalize(_owner); + } _defaultGenerator = MovementGeneratorPointer(movement); if (IsStatic(movement)) @@ -1243,6 +1246,7 @@ void MotionMaster::Delete(MovementGenerator* movement, bool active, bool movemen movement->Priority, movement->Flags, movement->BaseUnitState, movement->GetMovementGeneratorType(), _owner->GetGUID().ToString().c_str()); movement->Finalize(_owner, active, movementInform); + movement->NotifyAIOnFinalize(_owner); ClearBaseUnitState(movement); MovementGeneratorPointerDeleter(movement); } @@ -1253,6 +1257,7 @@ void MotionMaster::DeleteDefault(bool active, bool movementInform) _defaultGenerator->Priority, _defaultGenerator->Flags, _defaultGenerator->BaseUnitState, _defaultGenerator->GetMovementGeneratorType(), _owner->GetGUID().ToString().c_str()); _defaultGenerator->Finalize(_owner, active, movementInform); + _defaultGenerator->NotifyAIOnFinalize(_owner); _defaultGenerator = MovementGeneratorPointer(GetIdleMovementGenerator()); AddFlag(MOTIONMASTER_FLAG_STATIC_INITIALIZATION_PENDING); } diff --git a/src/server/game/Movement/MovementGenerator.cpp b/src/server/game/Movement/MovementGenerator.cpp index 7cbda1da955..dddd4ac8e6b 100644 --- a/src/server/game/Movement/MovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerator.cpp @@ -21,6 +21,7 @@ #include "MovementDefines.h" #include "PathGenerator.h" #include "RandomMovementGenerator.h" +#include "UnitAI.h" #include "WaypointMovementGenerator.h" #include <sstream> @@ -58,3 +59,9 @@ MovementGenerator* WaypointMovementFactory::Create(Unit* /*object*/) const { return new WaypointMovementGenerator<Creature>(); } + +void MovementGenerator::NotifyAIOnFinalize(Unit* object) +{ + if (UnitAI* ai = object->GetAI()) + ai->OnMovementGeneratorFinalized(GetMovementGeneratorType()); +} diff --git a/src/server/game/Movement/MovementGenerator.h b/src/server/game/Movement/MovementGenerator.h index 24585c4e77f..32b3cca87ee 100755 --- a/src/server/game/Movement/MovementGenerator.h +++ b/src/server/game/Movement/MovementGenerator.h @@ -69,6 +69,8 @@ class TC_GAME_API MovementGenerator // used by Evade code for select point to evade with expected restart default movement virtual bool GetResetPosition(Unit*, float&/* x*/, float&/* y*/, float&/* z*/) { return false; } + virtual void NotifyAIOnFinalize(Unit*); + void AddFlag(uint16 const flag) { Flags |= flag; } bool HasFlag(uint16 const flag) const { return (Flags & flag) != 0; } void RemoveFlag(uint16 const flag) { Flags &= ~flag; } |