diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index df43032ffb8..a19f0bba733 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -144,6 +144,7 @@ void SmartAI::PausePath(uint32 delay, bool forced) _waypointPauseForced = forced; SetRun(mRun); me->PauseMovement(); + me->SetHomePosition(me->GetPosition()); } else _waypointReached = false; @@ -407,6 +408,7 @@ void SmartAI::WaypointReached(uint32 nodeId, uint32 pathId) { _waypointReached = true; me->PauseMovement(); + me->SetHomePosition(me->GetPosition()); } else if (HasEscortState(SMART_ESCORT_ESCORTING) && me->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) { diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index b75c32f1e3d..630316ef4f9 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -268,13 +268,6 @@ void Creature::DisappearAndDie() RemoveCorpse(false); } -void Creature::PauseMovement(uint32 timer/* = 0*/, uint8 slot/* = 0*/) -{ - Unit::PauseMovement(timer, slot); - - SetHomePosition(GetPosition()); -} - bool Creature::IsReturningHome() const { if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_ACTIVE) == HOME_MOTION_TYPE) diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 009bb13bd5c..236f8bcfe2a 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -292,7 +292,6 @@ class TC_GAME_API Creature : public Unit, public GridObject, public Ma uint32 GetCurrentWaypointID() const { return m_waypointID; } void UpdateWaypointID(uint32 wpID) { m_waypointID = wpID; } - void PauseMovement(uint32 timer = 0, uint8 slot = 0) override; // timer in ms bool IsReturningHome() const; void SearchFormation(); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index db56c2e8463..1727bbb87c5 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1771,8 +1771,8 @@ class TC_GAME_API Unit : public WorldObject bool IsStopped() const { return !(HasUnitState(UNIT_STATE_MOVING)); } void StopMoving(); - virtual void PauseMovement(uint32 timer = 0, uint8 slot = 0); // timer in ms - void ResumeMovement(uint32 timer = 0, uint8 slot = 0); + void PauseMovement(uint32 timer = 0, uint8 slot = 0); // timer in ms + void ResumeMovement(uint32 timer = 0, uint8 slot = 0); // timer in ms void AddUnitMovementFlag(uint32 f) { m_movementInfo.AddMovementFlag(f); } void RemoveUnitMovementFlag(uint32 f) { m_movementInfo.RemoveMovementFlag(f); } diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index a13fecb02cb..ed39ba64797 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -55,6 +55,7 @@ void WorldSession::HandleBattlemasterHelloOpcode(WorldPacket& recvData) // Stop the npc if moving unit->PauseMovement(sWorld->getIntConfig(CONFIG_CREATURE_STOP_FOR_PLAYER)); + unit->SetHomePosition(unit->GetPosition()); BattlegroundTypeId bgTypeId = sBattlegroundMgr->GetBattleMasterBG(unit->GetEntry()); diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 273fa44c551..3974b59db07 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -613,6 +613,7 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid) // Stop the npc if moving vendor->PauseMovement(sWorld->getIntConfig(CONFIG_CREATURE_STOP_FOR_PLAYER)); + vendor->SetHomePosition(vendor->GetPosition()); VendorItemData const* vendorItems = vendor->GetVendorItems(); uint32 rawItemCount = vendorItems ? vendorItems->GetItemCount() : 0; diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index 3fb8e403dbb..708827b6181 100644 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -344,6 +344,7 @@ void WorldSession::HandleGossipHelloOpcode(WorldPacket& recvData) // Stop the npc if moving unit->PauseMovement(sWorld->getIntConfig(CONFIG_CREATURE_STOP_FOR_PLAYER)); + unit->SetHomePosition(unit->GetPosition()); // If spiritguide, no need for gossip menu, just put player into resurrect queue if (unit->IsSpiritGuide()) diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 05b03881909..92be488d5b5 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -93,6 +93,7 @@ void WorldSession::HandleQuestgiverHelloOpcode(WorldPacket& recvData) // Stop the npc if moving creature->PauseMovement(sWorld->getIntConfig(CONFIG_CREATURE_STOP_FOR_PLAYER)); + creature->SetHomePosition(creature->GetPosition()); _player->PlayerTalkClass->ClearMenus(); if (creature->AI()->GossipHello(_player)) diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index ff9a48ae7eb..aed99b25ee1 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -73,7 +73,7 @@ void MotionMaster::Initialize() // clear ALL movement generators (including default) while (!empty()) { - MovementGenerator *curr = top(); + MovementGenerator* curr = top(); pop(); if (curr) DirectDelete(curr); @@ -862,7 +862,7 @@ void MotionMaster::DirectDelete(MovementGenerator* curr) void MotionMaster::DelayedDelete(MovementGenerator* curr) { - TC_LOG_FATAL("misc", "Unit (Entry %u) is trying to delete its updating Movement Generator (Type %u)!", _owner->GetEntry(), curr->GetMovementGeneratorType()); + TC_LOG_DEBUG("misc", "MotionMaster::DelayedDelete: unit (%u) delayed deleting movement generator (type %u)", _owner->GetEntry(), curr->GetMovementGeneratorType()); if (IsStatic(curr)) return; diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index 9bc5b7d5891..d8b0ed91a17 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -31,16 +31,15 @@ #include "WaypointManager.h" #include "World.h" -WaypointMovementGenerator::WaypointMovementGenerator(WaypointPath& path, bool repeating) +WaypointMovementGenerator::WaypointMovementGenerator(uint32 pathId, bool repeating) : _nextMoveTime(0), _recalculateSpeed(false), _isArrivalDone(false), _pathId(pathId), +_repeating(repeating), _loadedFromDB(true), _stalled(false), _done(false) +{ +} + +WaypointMovementGenerator::WaypointMovementGenerator(WaypointPath& path, bool repeating) : _nextMoveTime(0), _recalculateSpeed(false), _isArrivalDone(false), _pathId(0), +_repeating(repeating), _loadedFromDB(false), _stalled(false), _done(false) { _path = &path; - _nextMoveTime = 0; - _recalculateSpeed = false; - _isArrivalDone = false; - _pathId = 0; - _repeating = repeating; - _loadedFromDB = false; - _stalled = false; } void WaypointMovementGenerator::LoadPath(Creature* creature) @@ -60,14 +59,12 @@ void WaypointMovementGenerator::LoadPath(Creature* creature) return; } - _nextMoveTime.Reset(3000); - - if (CanMove(creature)) - StartMoveNow(creature); + _nextMoveTime.Reset(1000); } void WaypointMovementGenerator::DoInitialize(Creature* creature) { + _done = false; LoadPath(creature); } @@ -79,8 +76,14 @@ void WaypointMovementGenerator::DoFinalize(Creature* creature) void WaypointMovementGenerator::DoReset(Creature* creature) { - if (CanMove(creature)) + if (!_done && CanMove(creature)) StartMoveNow(creature); + else if (_done) + { + // mimic IdleMovementGenerator + if (!creature->IsStopped()) + creature->StopMoving(); + } } void WaypointMovementGenerator::OnArrived(Creature* creature) @@ -117,10 +120,10 @@ void WaypointMovementGenerator::OnArrived(Creature* creature) bool WaypointMovementGenerator::StartMove(Creature* creature) { if (!creature || !creature->IsAlive()) - return false; + return true; - if (!_path || _path->nodes.empty()) - return false; + if (_done || !_path || _path->nodes.empty()) + return true; // if the owner is the leader of its formation, check members status if (creature->IsFormationLeader() && !creature->IsFormationLeaderMoveAllowed()) @@ -157,7 +160,8 @@ bool WaypointMovementGenerator::StartMove(Creature* creature) transportPath = false; // else if (vehicle) - this should never happen, vehicle offsets are const } - return false; + _done = true; + return true; } _currentNode = (_currentNode + 1) % _path->nodes.size(); @@ -229,7 +233,10 @@ bool WaypointMovementGenerator::StartMove(Creature* creature) bool WaypointMovementGenerator::DoUpdate(Creature* creature, uint32 diff) { if (!creature || !creature->IsAlive()) - return false; + return true; + + if (_done || !_path || _path->nodes.empty()) + return true; if (_stalled || creature->HasUnitState(UNIT_STATE_NOT_MOVE) || creature->IsMovementPreventedByCasting()) { @@ -237,10 +244,6 @@ bool WaypointMovementGenerator::DoUpdate(Creature* creature, uint32 di return true; } - // prevent a crash at empty waypoint path. - if (!_path || _path->nodes.empty()) - return false; - if (!_nextMoveTime.Passed()) { _nextMoveTime.Update(diff); @@ -267,7 +270,7 @@ bool WaypointMovementGenerator::DoUpdate(Creature* creature, uint32 di StartMove(creature); } } - return true; + return true; } void WaypointMovementGenerator::MovementInform(Creature* creature) @@ -315,7 +318,14 @@ bool WaypointMovementGenerator::CanMove(Creature* creature) #define SKIP_SPLINE_POINT_DISTANCE_SQ (40.f * 40.f) #define PLAYER_FLIGHT_SPEED 32.0f -//----------------------------------------------------// +FlightPathMovementGenerator::FlightPathMovementGenerator(uint32 startNode) +{ + _currentNode = startNode; + _endGridX = 0.0f; + _endGridY = 0.0f; + _endMapId = 0; + _preloadTargetNode = 0; +} uint32 FlightPathMovementGenerator::GetPathAtMapEnd() const { diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h index 5acb5b2827e..c5ec6d81e43 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h @@ -55,7 +55,7 @@ template<> class WaypointMovementGenerator : public MovementGeneratorMedium>, public PathMovementBase { public: - explicit WaypointMovementGenerator(uint32 pathId = 0, bool repeating = true) : _nextMoveTime(0), _recalculateSpeed(false), _isArrivalDone(false), _pathId(pathId), _repeating(repeating), _loadedFromDB(true), _stalled(false) { } + explicit WaypointMovementGenerator(uint32 pathId = 0, bool repeating = true); explicit WaypointMovementGenerator(WaypointPath& path, bool repeating = true); ~WaypointMovementGenerator() { _path = nullptr; } @@ -92,6 +92,7 @@ class WaypointMovementGenerator : public MovementGeneratorMedium : public MovementGeneratorMedium, public PathMovementBase { public: - explicit FlightPathMovementGenerator(uint32 startNode = 0) - { - _currentNode = startNode; - _endGridX = 0.0f; - _endGridY = 0.0f; - _endMapId = 0; - _preloadTargetNode = 0; - } + explicit FlightPathMovementGenerator(uint32 startNode = 0); + void LoadPath(Player* player); void DoInitialize(Player*); void DoReset(Player*); diff --git a/src/server/game/Movement/Waypoints/WaypointManager.cpp b/src/server/game/Movement/Waypoints/WaypointManager.cpp index 11b145e988c..b2b6291c410 100644 --- a/src/server/game/Movement/Waypoints/WaypointManager.cpp +++ b/src/server/game/Movement/Waypoints/WaypointManager.cpp @@ -31,7 +31,7 @@ void WaypointMgr::Load() if (!result) { - TC_LOG_ERROR("server.loading", ">> Loaded 0 waypoints. DB table `waypoint_data` is empty!"); + TC_LOG_INFO("server.loading", ">> Loaded 0 waypoints. DB table `waypoint_data` is empty!"); return; } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp index a46917d4648..20275ddfb3f 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp @@ -578,11 +578,10 @@ struct npc_raz_the_crazed : public EscortAI SetCombatMovement(false); } - void EnterEvadeMode(EvadeReason /*why*/) override + void EnterEvadeMode(EvadeReason why) override { - me->DeleteThreatList(); - me->CombatStop(true); - ReturnToLastPoint(); + EscortAI::EnterEvadeMode(why); + DoCastSelf(SPELL_AGGRO_NEARBY_TARGETS, true); } void JustAppeared() override