diff options
-rw-r--r-- | src/game/MotionMaster.cpp | 43 | ||||
-rw-r--r-- | src/game/MotionMaster.h | 3 | ||||
-rw-r--r-- | src/game/Unit.cpp | 1 |
3 files changed, 23 insertions, 24 deletions
diff --git a/src/game/MotionMaster.cpp b/src/game/MotionMaster.cpp index 170a9b52211..95cedfef3c3 100644 --- a/src/game/MotionMaster.cpp +++ b/src/game/MotionMaster.cpp @@ -50,17 +50,20 @@ MotionMaster::Initialize() if(curr) DirectDelete(curr); } - // set new default movement generator + InitDefault(); +} + +// set new default movement generator +void MotionMaster::InitDefault() +{ if(i_owner->GetTypeId() == TYPEID_UNIT) { MovementGenerator* movement = FactorySelector::selectMovementGenerator((Creature*)i_owner); - push( movement == NULL ? &si_idleMovement : movement ); - InitTop(); + Mutate(movement == NULL ? &si_idleMovement : movement, MOTION_SLOT_IDLE); } else { - push(&si_idleMovement); - needInit[MOTION_SLOT_IDLE] = false; + Mutate(&si_idleMovement, MOTION_SLOT_IDLE); } } @@ -200,28 +203,22 @@ MotionMaster::MoveTargetedHome() Clear(false); - if(i_owner->GetTypeId()==TYPEID_UNIT && !((Creature*)i_owner)->GetCharmerOrOwnerGUID()) + if(Unit *target = i_owner->GetCharmerOrOwner()) { - DEBUG_LOG("Creature (Entry: %u GUID: %u) targeted home", i_owner->GetEntry(), i_owner->GetGUIDLow()); - Mutate(new HomeMovementGenerator<Creature>(), MOTION_SLOT_ACTIVE); + DEBUG_LOG("Pet or controlled unit (Entry: %u GUID: %u) targeting home", + i_owner->GetEntry(), i_owner->GetGUIDLow() ); + + MoveFollow(i_owner, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE, MOTION_SLOT_IDLE); } - else if(i_owner->GetTypeId()==TYPEID_UNIT && ((Creature*)i_owner)->GetCharmerOrOwnerGUID()) + else if(i_owner->GetTypeId() == TYPEID_UNIT) { - DEBUG_LOG("Pet or controlled creature (Entry: %u GUID: %u) targeting home", - i_owner->GetEntry(), i_owner->GetGUIDLow() ); - Unit *target = ((Creature*)i_owner)->GetCharmerOrOwner(); - if(target) - { - i_owner->addUnitState(UNIT_STAT_FOLLOW); - DEBUG_LOG("Following %s (GUID: %u)", - target->GetTypeId()==TYPEID_PLAYER ? "player" : "creature", - target->GetTypeId()==TYPEID_PLAYER ? target->GetGUIDLow() : ((Creature*)target)->GetDBTableGUIDLow() ); - Mutate(new TargetedMovementGenerator<Creature>(*target,PET_FOLLOW_DIST,PET_FOLLOW_ANGLE), MOTION_SLOT_ACTIVE); - } + DEBUG_LOG("Creature (Entry: %u GUID: %u) targeted home", i_owner->GetEntry(), i_owner->GetGUIDLow()); + Mutate(new HomeMovementGenerator<Creature>(), MOTION_SLOT_ACTIVE); } else { sLog.outError("Player (GUID: %u) attempt targeted home", i_owner->GetGUIDLow() ); + return; } } @@ -268,7 +265,7 @@ MotionMaster::MoveChase(Unit* target, float dist, float angle) } void -MotionMaster::MoveFollow(Unit* target, float dist, float angle) +MotionMaster::MoveFollow(Unit* target, float dist, float angle, MovementSlot slot) { // ignore movement request if target not exist if(!target) @@ -280,7 +277,7 @@ MotionMaster::MoveFollow(Unit* target, float dist, float angle) DEBUG_LOG("Player (GUID: %u) follow to %s (GUID: %u)", i_owner->GetGUIDLow(), target->GetTypeId()==TYPEID_PLAYER ? "player" : "creature", target->GetTypeId()==TYPEID_PLAYER ? i_owner->GetGUIDLow() : ((Creature*)i_owner)->GetDBTableGUIDLow() ); - Mutate(new TargetedMovementGenerator<Player>(*target,dist,angle), MOTION_SLOT_ACTIVE); + Mutate(new TargetedMovementGenerator<Player>(*target,dist,angle), slot); } else { @@ -288,7 +285,7 @@ MotionMaster::MoveFollow(Unit* target, float dist, float angle) i_owner->GetEntry(), i_owner->GetGUIDLow(), target->GetTypeId()==TYPEID_PLAYER ? "player" : "creature", target->GetTypeId()==TYPEID_PLAYER ? target->GetGUIDLow() : ((Creature*)target)->GetDBTableGUIDLow() ); - Mutate(new TargetedMovementGenerator<Creature>(*target,dist,angle), MOTION_SLOT_ACTIVE); + Mutate(new TargetedMovementGenerator<Creature>(*target,dist,angle), slot); } } diff --git a/src/game/MotionMaster.h b/src/game/MotionMaster.h index d68a94b7a1f..7b26e4294e6 100644 --- a/src/game/MotionMaster.h +++ b/src/game/MotionMaster.h @@ -92,6 +92,7 @@ class TRINITY_DLL_SPEC MotionMaster //: private std::stack<MovementGenerator *> ~MotionMaster(); void Initialize(); + void InitDefault(); int size() const { return i_top + 1; } _Ty top() const { return Impl[i_top]; } @@ -131,7 +132,7 @@ class TRINITY_DLL_SPEC MotionMaster //: private std::stack<MovementGenerator *> void MoveIdle(MovementSlot slot = MOTION_SLOT_ACTIVE); void MoveTargetedHome(); void MoveRandom(float spawndist = 0.0f); - void MoveFollow(Unit* target, float dist, float angle); + void MoveFollow(Unit* target, float dist, float angle, MovementSlot slot = MOTION_SLOT_ACTIVE); void MoveChase(Unit* target, float dist = 0.0f, float angle = 0.0f); void MoveConfused(); void MoveFleeing(Unit* enemy); diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 5b8eac9bf59..09557e93108 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -13111,6 +13111,7 @@ void Unit::RemoveCharmedOrPossessedBy(Unit *charmer) DeleteThreatList(); SetCharmerGUID(0); RestoreFaction(); + GetMotionMaster()->InitDefault(); if(possess) { |