aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/AI
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2016-07-09 13:03:03 +0200
committerShauren <shauren.trinity@gmail.com>2016-07-09 20:47:45 +0200
commitb63e0769a55b0ae0799af0d44c503f873a656246 (patch)
treefebe2d05b6a4326fbe9249d08fddfb3d927cf83b /src/server/game/AI
parentc2f6c4d2bd6f06e382c27ca256fcffaa3f0d498b (diff)
Core/Units: Fixed autoattack range
Closes #17539 (cherry picked from commit 14b93c04ee07e9fe6e2767460e7fc7cc2b3e6808)
Diffstat (limited to 'src/server/game/AI')
-rw-r--r--src/server/game/AI/CoreAI/UnitAI.cpp68
1 files changed, 52 insertions, 16 deletions
diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp
index 85a93bd91c2..2c12ccc3e5c 100644
--- a/src/server/game/AI/CoreAI/UnitAI.cpp
+++ b/src/server/game/AI/CoreAI/UnitAI.cpp
@@ -243,28 +243,64 @@ bool SpellTargetSelector::operator()(Unit const* target) const
return false;
// copypasta from Spell::CheckRange
- uint32 range_type = _spellInfo->RangeEntry ? _spellInfo->RangeEntry->Flags : 0;
- float max_range = _caster->GetSpellMaxRangeForTarget(target, _spellInfo);
- float min_range = _caster->GetSpellMinRangeForTarget(target, _spellInfo);
+ float minRange = 0.0f;
+ float maxRange = 0.0f;
+ float rangeMod = 0.0f;
+ if (_spellInfo->RangeEntry)
+ {
+ if (_spellInfo->RangeEntry->Flags & SPELL_RANGE_MELEE)
+ {
+ rangeMod = _caster->GetCombatReach() + 4.0f / 3.0f;
+ if (target)
+ rangeMod += target->GetCombatReach();
+ else
+ rangeMod += _caster->GetCombatReach();
+
+ rangeMod = std::max(rangeMod, NOMINAL_MELEE_RANGE);
+ }
+ else
+ {
+ float meleeRange = 0.0f;
+ if (_spellInfo->RangeEntry->Flags & SPELL_RANGE_RANGED)
+ {
+ meleeRange = _caster->GetCombatReach() + 4.0f / 3.0f;
+ if (target)
+ meleeRange += target->GetCombatReach();
+ else
+ meleeRange += _caster->GetCombatReach();
+
+ meleeRange = std::max(meleeRange, NOMINAL_MELEE_RANGE);
+ }
+
+ minRange = _caster->GetSpellMinRangeForTarget(target, _spellInfo) + meleeRange;
+ maxRange = _caster->GetSpellMaxRangeForTarget(target, _spellInfo);
+ if (target)
+ {
+ rangeMod = _caster->GetCombatReach();
+ rangeMod += target->GetCombatReach();
+
+ if (minRange > 0.0f && !(_spellInfo->RangeEntry->Flags & SPELL_RANGE_RANGED))
+ minRange += rangeMod;
+ }
+ }
+
+ if (target && _caster->isMoving() && target->isMoving() && !_caster->IsWalking() && !target->IsWalking() &&
+ (_spellInfo->RangeEntry->type & SPELL_RANGE_MELEE || target->GetTypeId() == TYPEID_PLAYER))
+ rangeMod += 5.0f / 3.0f;
+ }
+
+ maxRange += rangeMod;
+
+ minRange *= minRange;
+ maxRange *= maxRange;
if (target && target != _caster)
{
- if (range_type == SPELL_RANGE_MELEE)
- {
- // Because of lag, we can not check too strictly here.
- if (!_caster->IsWithinMeleeRange(target, max_range))
- return false;
- }
- else if (!_caster->IsWithinCombatRange(target, max_range))
+ if (_caster->GetExactDistSq(target) > maxRange)
return false;
- if (range_type == SPELL_RANGE_RANGED)
- {
- if (_caster->IsWithinMeleeRange(target))
- return false;
- }
- else if (min_range && _caster->IsWithinCombatRange(target, min_range)) // skip this check if min_range = 0
+ if (minRange > 0.0f && _caster->GetExactDistSq(target) < minRange)
return false;
}