From 2f25e0490918bda5f918388bfd2ab23a5021c7ee Mon Sep 17 00:00:00 2001 From: Skoader Date: Sat, 1 Dec 2012 22:40:26 -0500 Subject: [PATCH] Fix controlled flight bug fControlledFlight state should be handled outside of the physics step. --- .../plAvatar/plPhysicalControllerCore.cpp | 23 +++++++++++-------- .../plAvatar/plPhysicalControllerCore.h | 4 +++- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/Sources/Plasma/PubUtilLib/plAvatar/plPhysicalControllerCore.cpp b/Sources/Plasma/PubUtilLib/plAvatar/plPhysicalControllerCore.cpp index af69775b..bb15544e 100644 --- a/Sources/Plasma/PubUtilLib/plAvatar/plPhysicalControllerCore.cpp +++ b/Sources/Plasma/PubUtilLib/plAvatar/plPhysicalControllerCore.cpp @@ -503,15 +503,6 @@ void plWalkingStrategy::Update(float delSecs) fImpactVelocity = (hsVector3)fController->GetLocalRotation().Rotate(&fImpactVelocity); fClearImpact = false; } - - if (fControlledFlight != 0) - { - if (IsOnGround()) - fControlledFlightTime = fTimeInAir; - - if (fControlledFlightTime > kControlledFlightThreshold) - EnableControlledFlight(false); - } } void plWalkingStrategy::AddContactNormals(hsVector3& vec) @@ -535,6 +526,20 @@ void plWalkingStrategy::Reset(bool newAge) } } +void plWalkingStrategy::RecalcVelocity(double timeNow, float elapsed, bool useAnim) +{ + if (fControlledFlight != 0) + { + if (IsOnGround()) + fControlledFlightTime = fTimeInAir; + + if (fControlledFlightTime > kControlledFlightThreshold) + EnableControlledFlight(false); + } + + plAnimatedMovementStrategy::RecalcVelocity(timeNow, elapsed, useAnim); +} + bool plWalkingStrategy::EnableControlledFlight(bool status) { if (status) diff --git a/Sources/Plasma/PubUtilLib/plAvatar/plPhysicalControllerCore.h b/Sources/Plasma/PubUtilLib/plAvatar/plPhysicalControllerCore.h index 808a6702..97af7f48 100644 --- a/Sources/Plasma/PubUtilLib/plAvatar/plPhysicalControllerCore.h +++ b/Sources/Plasma/PubUtilLib/plAvatar/plPhysicalControllerCore.h @@ -214,7 +214,7 @@ public: plAnimatedMovementStrategy(plAGApplicator* rootApp, plPhysicalControllerCore* controller); virtual ~plAnimatedMovementStrategy() { } - void RecalcVelocity(double timeNow, float elapsed, bool useAnim = true); + virtual void RecalcVelocity(double timeNow, float elapsed, bool useAnim = true); void SetTurnStrength(float val) { fTurnStr = val; } float GetTurnStrength() const { return fTurnStr; } @@ -240,6 +240,8 @@ public: virtual void AddContactNormals(hsVector3& vec); virtual void Reset(bool newAge); + virtual void RecalcVelocity(double timeNow, float elapsed, bool useAnim = true); + bool HitGroundInThisAge() const { return fHitGroundInThisAge; } bool IsOnGround() const { return fTimeInAir < kAirTimeThreshold || fFalseGround; }