mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
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.
This commit is contained in:
@@ -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*);
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -418,17 +418,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).
|
||||
|
||||
Reference in New Issue
Block a user