diff options
| author | DanVS <33371360+DanVS@users.noreply.github.com> | 2019-06-18 10:57:23 +0000 | 
|---|---|---|
| committer | Giacomo Pozzoni <giacomopoz@gmail.com> | 2019-06-18 12:57:23 +0200 | 
| commit | 0197a2f990aa7c7eaf8637a2a5da7f43def9c4bd (patch) | |
| tree | b81394387d93bde6079d59a6fe2c191ab4a5d05e /src | |
| parent | 015870bfe1d3ec57c4505072f087b88fe63662b5 (diff) | |
Core/Spell: Jump Speed Calculations (#22886)
* Jump Speed Calculations
* Fix
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Spells/Spell.h | 1 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 31 | 
2 files changed, 24 insertions, 8 deletions
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index c412ef3f2a2..4f29a1ea762 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -765,6 +765,7 @@ class TC_GAME_API Spell          // effect helpers          void SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const* properties, uint32 numSummons); +        void CalculateJumpSpeeds(SpellInfo const* spellInfo, uint8 i, float dist, float& speedXY, float& speedZ);          SpellCastResult CanOpenLock(uint32 effIndex, uint32 lockid, SkillType& skillid, int32& reqSkillValue, int32& skillValue);          // ------------------------------------------- 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)  | 
