111 lines
2.9 KiB
Lua
111 lines
2.9 KiB
Lua
|
|
Crouched = false
|
||
|
|
CrouchedForce = false
|
||
|
|
Aimed = false
|
||
|
|
LastCam = 0
|
||
|
|
Cooldown = false
|
||
|
|
|
||
|
|
CoolDownTime = 500 -- in ms
|
||
|
|
|
||
|
|
NormalWalk = function()
|
||
|
|
local Player = PlayerPedId()
|
||
|
|
SetPedMaxMoveBlendRatio(Player, 1.0)
|
||
|
|
ResetPedMovementClipset(Player, 0.55)
|
||
|
|
ResetPedStrafeClipset(Player)
|
||
|
|
SetPedCanPlayAmbientAnims(Player, true)
|
||
|
|
SetPedCanPlayAmbientBaseAnims(Player, true)
|
||
|
|
ResetPedWeaponMovementClipset(Player)
|
||
|
|
Crouched = false
|
||
|
|
end
|
||
|
|
|
||
|
|
SetupCrouch = function()
|
||
|
|
while not HasAnimSetLoaded('move_ped_crouched') do
|
||
|
|
Citizen.Wait(5)
|
||
|
|
RequestAnimSet('move_ped_crouched')
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
CanCrouch = function()
|
||
|
|
local PlayerPed = PlayerPedId()
|
||
|
|
if IsPedOnFoot(PlayerPed) and not IsPedJumping(PlayerPed) and not IsPedFalling(PlayerPed) and not IsPedDeadOrDying(PlayerPed) then
|
||
|
|
return true
|
||
|
|
else
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
CrouchPlayer = function()
|
||
|
|
local Player = PlayerPedId()
|
||
|
|
SetPedUsingActionMode(Player, false, -1, "DEFAULT_ACTION")
|
||
|
|
SetPedMovementClipset(Player, 'move_ped_crouched', 0.55)
|
||
|
|
SetPedStrafeClipset(Player, 'move_ped_crouched_strafing') -- it force be on third person if not player will freeze but this func make player can shoot with good anim on crouch if someone know how to fix this make request :D
|
||
|
|
SetWeaponAnimationOverride(Player, "Ballistic")
|
||
|
|
Crouched = true
|
||
|
|
Aimed = false
|
||
|
|
end
|
||
|
|
|
||
|
|
SetPlayerAimSpeed = function()
|
||
|
|
local Player = PlayerPedId()
|
||
|
|
SetPedMaxMoveBlendRatio(Player, 0.2)
|
||
|
|
Aimed = true
|
||
|
|
end
|
||
|
|
|
||
|
|
IsPlayerFreeAimed = function()
|
||
|
|
local Player = PlayerPedId()
|
||
|
|
local PlayerID = GetPlayerIndex()
|
||
|
|
if IsPlayerFreeAiming(PlayerID) or IsAimCamActive() or IsAimCamThirdPersonActive() then
|
||
|
|
return true
|
||
|
|
else
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
Citizen.CreateThread( function()
|
||
|
|
SetupCrouch()
|
||
|
|
while true do
|
||
|
|
DisableControlAction(0, 36, true) -- DISABLE DUCK and this make 0.01 and some time 0.02 but always left control will disable
|
||
|
|
-- SetPedStealthMovement(PlayerPedId(), false, "DEFAULT_ACTION") -- DISABLE DUCK But make script idle 0.02
|
||
|
|
|
||
|
|
if CrouchedForce then
|
||
|
|
local CanDo = CanCrouch()
|
||
|
|
if CanDo and Crouched and IsPlayerFreeAimed() then
|
||
|
|
SetPlayerAimSpeed()
|
||
|
|
elseif CanDo and (not Crouched or Aimed) then
|
||
|
|
CrouchPlayer()
|
||
|
|
elseif not CanDo and Crouched then
|
||
|
|
CrouchedForce = false
|
||
|
|
NormalWalk()
|
||
|
|
end
|
||
|
|
local NowCam = GetFollowPedCamViewMode()
|
||
|
|
if CanDo and Crouched and NowCam == 4 then
|
||
|
|
SetFollowPedCamViewMode(LastCam)
|
||
|
|
elseif CanDo and Crouched and NowCam ~= 4 then
|
||
|
|
LastCam = NowCam
|
||
|
|
end
|
||
|
|
elseif Crouched then
|
||
|
|
NormalWalk()
|
||
|
|
end
|
||
|
|
|
||
|
|
Citizen.Wait(5)
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
|
||
|
|
RegisterCommand('crouch', function()
|
||
|
|
if not Cooldown then
|
||
|
|
CrouchedForce = not CrouchedForce
|
||
|
|
Cooldown = true
|
||
|
|
SetTimeout(CoolDownTime, function()
|
||
|
|
Cooldown = false
|
||
|
|
end)
|
||
|
|
end
|
||
|
|
end, false)
|
||
|
|
|
||
|
|
RegisterKeyMapping('crouch', 'Crouch', 'keyboard', 'LCONTROL') -- now its better player can change to any bottom they want
|
||
|
|
|
||
|
|
|
||
|
|
-- Exports --
|
||
|
|
IsCrouched = function()
|
||
|
|
return Crouched
|
||
|
|
end
|
||
|
|
|
||
|
|
exports("IsCrouched", IsCrouched)
|