mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 16:37:01 +00:00
[11709] Cleanup, simplify random and targeted movement generator code
This commit is contained in:
parent
6a597ae755
commit
fce6a5b7d3
4 changed files with 39 additions and 81 deletions
|
|
@ -91,23 +91,15 @@ RandomMovementGenerator<Creature>::_setRandomLocation(Creature &creature)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
creature.AddSplineFlag(is_air_ok ? SPLINEFLAG_FLYING : SPLINEFLAG_WALKMODE);
|
||||||
Traveller<Creature> traveller(creature);
|
Traveller<Creature> traveller(creature);
|
||||||
|
|
||||||
creature.SetOrientation(creature.GetAngle(destX, destY));
|
|
||||||
i_destinationHolder.SetDestination(traveller, destX, destY, destZ);
|
i_destinationHolder.SetDestination(traveller, destX, destY, destZ);
|
||||||
creature.addUnitState(UNIT_STAT_ROAMING_MOVE);
|
creature.addUnitState(UNIT_STAT_ROAMING_MOVE);
|
||||||
|
|
||||||
if (is_air_ok)
|
if (is_air_ok)
|
||||||
{
|
|
||||||
i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime());
|
i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime());
|
||||||
creature.AddSplineFlag(SPLINEFLAG_FLYING);
|
|
||||||
}
|
|
||||||
//else if (is_water_ok) // Swimming mode to be done with more than this check
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime() + urand(500, 10000));
|
i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime() + urand(500, 10000));
|
||||||
creature.AddSplineFlag(SPLINEFLAG_WALKMODE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
@ -148,41 +140,22 @@ bool RandomMovementGenerator<Creature>::Update(Creature &creature, const uint32
|
||||||
{
|
{
|
||||||
if (creature.hasUnitState(UNIT_STAT_NOT_MOVE))
|
if (creature.hasUnitState(UNIT_STAT_NOT_MOVE))
|
||||||
{
|
{
|
||||||
i_nextMoveTime.Update(i_nextMoveTime.GetExpiry()); // Expire the timer
|
i_nextMoveTime.Reset(0); // Expire the timer
|
||||||
creature.clearUnitState(UNIT_STAT_ROAMING_MOVE);
|
creature.clearUnitState(UNIT_STAT_ROAMING_MOVE);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
i_nextMoveTime.Update(diff);
|
|
||||||
|
|
||||||
if (i_destinationHolder.HasArrived() && !creature.IsStopped() && !creature.CanFly())
|
|
||||||
creature.clearUnitState(UNIT_STAT_ROAMING_MOVE);
|
|
||||||
|
|
||||||
if (!i_destinationHolder.HasArrived() && creature.IsStopped())
|
|
||||||
creature.addUnitState(UNIT_STAT_ROAMING_MOVE);
|
|
||||||
|
|
||||||
CreatureTraveller traveller(creature);
|
CreatureTraveller traveller(creature);
|
||||||
|
|
||||||
if (i_destinationHolder.UpdateTraveller(traveller, diff, false, true))
|
if (i_destinationHolder.UpdateTraveller(traveller, diff, false, true))
|
||||||
{
|
{
|
||||||
if (!IsActive(creature)) // force stop processing (movement can move out active zone with cleanup movegens list)
|
if (!IsActive(creature)) // force stop processing (movement can move out active zone with cleanup movegens list)
|
||||||
return true; // not expire now, but already lost
|
return true; // not expire now, but already lost
|
||||||
|
}
|
||||||
|
|
||||||
|
i_nextMoveTime.Update(diff);
|
||||||
if (i_nextMoveTime.Passed())
|
if (i_nextMoveTime.Passed())
|
||||||
{
|
_setRandomLocation(creature);
|
||||||
if (creature.CanFly())
|
|
||||||
creature.AddSplineFlag(SPLINEFLAG_FLYING);
|
|
||||||
else
|
|
||||||
creature.AddSplineFlag(SPLINEFLAG_WALKMODE);
|
|
||||||
|
|
||||||
_setRandomLocation(creature);
|
|
||||||
}
|
|
||||||
else if (creature.IsPet() && creature.GetOwner() && !creature.IsWithinDist(creature.GetOwner(), PET_FOLLOW_DIST+2.5f))
|
|
||||||
{
|
|
||||||
creature.AddSplineFlag(SPLINEFLAG_WALKMODE);
|
|
||||||
_setRandomLocation(creature);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -74,13 +74,14 @@ void TargetedMovementGeneratorMedium<T,D>::_setTargetLocation(T &owner)
|
||||||
if( i_destinationHolder.HasDestination() && i_destinationHolder.GetDestinationDiff(x,y,z) < bothObjectSize )
|
if( i_destinationHolder.HasDestination() && i_destinationHolder.GetDestinationDiff(x,y,z) < bothObjectSize )
|
||||||
return;
|
return;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Traveller<T> traveller(owner);
|
|
||||||
i_destinationHolder.SetDestination(traveller, x, y, z);
|
|
||||||
|
|
||||||
D::_addUnitStateMove(owner);
|
|
||||||
if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->CanFly())
|
if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->CanFly())
|
||||||
((Creature&)owner).AddSplineFlag(SPLINEFLAG_FLYING);
|
((Creature&)owner).AddSplineFlag(SPLINEFLAG_FLYING);
|
||||||
|
|
||||||
|
i_targetReached = false;
|
||||||
|
i_recalculateTravel = false;
|
||||||
|
D::_addUnitStateMove(owner);
|
||||||
|
Traveller<T> traveller(owner);
|
||||||
|
i_destinationHolder.SetDestination(traveller, x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
@ -140,52 +141,35 @@ bool TargetedMovementGeneratorMedium<T,D>::Update(T &owner, const uint32 & time_
|
||||||
}
|
}
|
||||||
|
|
||||||
Traveller<T> traveller(owner);
|
Traveller<T> traveller(owner);
|
||||||
|
|
||||||
if (!i_destinationHolder.HasDestination())
|
|
||||||
_setTargetLocation(owner);
|
|
||||||
if (owner.IsStopped() && !i_destinationHolder.HasArrived())
|
|
||||||
{
|
|
||||||
D::_addUnitStateMove(owner);
|
|
||||||
if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->CanFly())
|
|
||||||
((Creature&)owner).AddSplineFlag(SPLINEFLAG_FLYING);
|
|
||||||
|
|
||||||
i_destinationHolder.StartTravel(traveller);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i_destinationHolder.UpdateTraveller(traveller, time_diff, false))
|
if (i_destinationHolder.UpdateTraveller(traveller, time_diff, false))
|
||||||
{
|
{
|
||||||
if (!IsActive(owner)) // force stop processing (movement can move out active zone with cleanup movegens list)
|
if (!IsActive(owner)) // force stop processing (movement can move out active zone with cleanup movegens list)
|
||||||
return true; // not expire now, but already lost
|
return true;
|
||||||
|
|
||||||
// put targeted movement generators on a higher priority
|
|
||||||
if (owner.GetObjectBoundingRadius())
|
|
||||||
i_destinationHolder.ResetUpdate(50);
|
i_destinationHolder.ResetUpdate(50);
|
||||||
|
|
||||||
float dist = i_target->GetObjectBoundingRadius() + owner.GetObjectBoundingRadius() + sWorld.getConfig(CONFIG_FLOAT_RATE_TARGET_POS_RECALCULATION_RANGE);
|
|
||||||
|
|
||||||
//More distance let have better performance, less distance let have more sensitive reaction at target move.
|
//More distance let have better performance, less distance let have more sensitive reaction at target move.
|
||||||
|
float dist = i_target->GetObjectBoundingRadius() + owner.GetObjectBoundingRadius()
|
||||||
// try to counter precision differences
|
+ sWorld.getConfig(CONFIG_FLOAT_RATE_TARGET_POS_RECALCULATION_RANGE);
|
||||||
if (i_destinationHolder.GetDistance3dFromDestSq(*i_target.getTarget()) >= dist * dist)
|
if (i_destinationHolder.GetDistance3dFromDestSq(*i_target.getTarget()) > dist * dist)
|
||||||
{
|
_setTargetLocation(owner);
|
||||||
owner.SetInFront(i_target.getTarget()); // Set new Angle For Map::
|
|
||||||
_setTargetLocation(owner); //Calculate New Dest and Send data To Player
|
|
||||||
}
|
}
|
||||||
// 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)
|
if (i_destinationHolder.HasArrived())
|
||||||
{
|
{
|
||||||
i_recalculateTravel = false;
|
if (i_angle == 0.f && !owner.HasInArc(0.01f, i_target.getTarget()))
|
||||||
//Angle update will take place into owner.StopMoving()
|
|
||||||
owner.SetInFront(i_target.getTarget());
|
owner.SetInFront(i_target.getTarget());
|
||||||
|
|
||||||
owner.StopMoving();
|
if (!i_targetReached)
|
||||||
|
{
|
||||||
|
i_targetReached = true;
|
||||||
static_cast<D*>(this)->_reachTarget(owner);
|
static_cast<D*>(this)->_reachTarget(owner);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (i_recalculateTravel)
|
||||||
|
_setTargetLocation(owner);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -38,12 +38,12 @@ class MANGOS_DLL_SPEC TargetedMovementGeneratorMedium
|
||||||
: public MovementGeneratorMedium< T, D >, public TargetedMovementGeneratorBase
|
: public MovementGeneratorMedium< T, D >, public TargetedMovementGeneratorBase
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
TargetedMovementGeneratorMedium()
|
TargetedMovementGeneratorMedium(Unit &target, float offset = 0.f, float angle = 0.f) :
|
||||||
: TargetedMovementGeneratorBase(), i_offset(0), i_angle(0), i_recalculateTravel(false) {}
|
TargetedMovementGeneratorBase(target), i_offset(offset), i_angle(angle),
|
||||||
TargetedMovementGeneratorMedium(Unit &target)
|
i_recalculateTravel(false), i_targetReached(false)
|
||||||
: TargetedMovementGeneratorBase(target), i_offset(0), i_angle(0), i_recalculateTravel(false) {}
|
{
|
||||||
TargetedMovementGeneratorMedium(Unit &target, float offset, float angle)
|
}
|
||||||
: TargetedMovementGeneratorBase(target), i_offset(offset), i_angle(angle), i_recalculateTravel(false) {}
|
|
||||||
~TargetedMovementGeneratorMedium() {}
|
~TargetedMovementGeneratorMedium() {}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
@ -67,7 +67,8 @@ class MANGOS_DLL_SPEC TargetedMovementGeneratorMedium
|
||||||
float i_offset;
|
float i_offset;
|
||||||
float i_angle;
|
float i_angle;
|
||||||
DestinationHolder< Traveller<T> > i_destinationHolder;
|
DestinationHolder< Traveller<T> > i_destinationHolder;
|
||||||
bool i_recalculateTravel;
|
bool i_recalculateTravel : 1;
|
||||||
|
bool i_targetReached : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "11708"
|
#define REVISION_NR "11709"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue