diff options
4 files changed, 28 insertions, 7 deletions
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index bc282025b6f..329eadb43e5 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -596,12 +596,12 @@ void MotionMaster::MoveTargetedHome() } } -void MotionMaster::MoveRandom(float wanderDistance) +void MotionMaster::MoveRandom(float wanderDistance, Optional<Milliseconds> duration) { if (_owner->GetTypeId() == TYPEID_UNIT) { TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveRandom: '{}', started random movement (spawnDist: {})", _owner->GetGUID().ToString(), wanderDistance); - Add(new RandomMovementGenerator<Creature>(wanderDistance), MOTION_SLOT_DEFAULT); + Add(new RandomMovementGenerator<Creature>(wanderDistance, duration), MOTION_SLOT_DEFAULT); } } diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index 01b1bf125a6..f48d6f9798a 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -19,6 +19,7 @@ #define MOTIONMASTER_H #include "Common.h" +#include "Duration.h" #include "ObjectGuid.h" #include "Optional.h" #include "MovementDefines.h" @@ -154,7 +155,7 @@ class TC_GAME_API MotionMaster void MoveIdle(); void MoveTargetedHome(); - void MoveRandom(float wanderDistance = 0.0f); + void MoveRandom(float wanderDistance = 0.0f, Optional<Milliseconds> duration = {}); void MoveFollow(Unit* target, float dist, ChaseAngle angle, MovementSlot slot = MOTION_SLOT_ACTIVE); void MoveChase(Unit* target, Optional<ChaseRange> dist = {}, Optional<ChaseAngle> angle = {}); void MoveChase(Unit* target, float dist, float angle) { MoveChase(target, ChaseRange(dist), ChaseAngle(angle)); } diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp index 52832341097..dc5ccd1ab8b 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp @@ -17,6 +17,7 @@ #include "RandomMovementGenerator.h" #include "Creature.h" +#include "CreatureAI.h" #include "MovementDefines.h" #include "MoveSpline.h" #include "MoveSplineInit.h" @@ -24,15 +25,17 @@ #include "Random.h" template<class T> -RandomMovementGenerator<T>::RandomMovementGenerator(float distance) : _timer(0), _reference(), _wanderDistance(distance), _wanderSteps(0) +RandomMovementGenerator<T>::RandomMovementGenerator(float distance, Optional<Milliseconds> duration) : _timer(0), _reference(), _wanderDistance(distance), _wanderSteps(0) { this->Mode = MOTION_MODE_DEFAULT; this->Priority = MOTION_PRIORITY_NORMAL; this->Flags = MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING; this->BaseUnitState = UNIT_STATE_ROAMING; + if (duration) + _duration.emplace(*duration); } -template RandomMovementGenerator<Creature>::RandomMovementGenerator(float/* distance*/); +template RandomMovementGenerator<Creature>::RandomMovementGenerator(float distance, Optional<Milliseconds> duration); template<class T> MovementGeneratorType RandomMovementGenerator<T>::GetMovementGeneratorType() const @@ -200,6 +203,17 @@ bool RandomMovementGenerator<Creature>::DoUpdate(Creature* owner, uint32 diff) if (HasFlag(MOVEMENTGENERATOR_FLAG_FINALIZED | MOVEMENTGENERATOR_FLAG_PAUSED)) return true; + if (_duration) + { + _duration->Update(diff); + if (_duration->Passed()) + { + RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY); + AddFlag(MOVEMENTGENERATOR_FLAG_INFORM_ENABLED); + return false; + } + } + if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting()) { AddFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED); @@ -231,7 +245,7 @@ template<class T> void RandomMovementGenerator<T>::DoFinalize(T*, bool, bool) { } template<> -void RandomMovementGenerator<Creature>::DoFinalize(Creature* owner, bool active, bool/* movementInform*/) +void RandomMovementGenerator<Creature>::DoFinalize(Creature* owner, bool active, bool movementInform) { AddFlag(MOVEMENTGENERATOR_FLAG_FINALIZED); if (active) @@ -242,4 +256,8 @@ void RandomMovementGenerator<Creature>::DoFinalize(Creature* owner, bool active, // TODO: Research if this modification is needed, which most likely isnt owner->SetWalk(false); } + + if (movementInform && HasFlag(MOVEMENTGENERATOR_FLAG_INFORM_ENABLED)) + if (owner->IsAIEnabled()) + owner->AI()->MovementInform(RANDOM_MOTION_TYPE, 0); } diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h index 812297fa212..f09ac170b50 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h @@ -19,6 +19,7 @@ #define TRINITY_RANDOMMOTIONGENERATOR_H #include "MovementGenerator.h" +#include "Optional.h" #include "Position.h" #include "Timer.h" @@ -28,7 +29,7 @@ template<class T> class RandomMovementGenerator : public MovementGeneratorMedium<T, RandomMovementGenerator<T>> { public: - explicit RandomMovementGenerator(float distance = 0.0f); + explicit RandomMovementGenerator(float distance = 0.0f, Optional<Milliseconds> duration = {}); MovementGeneratorType GetMovementGeneratorType() const override; @@ -48,6 +49,7 @@ class RandomMovementGenerator : public MovementGeneratorMedium<T, RandomMovement std::unique_ptr<PathGenerator> _path; TimeTracker _timer; + Optional<TimeTracker> _duration; Position _reference; float _wanderDistance; uint8 _wanderSteps; |