/// <summary> /// Trigger player crawling animation /// </summary> /// <param name="movementDirection">fwd or bwd movement</param> /// <param name="proneState">on front or on back prone state</param> private async void Crawl(Movements movementDirection, ProneStates proneState) { try { var proneStateStr = proneState == ProneStates.OnFront ? "onfront" : "onback"; string movementStr; if (proneState == ProneStates.OnFront) { movementStr = movementDirection == Movements.Forward ? "fwd" : "bwd"; } else { movementStr = movementDirection == Movements.Forward ? "bwd" : "fwd"; } var animStr = string.Concat(proneStateStr, "_", movementStr); Game.PlayerPed.Task.ClearAnimation("move_crawl", animStr); await Game.PlayerPed.Task.PlayAnimation("move_crawl", animStr, 8f, -8f, -1, (AnimationFlags)2, 0); } catch (Exception ex) { Log.Error(ex); } await Task.FromResult(0); }
/// <summary> /// Trigger player prone animation /// </summary> /// <param name="proneState">on front or on back prone state</param> private void GoProne(ProneStates proneState) { try { var playerPed = Game.PlayerPed; if (_proneState != _prevProneState) { playerPed.Heading = playerPed.Heading + 180f; _prevProneState = _proneState; } var animName = proneState == ProneStates.OnFront ? "onfront_fwd" : "onback_fwd"; var position = Game.PlayerPed.Position; var rotation = Game.PlayerPed.Rotation; const float animStartTime = 1000f; const int animFlags = (int)AnimationFlags.StayInEndFrame; API.TaskPlayAnimAdvanced(playerPed.Handle, "move_crawl", animName, position.X, position.Y, position.Z, rotation.X, rotation.Y, rotation.Z, 8f, -8f, -1, animFlags, animStartTime, 2, 0); } 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> /// Handle prone front/back toggle /// </summary> private static void HandleProneStateToggle() { try { if (!Game.IsControlJustPressed(0, ProneFrontBackControl)) { return; } if (_lastBodyFlip >= Game.GameTime - 1000) { return; } _lastBodyFlip = Game.GameTime; _proneState = _proneState == ProneStates.OnFront ? ProneStates.OnBack : ProneStates.OnFront; GoProne(_proneState); } catch (Exception ex) { Log.Error(ex); } }