aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGiacomo Pozzoni <giacomopoz@gmail.com>2020-03-17 18:58:07 +0000
committerShauren <shauren.trinity@gmail.com>2021-12-23 22:32:41 +0100
commit934c320d4b0da40691be7449f860447fe79b4083 (patch)
treee1a143498b408c85ef752a412196c3c2096c594c /src
parent103f7f5e77c5d5724f7d7bea79e4295b405d4617 (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.cpp9
-rw-r--r--src/server/game/AI/CoreAI/PassiveAI.h4
-rw-r--r--src/server/game/AI/CoreAI/UnitAI.h3
-rw-r--r--src/server/game/Movement/MotionMaster.cpp5
-rw-r--r--src/server/game/Movement/MovementGenerator.cpp7
-rwxr-xr-xsrc/server/game/Movement/MovementGenerator.h2
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; }