/// <summary> /// Handle state changes /// </summary> private async Task AdvanceState() { try { Game.PlayerPed.Task.ClearAll(); CancelCrouch(); switch (State) { case StanceStates.Idle: State = StanceStates.Stealth; break; case StanceStates.Stealth: API.RequestClipSet("move_ped_crouched"); while (!API.HasClipSetLoaded("move_ped_crouched")) { API.RequestClipSet("move_ped_crouched"); await BaseScript.Delay(0); } if (_isCrouchBlocked) { State = StanceStates.Idle; return; } State = StanceStates.Crouch; break; case StanceStates.Crouch: if (_isProneBlocked) { State = StanceStates.Idle; return; } await TransitionToProneState(); break; case StanceStates.Prone: TransitionProneToIdle(); State = StanceStates.Idle; break; default: Log.Error("Entered unused default stance state."); break; } await Task.FromResult(0); } catch (Exception ex) { Log.Error(ex); } }
/// <summary> /// Initialize class /// </summary> public static void Init() { try { API.RequestAnimDict("move_Prone"); State = StanceStates.Idle; Client.ActiveInstance.RegisterTickHandler(OnTick); Client.ActiveInstance.RegisterTickHandler(ModifyStance); } catch (Exception ex) { Log.Error(ex); } }
/// <summary> /// Initialize class /// </summary> public Stance(Client client) : base(client) { try { API.RequestAnimDict("move_Prone"); State = StanceStates.Idle; client.RegisterTickHandler(OnTick); client.RegisterTickHandler(ModifyStance); } catch (Exception ex) { Log.Error(ex); } }
/// <summary> /// Transition to prone state /// </summary> private async Task TransitionToProneState() { try { var playerPed = Game.PlayerPed; State = StanceStates.Prone; _proneAimActive = false; _proneState = ProneStates.OnFront; _prevProneState = ProneStates.OnFront; _prevWeapon = Game.PlayerPed.Weapons.Current.Hash; if (playerPed.IsRunning || playerPed.IsSprinting) { playerPed.Task.ClearAll(); _diveActive = true; await playerPed.Task.PlayAnimation("move_jump", "dive_start_run", 8f, -8f, -1, AnimationFlags.RagdollOnCollision, 0); //This is the ideal delay to make animation look good. Do not change. await BaseScript.Delay(1100); _diveActive = false; } if (playerPed.IsRagdoll) { State = StanceStates.Idle; } else { if (API.IsPedArmed(playerPed.Handle, 4)) { API.TaskAimGunScripted(playerPed.Handle, (uint)API.GetHashKey("SCRIPTED_GUN_TASK_PLANE_WING"), true, true); } else { await playerPed.Task.PlayAnimation("move_crawl", "onfront_fwd", 8f, -8f, -1, (AnimationFlags)2, 0); } } await Task.FromResult(0); } catch (Exception ex) { Log.Error(ex); } }
/// <summary> /// Stance OnTick /// </summary> private async Task OnTick() { try { switch (State) { case StanceStates.Idle: { ResetAnimations(); } break; case StanceStates.Stealth: { } break; case StanceStates.Crouch: { var playerPed = Game.PlayerPed; //if (playerPed.IsInStealthMode) //State = StanceStates.Stealth; const int firstPersonView = 4; if (API.GetFollowPedCamViewMode() == firstPersonView) { API.SetFollowPedCamViewMode(0); } API.DisableFirstPersonCamThisFrame(); DisableStealthControl(); if (IsCrouchStateCancelled() || _isCrouchBlocked) { State = StanceStates.Idle; break; } API.SetPedMovementClipset(playerPed.Handle, "move_ped_crouched", 1); API.SetPedStrafeClipset(playerPed.Handle, "move_ped_crouched_strafing"); } break; case StanceStates.Prone: { DisableStealthControl(); if (_diveActive) { break; } if (IsProneStateCancelled() || _isProneBlocked) { State = StanceStates.Idle; break; } HandleProneStateToggle(); HandleProneAim(); await HandleProneWeaponChange(); if (_proneAimActive) { break; } await ProneMovement(); } break; default: await BaseScript.Delay(MsPerS); break; } } catch (Exception ex) { Log.Error(ex); } await BaseScript.Delay(0); }
/// <summary> /// Handle stance changes /// </summary> private async Task ModifyStance() { try { if (LocalSession == null) { return; } var playerPed = Game.PlayerPed; var arrestInstance = Client.Get <Arrest>(); if (arrestInstance == null) { return; } if (arrestInstance.CurrentCuffState != CuffState.None || API.IsPedUsingAnyScenario(playerPed.Handle) || API.IsEntityPlayingAnim(playerPed.Handle, "mp_arresting", "idle", 3) || API.IsEntityPlayingAnim(playerPed.Handle, "random@mugging3", "handsup_standing_base", 3) || API.IsEntityPlayingAnim(playerPed.Handle, "random@arrests@busted", "idle_a", 3) || Game.IsControlJustPressed(2, CancleToIdleControl) || playerPed.IsInVehicle() || playerPed.IsInWater || playerPed.IsSwimming || playerPed.IsSwimmingUnderWater || playerPed.VehicleTryingToEnter != null) { if (State == StanceStates.Crouch) { CancelCrouch(); State = StanceStates.Idle; } else if (State == StanceStates.Prone) { await AdvanceState(); } return; } if (Game.IsControlJustPressed(2, StanceControl)) { _holdStateToggleActive = false; _lastKeyPress = Game.GameTime; } else if (Game.IsControlPressed(2, StanceControl)) { if (!_isProneBlocked) { if (_lastKeyPress < Game.GameTime - 200) { _holdStateToggleActive = true; if (State == StanceStates.Idle || State == StanceStates.Stealth || State == StanceStates.Crouch) { await TransitionToProneState(); } } } } else if (Game.IsControlJustReleased(0, StanceControl)) { if (_lastKeyPress >= Game.GameTime - 10) { return; } _lastKeyPress = Game.GameTime; if (!_holdStateToggleActive) { await AdvanceState(); } } await Task.FromResult(0); } catch (Exception ex) { Log.Error(ex); } }