diff options
Diffstat (limited to 'src/server/game/Spells/SpellEffects.cpp')
| -rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index e0d54a6c107..b50be84b7d2 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -965,16 +965,31 @@ void Spell::EffectTriggerRitualOfSummoning(SpellEffIndex effIndex) m_caster->CastSpell(nullptr, spellInfo->Id, false); } -inline void CalculateJumpSpeeds(SpellInfo const* spellInfo, uint8 i, float dist, float& speedXY, float& speedZ) -{ - if (spellInfo->Effects[i].MiscValue) - speedZ = spellInfo->Effects[i].MiscValue / 10.f; - else if (spellInfo->Effects[i].MiscValueB) - speedZ = spellInfo->Effects[i].MiscValueB / 10.f; +void Spell::CalculateJumpSpeeds(SpellInfo const* spellInfo, uint8 i, float dist, float& speedXY, float& speedZ) +{ + float runSpeed = unitCaster->IsControlledByPlayer() ? playerBaseMoveSpeed[MOVE_RUN] : baseMoveSpeed[MOVE_RUN]; + if (Creature* creature = unitCaster->ToCreature()) + runSpeed *= creature->GetCreatureTemplate()->speed_run; + + float multiplier = m_spellInfo->Effects[i].ValueMultiplier; + if (multiplier <= 0.0f) + multiplier = 1.0f; + + speedXY = std::min(runSpeed * 3.0f * multiplier, std::max(28.0f, unitCaster->GetSpeed(MOVE_RUN) * 4.0f)); + + float duration = dist / speedXY; + float durationSqr = duration * duration; + float minHeight = spellInfo->Effects[i].MiscValue ? spellInfo->Effects[i].MiscValue / 10.0f : 0.5f; // Lower bound is blizzlike + float maxHeight = spellInfo->Effects[i].MiscValueB ? spellInfo->Effects[i].MiscValueB / 10.0f : 1000.0f; // Upper bound is unknown + float height; + if (durationSqr < minHeight * 8 / Movement::gravity) + height = minHeight; + else if (durationSqr > maxHeight * 8 / Movement::gravity) + height = maxHeight; else - speedZ = 10.0f; + height = Movement::gravity * durationSqr / 8; - speedXY = dist * 10.0f / speedZ; + speedZ = std::sqrt(2 * Movement::gravity * height); } void Spell::EffectJump(SpellEffIndex effIndex) |
