@@ -231,12 +231,16 @@ void CClientPed::Init(CClientManager* pManager, unsigned long ulModelID, bool bI
231231 m_MovementStateNames[MOVEMENTSTATE_JOG] = " jog" ;
232232 m_MovementStateNames[MOVEMENTSTATE_SPRINT] = " sprint" ;
233233 m_MovementStateNames[MOVEMENTSTATE_CROUCH] = " crouch" ;
234- // These two are inactive for now
235234 m_MovementStateNames[MOVEMENTSTATE_CRAWL] = " crawl" ;
236235 m_MovementStateNames[MOVEMENTSTATE_ROLL] = " roll" ;
237236 m_MovementStateNames[MOVEMENTSTATE_JUMP] = " jump" ;
238237 m_MovementStateNames[MOVEMENTSTATE_FALL] = " fall" ;
239238 m_MovementStateNames[MOVEMENTSTATE_CLIMB] = " climb" ;
239+ m_MovementStateNames[MOVEMENTSTATE_SWIM] = " swim" ;
240+ m_MovementStateNames[MOVEMENTSTATE_WALK_TO_POINT] = " walk_to_point" ;
241+ m_MovementStateNames[MOVEMENTSTATE_ASCENT_JETPACK] = " ascent_jetpack" ;
242+ m_MovementStateNames[MOVEMENTSTATE_DESCENT_JETPACK] = " descent_jetpack" ;
243+ m_MovementStateNames[MOVEMENTSTATE_JETPACK] = " jetpack_flying" ;
240244
241245 // Create the player model
242246 if (m_bIsLocalPlayer)
@@ -2422,53 +2426,63 @@ eMovementState CClientPed::GetMovementState()
24222426 const char * szComplexTaskName = GetTaskManager ()->GetActiveTask ()->GetTaskName ();
24232427 const char * szSimpleTaskName = GetTaskManager ()->GetSimplestActiveTask ()->GetTaskName ();
24242428
2425- // Is he climbing?
2426- if (strcmp (szSimpleTaskName, " TASK_SIMPLE_CLIMB" ) == 0 )
2429+ // Check tasks
2430+ if (strcmp (szSimpleTaskName, " TASK_SIMPLE_CLIMB" ) == 0 ) // Is he climbing?
24272431 return MOVEMENTSTATE_CLIMB;
2428-
2429- // Is he jumping?
2430- else if (strcmp (szComplexTaskName, " TASK_COMPLEX_JUMP" ) == 0 )
2432+ else if (strcmp (szComplexTaskName, " TASK_COMPLEX_JUMP" ) == 0 ) // Is he jumping?
24312433 return MOVEMENTSTATE_JUMP;
2434+ else if (strcmp (szSimpleTaskName, " TASK_SIMPLE_GO_TO_POINT" ) == 0 ) // Entering vehicle (walking to the doors)?
2435+ return MOVEMENTSTATE_WALK_TO_POINT;
2436+ else if (strcmp (szSimpleTaskName, " TASK_SIMPLE_SWIM" ) == 0 ) // Is he swimming?
2437+ return MOVEMENTSTATE_SWIM;
2438+ else if (strcmp (szSimpleTaskName, " TASK_SIMPLE_JETPACK" ) == 0 ) // Is he flying?
2439+ {
2440+ if (cs.ButtonCross != 0 )
2441+ return MOVEMENTSTATE_ASCENT_JETPACK;
2442+ else if (cs.ButtonSquare != 0 )
2443+ return MOVEMENTSTATE_DESCENT_JETPACK;
2444+ else
2445+ return MOVEMENTSTATE_JETPACK;
2446+ }
24322447
2433- // Is he falling?
2434- else if (!IsOnGround () && !GetContactEntity ())
2448+ // Check movement state
2449+ if (!IsOnGround () && !GetContactEntity () && !m_pPlayerPed-> IsStandingOnEntity () && !m_pPlayerPed-> IsInWater () && ( strcmp (szSimpleTaskName, " TASK_SIMPLE_IN_AIR " ) == 0 || strcmp (szSimpleTaskName, " TASK_SIMPLE_FALL " ) == 0 )) // Is he falling?
24352450 return MOVEMENTSTATE_FALL;
24362451
2437- // Grab his controller state
2438- bool bWalkKey = false ;
2439- if (GetType () == CCLIENTPLAYER)
2440- bWalkKey = CClientPad::GetControlState (" walk" , cs, true );
2441- else
2442- m_Pad.GetControlState (" walk" , bWalkKey);
2452+ // Sometimes it returns 'fall' or 'walk', so it's better to return false instead
2453+ if (IsEnteringVehicle () || IsLeavingVehicle ())
2454+ return MOVEMENTSTATE_UNKNOWN;
24432455
2444- // Is he standing up?
24452456 if (!IsDucked ())
24462457 {
2447- unsigned int iRunState = m_pPlayerPed->GetRunState ();
2458+ bool walking = false ;
2459+ if (GetType () == CCLIENTPLAYER)
2460+ walking = CClientPad::GetControlState (" walk" , cs, true );
2461+ else
2462+ m_Pad.GetControlState (" walk" , walking);
24482463
2449- // Is he moving the contoller at all?
2450- if (iRunState == 1 && cs.LeftStickX == 0 && cs.LeftStickY == 0 )
2451- return MOVEMENTSTATE_STAND;
2452-
2453- // Is he either pressing the walk key, or has run state 1?
2454- if (iRunState == 1 || bWalkKey && iRunState == 6 )
2455- return MOVEMENTSTATE_WALK;
2456- else if (iRunState == 4 )
2457- return MOVEMENTSTATE_POWERWALK;
2458- else if (iRunState == 6 )
2459- return MOVEMENTSTATE_JOG;
2460- else if (iRunState == 7 )
2461- return MOVEMENTSTATE_SPRINT;
2464+ switch (m_pPlayerPed->GetMoveState ())
2465+ {
2466+ case PedMoveState::PEDMOVE_STILL:
2467+ return MOVEMENTSTATE_STAND;
2468+ case PedMoveState::PEDMOVE_WALK:
2469+ return (cs.LeftStickX == 0 && cs.LeftStickY == 0 ) ? MOVEMENTSTATE_STAND : MOVEMENTSTATE_WALK;
2470+ case PedMoveState::PEDMOVE_SPRINT:
2471+ return MOVEMENTSTATE_SPRINT;
2472+ case PedMoveState::PEDMOVE_RUN:
2473+ return walking ? MOVEMENTSTATE_WALK : MOVEMENTSTATE_JOG; // FileEX: It should be MOVEMENTSTATE_RUN, but we're keeping JOG for backward compatibility (PEDMOVE_JOG is unused in SA)
2474+ }
24622475 }
24632476 else
24642477 {
24652478 // Is he moving the contoller at all?
24662479 if (cs.LeftStickX == 0 && cs.LeftStickY == 0 )
24672480 return MOVEMENTSTATE_CROUCH;
24682481 else
2469- return MOVEMENTSTATE_CRAWL;
2482+ return (cs. LeftStickX != 0 && cs. RightShoulder1 != 0 ) ? MOVEMENTSTATE_ROLL : MOVEMENTSTATE_CRAWL;
24702483 }
24712484 }
2485+
24722486 return MOVEMENTSTATE_UNKNOWN;
24732487}
24742488
@@ -6098,7 +6112,7 @@ bool CClientPed::ShouldBeStealthAiming()
60986112 {
60996113 // We need to be either crouched, walking or standing
61006114 SBindableGTAControl* pWalkControl = pKeyBinds->GetBindableFromControl (" walk" );
6101- if (m_pPlayerPed->GetRunState () == 1 || m_pPlayerPed->GetRunState () == 4 || pWalkControl && pWalkControl->bState )
6115+ if (m_pPlayerPed->GetMoveState () == PedMoveState::PEDMOVE_STILL || m_pPlayerPed->GetMoveState () == PedMoveState::PEDMOVE_WALK || pWalkControl && pWalkControl->bState )
61026116 {
61036117 // Do we have a target ped?
61046118 CClientPed* pTargetPed = GetTargetedPed ();
0 commit comments