aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanVS <33371360+DanVS@users.noreply.github.com>2019-06-18 10:57:23 +0000
committerGiacomo Pozzoni <giacomopoz@gmail.com>2019-06-18 12:57:23 +0200
commit0197a2f990aa7c7eaf8637a2a5da7f43def9c4bd (patch)
treeb81394387d93bde6079d59a6fe2c191ab4a5d05e
parent015870bfe1d3ec57c4505072f087b88fe63662b5 (diff)
Core/Spell: Jump Speed Calculations (#22886)
* Jump Speed Calculations * Fix
-rw-r--r--src/server/game/Spells/Spell.h1
-rw-r--r--src/server/game/Spells/SpellEffects.cpp31
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)