aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Movement/MotionMaster.cpp4
-rw-r--r--src/server/game/Movement/MotionMaster.h3
-rw-r--r--src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp24
-rw-r--r--src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h4
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;