*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:
maximius
2009-11-19 20:03:35 -08:00
parent f4808f3ff5
commit 72607c20ba
2 changed files with 33 additions and 32 deletions
+32 -31
View File
@@ -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);
} }
} }
+1 -1
View File
@@ -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);