*Update targeted motion code.

--HG--
branch : trunk
This commit is contained in:
megamage
2009-05-30 00:05:20 -05:00
parent 83d468c7ee
commit 4d27b26638
2 changed files with 60 additions and 34 deletions

View File

@@ -42,28 +42,60 @@ struct StackCleaner
*/
template<class T>
void
TargetedMovementGenerator<T>::TargetedMovementGenerator(Unit &target, float offset, float angle)
: TargetedMovementGeneratorBase(target)
, i_offset(offset), i_angle(angle), i_recalculateTravel(false)
{
target.GetPosition(i_targetX, i_targetY, i_targetZ);
}
template<class T>
bool
TargetedMovementGenerator<T>::_setTargetLocation(T &owner)
{
if( !i_target.isValid() || !&owner )
return;
return false;
if( owner.hasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED) )
return;
return false;
float x, y, z;
Traveller<T> traveller(owner);
// prevent redundant micro-movement for pets, other followers.
if(i_offset ? i_target->IsWithinDistInMap(&owner, i_offset + 1.0f) : i_target->IsWithinMeleeRange(&owner))
if(i_destinationHolder.HasDestination())
{
owner.GetPosition(x, y, z);
i_destinationHolder.SetDestination(traveller, x, y, z, false);
return;
}
if(i_destinationHolder.HasArrived())
{
// prevent redundant micro-movement
if(i_offset ? i_target->IsWithinDistInMap(&owner, i_offset + 1.0f) : i_target->IsWithinMeleeRange(&owner))
return false;
}
else
{
bool stop = false;
if(!i_offset)
{
if(i_target->IsWithinMeleeRange(&owner, 0))
stop = true;
}
else if(!i_angle && !owner.hasUnitState(UNIT_STAT_FOLLOW))
{
if(i_target->IsWithinDist(&owner, i_offset * 0.8))
stop = true;
}
// chaser is on the way, and target did not move much
if(GetDestination(x, y, z) && i_target->IsWithinDist3d(x, y, z, 0.3f))
return;
if(stop)
{
i_target->GetPosition(x, y, z);
i_destinationHolder.SetDestination(traveller, x, y, z);
i_destinationHolder.StartTravel(traveller, false);
i_target->StopMoving();
return false;
}
}
if(i_target->GetDistanceSq(i_targetX, i_targetY, i_targetZ) < 0.01f)
return false;
}
if(!i_offset)
{
@@ -102,6 +134,7 @@ TargetedMovementGenerator<T>::_setTargetLocation(T &owner)
if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly())
owner.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2);
i_destinationHolder.StartTravel(traveller);
return true;
}
template<class T>
@@ -174,23 +207,17 @@ TargetedMovementGenerator<T>::Update(T &owner, const uint32 & time_diff)
if (i_destinationHolder.UpdateTraveller(traveller, time_diff))
{
// put targeted movement generators on a higher priority
if (owner.GetObjectSize())
i_destinationHolder.ResetUpdate(50);
//if (owner.GetObjectSize())
//i_destinationHolder.ResetUpdate(50);
//float dist = owner.GetCombatReach() + i_target.getTarget()->GetCombatReach() + sWorld.getRate(RATE_TARGET_POS_RECALCULATION_RANGE);
//More distance let have better performance, less distance let have more sensitive reaction at target move.
// try to counter precision differences
//if( i_destinationHolder.GetDistance2dFromDestSq(*i_target.getTarget()) >= dist * dist)
if(i_offset ? !i_target->IsWithinDistInMap(&owner, i_offset + 1.0f) : !i_target->IsWithinMeleeRange(&owner))
// target moved
if(i_targetX != i_target->GetPositionX() || i_targetY != i_target->GetPositionY()
|| i_targetZ != i_target->GetPositionZ())
{
owner.SetInFront(i_target.getTarget()); // Set new Angle For Map::
_setTargetLocation(owner); //Calculate New Dest and Send data To Player
if(_setTargetLocation(owner) || !owner.hasUnitState(UNIT_STAT_FOLLOW))
owner.SetInFront(i_target.getTarget());
i_target->GetPosition(i_targetX, i_targetY, i_targetZ);
}
// Update the Angle of the target only for Map::, no need to send packet for player
else if ( !i_angle && !owner.HasInArc( 0.01f, i_target.getTarget() ) )
owner.SetInFront(i_target.getTarget());
if(( owner.IsStopped() && !i_destinationHolder.HasArrived() ) || i_recalculateTravel )
{
@@ -213,8 +240,10 @@ TargetedMovementGenerator<T>::GetTarget() const
return i_target.getTarget();
}
template void TargetedMovementGenerator<Player>::_setTargetLocation(Player &);
template void TargetedMovementGenerator<Creature>::_setTargetLocation(Creature &);
template TargetedMovementGenerator<Player>::TargetedMovementGenerator(Unit &target, float offset, float angle);
template TargetedMovementGenerator<Creature>::TargetedMovementGenerator(Unit &target, float offset, float angle);
template bool TargetedMovementGenerator<Player>::_setTargetLocation(Player &);
template bool TargetedMovementGenerator<Creature>::_setTargetLocation(Creature &);
template void TargetedMovementGenerator<Player>::Initialize(Player &);
template void TargetedMovementGenerator<Creature>::Initialize(Creature &);
template void TargetedMovementGenerator<Player>::Finalize(Player &);

View File

@@ -40,11 +40,7 @@ class TRINITY_DLL_SPEC TargetedMovementGenerator
: public MovementGeneratorMedium< T, TargetedMovementGenerator<T> >, public TargetedMovementGeneratorBase
{
public:
TargetedMovementGenerator(Unit &target)
: TargetedMovementGeneratorBase(target), i_offset(0), i_angle(0), i_recalculateTravel(false) {}
TargetedMovementGenerator(Unit &target, float offset, float angle)
: TargetedMovementGeneratorBase(target), i_offset(offset), i_angle(angle), i_recalculateTravel(false) {}
TargetedMovementGenerator(Unit &target, float offset = 0, float angle = 0);
~TargetedMovementGenerator() {}
void Initialize(T &);
@@ -65,12 +61,13 @@ class TRINITY_DLL_SPEC TargetedMovementGenerator
void unitSpeedChanged() { i_recalculateTravel=true; }
private:
void _setTargetLocation(T &);
bool _setTargetLocation(T &);
float i_offset;
float i_angle;
DestinationHolder< Traveller<T> > i_destinationHolder;
bool i_recalculateTravel;
float i_targetX, i_targetY, i_targetZ;
};
#endif