aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Spells/SpellEffects.cpp13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 854fd4b22d9..6004dc11ac7 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -4002,12 +4002,15 @@ void Spell::EffectPullTowards()
if (!unitTarget)
return;
- float speedXY = effectInfo->MiscValue / 10.0f;
- float speedZ = damage / 10.0f;
- Position pos;
- pos.Relocate(m_caster);
+ Position pos = m_caster->GetFirstCollisionPosition(m_caster->GetCombatReach(), m_caster->GetRelativeAngle(unitTarget));
+
+ // This is a blizzlike mistake: this should be 2D distance according to projectile motion formulas, but Blizzard erroneously used 3D distance.
+ float distXY = unitTarget->GetExactDist(pos);
+ float distZ = pos.GetPositionZ() - unitTarget->GetPositionZ();
+ float speedXY = effectInfo->MiscValue ? effectInfo->MiscValue / 10.0f : 30.0f;
+ float speedZ = (2 * speedXY * speedXY * distZ + Movement::gravity * distXY * distXY) / (2 * speedXY * distXY);
- unitTarget->GetMotionMaster()->MoveJump(pos, speedXY, speedZ);
+ unitTarget->JumpTo(speedXY, speedZ, true, pos);
}
void Spell::EffectPullTowardsDest()