/// <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);
            }
        }
Exemple #2
0
        /// <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);
            }
        }