aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-07-03 16:18:06 +0200
committerOvahlord <dreadkiller@gmx.de>2024-07-05 04:43:28 +0200
commit071ddfa162db86815ecfc3a52c72c62863c08898 (patch)
tree8dbe837cdefede03890a9b0822436c77d098f307 /src
parent0617d977e9025940a0260c34d1d20a2b4a433c34 (diff)
Core/Spells: Remove spell range increase when caster or target move backwards
(cherry picked from commit f19e1a271618a35515512ce2a64330f21133616c)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Spells/Spell.cpp9
-rw-r--r--src/server/game/Spells/Spell.h2
-rw-r--r--src/server/game/Spells/SpellInfo.cpp4
3 files changed, 12 insertions, 3 deletions
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<float, float> Spell::GetMinMaxRange(bool strict) const
{
float rangeMod = 0.0f;
@@ -7210,7 +7217,7 @@ std::pair<float, float> 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;
}