*Prevent MoveFollow and MoveChase while UNIT_FLAG_DISABLE_MOVE is present, by Liberate. Closes #168.
*Some cleanup, and fix typo from cf0046bc32c6. --HG-- branch : trunk
This commit is contained in:
+32
-31
@@ -81,7 +81,7 @@ MotionMaster::~MotionMaster()
|
|||||||
void
|
void
|
||||||
MotionMaster::UpdateMotion(uint32 diff)
|
MotionMaster::UpdateMotion(uint32 diff)
|
||||||
{
|
{
|
||||||
if( i_owner->hasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED) ) // what about UNIT_STAT_DISTRACTED? Why is this not included?
|
if (i_owner->hasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED)) // what about UNIT_STAT_DISTRACTED? Why is this not included?
|
||||||
return;
|
return;
|
||||||
assert( !empty() );
|
assert( !empty() );
|
||||||
m_cleanFlag |= MMCF_UPDATE;
|
m_cleanFlag |= MMCF_UPDATE;
|
||||||
@@ -104,9 +104,9 @@ MotionMaster::UpdateMotion(uint32 diff)
|
|||||||
delete m_expList;
|
delete m_expList;
|
||||||
m_expList = NULL;
|
m_expList = NULL;
|
||||||
|
|
||||||
if(empty())
|
if (empty())
|
||||||
Initialize();
|
Initialize();
|
||||||
else if(needInitTop())
|
else if (needInitTop())
|
||||||
InitTop();
|
InitTop();
|
||||||
else if (m_cleanFlag & MMCF_RESET)
|
else if (m_cleanFlag & MMCF_RESET)
|
||||||
top()->Reset(*i_owner);
|
top()->Reset(*i_owner);
|
||||||
@@ -118,79 +118,80 @@ MotionMaster::UpdateMotion(uint32 diff)
|
|||||||
void
|
void
|
||||||
MotionMaster::DirectClean(bool reset)
|
MotionMaster::DirectClean(bool reset)
|
||||||
{
|
{
|
||||||
while(size() > 1)
|
while (size() > 1)
|
||||||
{
|
{
|
||||||
MovementGenerator *curr = top();
|
MovementGenerator *curr = top();
|
||||||
pop();
|
pop();
|
||||||
if(curr) DirectDelete(curr);
|
if(curr) DirectDelete(curr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(needInitTop())
|
if (needInitTop())
|
||||||
InitTop();
|
InitTop();
|
||||||
else if(reset)
|
else if (reset)
|
||||||
top()->Reset(*i_owner);
|
top()->Reset(*i_owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MotionMaster::DelayedClean()
|
MotionMaster::DelayedClean()
|
||||||
{
|
{
|
||||||
while(size() > 1)
|
while (size() > 1)
|
||||||
{
|
{
|
||||||
MovementGenerator *curr = top();
|
MovementGenerator *curr = top();
|
||||||
pop();
|
pop();
|
||||||
if(curr) DelayedDelete(curr);
|
if (curr)
|
||||||
|
DelayedDelete(curr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MotionMaster::DirectExpire(bool reset)
|
MotionMaster::DirectExpire(bool reset)
|
||||||
{
|
{
|
||||||
if(size() > 1 )
|
if (size() > 1)
|
||||||
{
|
{
|
||||||
MovementGenerator *curr = top();
|
MovementGenerator *curr = top();
|
||||||
pop();
|
pop();
|
||||||
DirectDelete(curr);
|
DirectDelete(curr);
|
||||||
}
|
}
|
||||||
|
|
||||||
while(!top())
|
while (!top())
|
||||||
--i_top;
|
--i_top;
|
||||||
|
|
||||||
if(empty())
|
if (empty())
|
||||||
Initialize();
|
Initialize();
|
||||||
else if(needInitTop())
|
else if (needInitTop())
|
||||||
InitTop();
|
InitTop();
|
||||||
else if(reset)
|
else if (reset)
|
||||||
top()->Reset(*i_owner);
|
top()->Reset(*i_owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MotionMaster::DelayedExpire()
|
MotionMaster::DelayedExpire()
|
||||||
{
|
{
|
||||||
if(size() > 1 )
|
if (size() > 1)
|
||||||
{
|
{
|
||||||
MovementGenerator *curr = top();
|
MovementGenerator *curr = top();
|
||||||
pop();
|
pop();
|
||||||
DelayedDelete(curr);
|
DelayedDelete(curr);
|
||||||
}
|
}
|
||||||
|
|
||||||
while(!top())
|
while (!top())
|
||||||
--i_top;
|
--i_top;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MotionMaster::MoveIdle(MovementSlot slot)
|
void MotionMaster::MoveIdle(MovementSlot slot)
|
||||||
{
|
{
|
||||||
//if( empty() || !isStatic( top() ) )
|
//if (empty() || !isStatic(top()))
|
||||||
// push( &si_idleMovement );
|
// push(&si_idleMovement);
|
||||||
if(!isStatic(Impl[slot]))
|
if (!isStatic(Impl[slot]))
|
||||||
Mutate(&si_idleMovement, slot);
|
Mutate(&si_idleMovement, slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MotionMaster::MoveRandom(float spawndist)
|
MotionMaster::MoveRandom(float spawndist)
|
||||||
{
|
{
|
||||||
if(i_owner->GetTypeId()==TYPEID_UNIT)
|
if (i_owner->GetTypeId() == TYPEID_UNIT)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("Creature (GUID: %u) start moving random", i_owner->GetGUIDLow() );
|
DEBUG_LOG("Creature (GUID: %u) start moving random", i_owner->GetGUIDLow());
|
||||||
Mutate(new RandomMovementGenerator<Creature>(spawndist), MOTION_SLOT_IDLE);
|
Mutate(new RandomMovementGenerator<Creature>(spawndist), MOTION_SLOT_IDLE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -198,28 +199,28 @@ MotionMaster::MoveRandom(float spawndist)
|
|||||||
void
|
void
|
||||||
MotionMaster::MoveTargetedHome()
|
MotionMaster::MoveTargetedHome()
|
||||||
{
|
{
|
||||||
//if(i_owner->hasUnitState(UNIT_STAT_FLEEING))
|
//if (i_owner->hasUnitState(UNIT_STAT_FLEEING))
|
||||||
// return;
|
// return;
|
||||||
|
|
||||||
Clear(false);
|
Clear(false);
|
||||||
|
|
||||||
if(i_owner->GetTypeId() == TYPEID_UNIT)
|
if (i_owner->GetTypeId() == TYPEID_UNIT)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("Creature (Entry: %u GUID: %u) targeted home", i_owner->GetEntry(), i_owner->GetGUIDLow());
|
DEBUG_LOG("Creature (Entry: %u GUID: %u) targeted home", i_owner->GetEntry(), i_owner->GetGUIDLow());
|
||||||
Mutate(new HomeMovementGenerator<Creature>(), MOTION_SLOT_ACTIVE);
|
Mutate(new HomeMovementGenerator<Creature>(), MOTION_SLOT_ACTIVE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sLog.outError("Player (GUID: %u) attempt targeted home", i_owner->GetGUIDLow() );
|
sLog.outError("Player (GUID: %u) attempt targeted home", i_owner->GetGUIDLow());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MotionMaster::MoveConfused()
|
MotionMaster::MoveConfused()
|
||||||
{
|
{
|
||||||
if(i_owner->GetTypeId() == TYPEID_PLAYER)
|
if (i_owner->GetTypeId() == TYPEID_PLAYER)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("Player (GUID: %u) move confused", i_owner->GetGUIDLow() );
|
DEBUG_LOG("Player (GUID: %u) move confused", i_owner->GetGUIDLow());
|
||||||
Mutate(new ConfusedMovementGenerator<Player>(), MOTION_SLOT_CONTROLLED);
|
Mutate(new ConfusedMovementGenerator<Player>(), MOTION_SLOT_CONTROLLED);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -234,7 +235,7 @@ void
|
|||||||
MotionMaster::MoveChase(Unit* target, float dist, float angle)
|
MotionMaster::MoveChase(Unit* target, float dist, float angle)
|
||||||
{
|
{
|
||||||
// ignore movement request if target not exist
|
// ignore movement request if target not exist
|
||||||
if(!target || target == i_owner)
|
if (!target || target == i_owner || i_owner->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
i_owner->clearUnitState(UNIT_STAT_FOLLOW);
|
i_owner->clearUnitState(UNIT_STAT_FOLLOW);
|
||||||
@@ -243,7 +244,7 @@ MotionMaster::MoveChase(Unit* target, float dist, float angle)
|
|||||||
DEBUG_LOG("Player (GUID: %u) chase to %s (GUID: %u)",
|
DEBUG_LOG("Player (GUID: %u) chase to %s (GUID: %u)",
|
||||||
i_owner->GetGUIDLow(),
|
i_owner->GetGUIDLow(),
|
||||||
target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature",
|
target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature",
|
||||||
target->GetTypeId() == TYPEID_PLAYER ? i_owner->GetGUIDLow() : ((Creature*)i_owner)->GetDBTableGUIDLow() );
|
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), MOTION_SLOT_ACTIVE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -251,7 +252,7 @@ MotionMaster::MoveChase(Unit* target, float dist, float angle)
|
|||||||
DEBUG_LOG("Creature (Entry: %u GUID: %u) chase to %s (GUID: %u)",
|
DEBUG_LOG("Creature (Entry: %u GUID: %u) chase to %s (GUID: %u)",
|
||||||
i_owner->GetEntry(), i_owner->GetGUIDLow(),
|
i_owner->GetEntry(), i_owner->GetGUIDLow(),
|
||||||
target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature",
|
target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature",
|
||||||
target->GetTypeId() == TYPEID_PLAYER ? target->GetGUIDLow() : ((Creature*)target)->GetDBTableGUIDLow() );
|
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), MOTION_SLOT_ACTIVE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -260,7 +261,7 @@ void
|
|||||||
MotionMaster::MoveFollow(Unit* target, float dist, float angle, MovementSlot slot)
|
MotionMaster::MoveFollow(Unit* target, float dist, float angle, MovementSlot slot)
|
||||||
{
|
{
|
||||||
// ignore movement request if target not exist
|
// ignore movement request if target not exist
|
||||||
if(!target || target == i_owner)
|
if (!target || target == i_owner || i_owner->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
i_owner->addUnitState(UNIT_STAT_FOLLOW);
|
i_owner->addUnitState(UNIT_STAT_FOLLOW);
|
||||||
@@ -268,7 +269,7 @@ MotionMaster::MoveFollow(Unit* target, float dist, float angle, MovementSlot slo
|
|||||||
{
|
{
|
||||||
DEBUG_LOG("Player (GUID: %u) follow to %s (GUID: %u)", i_owner->GetGUIDLow(),
|
DEBUG_LOG("Player (GUID: %u) follow to %s (GUID: %u)", i_owner->GetGUIDLow(),
|
||||||
target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature",
|
target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature",
|
||||||
target->GetTypeId() == TYPEID_PLAYER ? i_owner->GetGUIDLow() : ((Creature*)i_owner)->GetDBTableGUIDLow() );
|
target->GetTypeId() == TYPEID_PLAYER ? i_owner->GetGUIDLow() : ((Creature*)i_owner)->GetDBTableGUIDLow());
|
||||||
Mutate(new TargetedMovementGenerator<Player>(*target,dist,angle), slot);
|
Mutate(new TargetedMovementGenerator<Player>(*target,dist,angle), slot);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -276,7 +277,7 @@ MotionMaster::MoveFollow(Unit* target, float dist, float angle, MovementSlot slo
|
|||||||
DEBUG_LOG("Creature (Entry: %u GUID: %u) follow to %s (GUID: %u)",
|
DEBUG_LOG("Creature (Entry: %u GUID: %u) follow to %s (GUID: %u)",
|
||||||
i_owner->GetEntry(), i_owner->GetGUIDLow(),
|
i_owner->GetEntry(), i_owner->GetGUIDLow(),
|
||||||
target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature",
|
target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature",
|
||||||
target->GetTypeId() == TYPEID_PLAYER ? target->GetGUIDLow() : ((Creature*)target)->GetDBTableGUIDLow() );
|
target->GetTypeId() == TYPEID_PLAYER ? target->GetGUIDLow() : ((Creature*)target)->GetDBTableGUIDLow());
|
||||||
Mutate(new TargetedMovementGenerator<Creature>(*target,dist,angle), slot);
|
Mutate(new TargetedMovementGenerator<Creature>(*target,dist,angle), slot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5255,7 +5255,7 @@ void Spell::EffectScriptEffect(uint32 effIndex)
|
|||||||
case 45151:
|
case 45151:
|
||||||
{
|
{
|
||||||
//Workaround for Range ... should be global for every ScriptEffect
|
//Workaround for Range ... should be global for every ScriptEffect
|
||||||
float radius = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[effIndex]));
|
float radius = GetSpellRadiusForHostile(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[effIndex]));
|
||||||
if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER && unitTarget->GetDistance(m_caster) >= radius && !unitTarget->HasAura(46394) && unitTarget != m_caster)
|
if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER && unitTarget->GetDistance(m_caster) >= radius && !unitTarget->HasAura(46394) && unitTarget != m_caster)
|
||||||
unitTarget->CastSpell(unitTarget, 46394, true);
|
unitTarget->CastSpell(unitTarget, 46394, true);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user