diff options
author | Shauren <shauren.trinity@gmail.com> | 2023-03-06 00:14:42 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2023-03-06 00:14:42 +0100 |
commit | 705d5701bf17f1787d2646c55c994b0404659991 (patch) | |
tree | 37c31da9cd37d22743f32d0e9953182864cbcf0a /src/server/game/Movement/MotionMaster.cpp | |
parent | cdc09d29bc8fcb85d97846027ddf589478e21139 (diff) |
Core/Movement: Refactor jump speed calculation out of spell code
Diffstat (limited to 'src/server/game/Movement/MotionMaster.cpp')
-rw-r--r-- | src/server/game/Movement/MotionMaster.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index b2bd73830ec..036182a5131 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -1123,6 +1123,27 @@ void MotionMaster::LaunchMoveSpline(std::function<void(Movement::MoveSplineInit& Add(movement); } +void MotionMaster::CalculateJumpSpeeds(float dist, UnitMoveType moveType, float speedMultiplier, float minHeight, float maxHeight, float& speedXY, float& speedZ) const +{ + float baseSpeed = _owner->IsControlledByPlayer() ? playerBaseMoveSpeed[moveType] : baseMoveSpeed[moveType]; + if (Creature* creature = _owner->ToCreature()) + baseSpeed *= creature->GetCreatureTemplate()->speed_run; + + speedXY = std::min(baseSpeed * 3.0f * speedMultiplier, std::max(28.0f, _owner->GetSpeed(moveType) * 4.0f)); + + float duration = dist / speedXY; + float durationSqr = duration * duration; + float height; + if (durationSqr < minHeight * 8 / Movement::gravity) + height = minHeight; + else if (durationSqr > maxHeight * 8 / Movement::gravity) + height = maxHeight; + else + height = Movement::gravity * durationSqr / 8; + + speedZ = std::sqrt(2 * Movement::gravity * height); +} + /******************** Private methods ********************/ void MotionMaster::ResolveDelayedActions() |