diff options
| author | ccrs <ccrs@users.noreply.github.com> | 2017-11-06 22:19:23 +0100 |
|---|---|---|
| committer | funjoker <funjoker109@gmail.com> | 2021-01-29 19:23:53 +0100 |
| commit | bf12bae46746149d870cd3e52ccd610f0a975047 (patch) | |
| tree | 57b5f138b6d5dbefa8ec96aa14dbba150a1d0979 /src/server/game/Entities | |
| parent | 69d6b4241d8d9c49c135aec3a50fdafcca250a5f (diff) | |
Core/Misc: waypoint movement
- Creature: update current waypoint to store nodeId and pathId
- MotionMaster: change variable type on GetMotionSlotType and GetMotionSlot to keep consistency and prevent errors (ASSERT is now no longer needed)
- UnitAI: add new waypoint hooks WaypointPathStarted and WaypointPathEnded
- SAI: handle WAYPOINT related events if creature is no escorting
* SMART_EVENT_WAYPOINT_RESUMED still not implemented for no escorting
TODO: the new hooks can save, now duplicated, logic on EscortAI and SAI
closes #20777
updates #20310
updates 21bd52cb99
(cherry picked from commit e10d7dd45cfc073c791cd5e5f3f964d14b37df3d)
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 15 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/CreatureGroups.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 9 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 2 |
5 files changed, 18 insertions, 16 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index ccb0e3dcbe3..bb9ed8527eb 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -284,7 +284,7 @@ bool ForcedDespawnDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) Creature::Creature(bool isWorldObject): Unit(isWorldObject), MapObject(), m_groupLootTimer(0), m_PlayerDamageReq(0), _pickpocketLootRestore(0), m_corpseRemoveTime(0), m_respawnTime(0), m_respawnDelay(300), m_corpseDelay(60), m_respawnradius(0.0f), m_boundaryCheckTime(2500), m_combatPulseTime(0), m_combatPulseDelay(0), m_reactState(REACT_AGGRESSIVE), m_defaultMovementType(IDLE_MOTION_TYPE), m_spawnId(UI64LIT(0)), m_equipmentId(0), m_originalEquipmentId(0), m_AlreadyCallAssistance(false), m_AlreadySearchedAssistance(false), m_cannotReachTarget(false), m_cannotReachTimer(0), - m_AI_locked(false), m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL), m_originalEntry(0), m_homePosition(), m_transportHomePosition(), m_creatureInfo(nullptr), m_creatureData(nullptr), m_waypointID(0), m_path_id(0), + m_AI_locked(false), m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL), m_originalEntry(0), m_homePosition(), m_transportHomePosition(), m_creatureInfo(nullptr), m_creatureData(nullptr), _waypointPathId(0), _currentWaypointNodeInfo(0, 0), m_formation(nullptr), m_triggerJustAppeared(true), m_respawnCompatibilityMode(false), m_focusSpell(nullptr), m_focusDelay(0), m_shouldReacquireTarget(false), m_suppressedOrientation(0.0f), _lastDamagedTime(0), _regenerateHealth(true), _regenerateHealthLock(false) { @@ -2675,9 +2675,9 @@ bool Creature::LoadCreaturesAddon() if (cainfo->visibilityDistanceType != VisibilityDistanceType::Normal) SetVisibilityDistanceOverride(cainfo->visibilityDistanceType); - //Load Path + // Load Path if (cainfo->path_id != 0) - m_path_id = cainfo->path_id; + _waypointPathId = cainfo->path_id; if (!cainfo->auras.empty()) { diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 853039a20e8..e98a740a398 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -290,11 +290,12 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma void GetTransportHomePosition(float& x, float& y, float& z, float& ori) const { m_transportHomePosition.GetPosition(x, y, z, ori); } Position const& GetTransportHomePosition() const { return m_transportHomePosition; } - uint32 GetWaypointPath() const { return m_path_id; } - void LoadPath(uint32 pathid) { m_path_id = pathid; } + uint32 GetWaypointPath() const { return _waypointPathId; } + void LoadPath(uint32 pathid) { _waypointPathId = pathid; } - uint32 GetCurrentWaypointID() const { return m_waypointID; } - void UpdateWaypointID(uint32 wpID) { m_waypointID = wpID; } + // nodeId, pathId + std::pair<uint32, uint32> GetCurrentWaypointInfo() const { return _currentWaypointNodeInfo; } + void UpdateCurrentWaypointInfo(uint32 nodeId, uint32 pathId) { _currentWaypointNodeInfo = { nodeId, pathId }; } bool IsReturningHome() const; @@ -405,9 +406,9 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma void ForcedDespawn(uint32 timeMSToDespawn = 0, Seconds const& forceRespawnTimer = Seconds(0)); bool CheckNoGrayAggroConfig(uint32 playerLevel, uint32 creatureLevel) const; // No aggro from gray creatures - //WaypointMovementGenerator vars - uint32 m_waypointID; - uint32 m_path_id; + // Waypoint path + uint32 _waypointPathId; + std::pair<uint32/*nodeId*/, uint32/*pathId*/> _currentWaypointNodeInfo; //Formation var CreatureGroup* m_formation; diff --git a/src/server/game/Entities/Creature/CreatureGroups.cpp b/src/server/game/Entities/Creature/CreatureGroups.cpp index ed9dce1cb9b..3f6cbd9279c 100644 --- a/src/server/game/Entities/Creature/CreatureGroups.cpp +++ b/src/server/game/Entities/Creature/CreatureGroups.cpp @@ -235,7 +235,7 @@ void CreatureGroup::LeaderMoveTo(Position const& destination, uint32 id /*= 0*/, continue; if (itr->second->point_1) - if (m_leader->GetCurrentWaypointID() == itr->second->point_1 - 1 || m_leader->GetCurrentWaypointID() == itr->second->point_2 - 1) + if (m_leader->GetCurrentWaypointInfo().first == itr->second->point_1 || m_leader->GetCurrentWaypointInfo().first == itr->second->point_2) itr->second->follow_angle = float(M_PI) * 2 - itr->second->follow_angle; float angle = itr->second->follow_angle; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index cfc05a31f23..2e3c994863a 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -10727,15 +10727,16 @@ void Unit::StopMoving() init.Stop(); } -void Unit::PauseMovement(uint32 timer/* = 0*/, uint8 slot/* = 0*/) +void Unit::PauseMovement(uint32 timer/* = 0*/, uint8 slot/* = 0*/, bool forced/* = true*/) { if (slot >= MAX_MOTION_SLOT) return; - if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot)) + if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(MovementSlot(slot))) movementGenerator->Pause(timer); - StopMoving(); + if (forced) + StopMoving(); } void Unit::ResumeMovement(uint32 timer/* = 0*/, uint8 slot/* = 0*/) @@ -10743,7 +10744,7 @@ void Unit::ResumeMovement(uint32 timer/* = 0*/, uint8 slot/* = 0*/) if (slot >= MAX_MOTION_SLOT) return; - if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot)) + if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(MovementSlot(slot))) movementGenerator->Resume(timer); } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index f0e79c36768..bc49df35ca9 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1913,7 +1913,7 @@ class TC_GAME_API Unit : public WorldObject bool IsStopped() const { return !(HasUnitState(UNIT_STATE_MOVING)); } void StopMoving(); - void PauseMovement(uint32 timer = 0, uint8 slot = 0); // timer in ms + void PauseMovement(uint32 timer = 0, uint8 slot = 0, bool forced = true); // timer in ms void ResumeMovement(uint32 timer = 0, uint8 slot = 0); // timer in ms void AddUnitMovementFlag(uint32 f) { m_movementInfo.AddMovementFlag(f); } |
