From fce6a5b7d3c8884222c4855b96ef5ab4faa4a657 Mon Sep 17 00:00:00 2001 From: SilverIce Date: Sun, 3 Jul 2011 23:23:16 +0300 Subject: [PATCH] [11709] Cleanup, simplify random and targeted movement generator code --- src/game/RandomMovementGenerator.cpp | 41 +++-------------- src/game/TargetedMovementGenerator.cpp | 62 ++++++++++---------------- src/game/TargetedMovementGenerator.h | 15 ++++--- src/shared/revision_nr.h | 2 +- 4 files changed, 39 insertions(+), 81 deletions(-) diff --git a/src/game/RandomMovementGenerator.cpp b/src/game/RandomMovementGenerator.cpp index 9353e32e7..163cbd34e 100644 --- a/src/game/RandomMovementGenerator.cpp +++ b/src/game/RandomMovementGenerator.cpp @@ -91,23 +91,15 @@ RandomMovementGenerator::_setRandomLocation(Creature &creature) } } + creature.AddSplineFlag(is_air_ok ? SPLINEFLAG_FLYING : SPLINEFLAG_WALKMODE); Traveller traveller(creature); - - creature.SetOrientation(creature.GetAngle(destX, destY)); i_destinationHolder.SetDestination(traveller, destX, destY, destZ); creature.addUnitState(UNIT_STAT_ROAMING_MOVE); if (is_air_ok) - { 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 - { i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime() + urand(500, 10000)); - creature.AddSplineFlag(SPLINEFLAG_WALKMODE); - } } template<> @@ -148,41 +140,22 @@ bool RandomMovementGenerator::Update(Creature &creature, const uint32 { 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); 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); - if (i_destinationHolder.UpdateTraveller(traveller, diff, false, true)) { if (!IsActive(creature)) // force stop processing (movement can move out active zone with cleanup movegens list) return true; // not expire now, but already lost - - if (i_nextMoveTime.Passed()) - { - 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); - } } + + i_nextMoveTime.Update(diff); + if (i_nextMoveTime.Passed()) + _setRandomLocation(creature); + return true; } diff --git a/src/game/TargetedMovementGenerator.cpp b/src/game/TargetedMovementGenerator.cpp index bf1aeb9ba..2f222b434 100644 --- a/src/game/TargetedMovementGenerator.cpp +++ b/src/game/TargetedMovementGenerator.cpp @@ -74,13 +74,14 @@ void TargetedMovementGeneratorMedium::_setTargetLocation(T &owner) if( i_destinationHolder.HasDestination() && i_destinationHolder.GetDestinationDiff(x,y,z) < bothObjectSize ) return; */ - - Traveller traveller(owner); - i_destinationHolder.SetDestination(traveller, x, y, z); - - D::_addUnitStateMove(owner); if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->CanFly()) ((Creature&)owner).AddSplineFlag(SPLINEFLAG_FLYING); + + i_targetReached = false; + i_recalculateTravel = false; + D::_addUnitStateMove(owner); + Traveller traveller(owner); + i_destinationHolder.SetDestination(traveller, x, y, z); } template<> @@ -140,52 +141,35 @@ bool TargetedMovementGeneratorMedium::Update(T &owner, const uint32 & time_ } Traveller 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 (!IsActive(owner)) // force stop processing (movement can move out active zone with cleanup movegens list) - return true; // not expire now, but already lost - - // put targeted movement generators on a higher priority - if (owner.GetObjectBoundingRadius()) - i_destinationHolder.ResetUpdate(50); - - float dist = i_target->GetObjectBoundingRadius() + owner.GetObjectBoundingRadius() + sWorld.getConfig(CONFIG_FLOAT_RATE_TARGET_POS_RECALCULATION_RANGE); + return true; + i_destinationHolder.ResetUpdate(50); //More distance let have better performance, less distance let have more sensitive reaction at target move. + float dist = i_target->GetObjectBoundingRadius() + owner.GetObjectBoundingRadius() + + sWorld.getConfig(CONFIG_FLOAT_RATE_TARGET_POS_RECALCULATION_RANGE); + if (i_destinationHolder.GetDistance3dFromDestSq(*i_target.getTarget()) > dist * dist) + _setTargetLocation(owner); + } - // try to counter precision differences - if (i_destinationHolder.GetDistance3dFromDestSq(*i_target.getTarget()) >= dist * dist) - { - 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())) + if (i_destinationHolder.HasArrived()) + { + if (i_angle == 0.f && !owner.HasInArc(0.01f, i_target.getTarget())) owner.SetInFront(i_target.getTarget()); - if ((owner.IsStopped() && !i_destinationHolder.HasArrived()) || i_recalculateTravel) + if (!i_targetReached) { - i_recalculateTravel = false; - //Angle update will take place into owner.StopMoving() - owner.SetInFront(i_target.getTarget()); - - owner.StopMoving(); + i_targetReached = true; static_cast(this)->_reachTarget(owner); } } + else + { + if (i_recalculateTravel) + _setTargetLocation(owner); + } return true; } diff --git a/src/game/TargetedMovementGenerator.h b/src/game/TargetedMovementGenerator.h index c0f5b4f21..abb5e2737 100644 --- a/src/game/TargetedMovementGenerator.h +++ b/src/game/TargetedMovementGenerator.h @@ -38,12 +38,12 @@ class MANGOS_DLL_SPEC TargetedMovementGeneratorMedium : public MovementGeneratorMedium< T, D >, public TargetedMovementGeneratorBase { protected: - TargetedMovementGeneratorMedium() - : TargetedMovementGeneratorBase(), i_offset(0), i_angle(0), i_recalculateTravel(false) {} - TargetedMovementGeneratorMedium(Unit &target) - : 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(Unit &target, float offset = 0.f, float angle = 0.f) : + TargetedMovementGeneratorBase(target), i_offset(offset), i_angle(angle), + i_recalculateTravel(false), i_targetReached(false) + { + } + ~TargetedMovementGeneratorMedium() {} public: @@ -67,7 +67,8 @@ class MANGOS_DLL_SPEC TargetedMovementGeneratorMedium float i_offset; float i_angle; DestinationHolder< Traveller > i_destinationHolder; - bool i_recalculateTravel; + bool i_recalculateTravel : 1; + bool i_targetReached : 1; }; template diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 303fb2149..1aa6a1632 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "11708" + #define REVISION_NR "11709" #endif // __REVISION_NR_H__