296 lines
9.9 KiB
Lua
296 lines
9.9 KiB
Lua
|
local QBCore = exports['qb-core']:GetCoreObject()
|
||
|
local BagOnHead = false
|
||
|
local isZiptied = false
|
||
|
local OGOutfit = {}
|
||
|
|
||
|
--! ^ Dont Touch ^ !--
|
||
|
|
||
|
|
||
|
--==FUNCTIONS==--
|
||
|
|
||
|
local function loadAnimDict(dict)
|
||
|
while (not HasAnimDictLoaded(dict)) do
|
||
|
RequestAnimDict(dict)
|
||
|
Wait(10)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function GetZiptiedAnimation(playerId)
|
||
|
local ped = PlayerPedId()
|
||
|
local ziptier = GetPlayerPed(GetPlayerFromServerId(playerId))
|
||
|
local heading = GetEntityHeading(ziptier)
|
||
|
TriggerServerEvent("InteractSound_SV:PlayOnSource", "Cuff", 0.2)
|
||
|
loadAnimDict("mp_arrest_paired")
|
||
|
SetEntityCoords(ped, GetOffsetFromEntityInWorldCoords(ziptier, 0.0, 0.45, 0.0))
|
||
|
|
||
|
Wait(100)
|
||
|
SetEntityHeading(ped, heading)
|
||
|
TaskPlayAnim(ped, "mp_arrest_paired", "crook_p2_back_right", 3.0, 3.0, -1, 32, 0, 0, 0, 0 ,true, true, true)
|
||
|
Wait(2500)
|
||
|
end
|
||
|
|
||
|
local function ZiptieAnimation()
|
||
|
local ped = PlayerPedId()
|
||
|
|
||
|
TriggerServerEvent("InteractSound_SV:PlayOnSource", "Cuff", 0.2)
|
||
|
|
||
|
|
||
|
loadAnimDict("mp_arrest_paired")
|
||
|
Wait(100)
|
||
|
TaskPlayAnim(ped, "mp_arrest_paired", "cop_p2_back_right", 3.0, 3.0, -1, 48, 0, 0, 0, 0)
|
||
|
TriggerServerEvent("InteractSound_SV:PlayOnSource", "Cuff", 0.2)
|
||
|
Wait(3500)
|
||
|
TaskPlayAnim(ped, "mp_arrest_paired", "exit", 3.0, 3.0, -1, 48, 0, 0, 0, 0)
|
||
|
end
|
||
|
|
||
|
local function BagWiggle()
|
||
|
TriggerEvent('Crazy:Client:BagWiggle')
|
||
|
end
|
||
|
--==END OF FUNCTIONS==--
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
--==HEAD BAG SECTION==--
|
||
|
RegisterNetEvent('Crazy:Client:UseHeadBag', function()
|
||
|
local Target = QBCore.Functions.GetClosestPlayer()
|
||
|
local TargetId = GetPlayerServerId(Target)
|
||
|
local TargetPed = GetPlayerPed(Target)
|
||
|
local HasBag = QBCore.Functions.HasItem('headbag')
|
||
|
|
||
|
if not IsEntityPlayingAnim(TargetPed, "mp_arresting", "idle", 3) then return QBCore.Functions.Notify(Lang:t('error.cant_bag'), 'error', 3000) end
|
||
|
if not HasBag then return QBCore.Functions.Notify(Lang:t('error.missing_item'), 'error', 3000) end
|
||
|
TriggerServerEvent('Crazy:Server:PutBagOn', TargetId)
|
||
|
CrazyBagOff = exports['qb-radialmenu']:AddOption({
|
||
|
id = 'crzbagoff',
|
||
|
title = 'Remove Bag',
|
||
|
icon = 'mask',
|
||
|
type = 'client',
|
||
|
event = 'Crazy:Client:BagOff',
|
||
|
shouldClose = true,
|
||
|
})
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('Crazy:Client:GetBagOnHead', function(TargetId) -- Other Player
|
||
|
local ped = PlayerPedId()
|
||
|
QBCore.Functions.Notify(Lang:t('info.bagged'), 'primary', 3000)
|
||
|
DoScreenFadeOut(0)
|
||
|
BagOnHead = true -- unused atm
|
||
|
OGOutfit.draw = GetPedDrawableVariation(PlayerPedId(), 1)
|
||
|
OGOutfit.tex = GetPedTextureVariation(PlayerPedId(), 1)
|
||
|
SetPedComponentVariation(PlayerPedId(), 1, Config.BagSelection, Config.BagTexture, 0)
|
||
|
|
||
|
CrazyTakeBagOff = exports['qb-radialmenu']:AddOption({
|
||
|
id = 'crazy-takebagoff',
|
||
|
title = 'Take Off Head Covering',
|
||
|
icon = 'mask',
|
||
|
type = 'client',
|
||
|
event = 'Crazy:Client:TakeBagOff',
|
||
|
shouldClose = true
|
||
|
})
|
||
|
SetTimeout((Config.BagFallOffWait * 60000), BagWiggle)
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('Crazy:Client:BagOff', function()
|
||
|
local Target = QBCore.Functions.GetClosestPlayer()
|
||
|
local TargetId = GetPlayerServerId(Target)
|
||
|
|
||
|
TriggerServerEvent('Crazy:Server:BagOff', TargetId)
|
||
|
exports['qb-radialmenu']:RemoveOption(CrazyBagOff)
|
||
|
CrazyBagOff = nil
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('Crazy:Client:GetBagOff', function(TargetId) -- Other Player
|
||
|
QBCore.Functions.Notify(Lang:t('released.bag_off'), 'success', 3000)
|
||
|
DoScreenFadeIn(0)
|
||
|
SetPedComponentVariation(PlayerPedId(), 1, OGOutfit.draw, OGOutfit.tex, 0)
|
||
|
exports['qb-radialmenu']:RemoveOption(CrazyTakeBagOff)
|
||
|
CrazyTakeBagOff = nil
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('Crazy:Client:TakeBagOff', function() -- Self
|
||
|
QBCore.Functions.Notify(Lang:t('released.bag_off'), 'success', 3000)
|
||
|
DoScreenFadeIn(0)
|
||
|
SetPedComponentVariation(PlayerPedId(), 1, OGOutfit.draw, OGOutfit.tex, 0)
|
||
|
exports['qb-radialmenu']:RemoveOption(CrazyTakeBagOff)
|
||
|
CrazyTakeBagOff = nil
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('Crazy:Client:BagWiggle', function() -- Self
|
||
|
QBCore.Functions.Notify(Lang:t('released.wigglebag'), 'success', 3000)
|
||
|
DoScreenFadeIn(0)
|
||
|
SetPedComponentVariation(PlayerPedId(), 1, OGOutfit.draw, OGOutfit.tex, 0)
|
||
|
end)
|
||
|
--==END OF HEAD BAG SECTION==--
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
--==ZIPTIE SECTION==--
|
||
|
RegisterNetEvent('Crazy:Client:UseZiptie', function()
|
||
|
local HasZiptie = QBCore.Functions.HasItem('ziptie')
|
||
|
local Player = QBCore.Functions.GetClosestPlayer()
|
||
|
local TargetId = GetPlayerServerId(Player)
|
||
|
local TargetPed = GetPlayerPed(Player)
|
||
|
|
||
|
if not HasZiptie then return QBCore.Functions.Notify(Lang:t('error.missing_item'), 'error', 3000) end
|
||
|
if (not IsEntityPlayingAnim(TargetPed, "missminuteman_1ig_2", "handsup_base", 3)) or isZiptied then return QBCore.Functions.Notify(Lang:t('error.cant_zip'), 'error', 3000) end
|
||
|
|
||
|
if not IsPedRagdoll(PlayerPedId()) then
|
||
|
if Player ~= -1 then
|
||
|
local PlayerId = GetPlayerServerId(Player)
|
||
|
if not IsPedInAnyVehicle(GetPlayerPed(Player)) and not IsPedInAnyVehicle(PlayerPedId()) then
|
||
|
TriggerServerEvent("Crazy:Server:ZiptiePlayer", PlayerId)
|
||
|
ZiptieAnimation()
|
||
|
else
|
||
|
QBCore.Functions.Notify("error.vehicle_zip", "error")
|
||
|
end
|
||
|
else
|
||
|
QBCore.Functions.Notify("error.none_nearby", "error")
|
||
|
end
|
||
|
else
|
||
|
Wait(2000)
|
||
|
end
|
||
|
CrazyZipOff = exports['qb-radialmenu']:AddOption({
|
||
|
id = 'crzzipoff',
|
||
|
title = 'Cut Ziptie',
|
||
|
icon = 'hands-bound',
|
||
|
type = 'client',
|
||
|
event = 'Crazy:Client:ZipOff',
|
||
|
shouldClose = true,
|
||
|
})
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('Crazy:Client:GetZiptied', function(playerId) -- Other Player
|
||
|
local ped = PlayerPedId()
|
||
|
if not isZiptied then
|
||
|
isZiptied = true
|
||
|
TriggerServerEvent("police:server:SetHandcuffStatus", isZiptied)
|
||
|
ClearPedTasksImmediately(ped)
|
||
|
if GetSelectedPedWeapon(ped) ~= `WEAPON_UNARMED` then
|
||
|
SetCurrentPedWeapon(ped, `WEAPON_UNARMED`, true)
|
||
|
end
|
||
|
GetZiptiedAnimation(playerId)
|
||
|
|
||
|
cuffType = 49
|
||
|
QBCore.Functions.Notify(Lang:t('info.wiggle'), 'primary')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('Crazy:Client:ZipOff', function()
|
||
|
local Target, Distance = QBCore.Functions.GetClosestPlayer()
|
||
|
local TargetId = GetPlayerServerId(Target)
|
||
|
|
||
|
local HasItems = QBCore.Functions.HasItem(Config.UnZipItems)
|
||
|
if not HasItems then return QBCore.Functions.Notify(Lang:t('error.no_zip_item'), 'error', 3000) end
|
||
|
|
||
|
if Distance > 2.5 then return end
|
||
|
TriggerServerEvent('Crazy:Server:UnZiptie', TargetId)
|
||
|
ZiptieAnimation()
|
||
|
exports['qb-radialmenu']:RemoveOption(CrazyZipOff)
|
||
|
CrazyZipOff = nil
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('Crazy:Client:GetUnZiptied', function(TargetId) -- Other Player
|
||
|
local Ped = PlayerPedId()
|
||
|
if isZiptied then
|
||
|
GetZiptiedAnimation(TargetId)
|
||
|
isZiptied = false
|
||
|
TriggerServerEvent("police:server:SetHandcuffStatus", isZiptied)
|
||
|
ClearPedTasksImmediately(Ped)
|
||
|
end
|
||
|
QBCore.Functions.Notify(Lang:t('released.zipoff'), 'success', 3000)
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('Crazy:Client:ZiptieWiggle', function()
|
||
|
local Player = PlayerPedId()
|
||
|
isZiptied = false
|
||
|
TriggerServerEvent("police:server:SetHandcuffStatus", false)
|
||
|
ClearPedTasksImmediately(Player)
|
||
|
QBCore.Functions.Notify(Lang:t('released.wigglezip'), 'success', 3000)
|
||
|
end)
|
||
|
|
||
|
--==END OF ZIPTIE SECTION==--
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
--==THREAD==--
|
||
|
local ReleaseSpam = 0
|
||
|
CreateThread(function()
|
||
|
while true do
|
||
|
Wait(1)
|
||
|
if isZiptied then
|
||
|
DisableControlAction(0, 24, true) -- Attack
|
||
|
DisableControlAction(0, 257, true) -- Attack 2
|
||
|
DisableControlAction(0, 25, true) -- Aim
|
||
|
DisableControlAction(0, 263, true) -- Melee Attack 1
|
||
|
|
||
|
DisableControlAction(0, 45, true) -- Reload
|
||
|
DisableControlAction(0, 22, true) -- Jump
|
||
|
DisableControlAction(0, 21, true) -- Sprint
|
||
|
DisableControlAction(0, 44, true) -- Cover
|
||
|
DisableControlAction(0, 37, true) -- Select Weapon
|
||
|
DisableControlAction(0, 23, true) -- Also 'enter'?
|
||
|
|
||
|
DisableControlAction(0, 288, true) -- Disable phone
|
||
|
DisableControlAction(0, 289, true) -- Inventory
|
||
|
DisableControlAction(0, 170, true) -- Animations
|
||
|
DisableControlAction(0, 167, true) -- Job
|
||
|
|
||
|
DisableControlAction(0, 26, true) -- Disable looking behind
|
||
|
DisableControlAction(0, 73, true) -- Disable clearing animation
|
||
|
DisableControlAction(2, 199, true) -- Disable pause screen
|
||
|
|
||
|
DisableControlAction(0, 59, true) -- Disable steering in vehicle
|
||
|
DisableControlAction(0, 71, true) -- Disable driving forward in vehicle
|
||
|
DisableControlAction(0, 72, true) -- Disable reversing in vehicle
|
||
|
|
||
|
DisableControlAction(2, 36, true) -- Disable going stealth
|
||
|
|
||
|
DisableControlAction(0, 264, true) -- Disable melee
|
||
|
DisableControlAction(0, 257, true) -- Disable melee
|
||
|
DisableControlAction(0, 140, true) -- Disable melee
|
||
|
DisableControlAction(0, 141, true) -- Disable melee
|
||
|
DisableControlAction(0, 142, true) -- Disable melee
|
||
|
DisableControlAction(0, 143, true) -- Disable melee
|
||
|
DisableControlAction(0, 75, true) -- Disable exit vehicle
|
||
|
DisableControlAction(27, 75, true) -- Disable exit vehicle
|
||
|
EnableControlAction(0, 249, true) -- Added for talking while cuffed
|
||
|
EnableControlAction(0, 46, true) -- Added for talking while cuffed
|
||
|
|
||
|
if (not IsEntityPlayingAnim(PlayerPedId(), "mp_arresting", "idle", 3) and not IsEntityPlayingAnim(PlayerPedId(), "mp_arrest_paired", "crook_p2_back_right", 3)) and not QBCore.Functions.GetPlayerData().metadata["isdead"] then
|
||
|
loadAnimDict("mp_arresting")
|
||
|
TaskPlayAnim(PlayerPedId(), "mp_arresting", "idle", 8.0, -8, -1, cuffType, 0, 0, 0, 0)
|
||
|
end
|
||
|
|
||
|
if IsControlJustPressed(0, 29) then
|
||
|
ReleaseSpam += 1
|
||
|
if ReleaseSpam == Config.ZiptieWiggleAmount then
|
||
|
TriggerEvent('Crazy:Client:ZiptieWiggle')
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
if not isZiptied then
|
||
|
Wait(2000)
|
||
|
end
|
||
|
end
|
||
|
end)
|