*Set default movement as follow movement for charmed/pet when enterevademode.
--HG-- branch : trunk
This commit is contained in:
+20
-23
@@ -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("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)
|
||||
{
|
||||
DEBUG_LOG("Creature (Entry: %u GUID: %u) targeted home", i_owner->GetEntry(), i_owner->GetGUIDLow());
|
||||
Mutate(new HomeMovementGenerator<Creature>(), MOTION_SLOT_ACTIVE);
|
||||
}
|
||||
else if(i_owner->GetTypeId()==TYPEID_UNIT && ((Creature*)i_owner)->GetCharmerOrOwnerGUID())
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -13111,6 +13111,7 @@ void Unit::RemoveCharmedOrPossessedBy(Unit *charmer)
|
||||
DeleteThreatList();
|
||||
SetCharmerGUID(0);
|
||||
RestoreFaction();
|
||||
GetMotionMaster()->InitDefault();
|
||||
|
||||
if(possess)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user