891 lines
24 KiB
Lua
891 lines
24 KiB
Lua
--[[
|
|
Cops_FiveM - A cops script for FiveM RP servers.
|
|
Copyright (C) 2018 FiveM-Scripts
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU Affero General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU Affero General Public License for more details.
|
|
You should have received a copy of the GNU Affero General Public License
|
|
along with Cops_FiveM in the file "LICENSE". If not, see <http://www.gnu.org/licenses/>.
|
|
]]
|
|
|
|
--
|
|
--Local variables : Please do not touch theses variables
|
|
--
|
|
|
|
if(config.useCopWhitelist == true) then
|
|
isCop = false
|
|
else
|
|
isCop = true
|
|
end
|
|
|
|
local firstSpawn = true
|
|
local isInService = false
|
|
local policeHeli = nil
|
|
local handCuffed = false
|
|
local isAlreadyDead = false
|
|
local allServiceCops = {}
|
|
local blipsCops = {}
|
|
local drag = false
|
|
local officerDrag = -1
|
|
|
|
rank = -1
|
|
|
|
anyMenuOpen = {
|
|
menuName = "",
|
|
isActive = false
|
|
}
|
|
|
|
SpawnedSpikes = {}
|
|
|
|
--
|
|
--Events handlers
|
|
--
|
|
|
|
AddEventHandler("playerSpawned", function()
|
|
if config.useCopWhitelist then
|
|
TriggerServerEvent("police:checkIsCop")
|
|
else
|
|
isCop = true
|
|
TriggerServerEvent("police:checkIsCop")
|
|
load_armory()
|
|
load_garage()
|
|
end
|
|
|
|
if firstSpawn then
|
|
TriggerServerEvent("police:GetPayChecks")
|
|
firstSpawn = false
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('police:receiveIsCop')
|
|
AddEventHandler('police:receiveIsCop', function(svrank, svdept)
|
|
if(svrank == -1) then
|
|
if(config.useCopWhitelist == true) then
|
|
isCop = false
|
|
else
|
|
isCop = true
|
|
rank = 0
|
|
dept = 1
|
|
|
|
load_armory()
|
|
load_garage()
|
|
end
|
|
else
|
|
isCop = true
|
|
rank = svrank
|
|
dept = svdept
|
|
if(isInService) then --and config.enableOutfits
|
|
if(GetEntityModel(PlayerPedId()) == GetHashKey("mp_m_freemode_01")) then
|
|
SetPedComponentVariation(PlayerPedId(), 10, 8, config.rank.outfit_badge[rank], 2)
|
|
else
|
|
SetPedComponentVariation(PlayerPedId(), 10, 7, config.rank.outfit_badge[rank], 2)
|
|
end
|
|
end
|
|
|
|
load_armory()
|
|
load_garage()
|
|
end
|
|
end)
|
|
|
|
if(config.useCopWhitelist == true) then
|
|
RegisterNetEvent('police:nowCop')
|
|
AddEventHandler('police:nowCop', function()
|
|
isCop = true
|
|
end)
|
|
end
|
|
|
|
RegisterNetEvent('police:Update')
|
|
AddEventHandler('police:Update', function(boolState)
|
|
local data = GetResourceMetadata(GetCurrentResourceName(), 'resource_fname', 0)
|
|
|
|
if boolState then
|
|
DisplayNotificationLabel("FMMC_ENDVERC1", "~y~" .. data .. "~s~")
|
|
end
|
|
end)
|
|
|
|
if(config.useCopWhitelist == true) then
|
|
RegisterNetEvent('police:noLongerCop')
|
|
AddEventHandler('police:noLongerCop', function()
|
|
if(config.useCopWhitelist == true) then
|
|
isCop = false
|
|
end
|
|
|
|
isInService = false
|
|
|
|
if(config.enableOutfits == true) then
|
|
RemoveAllPedWeapons(PlayerPedId())
|
|
TriggerServerEvent("skin_customization:SpawnPlayer")
|
|
else
|
|
local model = GetHashKey("a_m_y_mexthug_01")
|
|
|
|
RequestModel(model)
|
|
while not HasModelLoaded(model) do
|
|
Citizen.Wait(0)
|
|
end
|
|
|
|
SetPlayerModel(PlayerId(), model)
|
|
SetModelAsNoLongerNeeded(model)
|
|
RemoveAllPedWeapons(PlayerPedId())
|
|
end
|
|
|
|
if(policeHeli ~= nil) then
|
|
SetEntityAsMissionEntity(policeHeli, true, true)
|
|
Citizen.InvokeNative(0xEA386986E786A54F, Citizen.PointerValueIntInitialized(policeHeli))
|
|
policeHeli = nil
|
|
end
|
|
|
|
ServiceOff()
|
|
end)
|
|
end
|
|
|
|
RegisterNetEvent('police:getArrested')
|
|
AddEventHandler('police:getArrested', function()
|
|
handCuffed = not handCuffed
|
|
if(handCuffed) then
|
|
TriggerEvent("police:notify", "CHAR_AGENT14", 1, i18n.translate("title_notification"), false, i18n.translate("now_cuffed"))
|
|
else
|
|
TriggerEvent("police:notify", "CHAR_AGENT14", 1, i18n.translate("title_notification"), false, i18n.translate("now_uncuffed"))
|
|
cuffing = false
|
|
drag = false
|
|
ClearPedTasksImmediately(PlayerPedId())
|
|
end
|
|
end)
|
|
|
|
--Inspired from emergency for request system (by Jyben : https://forum.fivem.net/t/release-job-save-people-be-a-hero-paramedic-emergency-coma-ko/19773)
|
|
local lockAskingFine = false
|
|
RegisterNetEvent('police:payFines')
|
|
AddEventHandler('police:payFines', function(amount, sender)
|
|
Citizen.CreateThread(function()
|
|
|
|
if(lockAskingFine ~= true) then
|
|
lockAskingFine = true
|
|
local notifReceivedAt = GetGameTimer()
|
|
Notification(i18n.translate("info_fine_request_before_amount")..amount..i18n.translate("info_fine_request_after_amount"))
|
|
while(true) do
|
|
Wait(0)
|
|
|
|
if (GetTimeDifference(GetGameTimer(), notifReceivedAt) > 15000) then
|
|
TriggerServerEvent('police:finesETA', sender, 2)
|
|
Notification(i18n.translate("request_fine_expired"))
|
|
lockAskingFine = false
|
|
break
|
|
end
|
|
|
|
if IsControlPressed(1, config.bindings.accept_fine) then
|
|
TriggerServerEvent('bank:withdraw', amount)
|
|
Notification(i18n.translate("pay_fine_success_before_amount")..amount..i18n.translate("pay_fine_success_after_amount"))
|
|
TriggerServerEvent('police:finesETA', sender, 0)
|
|
lockAskingFine = false
|
|
break
|
|
end
|
|
|
|
if IsControlPressed(1, config.bindings.refuse_fine) then
|
|
TriggerServerEvent('police:finesETA', sender, 3)
|
|
lockAskingFine = false
|
|
break
|
|
end
|
|
end
|
|
else
|
|
TriggerServerEvent('police:finesETA', sender, 1)
|
|
end
|
|
end)
|
|
end)
|
|
|
|
RegisterNetEvent('police:receivePaycheck')
|
|
AddEventHandler('police:receivePaycheck', function(amount)
|
|
if amount then
|
|
local _, currentValue = StatGetInt("BANK_BALANCE", -1)
|
|
local value = math.floor(amount + currentValue)
|
|
|
|
StatSetInt("BANK_BALANCE", value, true)
|
|
ShowHudComponentThisFrame(4)
|
|
end
|
|
end)
|
|
|
|
-- Copy/paste from fs_freemode (by FiveM-Script: https://github.com/FiveM-Scripts/fs_freemode)
|
|
|
|
RegisterNetEvent("police:notify")
|
|
AddEventHandler("police:notify", function(icon, type, sender, title, text)
|
|
SetNotificationTextEntry("STRING")
|
|
AddTextComponentString(text)
|
|
SetNotificationMessage(icon, icon, true, type, sender, title, text)
|
|
DrawNotification(false, true)
|
|
end)
|
|
|
|
--Piece of code given by Thefoxeur54
|
|
RegisterNetEvent('police:unseatme')
|
|
AddEventHandler('police:unseatme', function(t)
|
|
local ped = GetPlayerPed(t)
|
|
ClearPedTasksImmediately(ped)
|
|
plyPos = GetEntityCoords(PlayerPedId(), true)
|
|
local xnew = plyPos.x+2
|
|
local ynew = plyPos.y+2
|
|
|
|
SetEntityCoords(PlayerPedId(), xnew, ynew, plyPos.z)
|
|
end)
|
|
|
|
RegisterNetEvent('police:toggleDrag')
|
|
AddEventHandler('police:toggleDrag', function(t)
|
|
if(handCuffed) then
|
|
drag = not drag
|
|
officerDrag = t
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('police:forcedEnteringVeh')
|
|
AddEventHandler('police:forcedEnteringVeh', function(veh)
|
|
if(handCuffed) then
|
|
local pos = GetEntityCoords(PlayerPedId())
|
|
local entityWorld = GetOffsetFromEntityInWorldCoords(PlayerPedId(), 0.0, 20.0, 0.0)
|
|
|
|
local rayHandle = CastRayPointToPoint(pos.x, pos.y, pos.z, entityWorld.x, entityWorld.y, entityWorld.z, 10, PlayerPedId(), 0)
|
|
local _, _, _, _, vehicleHandle = GetRaycastResult(rayHandle)
|
|
|
|
if vehicleHandle ~= nil then
|
|
if(IsVehicleSeatFree(vehicleHandle, 1)) then
|
|
SetPedIntoVehicle(PlayerPedId(), vehicleHandle, 1)
|
|
else
|
|
if(IsVehicleSeatFree(vehicleHandle, 2)) then
|
|
SetPedIntoVehicle(PlayerPedId(), vehicleHandle, 2)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('police:removeWeapons')
|
|
AddEventHandler('police:removeWeapons', function()
|
|
RemoveAllPedWeapons(PlayerPedId(), true)
|
|
end)
|
|
|
|
if(config.enableOtherCopsBlips == true) then
|
|
RegisterNetEvent('police:resultAllCopsInService')
|
|
AddEventHandler('police:resultAllCopsInService', function(array)
|
|
allServiceCops = array
|
|
enableCopBlips()
|
|
end)
|
|
end
|
|
|
|
--
|
|
--Functions
|
|
--
|
|
|
|
function Notification(msg)
|
|
SetNotificationTextEntry("STRING")
|
|
AddTextComponentString(msg)
|
|
DrawNotification(0,1)
|
|
end
|
|
|
|
function drawNotification(text)
|
|
SetNotificationTextEntry("STRING")
|
|
AddTextComponentString(text)
|
|
DrawNotification(false, false)
|
|
end
|
|
|
|
function DisplayNotificationLabel(label, sublabel)
|
|
SetNotificationTextEntry(label)
|
|
if sublabel then
|
|
AddTextComponentSubstringPlayerName(sublabel)
|
|
end
|
|
|
|
DrawNotification(true, true)
|
|
end
|
|
|
|
--From Player Blips and Above Head Display (by Scammer : https://forum.fivem.net/t/release-scammers-script-collection-09-03-17/3313)
|
|
function enableCopBlips()
|
|
for k, existingBlip in pairs(blipsCops) do
|
|
RemoveBlip(existingBlip)
|
|
end
|
|
blipsCops = {}
|
|
|
|
local localIdCops = {}
|
|
for _, player in ipairs(GetActivePlayers()) do
|
|
if(GetPlayerPed(player) ~= PlayerPedId()) then
|
|
for i,c in pairs(allServiceCops) do
|
|
if(i == GetPlayerServerId(player)) then
|
|
localIdCops[player] = c
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
for id, c in pairs(localIdCops) do
|
|
local ped = GetPlayerPed(id)
|
|
local blip = GetBlipFromEntity(ped)
|
|
|
|
if not DoesBlipExist(blip) then
|
|
blip = AddBlipForEntity(ped)
|
|
SetBlipSprite(blip, 1)
|
|
Citizen.InvokeNative( 0x5FBCA48327B914DF, blip, true)
|
|
HideNumberOnBlip( blip)
|
|
SetBlipNameToPlayerName(blip, id)
|
|
|
|
SetBlipScale(blip, 0.85)
|
|
SetBlipAlpha(blip, 255)
|
|
|
|
table.insert(blipsCops, blip)
|
|
else
|
|
blipSprite = GetBlipSprite(blip)
|
|
|
|
HideNumberOnBlip(blip)
|
|
if blipSprite ~= 1 then
|
|
SetBlipSprite(blip, 1)
|
|
Citizen.InvokeNative(0x5FBCA48327B914DF, blip, true)
|
|
end
|
|
|
|
SetBlipNameToPlayerName(blip, id)
|
|
SetBlipScale(blip, 0.85)
|
|
SetBlipAlpha(blip, 255)
|
|
|
|
table.insert(blipsCops, blip)
|
|
end
|
|
end
|
|
end
|
|
|
|
function GetPlayers()
|
|
local players = {}
|
|
|
|
for _, player in ipairs(GetActivePlayers()) do
|
|
if NetworkIsPlayerActive(player) then
|
|
table.insert(players, player)
|
|
end
|
|
end
|
|
|
|
return players
|
|
end
|
|
|
|
function GetClosestPlayer()
|
|
local players = GetPlayers()
|
|
local closestDistance = -1
|
|
local closestPlayer = -1
|
|
local ply = PlayerPedId()
|
|
local plyCoords = GetEntityCoords(ply, 0)
|
|
|
|
for index,value in ipairs(players) do
|
|
local target = GetPlayerPed(value)
|
|
if(target ~= ply) then
|
|
local targetCoords = GetEntityCoords(GetPlayerPed(value), 0)
|
|
local distance = Vdist(targetCoords["x"], targetCoords["y"], targetCoords["z"], plyCoords["x"], plyCoords["y"], plyCoords["z"])
|
|
if(closestDistance == -1 or closestDistance > distance) then
|
|
closestPlayer = value
|
|
closestDistance = distance
|
|
end
|
|
end
|
|
end
|
|
|
|
return closestPlayer, closestDistance
|
|
end
|
|
|
|
function drawTxt(text,font,centre,x,y,scale,r,g,b,a)
|
|
SetTextFont(font)
|
|
SetTextProportional(0)
|
|
SetTextScale(scale, scale)
|
|
SetTextColour(r, g, b, a)
|
|
SetTextDropShadow(0, 0, 0, 0,255)
|
|
SetTextEdge(1, 0, 0, 0, 255)
|
|
SetTextDropShadow()
|
|
SetTextOutline()
|
|
SetTextCentre(centre)
|
|
SetTextEntry("STRING")
|
|
AddTextComponentString(text)
|
|
DrawText(x, y)
|
|
end
|
|
|
|
function isNearTakeService()
|
|
local distance = 10000
|
|
local pos = {}
|
|
for i = 1, #clockInStation do
|
|
local coords = GetEntityCoords(PlayerPedId(), 0)
|
|
local currentDistance = Vdist(clockInStation[i].x, clockInStation[i].y, clockInStation[i].z, coords.x, coords.y, coords.z)
|
|
if(currentDistance < distance) then
|
|
distance = currentDistance
|
|
pos = clockInStation[i]
|
|
end
|
|
end
|
|
|
|
if anyMenuOpen.menuName == "cloackroom" and anyMenuOpen.isActive and distance > 3 then
|
|
CloseMenu()
|
|
end
|
|
|
|
if(distance < 30) then
|
|
if anyMenuOpen.menuName ~= "cloackroom" and not anyMenuOpen.isActive then
|
|
DrawMarker(1, pos.x, pos.y, pos.z-1, 0, 0, 0, 0, 0, 0, 1.0, 1.0, 1.0, 0, 155, 255, 200, 0, 0, 2, 0, 0, 0, 0)
|
|
end
|
|
end
|
|
|
|
if(distance < 2) then
|
|
return true
|
|
end
|
|
end
|
|
|
|
function isNearStationGarage()
|
|
local distance = 10000
|
|
local pos = {}
|
|
for i = 1, #garageStation do
|
|
local coords = GetEntityCoords(PlayerPedId(), 0)
|
|
local currentDistance = Vdist(garageStation[i].x, garageStation[i].y, garageStation[i].z, coords.x, coords.y, coords.z)
|
|
if(currentDistance < distance) then
|
|
distance = currentDistance
|
|
pos = garageStation[i]
|
|
end
|
|
end
|
|
|
|
if anyMenuOpen.menuName == "garage" and anyMenuOpen.isActive and distance > 5 then
|
|
CloseMenu()
|
|
end
|
|
|
|
if(distance < 30) then
|
|
if anyMenuOpen.menuName ~= "garage" and not anyMenuOpen.isActive then
|
|
DrawMarker(1, pos.x, pos.y, pos.z-1, 0, 0, 0, 0, 0, 0, 2.0, 2.0, 1.0, 0, 155, 255, 200, 0, 0, 2, 0, 0, 0, 0)
|
|
end
|
|
end
|
|
|
|
if(distance < 2) then
|
|
return true
|
|
end
|
|
end
|
|
|
|
function isNearHelicopterStation()
|
|
local distance = 10000
|
|
local pos = {}
|
|
for i = 1, #heliStation do
|
|
local coords = GetEntityCoords(PlayerPedId(), 0)
|
|
local currentDistance = Vdist(heliStation[i].x, heliStation[i].y, heliStation[i].z, coords.x, coords.y, coords.z)
|
|
if(currentDistance < distance) then
|
|
distance = currentDistance
|
|
pos = heliStation[i]
|
|
end
|
|
end
|
|
|
|
if(distance < 30) then
|
|
DrawMarker(1, pos.x, pos.y, pos.z-1, 0, 0, 0, 0, 0, 0, 2.5, 2.5, 1.0, 0, 155, 255, 200, 0, 0, 2, 0, 0, 0, 0)
|
|
end
|
|
if(distance < 2) then
|
|
return true
|
|
end
|
|
end
|
|
|
|
function isNearArmory()
|
|
local distance = 10000
|
|
local pos = {}
|
|
for i = 1, #armoryStation do
|
|
local coords = GetEntityCoords(PlayerPedId(), 0)
|
|
local currentDistance = Vdist(armoryStation[i].x, armoryStation[i].y, armoryStation[i].z, coords.x, coords.y, coords.z)
|
|
if(currentDistance < distance) then
|
|
distance = currentDistance
|
|
pos = armoryStation[i]
|
|
end
|
|
end
|
|
|
|
if (anyMenuOpen.menuName == "armory" or anyMenuOpen.menuName == "armory-weapon_list") and anyMenuOpen.isActive and distance > 2 then
|
|
CloseMenu()
|
|
end
|
|
if(distance < 30) then
|
|
DrawMarker(1, pos.x, pos.y, pos.z-1, 0, 0, 0, 0, 0, 0, 1.0, 1.0, 1.0, 0, 155, 255, 200, 0, 0, 2, 0, 0, 0, 0)
|
|
end
|
|
if(distance < 2) then
|
|
return true
|
|
end
|
|
end
|
|
|
|
function ServiceOn()
|
|
isInService = true
|
|
TriggerServerEvent("police:takeService")
|
|
end
|
|
|
|
function ServiceOff()
|
|
isInService = false
|
|
TriggerServerEvent("police:breakService")
|
|
|
|
if config.enableOtherCopsBlips == true then
|
|
allServiceCops = {}
|
|
|
|
for k, existingBlip in pairs(blipsCops) do
|
|
RemoveBlip(existingBlip)
|
|
end
|
|
blipsCops = {}
|
|
end
|
|
end
|
|
|
|
function DisplayHelpText(str)
|
|
BeginTextCommandDisplayHelp("STRING")
|
|
AddTextComponentSubstringPlayerName(str)
|
|
EndTextCommandDisplayHelp(0, 0, 1, -1)
|
|
end
|
|
|
|
function CloseMenu()
|
|
SendNUIMessage({
|
|
action = "close"
|
|
})
|
|
|
|
anyMenuOpen.menuName = ""
|
|
anyMenuOpen.isActive = false
|
|
end
|
|
|
|
RegisterNUICallback('sendAction', function(data, cb)
|
|
_G[data.action](data.params)
|
|
cb('ok')
|
|
end)
|
|
|
|
--
|
|
--Threads
|
|
--
|
|
|
|
local alreadyDead = false
|
|
local playerStillDragged = false
|
|
|
|
Citizen.CreateThread(function()
|
|
DoScreenFadeIn(100)
|
|
local gxt = "fmmc"
|
|
local CurrentSlot = 0
|
|
|
|
while HasAdditionalTextLoaded(CurrentSlot) and not HasThisAdditionalTextLoaded(gxt, CurrentSlot) do
|
|
Wait(1)
|
|
CurrentSlot = CurrentSlot + 1
|
|
end
|
|
|
|
if not HasThisAdditionalTextLoaded(gxt, CurrentSlot) then
|
|
ClearAdditionalText(CurrentSlot, true)
|
|
RequestAdditionalText(gxt, CurrentSlot)
|
|
while not HasThisAdditionalTextLoaded(gxt, CurrentSlot) do
|
|
Wait(0)
|
|
end
|
|
end
|
|
|
|
RequestAnimDict('mp_arresting')
|
|
while not HasAnimDictLoaded('mp_arresting') do
|
|
Citizen.Wait(50)
|
|
end
|
|
|
|
if not IsIplActive("FIBlobby") then
|
|
RequestIpl("FIBlobbyfake")
|
|
end
|
|
|
|
TriggerServerEvent("police:checkIsCop")
|
|
|
|
if config.enableNeverWanted then
|
|
SetMaxWantedLevel(0)
|
|
SetWantedLevelMultiplier(0.0)
|
|
else
|
|
SetMaxWantedLevel(5)
|
|
SetWantedLevelMultiplier(1.0)
|
|
end
|
|
|
|
if config.stationBlipsEnabled then
|
|
for _, item in pairs(clockInStation) do
|
|
item.blip = AddBlipForCoord(item.x, item.y, item.z)
|
|
SetBlipSprite(item.blip, 60)
|
|
SetBlipScale(item.blip, 1.0)
|
|
SetBlipColour(item.blip, 38)
|
|
SetBlipAsShortRange(item.blip, true)
|
|
end
|
|
end
|
|
|
|
while true do
|
|
Citizen.Wait(5)
|
|
DisablePlayerVehicleRewards(PlayerId())
|
|
|
|
if(anyMenuOpen.isActive) then
|
|
DisableControlAction(1, 21)
|
|
DisableControlAction(1, 140)
|
|
DisableControlAction(1, 141)
|
|
DisableControlAction(1, 142)
|
|
|
|
SetDisableAmbientMeleeMove(PlayerPedId(), true)
|
|
|
|
if (IsControlJustPressed(1,172)) then
|
|
SendNUIMessage({
|
|
action = "keyup"
|
|
})
|
|
PlaySoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", true)
|
|
elseif (IsControlJustPressed(1,173)) then
|
|
SendNUIMessage({
|
|
action = "keydown"
|
|
})
|
|
PlaySoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", true)
|
|
elseif (anyMenuOpen.menuName == "cloackroom") then
|
|
if IsControlJustPressed(1, 176) then
|
|
SendNUIMessage({
|
|
action = "keyenter"
|
|
})
|
|
|
|
PlaySoundFrontend(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET", true)
|
|
Citizen.Wait(500)
|
|
CloseMenu()
|
|
end
|
|
elseif (IsControlJustPressed(1,176)) then
|
|
SendNUIMessage({
|
|
action = "keyenter"
|
|
})
|
|
PlaySoundFrontend(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET", true)
|
|
elseif (IsControlJustPressed(1,177)) then
|
|
if(anyMenuOpen.menuName == "policemenu" or anyMenuOpen.menuName == "cloackroom" or anyMenuOpen.menuName == "garage") then
|
|
CloseMenu()
|
|
elseif(anyMenuOpen.menuName == "armory") then
|
|
CloseArmory()
|
|
elseif(anyMenuOpen.menuName == "armory-weapon_list") then
|
|
BackArmory()
|
|
else
|
|
BackMenuPolice()
|
|
end
|
|
end
|
|
else
|
|
EnableControlAction(1, 21)
|
|
EnableControlAction(1, 140)
|
|
EnableControlAction(1, 141)
|
|
EnableControlAction(1, 142)
|
|
end
|
|
|
|
--Control death events
|
|
if(config.useModifiedEmergency == false) then
|
|
if(IsPlayerDead(PlayerId())) then
|
|
if(alreadyDead == false) then
|
|
if(isInService) then
|
|
ServiceOff()
|
|
end
|
|
|
|
handCuffed = false
|
|
drag = false
|
|
alreadyDead = true
|
|
end
|
|
else
|
|
alreadyDead = false
|
|
end
|
|
end
|
|
|
|
if (handCuffed == true) then
|
|
local myPed = PlayerPedId()
|
|
local animation = 'idle'
|
|
local flags = 50
|
|
|
|
while IsPedBeingStunned(myPed, 0) do
|
|
ClearPedTasksImmediately(myPed)
|
|
end
|
|
|
|
DisableControlAction(1, 12, true)
|
|
DisableControlAction(1, 13, true)
|
|
DisableControlAction(1, 14, true)
|
|
|
|
DisableControlAction(1, 23, true)
|
|
DisableControlAction(1, 24, true)
|
|
|
|
DisableControlAction(1, 15, true)
|
|
DisableControlAction(1, 16, true)
|
|
DisableControlAction(1, 17, true)
|
|
|
|
if not cuffing then
|
|
SetCurrentPedWeapon(myPed, GetHashKey("WEAPON_UNARMED"), true)
|
|
RemoveAllPedWeapons(myPed, true)
|
|
cuffing = true
|
|
end
|
|
|
|
if not IsEntityPlayingAnim(myPed, "mp_arresting", animation, 3) then
|
|
TaskPlayAnim(myPed, "mp_arresting", animation, 8.0, -8.0, -1, flags, 0, 0, 0, 0 )
|
|
end
|
|
else
|
|
EnableControlAction(1, 12, false)
|
|
EnableControlAction(1, 13, false)
|
|
EnableControlAction(1, 14, false)
|
|
|
|
EnableControlAction(1, 23, false)
|
|
EnableControlAction(1, 24, false)
|
|
|
|
EnableControlAction(1, 15, false)
|
|
EnableControlAction(1, 16, false)
|
|
EnableControlAction(1, 17, false)
|
|
|
|
if IsEntityPlayingAnim(PlayerPedId(), "mp_arresting", "idle", 3) then
|
|
StopAnimTask(PlayerPedId(), "mp_arresting", animation, 3)
|
|
ClearPedTasksImmediately(PlayerPedId())
|
|
end
|
|
|
|
cuffing = false
|
|
end
|
|
|
|
--Piece of code from Drag command (by Frazzle, Valk, Michael_Sanelli, NYKILLA1127 : https://forum.fivem.net/t/release-drag-command/22174)
|
|
if drag then
|
|
local ped = GetPlayerPed(GetPlayerFromServerId(officerDrag))
|
|
local myped = PlayerPedId()
|
|
AttachEntityToEntity(myped, ped, 4103, 11816, 0.48, 0.00, 0.0, 0.0, 0.0, 0.0, false, false, false, false, 2, true)
|
|
playerStillDragged = true
|
|
else
|
|
if(playerStillDragged) then
|
|
DetachEntity(PlayerPedId(), true, false)
|
|
playerStillDragged = false
|
|
end
|
|
end
|
|
|
|
if config.enableNeverWanted then
|
|
if IsPlayerWantedLevelGreater(PlayerId(), 0) then
|
|
ClearPlayerWantedLevel(PlayerId())
|
|
end
|
|
end
|
|
|
|
if(isCop) then
|
|
if(isNearTakeService()) then
|
|
if not (anyMenuOpen.isActive) then
|
|
DisplayHelpText(i18n.translate("help_text_open_cloackroom") .. GetLabelText("collision_8vlv02g"),0,1,0.5,0.8,0.6,255,255,255,255)
|
|
if IsControlJustPressed(1,config.bindings.interact_position) then
|
|
load_cloackroom()
|
|
OpenCloackroom()
|
|
end
|
|
end
|
|
end
|
|
|
|
if(isInService) then
|
|
if(isNearStationGarage()) then
|
|
if(policevehicle ~= nil) then
|
|
if not (anyMenuOpen.isActive) then
|
|
DisplayHelpText(i18n.translate("help_text_put_car_into_garage"),0,1,0.5,0.8,0.6,255,255,255,255)
|
|
end
|
|
else
|
|
DisplayHelpText(i18n.translate("help_text_get_car_out_garage"),0,1,0.5,0.8,0.6,255,255,255,255)
|
|
end
|
|
|
|
if IsControlJustPressed(1,config.bindings.interact_position) then
|
|
if(policevehicle ~= nil) then
|
|
Citizen.InvokeNative(0xEA386986E786A54F, Citizen.PointerValueIntInitialized(policevehicle))
|
|
policevehicle = nil
|
|
else
|
|
OpenGarage()
|
|
end
|
|
end
|
|
end
|
|
|
|
--Open Armory menu
|
|
if(isNearArmory()) then
|
|
if not (anyMenuOpen.isActive) then
|
|
DisplayHelpText(i18n.translate("help_text_open_armory"),0,1,0.5,0.8,0.6,255,255,255,255)
|
|
|
|
if IsControlJustPressed(1,config.bindings.interact_position) then
|
|
Lx, Ly, Lz = table.unpack(GetEntityCoords(PlayerPedId(), true))
|
|
DoScreenFadeOut(500)
|
|
Wait(600)
|
|
|
|
SetEntityCoords(PlayerPedId(), 452.119966796875, -980.061966796875, 30.690966796875)
|
|
Wait(800)
|
|
armoryPed = createArmoryPed()
|
|
|
|
if not DoesCamExist(ArmoryRoomCam) then
|
|
ArmoryRoomCam = CreateCam("DEFAULT_SCRIPTED_FLY_CAMERA", true)
|
|
AttachCamToEntity(ArmoryRoomCam, PlayerPedId(), 0.0, 0.0, 1.0, true)
|
|
PointCamAtEntity(ArmoryRoomCam, armoryPed, 0.0, -30.0, 1.0, true)
|
|
|
|
SetCamRot(ArmoryRoomCam, 0.0,0.0, GetEntityHeading(PlayerPedId()))
|
|
SetCamFov(ArmoryRoomCam, 70.0)
|
|
end
|
|
|
|
Wait(100)
|
|
DoScreenFadeIn(500)
|
|
|
|
if DoesEntityExist(armoryPed) then
|
|
TaskTurnPedToFaceEntity(PlayerPedId(), armoryPed, -1)
|
|
end
|
|
|
|
Wait(300)
|
|
OpenArmory()
|
|
if not IsAmbientSpeechPlaying(armoryPed) then
|
|
PlayAmbientSpeechWithVoice(armoryPed, "WEPSEXPERT_GREETSHOPGEN", "WEPSEXP", "SPEECH_PARAMS_FORCE", 0)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if (anyMenuOpen.menuName == "armory") then
|
|
if DoesCamExist(ArmoryRoomCam) then
|
|
RenderScriptCams(true, 1, 1800, 1, 0)
|
|
end
|
|
end
|
|
|
|
if (IsControlJustPressed(1,config.bindings.use_police_menu)) then
|
|
load_menu()
|
|
TogglePoliceMenu()
|
|
end
|
|
|
|
if isNearHelicopterStation() then
|
|
if(policeHeli ~= nil) then
|
|
DisplayHelpText(i18n.translate("help_text_put_heli_into_garage"),0,1,0.5,0.8,0.6,255,255,255,255)
|
|
else
|
|
DisplayHelpText(i18n.translate("help_text_get_heli_out_garage"),0,1,0.5,0.8,0.6,255,255,255,255)
|
|
end
|
|
|
|
if IsControlJustPressed(1,config.bindings.interact_position) then
|
|
if(policeHeli ~= nil) then
|
|
Citizen.InvokeNative(0xEA386986E786A54F, Citizen.PointerValueIntInitialized(policeHeli))
|
|
policeHeli = nil
|
|
else
|
|
local heli = GetHashKey("polmav")
|
|
local ply = PlayerPedId()
|
|
local plyCoords = GetEntityCoords(ply, 0)
|
|
|
|
RequestModel(heli)
|
|
while not HasModelLoaded(heli) do
|
|
Citizen.Wait(0)
|
|
end
|
|
|
|
policeHeli = CreateVehicle(heli, plyCoords["x"], plyCoords["y"], plyCoords["z"], 90.0, true, false)
|
|
SetVehicleHasBeenOwnedByPlayer(policevehicle,true)
|
|
|
|
local netid = NetworkGetNetworkIdFromEntity(policeHeli)
|
|
SetNetworkIdCanMigrate(netid, true)
|
|
NetworkRegisterEntityAsNetworked(VehToNet(policeHeli))
|
|
|
|
SetVehicleLivery(policeHeli, 0)
|
|
TaskWarpPedIntoVehicle(ply, policeHeli, -1)
|
|
SetEntityAsMissionEntity(policeHeli, true, true)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
if config.enablePaychecks then
|
|
Citizen.CreateThread(function()
|
|
while true do
|
|
Wait(1600)
|
|
if GetClockHours() == 10 and GetClockMinutes() == 00 then
|
|
TriggerServerEvent("police:TransferPayCheck")
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
|
|
Citizen.CreateThread(function()
|
|
while true do
|
|
if drag then
|
|
local ped = GetPlayerPed(GetPlayerFromServerId(playerPedDragged))
|
|
plyPos = GetEntityCoords(ped, true)
|
|
SetEntityCoords(ped, plyPos.x, plyPos.y, plyPos.z)
|
|
end
|
|
Citizen.Wait(1000)
|
|
end
|
|
end)
|
|
|
|
Citizen.CreateThread(function()
|
|
while true do
|
|
Citizen.Wait(1)
|
|
if IsPedInAnyVehicle(PlayerPedId(), false) then
|
|
currentVeh = GetVehiclePedIsIn(PlayerPedId(), false)
|
|
x,y,z = table.unpack(GetEntityCoords(PlayerPedId(), true))
|
|
|
|
if DoesObjectOfTypeExistAtCoords(x, y, z, 0.9, GetHashKey("P_ld_stinger_s"), true) then
|
|
for i= 0, 7 do
|
|
SetVehicleTyreBurst(currentVeh, i, true, 1148846080)
|
|
end
|
|
|
|
Citizen.Wait(100)
|
|
DeleteSpike()
|
|
end
|
|
end
|
|
end
|
|
end)
|