aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-03-06 00:14:42 +0100
committerShauren <shauren.trinity@gmail.com>2023-03-06 00:14:42 +0100
commit705d5701bf17f1787d2646c55c994b0404659991 (patch)
tree37c31da9cd37d22743f32d0e9953182864cbcf0a
parentcdc09d29bc8fcb85d97846027ddf589478e21139 (diff)
Core/Movement: Refactor jump speed calculation out of spell code
-rw-r--r--src/server/game/Entities/Unit/UnitDefines.h2
-rw-r--r--src/server/game/Movement/MotionMaster.cpp21
-rw-r--r--src/server/game/Movement/MotionMaster.h4
-rw-r--r--src/server/game/Spells/SpellEffects.cpp16
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()