diff options
| author | Chaouki Dhib <chaodhib@gmail.com> | 2018-01-07 00:55:17 +0100 |
|---|---|---|
| committer | Chaouki Dhib <chaodhib@gmail.com> | 2018-01-08 22:31:30 +0100 |
| commit | 274dede3dc89fa72ec1687d5ff454feba9849e47 (patch) | |
| tree | 89d7c24406656a586e8a54e56f36a232919975ab | |
| parent | c01d4ceadc1b6df775508b9f77a7d8611e0d5bba (diff) | |
Core/Movement: Correct the allowed distance to target before a repositioning is necessary. #20173
Also getting rid of the wordserveur config parameter 'TargetPosRecalculateRange' since it is no longer needed.
| -rw-r--r-- | src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp | 28 | ||||
| -rwxr-xr-x | src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h | 5 | ||||
| -rw-r--r-- | src/server/game/World/World.cpp | 13 | ||||
| -rw-r--r-- | src/server/game/World/World.h | 1 | ||||
| -rw-r--r-- | src/server/worldserver/worldserver.conf.dist | 11 |
5 files changed, 29 insertions, 29 deletions
diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index ef3d8a65c9e..2321682e7b3 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -61,9 +61,10 @@ bool TargetedMovementGenerator<T, D>::DoUpdate(T* owner, uint32 diff) { _timer.Reset(100); - float distance = owner->GetCombatReach() + sWorld->getRate(RATE_TARGET_POS_RECALCULATION_RANGE); + // the allowed distance between target and mover before the mover needs to reposition in order to keep attacking + float distance = GetMaxDistanceBeforeRepositioning(owner); if (owner->IsPet() && (owner->GetCharmerOrOwnerGUID() == GetTarget()->GetGUID())) - distance = 1.f; // pet following owner + distance = 1.f + GetTarget()->GetCombatReach(); // pet following owner G3D::Vector3 destination = owner->movespline->FinalDestination(); if (owner->movespline->onTransport) @@ -72,9 +73,9 @@ bool TargetedMovementGenerator<T, D>::DoUpdate(T* owner, uint32 diff) // First check distance if (owner->GetTypeId() == TYPEID_UNIT && owner->ToCreature()->CanFly()) - targetMoved = !GetTarget()->IsWithinDist3d(destination.x, destination.y, destination.z, distance); + targetMoved = !GetTarget()->IsInDist(destination.x, destination.y, destination.z, distance); else - targetMoved = !GetTarget()->IsWithinDist2d(destination.x, destination.y, distance); + targetMoved = !GetTarget()->IsInDist2d(destination.x, destination.y, distance); // then, if the target is in range, check also Line of Sight. if (!targetMoved) @@ -267,6 +268,15 @@ void ChaseMovementGenerator<T>::ReachTarget(T* owner) template<class T> void ChaseMovementGenerator<T>::MovementInform(T*) { } +template<class T> +float ChaseMovementGenerator<T>::GetMaxDistanceBeforeRepositioning(T* owner) +{ + // the notion of melee range and melee attack is clearly separated from the notion of the movement. + // As a seperation of concern refactoring, this value should be passed into parameter by the caller (during creation of ChaseMoveGen) instead of defining it + // here (or a callback should be used since this value depends on dynamic fields (combat reach). + return owner->GetMeleeRange(TargetedMovementGeneratorBase::GetTarget()); +} + template<> void ChaseMovementGenerator<Creature>::MovementInform(Creature* owner) { @@ -350,6 +360,12 @@ bool FollowMovementGenerator<Player>::EnableWalking() const template<class T> void FollowMovementGenerator<T>::MovementInform(T*) { } +template<class T> +float FollowMovementGenerator<T>::GetMaxDistanceBeforeRepositioning(T* owner) +{ + return owner->GetCombatReach() + TargetedMovementGeneratorBase::GetTarget()->GetCombatReach() + MOVE_FOLLOW_REPOSITIONING_DISTANCE; +} + template<> void FollowMovementGenerator<Creature>::MovementInform(Creature* unit) { @@ -386,6 +402,8 @@ template bool ChaseMovementGenerator<Creature>::HasLostTarget(Creature*) const; template void ChaseMovementGenerator<Player>::ReachTarget(Player*); template void ChaseMovementGenerator<Creature>::ReachTarget(Creature*); template void ChaseMovementGenerator<Player>::MovementInform(Player*); +template float ChaseMovementGenerator<Player>::GetMaxDistanceBeforeRepositioning(Player*); +template float ChaseMovementGenerator<Creature>::GetMaxDistanceBeforeRepositioning(Creature*); template void FollowMovementGenerator<Player>::DoInitialize(Player*); template void FollowMovementGenerator<Creature>::DoInitialize(Creature*); @@ -400,3 +418,5 @@ template void FollowMovementGenerator<Creature>::AddUnitStateMove(Creature*); template void FollowMovementGenerator<Player>::ReachTarget(Player*); template void FollowMovementGenerator<Creature>::ReachTarget(Creature*); template void FollowMovementGenerator<Player>::MovementInform(Player*); +template float FollowMovementGenerator<Player>::GetMaxDistanceBeforeRepositioning(Player*); +template float FollowMovementGenerator<Creature>::GetMaxDistanceBeforeRepositioning(Creature*); diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h index 8622defe556..b4fdbab9292 100755 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h @@ -23,6 +23,8 @@ #include "FollowerReference.h" #include "Timer.h" +#define MOVE_FOLLOW_REPOSITIONING_DISTANCE 1.5f + class TargetedMovementGeneratorBase { public: @@ -56,6 +58,7 @@ class TargetedMovementGenerator : public MovementGeneratorMedium< T, D >, public virtual void ReachTarget(T*) { } virtual bool EnableWalking() const { return false; } virtual void MovementInform(T*) { } + virtual float GetMaxDistanceBeforeRepositioning(T*) { return 0.0f; } bool IsReachable() const; void SetTargetLocation(T* owner, bool updateDestination); @@ -88,6 +91,7 @@ class ChaseMovementGenerator : public TargetedMovementGenerator<T, ChaseMovement bool HasLostTarget(T*) const override; void ReachTarget(T*) override; void MovementInform(T*) override; + float GetMaxDistanceBeforeRepositioning(T*) override; }; template<class T> @@ -108,6 +112,7 @@ class FollowMovementGenerator : public TargetedMovementGenerator<T, FollowMoveme void ReachTarget(T*) override; bool EnableWalking() const override; void MovementInform(T*) override; + float GetMaxDistanceBeforeRepositioning(T*) override; private: void UpdateSpeed(T* owner); }; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index dfd8a003099..542b7e7d51c 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -574,19 +574,6 @@ void World::LoadConfigSettings(bool reload) for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i) playerBaseMoveSpeed[i] = baseMoveSpeed[i] * rate_values[RATE_MOVESPEED]; rate_values[RATE_CORPSE_DECAY_LOOTED] = sConfigMgr->GetFloatDefault("Rate.Corpse.Decay.Looted", 0.5f); - rate_values[RATE_TARGET_POS_RECALCULATION_RANGE] = sConfigMgr->GetFloatDefault("TargetPosRecalculateRange", 1.5f); - if (rate_values[RATE_TARGET_POS_RECALCULATION_RANGE] < CONTACT_DISTANCE) - { - TC_LOG_ERROR("server.loading", "TargetPosRecalculateRange (%f) must be >= %f. Using %f instead.", rate_values[RATE_TARGET_POS_RECALCULATION_RANGE], CONTACT_DISTANCE, CONTACT_DISTANCE); - rate_values[RATE_TARGET_POS_RECALCULATION_RANGE] = CONTACT_DISTANCE; - } - else if (rate_values[RATE_TARGET_POS_RECALCULATION_RANGE] > NOMINAL_MELEE_RANGE) - { - TC_LOG_ERROR("server.loading", "TargetPosRecalculateRange (%f) must be <= %f. Using %f instead.", - rate_values[RATE_TARGET_POS_RECALCULATION_RANGE], NOMINAL_MELEE_RANGE, NOMINAL_MELEE_RANGE); - rate_values[RATE_TARGET_POS_RECALCULATION_RANGE] = NOMINAL_MELEE_RANGE; - } - rate_values[RATE_DURABILITY_LOSS_ON_DEATH] = sConfigMgr->GetFloatDefault("DurabilityLoss.OnDeath", 10.0f); if (rate_values[RATE_DURABILITY_LOSS_ON_DEATH] < 0.0f) { diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 9634bd82860..6d0bc442055 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -453,7 +453,6 @@ enum Rates RATE_TALENT, RATE_CORPSE_DECAY_LOOTED, RATE_INSTANCE_RESET_TIME, - RATE_TARGET_POS_RECALCULATION_RANGE, RATE_DURABILITY_LOSS_ON_DEATH, RATE_DURABILITY_LOSS_DAMAGE, RATE_DURABILITY_LOSS_PARRY, diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 78d18651724..d645eb55acd 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -419,17 +419,6 @@ DetectPosCollision = 1 CheckGameObjectLoS = 1 # -# TargetPosRecalculateRange -# Description: Max distance from movement target point (+moving unit size) and targeted -# object (+size) after that new target movement point calculated. -# Range: 0.5-5.0 -# Default: 1.5 -# 0.5 - (Minimum, Contact Range, More sensitive reaction to target movement) -# 5.0 - (Maximum, Melee attack range, Less CPU usage) - -TargetPosRecalculateRange = 1.5 - -# # UpdateUptimeInterval # Description: Update realm uptime period (in minutes). # Default: 10 - (10 minutes) |
