From 071ddfa162db86815ecfc3a52c72c62863c08898 Mon Sep 17 00:00:00 2001 From: Shauren Date: Wed, 3 Jul 2024 16:18:06 +0200 Subject: Core/Spells: Remove spell range increase when caster or target move backwards (cherry picked from commit f19e1a271618a35515512ce2a64330f21133616c) --- src/server/game/Spells/Spell.cpp | 9 ++++++++- src/server/game/Spells/Spell.h | 2 ++ src/server/game/Spells/SpellInfo.cpp | 4 ++-- 3 files changed, 12 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 7e957b98db9..29a652721f3 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -7169,6 +7169,13 @@ SpellCastResult Spell::CheckRange(bool strict) const return SPELL_CAST_OK; } +bool Spell::CanIncreaseRangeByMovement(Unit const* unit) +{ + // forward running only + return unit->HasUnitMovementFlag(MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_STRAFE_LEFT | MOVEMENTFLAG_STRAFE_RIGHT | MOVEMENTFLAG_FALLING) + && !unit->IsWalking(); +} + std::pair Spell::GetMinMaxRange(bool strict) const { float rangeMod = 0.0f; @@ -7210,7 +7217,7 @@ std::pair Spell::GetMinMaxRange(bool strict) const } } - if (target && unitCaster && unitCaster->isMoving() && target->isMoving() && !unitCaster->IsWalking() && !target->IsWalking() && + if (target && unitCaster && CanIncreaseRangeByMovement(target) && CanIncreaseRangeByMovement(unitCaster) && ((m_spellInfo->RangeEntry->Flags & SPELL_RANGE_MELEE) || target->GetTypeId() == TYPEID_PLAYER)) rangeMod += 8.0f / 3.0f; } diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index d28ce0f2ff8..cf27e5a1ff2 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -678,6 +678,8 @@ class TC_GAME_API Spell bool IsWithinLOS(WorldObject const* source, Position const& target, VMAP::ModelIgnoreFlags ignoreFlags) const; void MovePosition(Position& pos, WorldObject const* from, float dist, float angle) const; + static bool CanIncreaseRangeByMovement(Unit const* unit); + protected: bool HasGlobalCooldown() const; void TriggerGlobalCooldown(); diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 2a89469fd4d..d079113b828 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -663,7 +663,7 @@ float SpellEffectInfo::CalcRadius(WorldObject* caster /*= nullptr*/, SpellTarget if (caster) { - if (Unit* casterUnit = caster->ToUnit()) + if (Unit const* casterUnit = caster->ToUnit()) radius += entry->RadiusPerLevel * casterUnit->GetLevel(); radius = std::min(radius, entry->RadiusMax); @@ -672,7 +672,7 @@ float SpellEffectInfo::CalcRadius(WorldObject* caster /*= nullptr*/, SpellTarget modOwner->ApplySpellMod(_spellInfo, SpellModOp::Radius, radius, spell); if (!_spellInfo->HasAttribute(SPELL_ATTR9_NO_MOVEMENT_RADIUS_BONUS)) - if (Unit* casterUnit = caster->ToUnit(); casterUnit && casterUnit->isMoving() && !casterUnit->IsWalking()) + if (Unit const* casterUnit = caster->ToUnit(); casterUnit && Spell::CanIncreaseRangeByMovement(casterUnit)) radius += 2.0f; } -- cgit v1.2.3