diff options
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; |