aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Movement/MotionMaster.cpp13
-rw-r--r--src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp110
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h24
3 files changed, 50 insertions, 97 deletions
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp
index e305c584c99..ae052640a86 100644
--- a/src/server/game/Movement/MotionMaster.cpp
+++ b/src/server/game/Movement/MotionMaster.cpp
@@ -639,21 +639,16 @@ void MotionMaster::MoveConfused()
}
}
-void MotionMaster::MoveFleeing(Unit* enemy, Milliseconds time)
+void MotionMaster::MoveFleeing(Unit* enemy, Milliseconds time /*= 0ms*/)
{
if (!enemy)
return;
TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveFleeing: '{}', flees from '{}' (time: {}ms)", _owner->GetGUID().ToString(), enemy->GetGUID().ToString(), time.count());
- if (_owner->GetTypeId() == TYPEID_UNIT)
- {
- if (time > 0ms)
- Add(new TimedFleeingMovementGenerator(enemy->GetGUID(), time));
- else
- Add(new FleeingMovementGenerator<Creature>(enemy->GetGUID()));
- }
+ if (_owner->GetTypeId() == TYPEID_UNIT && time > 0ms)
+ Add(new TimedFleeingMovementGenerator(enemy->GetGUID(), time));
else
- Add(new FleeingMovementGenerator<Player>(enemy->GetGUID()));
+ Add(new FleeingMovementGenerator(enemy->GetGUID()));
}
void MotionMaster::MovePoint(uint32 id, Position const& pos, bool generatePath/* = true*/, Optional<float> finalOrient/* = {}*/, Optional<float> speed /*= {}*/,
diff --git a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp
index ea74fbbc895..61e1679b0db 100644
--- a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp
@@ -18,38 +18,32 @@
#include "FleeingMovementGenerator.h"
#include "Creature.h"
#include "CreatureAI.h"
-#include "MovementDefines.h"
#include "MoveSpline.h"
#include "MoveSplineInit.h"
#include "ObjectAccessor.h"
#include "PathGenerator.h"
-#include "Player.h"
-#include "Unit.h"
-#include "PhasingHandler.h"
#define MIN_QUIET_DISTANCE 28.0f
#define MAX_QUIET_DISTANCE 43.0f
-template<class T>
-FleeingMovementGenerator<T>::FleeingMovementGenerator(ObjectGuid fleeTargetGUID) : _fleeTargetGUID(fleeTargetGUID), _timer(0)
+FleeingMovementGenerator::FleeingMovementGenerator(ObjectGuid fleeTargetGUID) : _fleeTargetGUID(fleeTargetGUID), _timer(0)
{
- this->Mode = MOTION_MODE_DEFAULT;
- this->Priority = MOTION_PRIORITY_HIGHEST;
- this->Flags = MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING;
- this->BaseUnitState = UNIT_STATE_FLEEING;
+ Mode = MOTION_MODE_DEFAULT;
+ Priority = MOTION_PRIORITY_HIGHEST;
+ Flags = MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING;
+ BaseUnitState = UNIT_STATE_FLEEING;
+ ScriptResult = std::move(scriptResult);
}
-template<class T>
-MovementGeneratorType FleeingMovementGenerator<T>::GetMovementGeneratorType() const
+MovementGeneratorType FleeingMovementGenerator::GetMovementGeneratorType() const
{
return FLEEING_MOTION_TYPE;
}
-template<class T>
-void FleeingMovementGenerator<T>::DoInitialize(T* owner)
+void FleeingMovementGenerator::Initialize(Unit* owner)
{
- MovementGenerator::RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
- MovementGenerator::AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED);
+ RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
+ AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED);
if (!owner || !owner->IsAlive())
return;
@@ -58,86 +52,70 @@ void FleeingMovementGenerator<T>::DoInitialize(T* owner)
SetTargetLocation(owner);
}
-template<class T>
-void FleeingMovementGenerator<T>::DoReset(T* owner)
+void FleeingMovementGenerator::Reset(Unit* owner)
{
- MovementGenerator::RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
+ RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
- DoInitialize(owner);
+ Initialize(owner);
}
-template<class T>
-bool FleeingMovementGenerator<T>::DoUpdate(T* owner, uint32 diff)
+bool FleeingMovementGenerator::Update(Unit* owner, uint32 diff)
{
if (!owner || !owner->IsAlive())
return false;
if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting())
{
- MovementGenerator::AddFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED);
+ AddFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED);
owner->StopMoving();
_path = nullptr;
return true;
}
else
- MovementGenerator::RemoveFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED);
+ RemoveFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED);
_timer.Update(diff);
- if ((MovementGenerator::HasFlag(MOVEMENTGENERATOR_FLAG_SPEED_UPDATE_PENDING) && !owner->movespline->Finalized()) || (_timer.Passed() && owner->movespline->Finalized()))
+ if ((HasFlag(MOVEMENTGENERATOR_FLAG_SPEED_UPDATE_PENDING) && !owner->movespline->Finalized()) || (_timer.Passed() && owner->movespline->Finalized()))
{
- MovementGenerator::RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY);
+ RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY);
SetTargetLocation(owner);
}
return true;
}
-template<class T>
-void FleeingMovementGenerator<T>::DoDeactivate(T* owner)
+void FleeingMovementGenerator::Deactivate(Unit* owner)
{
- MovementGenerator::AddFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED);
+ AddFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED);
owner->ClearUnitState(UNIT_STATE_FLEEING_MOVE);
}
-template<class T>
-void FleeingMovementGenerator<T>::DoFinalize(T*, bool, bool)
-{
-}
-
-template<>
-void FleeingMovementGenerator<Player>::DoFinalize(Player* owner, bool active, bool/* movementInform*/)
+void FleeingMovementGenerator::Finalize(Unit* owner, bool active, bool movementInform)
{
AddFlag(MOVEMENTGENERATOR_FLAG_FINALIZED);
if (active)
{
owner->ClearUnitState(UNIT_STATE_FLEEING_MOVE);
- owner->StopMoving();
- }
-}
-template<>
-void FleeingMovementGenerator<Creature>::DoFinalize(Creature* owner, bool active, bool/* movementInform*/)
-{
- AddFlag(MOVEMENTGENERATOR_FLAG_FINALIZED);
-
- if (active)
- {
- owner->ClearUnitState(UNIT_STATE_FLEEING_MOVE);
- if (Unit const* victim = owner->GetVictim())
- owner->SetTarget(victim->GetGUID());
+ if (owner->IsCreature())
+ {
+ if (Unit const* victim = owner->GetVictim())
+ owner->SetTarget(victim->GetGUID());
+ }
+ else if (owner->IsPlayer())
+ owner->StopMoving();
}
}
-template<class T>
-void FleeingMovementGenerator<T>::SetTargetLocation(T* owner)
+void FleeingMovementGenerator::SetTargetLocation(Unit* owner)
{
if (!owner || !owner->IsAlive())
return;
if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting())
{
- MovementGenerator::AddFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED);
+ AddFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED);
owner->StopMoving();
_path = nullptr;
return;
@@ -177,8 +155,7 @@ void FleeingMovementGenerator<T>::SetTargetLocation(T* owner)
_timer.Reset(traveltime + urand(800, 1500));
}
-template<class T>
-void FleeingMovementGenerator<T>::GetPoint(T* owner, Position &position)
+void FleeingMovementGenerator::GetPoint(Unit* owner, Position& position) const
{
float casterDistance, casterAngle;
if (Unit* fleeTarget = ObjectAccessor::GetUnit(*owner, _fleeTargetGUID))
@@ -215,23 +192,6 @@ void FleeingMovementGenerator<T>::GetPoint(T* owner, Position &position)
owner->MovePositionToFirstCollision(position, distance, angle);
}
-template FleeingMovementGenerator<Player>::FleeingMovementGenerator(ObjectGuid);
-template FleeingMovementGenerator<Creature>::FleeingMovementGenerator(ObjectGuid);
-template MovementGeneratorType FleeingMovementGenerator<Player>::GetMovementGeneratorType() const;
-template MovementGeneratorType FleeingMovementGenerator<Creature>::GetMovementGeneratorType() const;
-template void FleeingMovementGenerator<Player>::DoInitialize(Player*);
-template void FleeingMovementGenerator<Creature>::DoInitialize(Creature*);
-template void FleeingMovementGenerator<Player>::DoReset(Player*);
-template void FleeingMovementGenerator<Creature>::DoReset(Creature*);
-template bool FleeingMovementGenerator<Player>::DoUpdate(Player*, uint32);
-template bool FleeingMovementGenerator<Creature>::DoUpdate(Creature*, uint32);
-template void FleeingMovementGenerator<Player>::DoDeactivate(Player*);
-template void FleeingMovementGenerator<Creature>::DoDeactivate(Creature*);
-template void FleeingMovementGenerator<Player>::SetTargetLocation(Player*);
-template void FleeingMovementGenerator<Creature>::SetTargetLocation(Creature*);
-template void FleeingMovementGenerator<Player>::GetPoint(Player*, Position &);
-template void FleeingMovementGenerator<Creature>::GetPoint(Creature*, Position &);
-
//---- TimedFleeingMovementGenerator
bool TimedFleeingMovementGenerator::Update(Unit* owner, uint32 diff)
@@ -243,7 +203,7 @@ bool TimedFleeingMovementGenerator::Update(Unit* owner, uint32 diff)
if (_totalFleeTime.Passed())
return false;
- return FleeingMovementGenerator<Creature>::DoUpdate(owner->ToCreature(), diff);
+ return FleeingMovementGenerator::Update(owner, diff);
}
void TimedFleeingMovementGenerator::Finalize(Unit* owner, bool active, bool movementInform)
@@ -253,12 +213,12 @@ void TimedFleeingMovementGenerator::Finalize(Unit* owner, bool active, bool move
return;
owner->StopMoving();
- if (Unit* victim = owner->GetVictim())
+ if (owner->IsCreature() && owner->IsAlive())
{
- if (owner->IsAlive())
+ if (Unit* victim = owner->GetVictim())
{
owner->AttackStop();
- owner->ToCreature()->AI()->AttackStart(victim);
+ owner->GetAI()->AttackStart(victim);
}
}
diff --git a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h
index 1859f610467..3e039265963 100755
--- a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h
@@ -22,39 +22,37 @@
#include "ObjectGuid.h"
#include "Timer.h"
-class Creature;
class PathGenerator;
struct Position;
-template<class T>
-class FleeingMovementGenerator : public MovementGeneratorMedium<T, FleeingMovementGenerator<T>>
+class FleeingMovementGenerator : public MovementGenerator
{
public:
explicit FleeingMovementGenerator(ObjectGuid fleeTargetGUID);
MovementGeneratorType GetMovementGeneratorType() const override;
- void DoInitialize(T*);
- void DoReset(T*);
- bool DoUpdate(T*, uint32);
- void DoDeactivate(T*);
- void DoFinalize(T*, bool, bool);
+ void Initialize(Unit* owner) override;
+ void Reset(Unit* owner) override;
+ bool Update(Unit* owner, uint32 diff) override;
+ void Deactivate(Unit* owner) override;
+ void Finalize(Unit* owner, bool, bool) override;
- void UnitSpeedChanged() override { FleeingMovementGenerator<T>::AddFlag(MOVEMENTGENERATOR_FLAG_SPEED_UPDATE_PENDING); }
+ void UnitSpeedChanged() override { AddFlag(MOVEMENTGENERATOR_FLAG_SPEED_UPDATE_PENDING); }
private:
- void SetTargetLocation(T*);
- void GetPoint(T*, Position& position);
+ void SetTargetLocation(Unit* owner);
+ void GetPoint(Unit* owner, Position& position) const;
std::unique_ptr<PathGenerator> _path;
ObjectGuid _fleeTargetGUID;
TimeTracker _timer;
};
-class TimedFleeingMovementGenerator : public FleeingMovementGenerator<Creature>
+class TimedFleeingMovementGenerator : public FleeingMovementGenerator
{
public:
- explicit TimedFleeingMovementGenerator(ObjectGuid fleeTargetGUID, Milliseconds time) : FleeingMovementGenerator<Creature>(fleeTargetGUID), _totalFleeTime(time) { }
+ explicit TimedFleeingMovementGenerator(ObjectGuid fleeTargetGUID, Milliseconds time) : FleeingMovementGenerator(fleeTargetGUID), _totalFleeTime(time) { }
bool Update(Unit*, uint32) override;
void Finalize(Unit*, bool, bool) override;