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 | |
parent | cdc09d29bc8fcb85d97846027ddf589478e21139 (diff) |
Core/Movement: Refactor jump speed calculation out of spell code
-rw-r--r-- | src/server/game/Entities/Unit/UnitDefines.h | 2 | ||||
-rw-r--r-- | src/server/game/Movement/MotionMaster.cpp | 21 | ||||
-rw-r--r-- | src/server/game/Movement/MotionMaster.h | 4 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 16 |
4 files changed, 27 insertions, 16 deletions
diff --git a/src/server/game/Entities/Unit/UnitDefines.h b/src/server/game/Entities/Unit/UnitDefines.h index 8918df59ec7..e7ffd0250ef 100644 --- a/src/server/game/Entities/Unit/UnitDefines.h +++ b/src/server/game/Entities/Unit/UnitDefines.h @@ -107,7 +107,7 @@ enum UnitPetFlag : uint8 DEFINE_ENUM_FLAG(UnitPetFlag); -enum UnitMoveType +enum UnitMoveType : uint8 { MOVE_WALK = 0, MOVE_RUN = 1, 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() diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index 1716fb1a589..326d166dd0e 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -37,6 +37,7 @@ struct Position; struct SplineChainLink; struct SplineChainResumeInfo; struct WaypointPath; +enum UnitMoveType : uint8; namespace Movement { @@ -199,6 +200,9 @@ class TC_GAME_API MotionMaster void MoveFormation(Unit* leader, float range, float angle, uint32 point1, uint32 point2); void LaunchMoveSpline(std::function<void(Movement::MoveSplineInit& init)>&& initializer, uint32 id = 0, MovementGeneratorPriority priority = MOTION_PRIORITY_NORMAL, MovementGeneratorType type = EFFECT_MOTION_TYPE); + + void CalculateJumpSpeeds(float dist, UnitMoveType moveType, float speedMultiplier, float minHeight, float maxHeight, float& speedXY, float& speedZ) const; + private: typedef std::unique_ptr<MovementGenerator, MovementGeneratorDeleter> MovementGeneratorPointer; typedef std::multiset<MovementGenerator*, MovementGeneratorComparator> MotionMasterContainer; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index e2aca6adda0..f731304766e 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -830,29 +830,15 @@ void Spell::CalculateJumpSpeeds(SpellEffectInfo const* effInfo, float dist, floa { Unit* unitCaster = GetUnitCasterForEffectHandlers(); ASSERT(unitCaster); - 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 - height = Movement::gravity * durationSqr / 8; - speedZ = std::sqrt(2 * Movement::gravity * height); + unitCaster->GetMotionMaster()->CalculateJumpSpeeds(dist, MOVE_RUN, multiplier, minHeight, maxHeight, speedXY, speedZ); } void Spell::EffectJump() |