diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 6c5a8fe281..38afb0315a 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -9236,22 +9236,27 @@ void Unit::FollowTarget(Unit* target) void Unit::RemoveFormationFollower(Unit* follower) { - for (FormationFollowerContainer::const_iterator itr = _formationFollowers.begin(); itr != _formationFollowers.end();) + for (FormationFollowerGUIDContainer::const_iterator itr = _formationFollowers.begin(); itr != _formationFollowers.end();) { - Unit* follwingUnit = *itr; - // Cleaning up dead references while at it - if (!follwingUnit || follwingUnit == follower) - itr = _formationFollowers.erase(itr); + ObjectGuid guid = *itr; + if (Unit* followingUnit = ObjectAccessor::GetUnit(*this, guid)) + { + if (followingUnit == follower) + itr = _formationFollowers.erase(itr); + else + ++itr; + } else - ++itr; + itr = _formationFollowers.erase(itr); } } bool Unit::HasFormationFollower(Unit* follower) const { - for (Unit* followingUnit : _formationFollowers) - if (followingUnit == follower) - return true; + for (ObjectGuid guid : _formationFollowers) + if (Unit* followingUnit = ObjectAccessor::GetUnit(*this, guid)) + if (followingUnit == follower) + return true; return false; } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index a556dc2bed..17cd1eb806 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -973,7 +973,7 @@ class TC_GAME_API Unit : public WorldObject typedef std::list AuraApplicationList; typedef std::vector> AuraApplicationProcContainer; - typedef std::vector FormationFollowerContainer; + typedef std::vector FormationFollowerGUIDContainer; typedef std::map VisibleAuraMap; @@ -1787,8 +1787,8 @@ class TC_GAME_API Unit : public WorldObject // Makes the unit follow the given target. Use this function above using the MotionMaster::MoveFollow for default follow behaivior. void FollowTarget(Unit* target); - FormationFollowerContainer GetFormationFollowers() { return _formationFollowers; } - void AddFormationFollower(Unit* follower) { _formationFollowers.push_back(follower); } + FormationFollowerGUIDContainer GetFormationFollowers() { return _formationFollowers; } + void AddFormationFollower(Unit* follower) { _formationFollowers.push_back(follower->GetGUID()); } void RemoveFormationFollower(Unit* follower); bool HasFormationFollower(Unit* follower) const; @@ -2064,7 +2064,7 @@ class TC_GAME_API Unit : public WorldObject PositionUpdateInfo _positionUpdateInfo; - FormationFollowerContainer _formationFollowers; + FormationFollowerGUIDContainer _formationFollowers; }; namespace Trinity diff --git a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp index 597fb610cf..ceed4743f5 100644 --- a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp @@ -274,19 +274,22 @@ bool FollowMovementGenerator::Update(Unit* owner, uint32 diff) void FollowMovementGenerator::UpdateFollowFormation() { uint8 followSlot = 0; - for (Unit* follower : _target->GetFormationFollowers()) + for (ObjectGuid guid : _target->GetFormationFollowers()) { - for (uint8 slot = MOTION_SLOT_IDLE; slot < MAX_MOTION_SLOT; ++slot) + if (Unit* follower = ObjectAccessor::GetUnit(*_target, guid)) { - MovementGenerator* moveGen = follower->GetMotionMaster()->GetMotionSlot(MovementSlot(slot)); - if (!moveGen || moveGen->GetMovementGeneratorType() != FOLLOW_MOTION_TYPE) - continue; + for (uint8 slot = MOTION_SLOT_IDLE; slot < MAX_MOTION_SLOT; ++slot) + { + MovementGenerator* moveGen = follower->GetMotionMaster()->GetMotionSlot(MovementSlot(slot)); + if (!moveGen || moveGen->GetMovementGeneratorType() != FOLLOW_MOTION_TYPE) + continue; - if (FollowMovementGenerator* followMoveGen = static_cast(moveGen)) - followMoveGen->UpdateFormationFollowOffsets(followSlot); + if (FollowMovementGenerator* followMoveGen = static_cast(moveGen)) + followMoveGen->UpdateFormationFollowOffsets(followSlot); + } + + ++followSlot; } - - ++followSlot; } }