aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp28
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h5
-rw-r--r--src/server/game/World/World.cpp13
-rw-r--r--src/server/game/World/World.h1
-rw-r--r--src/server/worldserver/worldserver.conf.dist11
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 a2e954ad225..037b77d3982 100755
--- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp
@@ -60,9 +60,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)
@@ -71,9 +72,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)
@@ -266,6 +267,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)
{
@@ -349,6 +359,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)
{
@@ -385,6 +401,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*);
@@ -399,3 +417,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 9f4e3712b5c..de1d08dbf91 100755
--- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h
@@ -22,6 +22,8 @@
#include "FollowerReference.h"
#include "Timer.h"
+#define MOVE_FOLLOW_REPOSITIONING_DISTANCE 1.5f
+
class TargetedMovementGeneratorBase
{
public:
@@ -55,6 +57,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);
@@ -87,6 +90,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>
@@ -107,6 +111,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 a2fdd5aea7d..06f45667e25 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -652,19 +652,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 1dcc407b997..76272c92e8e 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -494,7 +494,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 20c1bf6158f..165121838ec 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -455,17 +455,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)