From f15bcebdbe42acb72d2d9165cd8091e9a61f5909 Mon Sep 17 00:00:00 2001 From: DanVS <33371360+DanVS@users.noreply.github.com> Date: Tue, 18 Jun 2019 10:57:23 +0000 Subject: Core/Spell: Jump Speed Calculations (#22886) * Jump Speed Calculations * Fix (cherry picked from commit 0197a2f990aa7c7eaf8637a2a5da7f43def9c4bd) --- src/server/game/Spells/Spell.h | 1 + src/server/game/Spells/SpellEffects.cpp | 31 +++++++++++++++++++++++-------- 2 files changed, 24 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 4d52449b698..2645d7f5769 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -830,6 +830,7 @@ class TC_GAME_API Spell // effect helpers void SummonGuardian(SpellEffectInfo const* effect, uint32 entry, SummonPropertiesEntry const* properties, uint32 numSummons, ObjectGuid privateObjectOwner); + void CalculateJumpSpeeds(SpellEffectInfo const* effInfo, float dist, float& speedXY, float& speedZ); void UpdateSpellCastDataTargets(WorldPackets::Spells::SpellCastData& data); void UpdateSpellCastDataAmmo(WorldPackets::Spells::SpellAmmo& data); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index d5f4cac251d..b4028e41615 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -788,16 +788,31 @@ void Spell::EffectTriggerRitualOfSummoning() .SetOriginalCastId(m_castId)); } -inline void CalculateJumpSpeeds(SpellEffectInfo const* effInfo, float dist, float& speedXY, float& speedZ) -{ - if (effInfo->MiscValue) - speedZ = float(effInfo->MiscValue) / 10; - else if (effInfo->MiscValueB) - speedZ = float(effInfo->MiscValueB) / 10; +void Spell::CalculateJumpSpeeds(SpellEffectInfo const* effInfo, 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 = effInfo->Amplitude; + 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 = effInfo->MiscValue ? effInfo->MiscValue / 10.0f : 0.5f; // Lower bound is blizzlike + float maxHeight = effInfo->MiscValueB ? effInfo->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() -- cgit v1.2.3