aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/Common.h6
-rw-r--r--src/server/game/AI/CreatureAIRegistry.cpp6
-rw-r--r--src/server/game/AI/CreatureAISelector.cpp4
-rw-r--r--src/server/game/Entities/Creature/Creature.h2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp10
-rw-r--r--src/server/game/Entities/Unit/Unit.h5
-rw-r--r--src/server/game/Movement/MotionMaster.cpp66
-rw-r--r--src/server/game/Movement/MotionMaster.h109
-rw-r--r--src/server/game/Movement/MovementDefines.cpp49
-rw-r--r--src/server/game/Movement/MovementDefines.h102
-rw-r--r--src/server/game/Movement/MovementGenerator.cpp21
-rwxr-xr-xsrc/server/game/Movement/MovementGenerator.h42
-rw-r--r--src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp8
-rw-r--r--src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h9
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp18
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h10
-rw-r--r--src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp36
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h12
-rw-r--r--src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp6
-rw-r--r--src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h3
-rw-r--r--src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp7
-rw-r--r--src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h11
-rw-r--r--src/server/game/Movement/MovementGenerators/FormationMovementGenerator.cpp6
-rw-r--r--src/server/game/Movement/MovementGenerators/FormationMovementGenerator.h3
-rw-r--r--src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp11
-rw-r--r--src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h6
-rw-r--r--src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp23
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/IdleMovementGenerator.h10
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp22
-rw-r--r--src/server/game/Movement/MovementGenerators/PointMovementGenerator.h10
-rw-r--r--src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp22
-rw-r--r--src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h10
-rw-r--r--src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.cpp13
-rw-r--r--src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.h7
-rw-r--r--src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp9
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h4
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp2
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp2
38 files changed, 476 insertions, 226 deletions
diff --git a/src/common/Common.h b/src/common/Common.h
index 114f24ea132..7c0f2b37142 100644
--- a/src/common/Common.h
+++ b/src/common/Common.h
@@ -131,7 +131,11 @@ struct LocalizedString
#endif
#ifndef M_PI
-#define M_PI 3.14159265358979323846
+#define M_PI 3.14159265358979323846
+#endif
+
+#ifndef M_PI_4
+#define M_PI_4 0.785398163397448309616
#endif
#define MAX_QUERY_LEN 32*1024
diff --git a/src/server/game/AI/CreatureAIRegistry.cpp b/src/server/game/AI/CreatureAIRegistry.cpp
index 10a06384f49..2ae35369966 100644
--- a/src/server/game/AI/CreatureAIRegistry.cpp
+++ b/src/server/game/AI/CreatureAIRegistry.cpp
@@ -27,8 +27,6 @@
#include "TotemAI.h"
#include "MovementGenerator.h"
-#include "RandomMovementGenerator.h"
-#include "WaypointMovementGenerator.h"
namespace AIRegistry
{
@@ -54,7 +52,7 @@ namespace AIRegistry
(new GameObjectAIFactory<SmartGameObjectAI>("SmartGameObjectAI"))->RegisterSelf();
(new IdleMovementFactory())->RegisterSelf();
- (new MovementGeneratorFactory<RandomMovementGenerator<Creature>>(RANDOM_MOTION_TYPE))->RegisterSelf();
- (new MovementGeneratorFactory<WaypointMovementGenerator<Creature>>(WAYPOINT_MOTION_TYPE))->RegisterSelf();
+ (new RandomMovementFactory())->RegisterSelf();
+ (new WaypointMovementFactory())->RegisterSelf();
}
}
diff --git a/src/server/game/AI/CreatureAISelector.cpp b/src/server/game/AI/CreatureAISelector.cpp
index a1e78149ced..99eb3b05ff6 100644
--- a/src/server/game/AI/CreatureAISelector.cpp
+++ b/src/server/game/AI/CreatureAISelector.cpp
@@ -100,10 +100,10 @@ namespace FactorySelector
MovementGenerator* SelectMovementGenerator(Unit* unit)
{
- MovementGeneratorType type = IDLE_MOTION_TYPE;
+ MovementGeneratorType type = unit->GetDefaultMovementType();
if (Creature* creature = unit->ToCreature())
if (!creature->GetPlayerMovingMe())
- type = unit->ToCreature()->GetDefaultMovementType();
+ type = creature->GetDefaultMovementType();
MovementGeneratorCreator const* mv_factory = sMovementGeneratorRegistry->GetRegistryItem(type);
return ASSERT_NOTNULL(mv_factory)->Create(unit);
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index 1add6c4d146..cab9b45e783 100644
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -244,7 +244,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma
bool CanAssistTo(Unit const* u, Unit const* enemy, bool checkfaction = true) const;
bool _IsTargetAcceptable(Unit const* target) const;
- MovementGeneratorType GetDefaultMovementType() const { return m_defaultMovementType; }
+ MovementGeneratorType GetDefaultMovementType() const override { return m_defaultMovementType; }
void SetDefaultMovementType(MovementGeneratorType mgt) { m_defaultMovementType = mgt; }
void RemoveCorpse(bool setSpawnTime = true, bool destroyForNearbyPlayers = true);
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index f5a4e806dca..faa67714955 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -8064,10 +8064,9 @@ void Unit::UpdateSpeed(UnitMoveType mtype)
if (creature->HasUnitTypeMask(UNIT_MASK_MINION) && !creature->IsInCombat())
{
- MovementGenerator* top = creature->GetMotionMaster()->topOrNull();
- if (top && top->GetMovementGeneratorType() == FOLLOW_MOTION_TYPE)
+ if (GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE)
{
- Unit* followed = ASSERT_NOTNULL(dynamic_cast<AbstractFollower*>(top))->GetTarget();
+ Unit* followed = ASSERT_NOTNULL(dynamic_cast<AbstractFollower*>(GetMotionMaster()->top()))->GetTarget();
if (followed && followed->GetGUID() == GetOwnerGUID() && !followed->IsInCombat())
{
float ownerSpeed = followed->GetSpeedRate(mtype);
@@ -9765,6 +9764,11 @@ void Unit::PropagateSpeedChange()
GetMotionMaster()->PropagateSpeedChange();
}
+MovementGeneratorType Unit::GetDefaultMovementType() const
+{
+ return IDLE_MOTION_TYPE;
+}
+
void Unit::StopMoving()
{
ClearUnitState(UNIT_STATE_MOVING);
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 25e694d758c..4bffe695f20 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -30,7 +30,8 @@
#include <array>
#include <map>
-#define WORLD_TRIGGER 12999
+#define VISUAL_WAYPOINT 1 // Creature Entry ID used for waypoints show, visible only for GMs
+#define WORLD_TRIGGER 12999
#define ARTIFACTS_ALL_WEAPONS_GENERAL_WEAPON_EQUIPPED_PASSIVE 197886
#define SPELL_DH_DOUBLE_JUMP 196055
#define DISPLAYID_HIDDEN_MOUNT 73200
@@ -96,6 +97,7 @@ class VehicleJoinEvent;
enum class PetActionFeedback : uint8;
enum ZLiquidStatus : uint32;
+enum MovementGeneratorType : uint8;
namespace Movement
{
@@ -1690,6 +1692,7 @@ class TC_GAME_API Unit : public WorldObject
MotionMaster* GetMotionMaster() { return i_motionMaster; }
MotionMaster const* GetMotionMaster() const { return i_motionMaster; }
+ virtual MovementGeneratorType GetDefaultMovementType() const;
bool IsStopped() const { return !(HasUnitState(UNIT_STATE_MOVING)); }
void StopMoving();
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp
index d65788dcbac..23cc2d97d7b 100644
--- a/src/server/game/Movement/MotionMaster.cpp
+++ b/src/server/game/Movement/MotionMaster.cpp
@@ -16,27 +16,31 @@
*/
#include "MotionMaster.h"
-#include "ChaseMovementGenerator.h"
-#include "ConfusedMovementGenerator.h"
#include "Creature.h"
#include "CreatureAISelector.h"
#include "DB2Stores.h"
-#include "FleeingMovementGenerator.h"
-#include "FlightPathMovementGenerator.h"
-#include "FollowMovementGenerator.h"
-#include "FormationMovementGenerator.h"
-#include "HomeMovementGenerator.h"
-#include "IdleMovementGenerator.h"
#include "Log.h"
#include "Map.h"
+#include "MovementGenerator.h"
#include "MoveSpline.h"
#include "MoveSplineInit.h"
#include "PathGenerator.h"
#include "PetDefines.h"
#include "Player.h"
+#include "ScriptSystem.h"
+#include "Unit.h"
+#include "WaypointDefines.h"
+
+#include "ChaseMovementGenerator.h"
+#include "ConfusedMovementGenerator.h"
+#include "FleeingMovementGenerator.h"
+#include "FlightPathMovementGenerator.h"
+#include "FollowMovementGenerator.h"
+#include "FormationMovementGenerator.h"
+#include "HomeMovementGenerator.h"
+#include "IdleMovementGenerator.h"
#include "PointMovementGenerator.h"
#include "RandomMovementGenerator.h"
-#include "ScriptSystem.h"
#include "SplineChainMovementGenerator.h"
#include "WaypointMovementGenerator.h"
@@ -68,6 +72,13 @@ MotionMaster::~MotionMaster()
}
}
+MovementGenerator* MotionMaster::top() const
+{
+ ASSERT(!empty());
+
+ return _slot[_top];
+}
+
void MotionMaster::Initialize()
{
// clear ALL movement generators (including default)
@@ -95,14 +106,14 @@ void MotionMaster::UpdateMotion(uint32 diff)
ASSERT(!empty());
- _cleanFlag |= MMCF_UPDATE;
+ _cleanFlag |= MOTIONMMASTER_CLEANFLAG_UPDATE;
if (!top()->Update(_owner, diff))
{
- _cleanFlag &= ~MMCF_UPDATE;
+ _cleanFlag &= ~MOTIONMMASTER_CLEANFLAG_UPDATE;
MovementExpired();
}
else
- _cleanFlag &= ~MMCF_UPDATE;
+ _cleanFlag &= ~MOTIONMMASTER_CLEANFLAG_UPDATE;
if (!_expireList.empty())
ClearExpireList();
@@ -110,12 +121,12 @@ void MotionMaster::UpdateMotion(uint32 diff)
void MotionMaster::Clear(bool reset /*= true*/)
{
- if (_cleanFlag & MMCF_UPDATE)
+ if (_cleanFlag & MOTIONMMASTER_CLEANFLAG_UPDATE)
{
if (reset)
- _cleanFlag |= MMCF_RESET;
+ _cleanFlag |= MOTIONMMASTER_CLEANFLAG_RESET;
else
- _cleanFlag &= ~MMCF_RESET;
+ _cleanFlag &= ~MOTIONMMASTER_CLEANFLAG_RESET;
DelayedClean();
}
else
@@ -127,7 +138,7 @@ void MotionMaster::Clear(MovementSlot slot)
if (empty() || slot >= MAX_MOTION_SLOT)
return;
- if (_cleanFlag & MMCF_UPDATE)
+ if (_cleanFlag & MOTIONMMASTER_CLEANFLAG_UPDATE)
DelayedClean(slot);
else
DirectClean(slot);
@@ -135,12 +146,12 @@ void MotionMaster::Clear(MovementSlot slot)
void MotionMaster::MovementExpired(bool reset /*= true*/)
{
- if (_cleanFlag & MMCF_UPDATE)
+ if (_cleanFlag & MOTIONMMASTER_CLEANFLAG_UPDATE)
{
if (reset)
- _cleanFlag |= MMCF_RESET;
+ _cleanFlag |= MOTIONMMASTER_CLEANFLAG_RESET;
else
- _cleanFlag &= ~MMCF_RESET;
+ _cleanFlag &= ~MOTIONMMASTER_CLEANFLAG_RESET;
DelayedExpire();
}
else
@@ -304,6 +315,11 @@ void MotionMaster::MoveFleeing(Unit* enemy, uint32 time)
}
}
+void MotionMaster::MovePoint(uint32 id, Position const& pos, bool generatePath/* = true*/, Optional<float> finalOrient/* = {}*/)
+{
+ MovePoint(id, pos.m_positionX, pos.m_positionY, pos.m_positionZ, generatePath, finalOrient);
+}
+
void MotionMaster::MovePoint(uint32 id, float x, float y, float z, bool generatePath, Optional<float> finalOrient)
{
if (_owner->GetTypeId() == TYPEID_PLAYER)
@@ -449,6 +465,12 @@ void MotionMaster::MoveJumpTo(float angle, float speedXY, float speedZ)
MoveJump(x, y, z, 0.0f, speedXY, speedZ);
}
+void MotionMaster::MoveJump(Position const& pos, float speedXY, float speedZ, uint32 id/* = EVENT_JUMP*/, bool hasOrientation/* = false*/,
+ JumpArrivalCastArgs const* arrivalCast /*= nullptr*/, Movement::SpellEffectExtraData const* spellEffectExtraData /*= nullptr*/)
+{
+ MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), speedXY, speedZ, id, hasOrientation, arrivalCast, spellEffectExtraData);
+}
+
void MotionMaster::MoveJump(float x, float y, float z, float o, float speedXY, float speedZ, uint32 id /*= EVENT_JUMP*/, bool hasOrientation /* = false*/,
JumpArrivalCastArgs const* arrivalCast /*= nullptr*/, Movement::SpellEffectExtraData const* spellEffectExtraData /*= nullptr*/)
{
@@ -748,7 +770,7 @@ void MotionMaster::Mutate(MovementGenerator *m, MovementSlot slot)
if (MovementGenerator* curr = _slot[slot])
{
_slot[slot] = nullptr; // in case a new one is generated in this slot during directdelete
- if (_top == slot && (_cleanFlag & MMCF_UPDATE))
+ if (_top == slot && (_cleanFlag & MOTIONMMASTER_CLEANFLAG_UPDATE))
DelayedDelete(curr);
else
DirectDelete(curr);
@@ -888,8 +910,8 @@ void MotionMaster::ClearExpireList()
Initialize();
else if (NeedInitTop())
InitTop();
- else if (_cleanFlag & MMCF_RESET)
+ else if (_cleanFlag & MOTIONMMASTER_CLEANFLAG_RESET)
top()->Reset(_owner);
- _cleanFlag &= ~MMCF_RESET;
+ _cleanFlag &= ~MOTIONMMASTER_CLEANFLAG_RESET;
}
diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h
index c3cf37424cb..92098b90d27 100644
--- a/src/server/game/Movement/MotionMaster.h
+++ b/src/server/game/Movement/MotionMaster.h
@@ -19,11 +19,8 @@
#define MOTIONMASTER_H
#include "Common.h"
-#include "Errors.h"
-#include "ObjectDefines.h"
-#include "ObjectGuid.h"
#include "Optional.h"
-#include "Position.h"
+#include "MovementDefines.h"
#include "SharedDefines.h"
#include <vector>
@@ -35,104 +32,15 @@ struct SplineChainLink;
struct SplineChainResumeInfo;
struct WaypointPath;
-namespace G3D
-{
- class Vector3;
-}
namespace Movement
{
struct SpellEffectExtraData;
}
-// Creature Entry ID used for waypoints show, visible only for GMs
-#define VISUAL_WAYPOINT 1
-// assume it is 25 yard per 0.6 second
-#define SPEED_CHARGE 42.0f
-
-enum MovementGeneratorType : uint8
-{
- IDLE_MOTION_TYPE = 0, // IdleMovementGenerator.h
- RANDOM_MOTION_TYPE = 1, // RandomMovementGenerator.h
- WAYPOINT_MOTION_TYPE = 2, // WaypointMovementGenerator.h
- MAX_DB_MOTION_TYPE = 3, // Below motion types can't be set in DB.
- CONFUSED_MOTION_TYPE = 4, // ConfusedMovementGenerator.h
- CHASE_MOTION_TYPE = 5, // TargetedMovementGenerator.h
- HOME_MOTION_TYPE = 6, // HomeMovementGenerator.h
- FLIGHT_MOTION_TYPE = 7, // WaypointMovementGenerator.h
- POINT_MOTION_TYPE = 8, // PointMovementGenerator.h
- FLEEING_MOTION_TYPE = 9, // FleeingMovementGenerator.h
- DISTRACT_MOTION_TYPE = 10, // IdleMovementGenerator.h
- ASSISTANCE_MOTION_TYPE = 11, // PointMovementGenerator.h
- ASSISTANCE_DISTRACT_MOTION_TYPE = 12, // IdleMovementGenerator.h
- TIMED_FLEEING_MOTION_TYPE = 13, // FleeingMovementGenerator.h
- FOLLOW_MOTION_TYPE = 14,
- ROTATE_MOTION_TYPE = 15,
- EFFECT_MOTION_TYPE = 16,
- SPLINE_CHAIN_MOTION_TYPE = 17, // SplineChainMovementGenerator.h
- FORMATION_MOTION_TYPE = 18, // FormationMovementGenerator.h
- MAX_MOTION_TYPE // limit
-};
-
-enum MovementSlot : uint8
-{
- MOTION_SLOT_IDLE = 0,
- MOTION_SLOT_ACTIVE,
- MOTION_SLOT_CONTROLLED,
- MAX_MOTION_SLOT
-};
-
-enum MMCleanFlag
-{
- MMCF_NONE = 0,
- MMCF_UPDATE = 1, // Clear or Expire called from update
- MMCF_RESET = 2 // Flag if need top()->Reset()
-};
-
-enum RotateDirection
-{
- ROTATE_DIRECTION_LEFT,
- ROTATE_DIRECTION_RIGHT
-};
-
-struct ChaseRange
-{
- ChaseRange(float range) : MinRange(range > CONTACT_DISTANCE ? 0 : range - CONTACT_DISTANCE), MinTolerance(range), MaxRange(range + CONTACT_DISTANCE), MaxTolerance(range) {}
- ChaseRange(float min, float max) : MinRange(min), MinTolerance(std::min(min + CONTACT_DISTANCE, (min + max) / 2)), MaxRange(max), MaxTolerance(std::max(max - CONTACT_DISTANCE, MinTolerance)) {}
- ChaseRange(float min, float tMin, float tMax, float max) : MinRange(min), MinTolerance(tMin), MaxRange(max), MaxTolerance(tMax) {}
-
- // this contains info that informs how we should path!
- float MinRange; // we have to move if we are within this range... (min. attack range)
- float MinTolerance; // ...and if we are, we will move this far away
- float MaxRange; // we have to move if we are outside this range... (max. attack range)
- float MaxTolerance; // ...and if we are, we will move into this range
-};
-
-struct ChaseAngle
-{
- ChaseAngle(float angle, float tol = M_PI_4) : RelativeAngle(Position::NormalizeOrientation(angle)), Tolerance(tol) {}
-
- float RelativeAngle; // we want to be at this angle relative to the target (0 = front, M_PI = back)
- float Tolerance; // but we'll tolerate anything within +- this much
-
- float UpperBound() const { return Position::NormalizeOrientation(RelativeAngle + Tolerance); }
- float LowerBound() const { return Position::NormalizeOrientation(RelativeAngle - Tolerance); }
- bool IsAngleOkay(float relAngle) const
- {
- float const diff = std::abs(relAngle - RelativeAngle);
- return (std::min(diff, float(2 * M_PI) - diff) <= Tolerance);
- }
-};
-
-struct JumpArrivalCastArgs
-{
- uint32 SpellId;
- ObjectGuid Target;
-};
-
class TC_GAME_API MotionMaster
{
public:
- explicit MotionMaster(Unit* unit) : _owner(unit), _top(-1), _cleanFlag(MMCF_NONE)
+ explicit MotionMaster(Unit* unit) : _owner(unit), _top(-1), _cleanFlag(MOTIONMMASTER_CLEANFLAG_NONE)
{
for (uint8 i = 0; i < MAX_MOTION_SLOT; ++i)
{
@@ -144,8 +52,7 @@ class TC_GAME_API MotionMaster
bool empty() const { return (_top < 0); }
int size() const { return _top + 1; }
- MovementGenerator* topOrNull() const { return empty() ? nullptr : top(); }
- MovementGenerator* top() const { ASSERT(!empty()); return _slot[_top]; }
+ MovementGenerator* top() const;
void Initialize();
void InitDefault();
@@ -172,10 +79,7 @@ class TC_GAME_API MotionMaster
void MoveChase(Unit* target, float dist, float angle = 0.0f) { MoveChase(target, Optional<ChaseRange>(dist), Optional<ChaseAngle>(angle)); }
void MoveConfused();
void MoveFleeing(Unit* enemy, uint32 time = 0);
- void MovePoint(uint32 id, Position const& pos, bool generatePath = true, Optional<float> finalOrient = {})
- {
- MovePoint(id, pos.m_positionX, pos.m_positionY, pos.m_positionZ, generatePath, finalOrient);
- }
+ void MovePoint(uint32 id, Position const& pos, bool generatePath = true, Optional<float> finalOrient = {});
void MovePoint(uint32 id, float x, float y, float z, bool generatePath = true, Optional<float> finalOrient = {});
/* Makes the unit move toward the target until it is at a certain distance from it. The unit then stops.
@@ -192,10 +96,7 @@ class TC_GAME_API MotionMaster
void MoveCharge(PathGenerator const& path, float speed = SPEED_CHARGE, Unit const* target = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr);
void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr);
void MoveJumpTo(float angle, float speedXY, float speedZ);
- void MoveJump(Position const& pos, float speedXY, float speedZ, uint32 id = EVENT_JUMP, bool hasOrientation = false, JumpArrivalCastArgs const* arrivalCast = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr)
- {
- MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), speedXY, speedZ, id, hasOrientation, arrivalCast, spellEffectExtraData);
- }
+ void MoveJump(Position const& pos, float speedXY, float speedZ, uint32 id = EVENT_JUMP, bool hasOrientation = false, JumpArrivalCastArgs const* arrivalCast = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr);
void MoveJump(float x, float y, float z, float o, float speedXY, float speedZ, uint32 id = EVENT_JUMP, bool hasOrientation = false, JumpArrivalCastArgs const* arrivalCast = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr);
void MoveCirclePath(float x, float y, float z, float radius, bool clockwise, uint8 stepCount);
void MoveSmoothPath(uint32 pointId, Position const* pathPoints, size_t pathSize, bool walk = false, bool fly = false);
diff --git a/src/server/game/Movement/MovementDefines.cpp b/src/server/game/Movement/MovementDefines.cpp
new file mode 100644
index 00000000000..ec133d07c68
--- /dev/null
+++ b/src/server/game/Movement/MovementDefines.cpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2008-2018 TrinityCore <https://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "Common.h"
+#include "MovementDefines.h"
+#include "ObjectDefines.h"
+#include "Position.h"
+#include <algorithm>
+
+ // ---- ChaseRange ---- //
+
+ChaseRange::ChaseRange(float range) : MinRange(range > CONTACT_DISTANCE ? 0 : range - CONTACT_DISTANCE), MinTolerance(range), MaxRange(range + CONTACT_DISTANCE), MaxTolerance(range) { }
+ChaseRange::ChaseRange(float _minRange, float _maxRange) : MinRange(_minRange), MinTolerance(std::min(_minRange + CONTACT_DISTANCE, (_minRange + _maxRange) / 2)), MaxRange(_maxRange), MaxTolerance(std::max(_maxRange - CONTACT_DISTANCE, MinTolerance)) { }
+ChaseRange::ChaseRange(float _minRange, float _minTolerance, float _maxTolerance, float _maxRange) : MinRange(_minRange), MinTolerance(_minTolerance), MaxRange(_maxRange), MaxTolerance(_maxTolerance) { }
+
+// ---- ChaseAngle ---- //
+
+ChaseAngle::ChaseAngle(float angle, float _tolerance/* = M_PI_4*/) : RelativeAngle(Position::NormalizeOrientation(angle)), Tolerance(_tolerance) { }
+
+float ChaseAngle::UpperBound() const
+{
+ return Position::NormalizeOrientation(RelativeAngle + Tolerance);
+}
+
+float ChaseAngle::LowerBound() const
+{
+ return Position::NormalizeOrientation(RelativeAngle - Tolerance);
+}
+
+bool ChaseAngle::IsAngleOkay(float relativeAngle) const
+{
+ float const diff = std::abs(relativeAngle - RelativeAngle);
+
+ return (std::min(diff, float(2 * M_PI) - diff) <= Tolerance);
+}
diff --git a/src/server/game/Movement/MovementDefines.h b/src/server/game/Movement/MovementDefines.h
new file mode 100644
index 00000000000..dbacd9a469f
--- /dev/null
+++ b/src/server/game/Movement/MovementDefines.h
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2008-2018 TrinityCore <https://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef TRINITY_MOVEMENTDEFINES_H
+#define TRINITY_MOVEMENTDEFINES_H
+
+#include "Common.h"
+#include "ObjectGuid.h"
+
+#define SPEED_CHARGE 42.0f // assume it is 25 yard per 0.6 second
+
+enum MovementGeneratorType : uint8
+{
+ IDLE_MOTION_TYPE = 0, // IdleMovementGenerator.h
+ RANDOM_MOTION_TYPE = 1, // RandomMovementGenerator.h
+ WAYPOINT_MOTION_TYPE = 2, // WaypointMovementGenerator.h
+ MAX_DB_MOTION_TYPE = 3, // Below motion types can't be set in DB.
+ CONFUSED_MOTION_TYPE = 4, // ConfusedMovementGenerator.h
+ CHASE_MOTION_TYPE = 5, // TargetedMovementGenerator.h
+ HOME_MOTION_TYPE = 6, // HomeMovementGenerator.h
+ FLIGHT_MOTION_TYPE = 7, // WaypointMovementGenerator.h
+ POINT_MOTION_TYPE = 8, // PointMovementGenerator.h
+ FLEEING_MOTION_TYPE = 9, // FleeingMovementGenerator.h
+ DISTRACT_MOTION_TYPE = 10, // IdleMovementGenerator.h
+ ASSISTANCE_MOTION_TYPE = 11, // PointMovementGenerator.h
+ ASSISTANCE_DISTRACT_MOTION_TYPE = 12, // IdleMovementGenerator.h
+ TIMED_FLEEING_MOTION_TYPE = 13, // FleeingMovementGenerator.h
+ FOLLOW_MOTION_TYPE = 14,
+ ROTATE_MOTION_TYPE = 15,
+ EFFECT_MOTION_TYPE = 16,
+ SPLINE_CHAIN_MOTION_TYPE = 17, // SplineChainMovementGenerator.h
+ FORMATION_MOTION_TYPE = 18, // FormationMovementGenerator.h
+ MAX_MOTION_TYPE // limit
+};
+
+enum MovementSlot : uint8
+{
+ MOTION_SLOT_IDLE = 0,
+ MOTION_SLOT_ACTIVE,
+ MOTION_SLOT_CONTROLLED,
+ MAX_MOTION_SLOT
+};
+
+enum MotionMasterCleanFlags
+{
+ MOTIONMMASTER_CLEANFLAG_NONE = 0,
+ MOTIONMMASTER_CLEANFLAG_UPDATE = 1, // Clear or Expire called from update
+ MOTIONMMASTER_CLEANFLAG_RESET = 2 // Flag if need top()->Reset()
+};
+
+enum RotateDirection : uint8
+{
+ ROTATE_DIRECTION_LEFT = 0,
+ ROTATE_DIRECTION_RIGHT
+};
+
+struct TC_GAME_API ChaseRange
+{
+ ChaseRange(float range);
+ ChaseRange(float _minRange, float _maxRange);
+ ChaseRange(float _minRange, float _minTolerance, float _maxTolerance, float _maxRange);
+
+ // this contains info that informs how we should path!
+ float MinRange; // we have to move if we are within this range... (min. attack range)
+ float MinTolerance; // ...and if we are, we will move this far away
+ float MaxRange; // we have to move if we are outside this range... (max. attack range)
+ float MaxTolerance; // ...and if we are, we will move into this range
+};
+
+struct TC_GAME_API ChaseAngle
+{
+ ChaseAngle(float angle, float _tolerance = M_PI_4);
+
+ float RelativeAngle; // we want to be at this angle relative to the target (0 = front, M_PI = back)
+ float Tolerance; // but we'll tolerate anything within +- this much
+
+ float UpperBound() const;
+ float LowerBound() const;
+ bool IsAngleOkay(float relativeAngle) const;
+};
+
+struct JumpArrivalCastArgs
+{
+ uint32 SpellId;
+ ObjectGuid Target;
+};
+
+#endif
diff --git a/src/server/game/Movement/MovementGenerator.cpp b/src/server/game/Movement/MovementGenerator.cpp
index 661267401d2..35d689277dd 100644
--- a/src/server/game/Movement/MovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerator.cpp
@@ -16,12 +16,33 @@
*/
#include "MovementGenerator.h"
+#include "Creature.h"
#include "IdleMovementGenerator.h"
+#include "MovementDefines.h"
+#include "PathGenerator.h"
+#include "RandomMovementGenerator.h"
+#include "WaypointMovementGenerator.h"
MovementGenerator::~MovementGenerator() { }
+IdleMovementFactory::IdleMovementFactory() : MovementGeneratorCreator(IDLE_MOTION_TYPE) { }
+
MovementGenerator* IdleMovementFactory::Create(Unit* /*object*/) const
{
static IdleMovementGenerator instance;
return &instance;
}
+
+RandomMovementFactory::RandomMovementFactory() : MovementGeneratorCreator(RANDOM_MOTION_TYPE) { }
+
+MovementGenerator* RandomMovementFactory::Create(Unit* /*object*/) const
+{
+ return new RandomMovementGenerator<Creature>();
+}
+
+WaypointMovementFactory::WaypointMovementFactory() : MovementGeneratorCreator(WAYPOINT_MOTION_TYPE) { }
+
+MovementGenerator* WaypointMovementFactory::Create(Unit* /*object*/) const
+{
+ return new WaypointMovementGenerator<Creature>();
+}
diff --git a/src/server/game/Movement/MovementGenerator.h b/src/server/game/Movement/MovementGenerator.h
index 3064a3d967e..03f96ba1538 100755
--- a/src/server/game/Movement/MovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerator.h
@@ -19,13 +19,14 @@
#define TRINITY_MOVEMENTGENERATOR_H
#include "Define.h"
-#include "ObjectRegistry.h"
#include "FactoryHolder.h"
-#include "Common.h"
-#include "MotionMaster.h"
+#include "ObjectRegistry.h"
+class Creature;
class Unit;
+enum MovementGeneratorType : uint8;
+
class TC_GAME_API MovementGenerator
{
public:
@@ -41,32 +42,31 @@ class TC_GAME_API MovementGenerator
virtual void Pause(uint32/* timer = 0*/) { } // timer in ms
virtual void Resume(uint32/* overrideTimer = 0*/) { } // timer in ms
- // 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 bool GetResetPosition(Unit*, float&/* x*/, float&/* y*/, float&/* z*/) { return false; } // used by Evade code for select point to evade with expected restart default movement
};
template<class T, class D>
class MovementGeneratorMedium : public MovementGenerator
{
public:
- void Initialize(Unit* u) override
+ void Initialize(Unit* owner) override
{
- (static_cast<D*>(this))->DoInitialize(static_cast<T*>(u));
+ (static_cast<D*>(this))->DoInitialize(static_cast<T*>(owner));
}
- void Finalize(Unit* u) override
+ void Finalize(Unit* owner) override
{
- (static_cast<D*>(this))->DoFinalize(static_cast<T*>(u));
+ (static_cast<D*>(this))->DoFinalize(static_cast<T*>(owner));
}
- void Reset(Unit* u) override
+ void Reset(Unit* owner) override
{
- (static_cast<D*>(this))->DoReset(static_cast<T*>(u));
+ (static_cast<D*>(this))->DoReset(static_cast<T*>(owner));
}
- bool Update(Unit* u, uint32 time_diff) override
+ bool Update(Unit* owner, uint32 diff) override
{
- return (static_cast<D*>(this))->DoUpdate(static_cast<T*>(u), time_diff);
+ return (static_cast<D*>(this))->DoUpdate(static_cast<T*>(owner), diff);
}
};
@@ -85,7 +85,21 @@ struct MovementGeneratorFactory : public MovementGeneratorCreator
struct IdleMovementFactory : public MovementGeneratorCreator
{
- IdleMovementFactory() : MovementGeneratorCreator(IDLE_MOTION_TYPE) { }
+ IdleMovementFactory();
+
+ MovementGenerator* Create(Unit* object) const override;
+};
+
+struct RandomMovementFactory : public MovementGeneratorCreator
+{
+ RandomMovementFactory();
+
+ MovementGenerator* Create(Unit* object) const override;
+};
+
+struct WaypointMovementFactory : public MovementGeneratorCreator
+{
+ WaypointMovementFactory();
MovementGenerator* Create(Unit* object) const override;
};
diff --git a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp
index 230edbdc861..ce04b237fa4 100644
--- a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp
@@ -18,6 +18,7 @@
#include "ChaseMovementGenerator.h"
#include "Creature.h"
#include "G3DPosition.hpp"
+#include "MotionMaster.h"
#include "MoveSpline.h"
#include "MoveSplineInit.h"
#include "PathGenerator.h"
@@ -26,10 +27,10 @@
static bool IsMutualChase(Unit* owner, Unit* target)
{
- MovementGenerator const* gen = target->GetMotionMaster()->topOrNull();
- if (!gen || gen->GetMovementGeneratorType() != CHASE_MOTION_TYPE)
+ if (target->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE)
return false;
- return (static_cast<ChaseMovementGenerator const*>(gen)->GetTarget() == owner);
+
+ return (static_cast<ChaseMovementGenerator const*>(target->GetMotionMaster()->top())->GetTarget() == owner);
}
static bool PositionOkay(Unit* owner, Unit* target, Optional<float> minDistance, Optional<float> maxDistance, Optional<ChaseAngle> angle)
@@ -49,6 +50,7 @@ void ChaseMovementGenerator::Initialize(Unit* owner)
{
owner->AddUnitState(UNIT_STATE_CHASE);
owner->SetWalk(false);
+ _path = nullptr;
}
bool ChaseMovementGenerator::Update(Unit* owner, uint32 diff)
diff --git a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h
index 4a7269bf70d..c1d967d6eed 100644
--- a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h
@@ -19,8 +19,10 @@
#define TRINITY_CHASEMOVEMENTGENERATOR_H
#include "AbstractFollower.h"
+#include "MovementDefines.h"
#include "MovementGenerator.h"
#include "Optional.h"
+#include "Position.h"
class PathGenerator;
class Unit;
@@ -28,17 +30,16 @@ class Unit;
class ChaseMovementGenerator : public MovementGenerator, public AbstractFollower
{
public:
- MovementGeneratorType GetMovementGeneratorType() const override { return CHASE_MOTION_TYPE; }
-
- ChaseMovementGenerator(Unit* target, Optional<ChaseRange> range = {}, Optional<ChaseAngle> angle = {});
+ explicit ChaseMovementGenerator(Unit* target, Optional<ChaseRange> range = {}, Optional<ChaseAngle> angle = {});
~ChaseMovementGenerator();
void Initialize(Unit* owner) override;
void Reset(Unit* owner) override { Initialize(owner); }
bool Update(Unit* owner, uint32 diff) override;
void Finalize(Unit* owner) override;
+ MovementGeneratorType GetMovementGeneratorType() const override { return CHASE_MOTION_TYPE; }
- void UnitSpeedChanged() override { _lastTargetPosition.Relocate(0.0f,0.0f,0.0f); }
+ void UnitSpeedChanged() override { _lastTargetPosition.Relocate(0.0f, 0.0f, 0.0f); }
private:
static constexpr uint32 RANGE_CHECK_INTERVAL = 100; // time (ms) until we attempt to recalculate
diff --git a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp
index d3cdffb462f..d949ea5655f 100755
--- a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp
@@ -17,6 +17,7 @@
#include "ConfusedMovementGenerator.h"
#include "Creature.h"
+#include "MovementDefines.h"
#include "MoveSpline.h"
#include "MoveSplineInit.h"
#include "PathGenerator.h"
@@ -24,9 +25,12 @@
#include "Random.h"
template<class T>
-ConfusedMovementGenerator<T>::~ConfusedMovementGenerator()
+ConfusedMovementGenerator<T>::~ConfusedMovementGenerator() = default;
+
+template<class T>
+MovementGeneratorType ConfusedMovementGenerator<T>::GetMovementGeneratorType() const
{
- delete _path;
+ return CONFUSED_MOTION_TYPE;
}
template<class T>
@@ -41,6 +45,7 @@ void ConfusedMovementGenerator<T>::DoInitialize(T* owner)
_timer.Reset(0);
owner->GetPosition(_reference.m_positionX, _reference.m_positionY, _reference.m_positionZ);
+ _path = nullptr;
}
template<class T>
@@ -59,6 +64,7 @@ bool ConfusedMovementGenerator<T>::DoUpdate(T* owner, uint32 diff)
{
_interrupt = true;
owner->StopMoving();
+ _path = nullptr;
return true;
}
else
@@ -77,9 +83,11 @@ bool ConfusedMovementGenerator<T>::DoUpdate(T* owner, uint32 diff)
owner->MovePositionToFirstCollision(destination, distance, angle);
if (!_path)
- _path = new PathGenerator(owner);
+ {
+ _path = std::make_unique<PathGenerator>(owner);
+ _path->SetPathLengthLimit(30.0f);
+ }
- _path->SetPathLengthLimit(30.0f);
bool result = _path->CalculatePath(destination.GetPositionX(), destination.GetPositionY(), destination.GetPositionZ());
if (!result || (_path->GetPathType() & PATHFIND_NOPATH))
{
@@ -119,6 +127,8 @@ void ConfusedMovementGenerator<Creature>::DoFinalize(Creature* unit)
template ConfusedMovementGenerator<Player>::~ConfusedMovementGenerator();
template ConfusedMovementGenerator<Creature>::~ConfusedMovementGenerator();
+template MovementGeneratorType ConfusedMovementGenerator<Player>::GetMovementGeneratorType() const;
+template MovementGeneratorType ConfusedMovementGenerator<Creature>::GetMovementGeneratorType() const;
template void ConfusedMovementGenerator<Player>::DoInitialize(Player*);
template void ConfusedMovementGenerator<Creature>::DoInitialize(Creature*);
template void ConfusedMovementGenerator<Player>::DoReset(Player*);
diff --git a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h
index 7d4cd073457..b571603ce36 100755
--- a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h
@@ -19,16 +19,20 @@
#define TRINITY_CONFUSEDGENERATOR_H
#include "MovementGenerator.h"
+#include "Position.h"
#include "Timer.h"
+class PathGenerator;
+
template<class T>
class ConfusedMovementGenerator : public MovementGeneratorMedium< T, ConfusedMovementGenerator<T> >
{
public:
- explicit ConfusedMovementGenerator() : _path(nullptr), _timer(0), _reference(0.f, 0.f, 0.f), _interrupt(false) { }
+ explicit ConfusedMovementGenerator() : _timer(0), _reference(0.f, 0.f, 0.f), _interrupt(false) { }
~ConfusedMovementGenerator();
- MovementGeneratorType GetMovementGeneratorType() const override { return CONFUSED_MOTION_TYPE; }
+ MovementGeneratorType GetMovementGeneratorType() const override;
+ void UnitSpeedChanged() override { } //TODO
void DoInitialize(T*);
void DoFinalize(T*);
@@ -36,7 +40,7 @@ class ConfusedMovementGenerator : public MovementGeneratorMedium< T, ConfusedMov
bool DoUpdate(T*, uint32);
private:
- PathGenerator* _path;
+ std::unique_ptr<PathGenerator> _path;
TimeTracker _timer;
Position _reference;
bool _interrupt;
diff --git a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp
index d142913268f..621cae86d12 100644
--- a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp
@@ -16,23 +16,27 @@
*/
#include "FleeingMovementGenerator.h"
-#include "VMapFactory.h"
-#include "CreatureAI.h"
-#include "ObjectAccessor.h"
#include "Creature.h"
-#include "Player.h"
-#include "PathGenerator.h"
+#include "CreatureAI.h"
+#include "MovementDefines.h"
#include "MoveSplineInit.h"
#include "MoveSpline.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()
+FleeingMovementGenerator<T>::~FleeingMovementGenerator() = default;
+
+template<class T>
+MovementGeneratorType FleeingMovementGenerator<T>::GetMovementGeneratorType() const
{
- delete _path;
+ return FLEEING_MOTION_TYPE;
}
template<class T>
@@ -44,6 +48,7 @@ void FleeingMovementGenerator<T>::DoInitialize(T* owner)
owner->AddUnitFlag(UNIT_FLAG_FLEEING);
owner->AddUnitState(UNIT_STATE_FLEEING);
SetTargetLocation(owner);
+ _path = nullptr;
}
template<class T>
@@ -84,6 +89,7 @@ bool FleeingMovementGenerator<T>::DoUpdate(T* owner, uint32 diff)
{
_interrupt = true;
owner->StopMoving();
+ _path = nullptr;
return true;
}
else
@@ -106,6 +112,7 @@ void FleeingMovementGenerator<T>::SetTargetLocation(T* owner)
{
_interrupt = true;
owner->StopMoving();
+ _path = nullptr;
return;
}
@@ -122,9 +129,11 @@ void FleeingMovementGenerator<T>::SetTargetLocation(T* owner)
}
if (!_path)
- _path = new PathGenerator(owner);
+ {
+ _path = std::make_unique<PathGenerator>(owner);
+ _path->SetPathLengthLimit(30.0f);
+ }
- _path->SetPathLengthLimit(30.0f);
bool result = _path->CalculatePath(destination.GetPositionX(), destination.GetPositionY(), destination.GetPositionZ());
if (!result || (_path->GetPathType() & PATHFIND_NOPATH))
{
@@ -168,7 +177,7 @@ void FleeingMovementGenerator<T>::GetPoint(T* owner, Position &position)
distance = frand(0.4f, 1.0f) * (MAX_QUIET_DISTANCE - MIN_QUIET_DISTANCE);
angle = -casterAngle + frand(-float(M_PI) / 4.0f, float(M_PI) / 4.0f);
}
- else // we are inside quiet range
+ else // we are inside quiet range
{
distance = frand(0.6f, 1.2f) * (MAX_QUIET_DISTANCE - MIN_QUIET_DISTANCE);
angle = frand(0.0f, 2.0f * float(M_PI));
@@ -179,6 +188,8 @@ void FleeingMovementGenerator<T>::GetPoint(T* owner, Position &position)
template FleeingMovementGenerator<Player>::~FleeingMovementGenerator();
template FleeingMovementGenerator<Creature>::~FleeingMovementGenerator();
+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*);
@@ -192,6 +203,11 @@ template void FleeingMovementGenerator<Creature>::GetPoint(Creature*, Position &
//---- TimedFleeingMovementGenerator
+MovementGeneratorType TimedFleeingMovementGenerator::GetMovementGeneratorType() const
+{
+ return TIMED_FLEEING_MOTION_TYPE;
+}
+
bool TimedFleeingMovementGenerator::Update(Unit* owner, uint32 time_diff)
{
if (!owner->IsAlive())
diff --git a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h
index e08481142c1..b4b27c4dd38 100755
--- a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h
@@ -19,18 +19,22 @@
#define TRINITY_FLEEINGMOVEMENTGENERATOR_H
#include "MovementGenerator.h"
+#include "ObjectGuid.h"
#include "Timer.h"
class Creature;
+class PathGenerator;
+struct Position;
template<class T>
class FleeingMovementGenerator : public MovementGeneratorMedium< T, FleeingMovementGenerator<T> >
{
public:
- explicit FleeingMovementGenerator(ObjectGuid fleeTargetGUID) : _path(nullptr), _fleeTargetGUID(fleeTargetGUID), _timer(0), _interrupt(false) { }
+ explicit FleeingMovementGenerator(ObjectGuid fleeTargetGUID) : _fleeTargetGUID(fleeTargetGUID), _timer(0), _interrupt(false) { }
~FleeingMovementGenerator();
- MovementGeneratorType GetMovementGeneratorType() const override { return FLEEING_MOTION_TYPE; }
+ MovementGeneratorType GetMovementGeneratorType() const override;
+ void UnitSpeedChanged() override { } //TODO
void DoInitialize(T*);
void DoFinalize(T*);
@@ -41,7 +45,7 @@ class FleeingMovementGenerator : public MovementGeneratorMedium< T, FleeingMovem
void SetTargetLocation(T*);
void GetPoint(T*, Position &position);
- PathGenerator* _path;
+ std::unique_ptr<PathGenerator> _path;
ObjectGuid _fleeTargetGUID;
TimeTracker _timer;
bool _interrupt;
@@ -52,7 +56,7 @@ class TimedFleeingMovementGenerator : public FleeingMovementGenerator<Creature>
public:
explicit TimedFleeingMovementGenerator(ObjectGuid fleeTargetGUID, uint32 time) : FleeingMovementGenerator<Creature>(fleeTargetGUID), _totalFleeTime(time) { }
- MovementGeneratorType GetMovementGeneratorType() const override { return TIMED_FLEEING_MOTION_TYPE; }
+ MovementGeneratorType GetMovementGeneratorType() const override;
bool Update(Unit*, uint32) override;
void Finalize(Unit*) override;
diff --git a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp
index cd4f09d40c8..7e04a0ff831 100644
--- a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp
@@ -19,6 +19,7 @@
#include "DB2Stores.h"
#include "Log.h"
#include "MapManager.h"
+#include "MovementDefines.h"
#include "MoveSpline.h"
#include "MoveSplineInit.h"
#include "ObjectMgr.h"
@@ -183,6 +184,11 @@ bool FlightPathMovementGenerator::DoUpdate(Player* player, uint32 /*diff*/)
return _currentNode < (_path.size() - 1);
}
+MovementGeneratorType FlightPathMovementGenerator::GetMovementGeneratorType() const
+{
+ return FLIGHT_MOTION_TYPE;
+}
+
void FlightPathMovementGenerator::SetCurrentNodeAfterTeleport()
{
if (_path.empty() || _currentNode >= _path.size())
diff --git a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h
index a7ba4c3ca7a..4f850ab3147 100644
--- a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h
@@ -20,6 +20,7 @@
#include "MovementGenerator.h"
#include "PathMovementBase.h"
+#include <deque>
class Player;
struct TaxiPathNodeEntry;
@@ -38,7 +39,7 @@ public:
void DoReset(Player*);
void DoFinalize(Player*);
bool DoUpdate(Player*, uint32);
- MovementGeneratorType GetMovementGeneratorType() const override { return FLIGHT_MOTION_TYPE; }
+ MovementGeneratorType GetMovementGeneratorType() const override;
std::vector<TaxiPathNodeEntry const*> const& GetPath() { return _path; }
uint32 GetPathAtMapEnd() const;
diff --git a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp
index 5f4ce139dc1..863b282e5fb 100644
--- a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp
@@ -18,18 +18,20 @@
#include "FollowMovementGenerator.h"
#include "MoveSpline.h"
#include "MoveSplineInit.h"
+#include "Optional.h"
#include "PathGenerator.h"
#include "Pet.h"
#include "Unit.h"
#include "Util.h"
FollowMovementGenerator::FollowMovementGenerator(Unit* target, float range, ChaseAngle angle) : AbstractFollower(ASSERT_NOTNULL(target)), _range(range), _angle(angle) {}
-FollowMovementGenerator::~FollowMovementGenerator() {}
+FollowMovementGenerator::~FollowMovementGenerator() = default;
static bool PositionOkay(Unit* owner, Unit* target, float range, Optional<ChaseAngle> angle = {})
{
if (owner->GetExactDistSq(target) > square(owner->GetCombatReach() + target->GetCombatReach() + range))
return false;
+
return !angle || angle->IsAngleOkay(target->GetRelativeAngle(owner));
}
@@ -37,6 +39,7 @@ void FollowMovementGenerator::Initialize(Unit* owner)
{
owner->AddUnitState(UNIT_STATE_FOLLOW);
UpdatePetSpeed(owner);
+ _path = nullptr;
}
bool FollowMovementGenerator::Update(Unit* owner, uint32 diff)
@@ -142,10 +145,12 @@ void FollowMovementGenerator::Finalize(Unit* owner)
void FollowMovementGenerator::UpdatePetSpeed(Unit* owner)
{
if (Pet* oPet = owner->ToPet())
+ {
if (!GetTarget() || GetTarget()->GetGUID() == owner->GetOwnerGUID())
{
oPet->UpdateSpeed(MOVE_RUN);
oPet->UpdateSpeed(MOVE_WALK);
oPet->UpdateSpeed(MOVE_SWIM);
}
+ }
}
diff --git a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h
index 112161de95c..2725656f2ef 100644
--- a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h
@@ -19,30 +19,31 @@
#define TRINITY_FOLLOWMOVEMENTGENERATOR_H
#include "AbstractFollower.h"
+#include "MovementDefines.h"
#include "MovementGenerator.h"
+#include "Position.h"
class PathGenerator;
class Unit;
+#define FOLLOW_RANGE_TOLERANCE 1.0f
+
class FollowMovementGenerator : public MovementGenerator, public AbstractFollower
{
public:
- MovementGeneratorType GetMovementGeneratorType() const override { return FOLLOW_MOTION_TYPE; }
-
- FollowMovementGenerator(Unit* target, float range, ChaseAngle angle);
+ explicit FollowMovementGenerator(Unit* target, float range, ChaseAngle angle);
~FollowMovementGenerator();
void Initialize(Unit* owner) override;
void Reset(Unit* owner) override { Initialize(owner); }
bool Update(Unit* owner, uint32 diff) override;
void Finalize(Unit* owner) override;
+ MovementGeneratorType GetMovementGeneratorType() const override { return FOLLOW_MOTION_TYPE; }
void UnitSpeedChanged() override { _lastTargetPosition.Relocate(0.0f, 0.0f, 0.0f); }
private:
static constexpr uint32 CHECK_INTERVAL = 500;
-// static inline const when?
-#define FOLLOW_RANGE_TOLERANCE 1.0f
void UpdatePetSpeed(Unit* owner);
diff --git a/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.cpp
index cc2b42c0e5b..d7a228eef53 100644
--- a/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.cpp
@@ -18,9 +18,15 @@
#include "FormationMovementGenerator.h"
#include "Creature.h"
#include "CreatureAI.h"
+#include "MovementDefines.h"
#include "MoveSplineInit.h"
#include "MoveSpline.h"
+MovementGeneratorType FormationMovementGenerator::GetMovementGeneratorType() const
+{
+ return FORMATION_MOTION_TYPE;
+}
+
void FormationMovementGenerator::DoInitialize(Creature* owner)
{
owner->AddUnitState(UNIT_STATE_ROAMING);
diff --git a/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.h
index 9c65399d623..f9d46c23583 100644
--- a/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.h
@@ -19,6 +19,7 @@
#define TRINITY_FORMATIONMOVEMENTGENERATOR_H
#include "MovementGenerator.h"
+#include "Position.h"
class Creature;
@@ -27,7 +28,7 @@ class FormationMovementGenerator : public MovementGeneratorMedium< Creature, For
public:
explicit FormationMovementGenerator(uint32 id, Position destination, uint32 moveType, bool run, bool orientation) : _movementId(id), _destination(destination), _moveType(moveType), _run(run), _orientation(orientation), _recalculateSpeed(false), _interrupt(false) { }
- MovementGeneratorType GetMovementGeneratorType() const override { return FORMATION_MOTION_TYPE; }
+ MovementGeneratorType GetMovementGeneratorType() const override;
void DoInitialize(Creature*);
void DoFinalize(Creature*);
diff --git a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp
index df1adb19684..d058b70ef6f 100644
--- a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp
@@ -18,19 +18,20 @@
#include "HomeMovementGenerator.h"
#include "Creature.h"
#include "CreatureAI.h"
+#include "MotionMaster.h"
+#include "MovementDefines.h"
#include "MoveSpline.h"
#include "MoveSplineInit.h"
#include "PathGenerator.h"
template<class T>
-HomeMovementGenerator<T>::~HomeMovementGenerator() { }
-
-template<>
-HomeMovementGenerator<Creature>::~HomeMovementGenerator()
+MovementGeneratorType HomeMovementGenerator<T>::GetMovementGeneratorType() const
{
- delete _path;
+ return HOME_MOTION_TYPE;
}
+template MovementGeneratorType HomeMovementGenerator<Creature>::GetMovementGeneratorType() const;
+
template<class T>
void HomeMovementGenerator<T>::SetTargetLocation(T*) { }
diff --git a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h
index 5e1c25d9361..3126b2ac6e2 100644
--- a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h
@@ -24,10 +24,9 @@ template <class T>
class HomeMovementGenerator : public MovementGeneratorMedium< T, HomeMovementGenerator<T> >
{
public:
- explicit HomeMovementGenerator() : _path(nullptr), _arrived(false), _skipToHome(false) { }
- ~HomeMovementGenerator();
+ explicit HomeMovementGenerator() : _arrived(false), _skipToHome(false) { }
- MovementGeneratorType GetMovementGeneratorType() const override { return HOME_MOTION_TYPE; }
+ MovementGeneratorType GetMovementGeneratorType() const override;
void DoInitialize(T*);
void DoFinalize(T*);
@@ -37,7 +36,6 @@ class HomeMovementGenerator : public MovementGeneratorMedium< T, HomeMovementGen
private:
void SetTargetLocation(T*);
- PathGenerator* _path;
bool _arrived;
bool _skipToHome;
};
diff --git a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp
index 43638197578..2089c0fc18d 100644
--- a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp
@@ -16,8 +16,9 @@
*/
#include "IdleMovementGenerator.h"
-#include "CreatureAI.h"
#include "Creature.h"
+#include "CreatureAI.h"
+#include "MovementDefines.h"
#include <G3D/g3dmath.h>
// StopMoving is needed to make unit stop if its last movement generator expires
@@ -33,6 +34,11 @@ void IdleMovementGenerator::Reset(Unit* owner)
owner->StopMoving();
}
+MovementGeneratorType IdleMovementGenerator::GetMovementGeneratorType() const
+{
+ return IDLE_MOTION_TYPE;
+}
+
//----------------------------------------------------//
void RotateMovementGenerator::Initialize(Unit* owner)
@@ -64,6 +70,11 @@ bool RotateMovementGenerator::Update(Unit* owner, uint32 diff)
return true;
}
+MovementGeneratorType RotateMovementGenerator::GetMovementGeneratorType() const
+{
+ return ROTATE_MOTION_TYPE;
+}
+
void RotateMovementGenerator::Finalize(Unit* owner)
{
owner->ClearUnitState(UNIT_STATE_ROTATING);
@@ -103,8 +114,18 @@ bool DistractMovementGenerator::Update(Unit* /*owner*/, uint32 diff)
return true;
}
+MovementGeneratorType DistractMovementGenerator::GetMovementGeneratorType() const
+{
+ return DISTRACT_MOTION_TYPE;
+}
+
//----------------------------------------------------//
+MovementGeneratorType AssistanceDistractMovementGenerator::GetMovementGeneratorType() const
+{
+ return ASSISTANCE_DISTRACT_MOTION_TYPE;
+}
+
void AssistanceDistractMovementGenerator::Finalize(Unit* owner)
{
owner->ClearUnitState(UNIT_STATE_DISTRACTED);
diff --git a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h
index 773d4dc03b7..5e41413c019 100755
--- a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h
@@ -21,6 +21,8 @@
#include "MovementGenerator.h"
#include "Timer.h"
+enum RotateDirection : uint8;
+
class IdleMovementGenerator : public MovementGenerator
{
public:
@@ -28,7 +30,7 @@ class IdleMovementGenerator : public MovementGenerator
void Finalize(Unit*) override { }
void Reset(Unit*) override;
bool Update(Unit*, uint32) override { return true; }
- MovementGeneratorType GetMovementGeneratorType() const override { return IDLE_MOTION_TYPE; }
+ MovementGeneratorType GetMovementGeneratorType() const override;
};
class RotateMovementGenerator : public MovementGenerator
@@ -40,7 +42,7 @@ class RotateMovementGenerator : public MovementGenerator
void Finalize(Unit*) override;
void Reset(Unit* owner) override { Initialize(owner); }
bool Update(Unit*, uint32) override;
- MovementGeneratorType GetMovementGeneratorType() const override { return ROTATE_MOTION_TYPE; }
+ MovementGeneratorType GetMovementGeneratorType() const override;
private:
uint32 _duration, _maxDuration;
@@ -56,7 +58,7 @@ class DistractMovementGenerator : public MovementGenerator
void Finalize(Unit*) override;
void Reset(Unit* owner) override { Initialize(owner); }
bool Update(Unit*, uint32) override;
- MovementGeneratorType GetMovementGeneratorType() const override { return DISTRACT_MOTION_TYPE; }
+ MovementGeneratorType GetMovementGeneratorType() const override;
private:
uint32 _timer;
@@ -67,7 +69,7 @@ class AssistanceDistractMovementGenerator : public DistractMovementGenerator
public:
explicit AssistanceDistractMovementGenerator(uint32 timer) : DistractMovementGenerator(timer) { }
- MovementGeneratorType GetMovementGeneratorType() const override { return ASSISTANCE_DISTRACT_MOTION_TYPE; }
+ MovementGeneratorType GetMovementGeneratorType() const override;
void Finalize(Unit*) override;
};
diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp
index 5a75ba7340c..ad32681769e 100755
--- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp
@@ -16,9 +16,11 @@
*/
#include "PointMovementGenerator.h"
-#include "CreatureAI.h"
#include "Creature.h"
+#include "CreatureAI.h"
#include "Player.h"
+#include "MotionMaster.h"
+#include "MovementDefines.h"
#include "MoveSplineInit.h"
#include "MoveSpline.h"
#include "ObjectAccessor.h"
@@ -27,6 +29,12 @@
//----- Point Movement Generator
template<class T>
+MovementGeneratorType PointMovementGenerator<T>::GetMovementGeneratorType() const
+{
+ return POINT_MOTION_TYPE;
+}
+
+template<class T>
void PointMovementGenerator<T>::DoInitialize(T* owner)
{
if (_movementId == EVENT_CHARGE_PREPATH)
@@ -127,6 +135,8 @@ void PointMovementGenerator<Creature>::MovementInform(Creature* owner)
owner->AI()->MovementInform(POINT_MOTION_TYPE, _movementId);
}
+template MovementGeneratorType PointMovementGenerator<Player>::GetMovementGeneratorType() const;
+template MovementGeneratorType PointMovementGenerator<Creature>::GetMovementGeneratorType() const;
template void PointMovementGenerator<Player>::DoInitialize(Player*);
template void PointMovementGenerator<Creature>::DoInitialize(Creature*);
template void PointMovementGenerator<Player>::DoFinalize(Player*);
@@ -138,6 +148,11 @@ template bool PointMovementGenerator<Creature>::DoUpdate(Creature*, uint32);
//---- AssistanceMovementGenerator
+MovementGeneratorType AssistanceMovementGenerator::GetMovementGeneratorType() const
+{
+ return ASSISTANCE_MOTION_TYPE;
+}
+
void AssistanceMovementGenerator::Finalize(Unit* owner)
{
owner->ClearUnitState(UNIT_STATE_ROAMING);
@@ -155,6 +170,11 @@ bool EffectMovementGenerator::Update(Unit* owner, uint32 /*diff*/)
return !owner->movespline->Finalized();
}
+MovementGeneratorType EffectMovementGenerator::GetMovementGeneratorType() const
+{
+ return EFFECT_MOTION_TYPE;
+}
+
void EffectMovementGenerator::Finalize(Unit* owner)
{
MovementInform(owner);
diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h
index 47570092744..1fcfd494354 100644
--- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h
@@ -19,7 +19,9 @@
#define TRINITY_POINTMOVEMENTGENERATOR_H
#include "MovementGenerator.h"
+#include "ObjectGuid.h"
#include "Optional.h"
+#include "Position.h"
class Creature;
namespace Movement
@@ -33,7 +35,7 @@ class PointMovementGenerator : public MovementGeneratorMedium< T, PointMovementG
public:
explicit PointMovementGenerator(uint32 id, float x, float y, float z, bool generatePath, float speed = 0.0f, Unit const* faceTarget = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr, Optional<float> finalOrient = {}) : _movementId(id), _destination(x, y, z), _speed(speed), i_faceTarget(faceTarget), i_spellEffectExtra(spellEffectExtraData), _generatePath(generatePath), _recalculateSpeed(false), _interrupt(false), _finalOrient(finalOrient) { }
- MovementGeneratorType GetMovementGeneratorType() const override { return POINT_MOTION_TYPE; }
+ MovementGeneratorType GetMovementGeneratorType() const override;
void DoInitialize(T*);
void DoFinalize(T*);
@@ -60,9 +62,9 @@ class PointMovementGenerator : public MovementGeneratorMedium< T, PointMovementG
class AssistanceMovementGenerator : public PointMovementGenerator<Creature>
{
public:
- AssistanceMovementGenerator(float x, float y, float z) : PointMovementGenerator<Creature>(0, x, y, z, true) { }
+ explicit AssistanceMovementGenerator(float x, float y, float z) : PointMovementGenerator<Creature>(0, x, y, z, true) { }
- MovementGeneratorType GetMovementGeneratorType() const override { return ASSISTANCE_MOTION_TYPE; }
+ MovementGeneratorType GetMovementGeneratorType() const override;
void Finalize(Unit*) override;
};
@@ -75,7 +77,7 @@ class EffectMovementGenerator : public MovementGenerator
void Finalize(Unit*) override;
void Reset(Unit*) override { }
bool Update(Unit*, uint32) override;
- MovementGeneratorType GetMovementGeneratorType() const override { return EFFECT_MOTION_TYPE; }
+ MovementGeneratorType GetMovementGeneratorType() const override;
private:
void MovementInform(Unit*);
diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
index 48f1c00c616..8c9844df6af 100644
--- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
@@ -18,20 +18,25 @@
#include "RandomMovementGenerator.h"
#include "Creature.h"
#include "Map.h"
+#include "MovementDefines.h"
#include "MoveSplineInit.h"
#include "MoveSpline.h"
#include "PathGenerator.h"
#include "Random.h"
template<class T>
-RandomMovementGenerator<T>::~RandomMovementGenerator() { }
+RandomMovementGenerator<T>::~RandomMovementGenerator() = default;
-template<>
-RandomMovementGenerator<Creature>::~RandomMovementGenerator()
+template RandomMovementGenerator<Creature>::~RandomMovementGenerator();
+
+template<class T>
+MovementGeneratorType RandomMovementGenerator<T>::GetMovementGeneratorType() const
{
- delete _path;
+ return RANDOM_MOTION_TYPE;
}
+template MovementGeneratorType RandomMovementGenerator<Creature>::GetMovementGeneratorType() const;
+
template<class T>
void RandomMovementGenerator<T>::DoInitialize(T*) { }
@@ -49,6 +54,7 @@ void RandomMovementGenerator<Creature>::DoInitialize(Creature* owner)
_wanderDistance = owner->GetRespawnRadius();
_timer.Reset(0);
+ _path = nullptr;
}
template<class T>
@@ -84,6 +90,7 @@ void RandomMovementGenerator<Creature>::SetRandomLocation(Creature* owner)
{
_interrupt = true;
owner->StopMoving();
+ _path = nullptr;
return;
}
@@ -97,9 +104,11 @@ void RandomMovementGenerator<Creature>::SetRandomLocation(Creature* owner)
uint32 resetTimer = roll_chance_i(50) ? urand(5000, 10000) : urand(1000, 2000);
if (!_path)
- _path = new PathGenerator(owner);
+ {
+ _path = std::make_unique<PathGenerator>(owner);
+ _path->SetPathLengthLimit(30.0f);
+ }
- _path->SetPathLengthLimit(30.0f);
bool result = _path->CalculatePath(position.GetPositionX(), position.GetPositionY(), position.GetPositionZ());
if (!result || (_path->GetPathType() & PATHFIND_NOPATH))
{
@@ -133,6 +142,7 @@ bool RandomMovementGenerator<Creature>::DoUpdate(Creature* owner, uint32 diff)
{
_interrupt = true;
owner->StopMoving();
+ _path = nullptr;
return true;
}
else
diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h
index c0716f4c247..1788161f70d 100644
--- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h
@@ -19,16 +19,20 @@
#define TRINITY_RANDOMMOTIONGENERATOR_H
#include "MovementGenerator.h"
+#include "Position.h"
#include "Timer.h"
+class PathGenerator;
+
template<class T>
class RandomMovementGenerator : public MovementGeneratorMedium< T, RandomMovementGenerator<T> >
{
public:
- explicit RandomMovementGenerator(float distance = 0.0f) : _path(nullptr), _timer(0), _reference(), _wanderDistance(distance), _interrupt(false) { }
+ explicit RandomMovementGenerator(float distance = 0.0f) : _timer(0), _reference(), _wanderDistance(distance), _interrupt(false) { }
~RandomMovementGenerator();
- MovementGeneratorType GetMovementGeneratorType() const override { return RANDOM_MOTION_TYPE; }
+ MovementGeneratorType GetMovementGeneratorType() const override;
+ void UnitSpeedChanged() override { } //TODO
void DoInitialize(T*);
void DoFinalize(T*);
@@ -38,7 +42,7 @@ class RandomMovementGenerator : public MovementGeneratorMedium< T, RandomMovemen
private:
void SetRandomLocation(T*);
- PathGenerator* _path;
+ std::unique_ptr<PathGenerator> _path;
TimeTracker _timer;
Position _reference;
float _wanderDistance;
diff --git a/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.cpp
index 6398a190c3f..476766aa1f6 100644
--- a/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.cpp
@@ -18,6 +18,8 @@
#include "SplineChainMovementGenerator.h"
#include "Creature.h"
#include "CreatureAI.h"
+#include "MotionMaster.h"
+#include "MovementDefines.h"
#include "MoveSplineInit.h"
#include "MoveSpline.h"
#include "Log.h"
@@ -132,6 +134,11 @@ bool SplineChainMovementGenerator::Update(Unit* me, uint32 diff)
return true;
}
+MovementGeneratorType SplineChainMovementGenerator::GetMovementGeneratorType() const
+{
+ return SPLINE_CHAIN_MOTION_TYPE;
+}
+
SplineChainResumeInfo SplineChainMovementGenerator::GetResumeInfo(Unit const* me) const
{
if (!_nextIndex)
@@ -148,11 +155,11 @@ SplineChainResumeInfo SplineChainMovementGenerator::GetResumeInfo(Unit const* me
/* static */ void SplineChainMovementGenerator::GetResumeInfo(Unit const* me, SplineChainResumeInfo& info)
{
- if (MovementGenerator const* activeGen = me->GetMotionMaster()->GetMotionSlot(MOTION_SLOT_ACTIVE))
+ if (MovementGenerator const* activeGenerator = me->GetMotionMaster()->GetMotionSlot(MOTION_SLOT_ACTIVE))
{
- if (activeGen->GetMovementGeneratorType() == SPLINE_CHAIN_MOTION_TYPE)
+ if (activeGenerator->GetMovementGeneratorType() == SPLINE_CHAIN_MOTION_TYPE)
{
- info = reinterpret_cast<SplineChainMovementGenerator const*>(activeGen)->GetResumeInfo(me);
+ info = reinterpret_cast<SplineChainMovementGenerator const*>(activeGenerator)->GetResumeInfo(me);
return;
}
}
diff --git a/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.h b/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.h
index 517415e017d..8abe8e81e48 100644
--- a/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.h
@@ -20,17 +20,22 @@
#include "SplineChain.h"
#include "MovementGenerator.h"
+#include <vector>
+
+class Unit;
class TC_GAME_API SplineChainMovementGenerator : public MovementGenerator
{
public:
explicit SplineChainMovementGenerator(uint32 id, std::vector<SplineChainLink> const& chain, bool walk = false) : _id(id), _chain(chain), _chainSize(chain.size()), _walk(walk), finished(false), _nextIndex(0), _nextFirstWP(0), _msToNext(0) { }
explicit SplineChainMovementGenerator(SplineChainResumeInfo const& info) : _id(info.PointID), _chain(*info.Chain), _chainSize(info.Chain->size()), _walk(info.IsWalkMode), finished(info.SplineIndex >= info.Chain->size()), _nextIndex(info.SplineIndex), _nextFirstWP(info.PointIndex), _msToNext(info.TimeToNext) { }
+
void Initialize(Unit* me) override;
void Finalize(Unit* me) override;
void Reset(Unit* /*me*/) override { };
bool Update(Unit* me, uint32 diff) override;
- MovementGeneratorType GetMovementGeneratorType() const override { return SPLINE_CHAIN_MOTION_TYPE; }
+ MovementGeneratorType GetMovementGeneratorType() const override;
+
// Builds info that can later be used to resume this spline chain movement at the current position
static void GetResumeInfo(Unit const* me, SplineChainResumeInfo& info);
// Leaving the object method public for people that know what they're doing to use
diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
index 9e6c33152ee..0017f89e9f8 100644
--- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
@@ -20,6 +20,7 @@
#include "CreatureAI.h"
#include "Log.h"
#include "Map.h"
+#include "MovementDefines.h"
#include "MoveSpline.h"
#include "MoveSplineInit.h"
#include "ObjectMgr.h"
@@ -37,9 +38,9 @@ WaypointMovementGenerator<Creature>::WaypointMovementGenerator(WaypointPath& pat
_path = &path;
}
-WaypointMovementGenerator<Creature>::~WaypointMovementGenerator()
+MovementGeneratorType WaypointMovementGenerator<Creature>::GetMovementGeneratorType() const
{
- _path = nullptr;
+ return WAYPOINT_MOTION_TYPE;
}
void WaypointMovementGenerator<Creature>::DoInitialize(Creature* creature)
@@ -261,7 +262,7 @@ bool WaypointMovementGenerator<Creature>::DoUpdate(Creature* creature, uint32 di
// check if there is a wait time for the next movement
if (!_nextMoveTime.Passed())
{
- // dont update wait timer while moving
+ // update timer since it's not moving
_nextMoveTime.Update(diff);
if (_nextMoveTime.Passed())
{
@@ -272,7 +273,7 @@ bool WaypointMovementGenerator<Creature>::DoUpdate(Creature* creature, uint32 di
else // if it's not moving and there is no timer, assume node is reached
{
OnArrived(creature); // hooks and wait timer reset (if necessary)
- _isArrivalDone = true; // signals that the next move will happen after reaching a node
+ _isArrivalDone = true; // signals to future StartMove that it reached a node
if (_nextMoveTime.Passed())
StartMove(creature); // check path status, get next point and move if necessary & can
diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h
index da1a5659f5c..1be8373cfd4 100755
--- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h
@@ -43,14 +43,14 @@ class WaypointMovementGenerator<Creature> : public MovementGeneratorMedium<Creat
explicit WaypointMovementGenerator(uint32 pathId = 0, bool repeating = true);
explicit WaypointMovementGenerator(WaypointPath& path, bool repeating = true);
- ~WaypointMovementGenerator();
+ ~WaypointMovementGenerator() { _path = nullptr; }
void DoInitialize(Creature*);
void DoFinalize(Creature*);
void DoReset(Creature*);
bool DoUpdate(Creature*, uint32 diff);
- MovementGeneratorType GetMovementGeneratorType() const override { return WAYPOINT_MOTION_TYPE; }
+ MovementGeneratorType GetMovementGeneratorType() const override;
void UnitSpeedChanged() override { _recalculateSpeed = true; }
void Pause(uint32 timer = 0) override;
void Resume(uint32 overrideTimer = 0) override;
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 2e5fadef27f..ffc895f159a 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -39,6 +39,8 @@
#include "MapManager.h"
#include "MiscPackets.h"
#include "MMapFactory.h"
+#include "MotionMaster.h"
+#include "MovementDefines.h"
#include "MovementGenerator.h"
#include "ObjectAccessor.h"
#include "ObjectMgr.h"
diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp
index 07d2e01b6d2..68a7d63ee6a 100644
--- a/src/server/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
@@ -32,6 +32,8 @@ EndScriptData */
#include "Language.h"
#include "Log.h"
#include "Map.h"
+#include "MotionMaster.h"
+#include "MovementDefines.h"
#include "ObjectAccessor.h"
#include "ObjectMgr.h"
#include "Pet.h"