diff options
Diffstat (limited to 'src/server/game/Movement/MotionMaster.cpp')
-rw-r--r-- | src/server/game/Movement/MotionMaster.cpp | 67 |
1 files changed, 43 insertions, 24 deletions
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 62396a0a315..a13785dbd00 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -17,29 +17,31 @@ */ #include "MotionMaster.h" -#include "ChaseMovementGenerator.h" -#include "ConfusedMovementGenerator.h" #include "Creature.h" #include "CreatureAISelector.h" #include "DBCStores.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 "Player.h" -#include "PointMovementGenerator.h" -#include "RandomMovementGenerator.h" #include "ScriptSystem.h" -#include "SplineChainMovementGenerator.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 "SplineChainMovementGenerator.h" #include "WaypointMovementGenerator.h" inline MovementGenerator* GetIdleMovementGenerator() @@ -70,6 +72,13 @@ MotionMaster::~MotionMaster() } } +MovementGenerator* MotionMaster::top() const +{ + ASSERT(!empty()); + + return _slot[_top]; +} + void MotionMaster::Initialize() { // clear ALL movement generators (including default) @@ -97,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(); @@ -112,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 @@ -129,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); @@ -137,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 @@ -308,6 +317,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) @@ -444,6 +458,11 @@ 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*/) +{ + MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), speedXY, speedZ, id, hasOrientation); +} + void MotionMaster::MoveJump(float x, float y, float z, float o, float speedXY, float speedZ, uint32 id, bool hasOrientation /* = false*/) { TC_LOG_DEBUG("misc", "Unit (GUID: %u) jumps to point (X: %f Y: %f Z: %f).", _owner->GetGUID().GetCounter(), x, y, z); @@ -725,7 +744,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); @@ -865,8 +884,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; } |