@@ -231,12 +231,16 @@ void CClientPed::Init(CClientManager* pManager, unsigned long ulModelID, bool bI
231
231
m_MovementStateNames[MOVEMENTSTATE_JOG] = " jog" ;
232
232
m_MovementStateNames[MOVEMENTSTATE_SPRINT] = " sprint" ;
233
233
m_MovementStateNames[MOVEMENTSTATE_CROUCH] = " crouch" ;
234
- // These two are inactive for now
235
234
m_MovementStateNames[MOVEMENTSTATE_CRAWL] = " crawl" ;
236
235
m_MovementStateNames[MOVEMENTSTATE_ROLL] = " roll" ;
237
236
m_MovementStateNames[MOVEMENTSTATE_JUMP] = " jump" ;
238
237
m_MovementStateNames[MOVEMENTSTATE_FALL] = " fall" ;
239
238
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" ;
240
244
241
245
// Create the player model
242
246
if (m_bIsLocalPlayer)
@@ -2420,53 +2424,63 @@ eMovementState CClientPed::GetMovementState()
2420
2424
const char * szComplexTaskName = GetTaskManager ()->GetActiveTask ()->GetTaskName ();
2421
2425
const char * szSimpleTaskName = GetTaskManager ()->GetSimplestActiveTask ()->GetTaskName ();
2422
2426
2423
- // Is he climbing?
2424
- if (strcmp (szSimpleTaskName, " TASK_SIMPLE_CLIMB" ) == 0 )
2427
+ // Check tasks
2428
+ if (strcmp (szSimpleTaskName, " TASK_SIMPLE_CLIMB" ) == 0 ) // Is he climbing?
2425
2429
return MOVEMENTSTATE_CLIMB;
2426
-
2427
- // Is he jumping?
2428
- else if (strcmp (szComplexTaskName, " TASK_COMPLEX_JUMP" ) == 0 )
2430
+ else if (strcmp (szComplexTaskName, " TASK_COMPLEX_JUMP" ) == 0 ) // Is he jumping?
2429
2431
return MOVEMENTSTATE_JUMP;
2432
+ else if (strcmp (szSimpleTaskName, " TASK_SIMPLE_GO_TO_POINT" ) == 0 ) // Entering vehicle (walking to the doors)?
2433
+ return MOVEMENTSTATE_WALK_TO_POINT;
2434
+ else if (strcmp (szSimpleTaskName, " TASK_SIMPLE_SWIM" ) == 0 ) // Is he swimming?
2435
+ return MOVEMENTSTATE_SWIM;
2436
+ else if (strcmp (szSimpleTaskName, " TASK_SIMPLE_JETPACK" ) == 0 ) // Is he flying?
2437
+ {
2438
+ if (cs.ButtonCross != 0 )
2439
+ return MOVEMENTSTATE_ASCENT_JETPACK;
2440
+ else if (cs.ButtonSquare != 0 )
2441
+ return MOVEMENTSTATE_DESCENT_JETPACK;
2442
+ else
2443
+ return MOVEMENTSTATE_JETPACK;
2444
+ }
2430
2445
2431
- // Is he falling?
2432
- else if (!IsOnGround () && !GetContactEntity ())
2446
+ // Check movement state
2447
+ 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?
2433
2448
return MOVEMENTSTATE_FALL;
2434
2449
2435
- // Grab his controller state
2436
- bool bWalkKey = false ;
2437
- if (GetType () == CCLIENTPLAYER)
2438
- bWalkKey = CClientPad::GetControlState (" walk" , cs, true );
2439
- else
2440
- m_Pad.GetControlState (" walk" , bWalkKey);
2450
+ // Sometimes it returns 'fall' or 'walk', so it's better to return false instead
2451
+ if (IsEnteringVehicle () || IsLeavingVehicle ())
2452
+ return MOVEMENTSTATE_UNKNOWN;
2441
2453
2442
- // Is he standing up?
2443
2454
if (!IsDucked ())
2444
2455
{
2445
- unsigned int iRunState = m_pPlayerPed->GetRunState ();
2456
+ bool walking = false ;
2457
+ if (GetType () == CCLIENTPLAYER)
2458
+ walking = CClientPad::GetControlState (" walk" , cs, true );
2459
+ else
2460
+ m_Pad.GetControlState (" walk" , walking);
2446
2461
2447
- // Is he moving the contoller at all?
2448
- if (iRunState == 1 && cs.LeftStickX == 0 && cs.LeftStickY == 0 )
2449
- return MOVEMENTSTATE_STAND;
2450
-
2451
- // Is he either pressing the walk key, or has run state 1?
2452
- if (iRunState == 1 || bWalkKey && iRunState == 6 )
2453
- return MOVEMENTSTATE_WALK;
2454
- else if (iRunState == 4 )
2455
- return MOVEMENTSTATE_POWERWALK;
2456
- else if (iRunState == 6 )
2457
- return MOVEMENTSTATE_JOG;
2458
- else if (iRunState == 7 )
2459
- return MOVEMENTSTATE_SPRINT;
2462
+ switch (m_pPlayerPed->GetMoveState ())
2463
+ {
2464
+ case PedMoveState::PEDMOVE_STILL:
2465
+ return MOVEMENTSTATE_STAND;
2466
+ case PedMoveState::PEDMOVE_WALK:
2467
+ return (cs.LeftStickX == 0 && cs.LeftStickY == 0 ) ? MOVEMENTSTATE_STAND : MOVEMENTSTATE_WALK;
2468
+ case PedMoveState::PEDMOVE_SPRINT:
2469
+ return MOVEMENTSTATE_SPRINT;
2470
+ case PedMoveState::PEDMOVE_RUN:
2471
+ 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)
2472
+ }
2460
2473
}
2461
2474
else
2462
2475
{
2463
2476
// Is he moving the contoller at all?
2464
2477
if (cs.LeftStickX == 0 && cs.LeftStickY == 0 )
2465
2478
return MOVEMENTSTATE_CROUCH;
2466
2479
else
2467
- return MOVEMENTSTATE_CRAWL;
2480
+ return (cs. LeftStickX != 0 && cs. RightShoulder1 != 0 ) ? MOVEMENTSTATE_ROLL : MOVEMENTSTATE_CRAWL;
2468
2481
}
2469
2482
}
2483
+
2470
2484
return MOVEMENTSTATE_UNKNOWN;
2471
2485
}
2472
2486
@@ -6119,7 +6133,7 @@ bool CClientPed::ShouldBeStealthAiming()
6119
6133
{
6120
6134
// We need to be either crouched, walking or standing
6121
6135
SBindableGTAControl* pWalkControl = pKeyBinds->GetBindableFromControl (" walk" );
6122
- if (m_pPlayerPed->GetRunState () == 1 || m_pPlayerPed->GetRunState () == 4 || pWalkControl && pWalkControl->bState )
6136
+ if (m_pPlayerPed->GetMoveState () == PedMoveState::PEDMOVE_STILL || m_pPlayerPed->GetMoveState () == PedMoveState::PEDMOVE_WALK || pWalkControl && pWalkControl->bState )
6123
6137
{
6124
6138
// Do we have a target ped?
6125
6139
CClientPed* pTargetPed = GetTargetedPed ();
0 commit comments