diff options
author | ccrs <ccrs@users.noreply.github.com> | 2018-04-19 13:31:39 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-09-26 01:22:17 +0200 |
commit | 4793b073eec2af32622ff703911721100730e868 (patch) | |
tree | 80a8505e660ae22c043856335a454ca0df2aff8e | |
parent | 763459ada731d31c75c2bd436e486d6cf033a6d3 (diff) |
Core/Misc: movement header cleanup
(cherry picked from commit f9914caefc59f36ab7583432442a26b29124b7f1)
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" |