1155 lines
51 KiB
Lua
1155 lines
51 KiB
Lua
|
-- Variables
|
||
|
local Plates = {}
|
||
|
local PlayerStatus = {}
|
||
|
local Casings = {}
|
||
|
local BloodDrops = {}
|
||
|
local FingerDrops = {}
|
||
|
local Objects = {}
|
||
|
local QBCore = exports['qb-core']:GetCoreObject()
|
||
|
local updatingCops = false
|
||
|
|
||
|
-- Functions
|
||
|
local function UpdateBlips()
|
||
|
local dutyPlayers = {}
|
||
|
local players = QBCore.Functions.GetQBPlayers()
|
||
|
for _, v in pairs(players) do
|
||
|
if v and (v.PlayerData.job.name == "police" or v.PlayerData.job.name == "ambulance") and v.PlayerData.job.onduty then
|
||
|
local coords = GetEntityCoords(GetPlayerPed(v.PlayerData.source))
|
||
|
local heading = GetEntityHeading(GetPlayerPed(v.PlayerData.source))
|
||
|
dutyPlayers[#dutyPlayers+1] = {
|
||
|
source = v.PlayerData.source,
|
||
|
label = v.PlayerData.metadata["callsign"],
|
||
|
job = v.PlayerData.job.name,
|
||
|
location = {
|
||
|
x = coords.x,
|
||
|
y = coords.y,
|
||
|
z = coords.z,
|
||
|
w = heading
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
TriggerClientEvent("police:client:UpdateBlips", -1, dutyPlayers)
|
||
|
end
|
||
|
|
||
|
local function CreateBloodId()
|
||
|
if BloodDrops then
|
||
|
local bloodId = math.random(10000, 99999)
|
||
|
while BloodDrops[bloodId] do
|
||
|
bloodId = math.random(10000, 99999)
|
||
|
end
|
||
|
return bloodId
|
||
|
else
|
||
|
local bloodId = math.random(10000, 99999)
|
||
|
return bloodId
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function CreateFingerId()
|
||
|
if FingerDrops then
|
||
|
local fingerId = math.random(10000, 99999)
|
||
|
while FingerDrops[fingerId] do
|
||
|
fingerId = math.random(10000, 99999)
|
||
|
end
|
||
|
return fingerId
|
||
|
else
|
||
|
local fingerId = math.random(10000, 99999)
|
||
|
return fingerId
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function CreateCasingId()
|
||
|
if Casings then
|
||
|
local caseId = math.random(10000, 99999)
|
||
|
while Casings[caseId] do
|
||
|
caseId = math.random(10000, 99999)
|
||
|
end
|
||
|
return caseId
|
||
|
else
|
||
|
local caseId = math.random(10000, 99999)
|
||
|
return caseId
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function CreateObjectId()
|
||
|
if Objects then
|
||
|
local objectId = math.random(10000, 99999)
|
||
|
while Objects[objectId] do
|
||
|
objectId = math.random(10000, 99999)
|
||
|
end
|
||
|
return objectId
|
||
|
else
|
||
|
local objectId = math.random(10000, 99999)
|
||
|
return objectId
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function IsVehicleOwned(plate)
|
||
|
local result = MySQL.scalar.await('SELECT plate FROM player_vehicles WHERE plate = ?', {plate})
|
||
|
return result
|
||
|
end
|
||
|
|
||
|
local function GetCurrentCops()
|
||
|
local amount = 0
|
||
|
local players = QBCore.Functions.GetQBPlayers()
|
||
|
for _, v in pairs(players) do
|
||
|
if v and v.PlayerData.job.name == "police" and v.PlayerData.job.onduty then
|
||
|
amount += 1
|
||
|
end
|
||
|
end
|
||
|
return amount
|
||
|
end
|
||
|
|
||
|
local function DnaHash(s)
|
||
|
local h = string.gsub(s, ".", function(c)
|
||
|
return string.format("%02x", string.byte(c))
|
||
|
end)
|
||
|
return h
|
||
|
end
|
||
|
|
||
|
|
||
|
-- Commands
|
||
|
QBCore.Commands.Add("spikestrip", Lang:t("commands.place_spike"), {}, false, function(source)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty then
|
||
|
TriggerClientEvent('police:client:SpawnSpikeStrip', src)
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("grantlicense", Lang:t("commands.license_grant"), {{name = "id", help = Lang:t('info.player_id')}, {name = "license", help = Lang:t('info.license_type')}}, true, function(source, args)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.PlayerData.job.name == "police" and Player.PlayerData.job.grade.level >= Config.LicenseRank then
|
||
|
if args[2] == "driver" or args[2] == "weapon" then
|
||
|
local SearchedPlayer = QBCore.Functions.GetPlayer(tonumber(args[1]))
|
||
|
if not SearchedPlayer then return end
|
||
|
local licenseTable = SearchedPlayer.PlayerData.metadata["licences"]
|
||
|
if licenseTable[args[2]] then
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.license_already"), "error")
|
||
|
return
|
||
|
end
|
||
|
licenseTable[args[2]] = true
|
||
|
SearchedPlayer.Functions.SetMetaData("licences", licenseTable)
|
||
|
TriggerClientEvent('QBCore:Notify', SearchedPlayer.PlayerData.source, Lang:t("success.granted_license"), "success")
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("success.grant_license"), "success")
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.error_license_type"), "error")
|
||
|
end
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.rank_license"), "error")
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("revokelicense", Lang:t("commands.license_revoke"), {{name = "id", help = Lang:t('info.player_id')}, {name = "license", help = Lang:t('info.license_type')}}, true, function(source, args)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.PlayerData.job.name == "police" and Player.PlayerData.job.grade.level >= Config.LicenseRank then
|
||
|
if args[2] == "driver" or args[2] == "weapon" then
|
||
|
local SearchedPlayer = QBCore.Functions.GetPlayer(tonumber(args[1]))
|
||
|
if not SearchedPlayer then return end
|
||
|
local licenseTable = SearchedPlayer.PlayerData.metadata["licences"]
|
||
|
if not licenseTable[args[2]] then
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.error_license"), "error")
|
||
|
return
|
||
|
end
|
||
|
licenseTable[args[2]] = false
|
||
|
SearchedPlayer.Functions.SetMetaData("licences", licenseTable)
|
||
|
TriggerClientEvent('QBCore:Notify', SearchedPlayer.PlayerData.source, Lang:t("error.revoked_license"), "error")
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("success.revoke_license"), "success")
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.error_license"), "error")
|
||
|
end
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.rank_revoke"), "error")
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("pobject", Lang:t("commands.place_object"), {{name = "type",help = Lang:t("info.poobject_object")}}, true, function(source, args)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
local type = args[1]:lower()
|
||
|
if Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty then
|
||
|
if type == "cone" then
|
||
|
TriggerClientEvent("police:client:spawnCone", src)
|
||
|
elseif type == "barrier" then
|
||
|
TriggerClientEvent("police:client:spawnBarrier", src)
|
||
|
elseif type == "roadsign" then
|
||
|
TriggerClientEvent("police:client:spawnRoadSign", src)
|
||
|
elseif type == "tent" then
|
||
|
TriggerClientEvent("police:client:spawnTent", src)
|
||
|
elseif type == "light" then
|
||
|
TriggerClientEvent("police:client:spawnLight", src)
|
||
|
elseif type == "delete" then
|
||
|
TriggerClientEvent("police:client:deleteObject", src)
|
||
|
end
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("cuff", Lang:t("commands.cuff_player"), {}, false, function(source)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty then
|
||
|
TriggerClientEvent("police:client:CuffPlayer", src)
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("escort", Lang:t("commands.escort"), {}, false, function(source)
|
||
|
local src = source
|
||
|
TriggerClientEvent("police:client:EscortPlayer", src)
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("callsign", Lang:t("commands.callsign"), {{name = "name", help = Lang:t('info.callsign_name')}}, false, function(source, args)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
Player.Functions.SetMetaData("callsign", table.concat(args, " "))
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("clearcasings", Lang:t("commands.clear_casign"), {}, false, function(source)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty then
|
||
|
TriggerClientEvent("evidence:client:ClearCasingsInArea", src)
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
-- QBCore.Commands.Add("jail", Lang:t("commands.jail_player"), {}, false, function(source)
|
||
|
-- local src = source
|
||
|
-- local Player = QBCore.Functions.GetPlayer(src)
|
||
|
-- if Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty then
|
||
|
-- TriggerClientEvent("police:client:JailPlayer", src)
|
||
|
-- else
|
||
|
-- TriggerClientEvent('QBCore:Notify', src, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
-- end
|
||
|
-- end)
|
||
|
-- local timetowait = false
|
||
|
-- QBCore.Commands.Add("jail", "Jail Player (Police Only)", {{name = "id", help = "Player ID"}, {name = "time", help = "Time they have to be in jail"}, {name = "fine", help = "Fine they have to pay"}}, true, function(source, args)
|
||
|
-- if not timetowait then
|
||
|
-- local src = source
|
||
|
-- local Player = QBCore.Functions.GetPlayer(src)
|
||
|
-- if (Player.PlayerData.job.name == "police" or Player.PlayerData.job.name == "bcso" or Player.PlayerData.job.name == "corrections") and Player.PlayerData.job.onduty then
|
||
|
-- local playerId = tonumber(args[1])
|
||
|
-- local OtherPlayer = QBCore.Functions.GetPlayer(playerId)
|
||
|
-- local Ply = QBCore.Functions.GetPlayer(tonumber(args[1]))
|
||
|
-- local time = tonumber(args[2])
|
||
|
-- local amount = tonumber(args[3])
|
||
|
-- local PdPay = amount * 0.1
|
||
|
-- local billed = QBCore.Functions.GetPlayer(tonumber(args[1]))
|
||
|
-- if OtherPlayer ~= nil then
|
||
|
-- if time > 0 and amount and amount >= 0 then
|
||
|
-- TriggerClientEvent('cqc-mugshot:client:trigger', args[1], playerId)
|
||
|
-- -- TriggerClientEvent("police:client:JailCommand", src, playerId, time)
|
||
|
-- Ply.Functions.RemoveMoney('bank', amount, "paid-fine")
|
||
|
-- TriggerClientEvent('QBCore:Notify', src, 'Fine has been issued to offender succesfully', 'success')
|
||
|
-- TriggerClientEvent('QBCore:Notify', billed.PlayerData.source, 'State Debt Recovery has automatically recovered the fines owed...')
|
||
|
-- TriggerEvent('qb-bossmenu:server:addAccountMoney', 'police', PdPay)
|
||
|
-- TriggerEvent('qb-log:server:CreateLog', 'jail', "Officer " .. Player.PlayerData.charinfo.firstname .. " " .. Player.PlayerData.charinfo.lastname .. ' jailed ' .. OtherPlayer.PlayerData.charinfo.firstname .. " " .. OtherPlayer.PlayerData.charinfo.lastname .. " " .. "for " .. time .. " months and a $" .. amount .." fine")
|
||
|
-- timetowait = true
|
||
|
-- Wait(25000)
|
||
|
-- timetowait = false
|
||
|
-- else
|
||
|
-- TriggerClientEvent('QBCore:Notify', src, 'Cannot sentence for 0', 'error')
|
||
|
-- end
|
||
|
-- else
|
||
|
-- TriggerClientEvent("QBCore:Notify", source, "no one is present", "error")
|
||
|
-- end
|
||
|
-- else
|
||
|
-- TriggerClientEvent('QBCore:Notify', src, 'For on-duty police only', 'error')
|
||
|
-- end
|
||
|
-- else
|
||
|
-- TriggerClientEvent('QBCore:Notify', src, 'You need to wait for the other suspect to finish getting there mug shot', 'error')
|
||
|
-- end
|
||
|
-- end)
|
||
|
|
||
|
-- QBCore.Commands.Add("unjail", Lang:t("commands.unjail_player"), {{name = "id", help = Lang:t('info.player_id')}}, true, function(source, args)
|
||
|
-- local src = source
|
||
|
-- local Player = QBCore.Functions.GetPlayer(src)
|
||
|
-- if Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty then
|
||
|
-- local playerId = tonumber(args[1])
|
||
|
-- TriggerClientEvent("prison:client:UnjailPerson", playerId)
|
||
|
-- else
|
||
|
-- TriggerClientEvent('QBCore:Notify', src, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
-- end
|
||
|
-- end)
|
||
|
|
||
|
QBCore.Commands.Add("clearblood", Lang:t("commands.clearblood"), {}, false, function(source)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty then
|
||
|
TriggerClientEvent("evidence:client:ClearBlooddropsInArea", src)
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("seizecash", Lang:t("commands.seizecash"), {}, false, function(source)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty then
|
||
|
TriggerClientEvent("police:client:SeizeCash", src)
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("sc", Lang:t("commands.softcuff"), {}, false, function(source)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty then
|
||
|
TriggerClientEvent("police:client:CuffPlayerSoft", src)
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("cam", Lang:t("commands.camera"), {{name = "camid", help = Lang:t('info.camera_id')}}, false, function(source, args)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty then
|
||
|
TriggerClientEvent("police:client:ActiveCamera", src, tonumber(args[1]))
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("flagplate", Lang:t("commands.flagplate"), {{name = "plate", help = Lang:t('info.plate_number')}, {name = "reason", help = Lang:t('info.flag_reason')}}, true, function(source, args)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty then
|
||
|
local reason = {}
|
||
|
for i = 2, #args, 1 do
|
||
|
reason[#reason+1] = args[i]
|
||
|
end
|
||
|
Plates[args[1]:upper()] = {
|
||
|
isflagged = true,
|
||
|
reason = table.concat(reason, " ")
|
||
|
}
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("info.vehicle_flagged", {vehicle = args[1]:upper(), reason = table.concat(reason, " ")}))
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("unflagplate", Lang:t("commands.unflagplate"), {{name = "plate", help = Lang:t('info.plate_number')}}, true, function(source, args)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty then
|
||
|
if Plates and Plates[args[1]:upper()] then
|
||
|
if Plates[args[1]:upper()].isflagged then
|
||
|
Plates[args[1]:upper()].isflagged = false
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("info.unflag_vehicle", {vehicle = args[1]:upper()}))
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.vehicle_not_flag"), 'error')
|
||
|
end
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.vehicle_not_flag"), 'error')
|
||
|
end
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("plateinfo", Lang:t("commands.plateinfo"), {{name = "plate", help = Lang:t('info.plate_number')}}, true, function(source, args)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty then
|
||
|
if Plates and Plates[args[1]:upper()] then
|
||
|
if Plates[args[1]:upper()].isflagged then
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t('success.vehicle_flagged', {plate = args[1]:upper(), reason = Plates[args[1]:upper()].reason}), 'success')
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.vehicle_not_flag"), 'error')
|
||
|
end
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.vehicle_not_flag"), 'error')
|
||
|
end
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("depot", Lang:t("commands.depot"), {{name = "price", help = Lang:t('info.impound_price')}}, false, function(source, args)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty then
|
||
|
TriggerClientEvent("police:client:ImpoundVehicle", src, false, tonumber(args[1]))
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("impound", Lang:t("commands.impound"), {}, false, function(source)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty then
|
||
|
TriggerClientEvent("police:client:ImpoundVehicle", src, true)
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("paytow", Lang:t("commands.paytow"), {{name = "id", help = Lang:t('info.player_id')}}, true, function(source, args)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty then
|
||
|
local playerId = tonumber(args[1])
|
||
|
local OtherPlayer = QBCore.Functions.GetPlayer(playerId)
|
||
|
if OtherPlayer then
|
||
|
if OtherPlayer.PlayerData.job.name == "tow" then
|
||
|
OtherPlayer.Functions.AddMoney("bank", 500, "police-tow-paid")
|
||
|
TriggerClientEvent('QBCore:Notify', OtherPlayer.PlayerData.source, Lang:t("success.tow_paid"), 'success')
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("info.tow_driver_paid"))
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.not_towdriver"), 'error')
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("paylawyer", Lang:t("commands.paylawyer"), {{name = "id",help = Lang:t('info.player_id')}}, true, function(source, args)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.PlayerData.job.name == "police" or Player.PlayerData.job.name == "judge" then
|
||
|
local playerId = tonumber(args[1])
|
||
|
local OtherPlayer = QBCore.Functions.GetPlayer(playerId)
|
||
|
if not OtherPlayer then return end
|
||
|
if OtherPlayer.PlayerData.job.name == "lawyer" then
|
||
|
OtherPlayer.Functions.AddMoney("bank", 500, "police-lawyer-paid")
|
||
|
TriggerClientEvent('QBCore:Notify', OtherPlayer.PlayerData.source, Lang:t("success.tow_paid"), 'success')
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("info.paid_lawyer"))
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.not_lawyer"), "error")
|
||
|
end
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add('fine', Lang:t("commands.fine"), {{name = 'id', help = Lang:t('info.player_id')}, {name = 'amount', help = Lang:t('info.amount')}}, false, function(source, args)
|
||
|
local biller = QBCore.Functions.GetPlayer(source)
|
||
|
local billed = QBCore.Functions.GetPlayer(tonumber(args[1]))
|
||
|
local amount = tonumber(args[2])
|
||
|
if biller.PlayerData.job.name == "police" and biller.PlayerData.job.onduty then
|
||
|
if billed ~= nil then
|
||
|
if biller.PlayerData.citizenid ~= billed.PlayerData.citizenid then
|
||
|
if amount and amount > 0 then
|
||
|
if billed.Functions.RemoveMoney('bank', amount, "paid-fine") then
|
||
|
TriggerClientEvent('QBCore:Notify', source, Lang:t("info.fine_issued"), 'success')
|
||
|
TriggerClientEvent('QBCore:Notify', billed.PlayerData.source, Lang:t("info.received_fine"))
|
||
|
exports['qb-management']:AddMoney(biller.PlayerData.job.name, amount)
|
||
|
elseif billed.Functions.RemoveMoney('cash', amount, "paid-fine") then
|
||
|
TriggerClientEvent('QBCore:Notify', source, Lang:t("info.fine_issued"), 'success')
|
||
|
TriggerClientEvent('QBCore:Notify', billed.PlayerData.source, Lang:t("info.received_fine"))
|
||
|
exports['qb-management']:AddMoney(biller.PlayerData.job.name, amount)
|
||
|
else
|
||
|
MySQL.Async.insert('INSERT INTO phone_invoices (citizenid, amount, societylabel, society, sender, sendercitizenid) VALUES (?, ?, ?, ?, ?, ?)',{billed.PlayerData.citizenid, amount, biller.PlayerData.job.label, biller.PlayerData.job.name, biller.PlayerData.charinfo.firstname, biller.PlayerData.citizenid}, function(id)
|
||
|
end)
|
||
|
end
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', source, Lang:t("error.amount_higher"), 'error')
|
||
|
end
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', source, Lang:t("error.fine_yourself"), 'error')
|
||
|
end
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', source, Lang:t("error.not_online"), 'error')
|
||
|
end
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', source, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("anklet", Lang:t("commands.anklet"), {}, false, function(source)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty then
|
||
|
TriggerClientEvent("police:client:CheckDistance", src)
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("ankletlocation", Lang:t("commands.ankletlocation"), {{name = "cid", help = Lang:t('info.citizen_id')}}, true, function(source, args)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty then
|
||
|
local citizenid = args[1]
|
||
|
local Target = QBCore.Functions.GetPlayerByCitizenId(citizenid)
|
||
|
if not Target then return end
|
||
|
if Target.PlayerData.metadata["tracker"] then
|
||
|
TriggerClientEvent("police:client:SendTrackerLocation", Target.PlayerData.source, src)
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.no_anklet"), 'error')
|
||
|
end
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("takedrivinglicense", Lang:t("commands.drivinglicense"), {}, false, function(source)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty then
|
||
|
TriggerClientEvent("police:client:SeizeDriverLicense", source)
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.on_duty_police_only"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add("takedna", Lang:t("commands.takedna"), {{name = "id", help = Lang:t('info.player_id')}}, true, function(source, args)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
local OtherPlayer = QBCore.Functions.GetPlayer(tonumber(args[1]))
|
||
|
if not OtherPlayer or Player.PlayerData.job.name ~= "police" or not Player.PlayerData.job.onduty then return end
|
||
|
if Player.Functions.RemoveItem("empty_evidence_bag", 1) then
|
||
|
local info = {
|
||
|
label = Lang:t('info.dna_sample'),
|
||
|
type = "dna",
|
||
|
dnalabel = DnaHash(OtherPlayer.PlayerData.citizenid)
|
||
|
}
|
||
|
if not Player.Functions.AddItem("filled_evidence_bag", 1, false, info) then return end
|
||
|
TriggerClientEvent("inventory:client:ItemBox", src, QBCore.Shared.Items["filled_evidence_bag"], "add")
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.have_evidence_bag"), "error")
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:SendTrackerLocation', function(coords, requestId)
|
||
|
local Target = QBCore.Functions.GetPlayer(source)
|
||
|
local msg = Lang:t('info.target_location', {firstname = Target.PlayerData.charinfo.firstname, lastname = Target.PlayerData.charinfo.lastname})
|
||
|
local alertData = {
|
||
|
title = Lang:t('info.anklet_location'),
|
||
|
coords = {
|
||
|
x = coords.x,
|
||
|
y = coords.y,
|
||
|
z = coords.z
|
||
|
},
|
||
|
description = msg
|
||
|
}
|
||
|
TriggerClientEvent("police:client:TrackerMessage", requestId, msg, coords)
|
||
|
TriggerClientEvent("qb-phone:client:addPoliceAlert", requestId, alertData)
|
||
|
end)
|
||
|
|
||
|
QBCore.Commands.Add('911p', Lang:t("commands.police_report"), {{name='message', help= Lang:t("commands.message_sent")}}, false, function(source, args)
|
||
|
local src = source
|
||
|
local message
|
||
|
if args[1] then message = table.concat(args, " ") else message = Lang:t("commands.civilian_call") end
|
||
|
local ped = GetPlayerPed(src)
|
||
|
local coords = GetEntityCoords(ped)
|
||
|
local players = QBCore.Functions.GetQBPlayers()
|
||
|
for _, v in pairs(players) do
|
||
|
if v and v.PlayerData.job.name == 'police' and v.PlayerData.job.onduty then
|
||
|
local alertData = {title = Lang:t("commands.emergency_call"), coords = {x = coords.x, y = coords.y, z = coords.z}, description = message}
|
||
|
TriggerClientEvent("qb-phone:client:addPoliceAlert", v.PlayerData.source, alertData)
|
||
|
TriggerClientEvent('police:client:policeAlert', v.PlayerData.source, coords, message)
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
-- Items
|
||
|
QBCore.Functions.CreateUseableItem("handcuffs", function(source)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if not Player.Functions.GetItemByName("handcuffs") then return end
|
||
|
TriggerClientEvent("police:client:CuffPlayerSoft", src)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateUseableItem("moneybag", function(source, item)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if not Player or not Player.Functions.GetItemByName("moneybag") or not item.info or item.info == "" or Player.PlayerData.job.name == "police" or not Player.Functions.RemoveItem("moneybag", 1, item.slot) then return end
|
||
|
Player.Functions.AddMoney("cash", tonumber(item.info.cash), "used-moneybag")
|
||
|
end)
|
||
|
|
||
|
-- Callbacks
|
||
|
QBCore.Functions.CreateCallback('police:server:isPlayerDead', function(_, cb, playerId)
|
||
|
local Player = QBCore.Functions.GetPlayer(playerId)
|
||
|
cb(Player.PlayerData.metadata["isdead"])
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('police:GetPlayerStatus', function(_, cb, playerId)
|
||
|
local Player = QBCore.Functions.GetPlayer(playerId)
|
||
|
local statList = {}
|
||
|
if Player then
|
||
|
if PlayerStatus[Player.PlayerData.source] and next(PlayerStatus[Player.PlayerData.source]) then
|
||
|
for k in pairs(PlayerStatus[Player.PlayerData.source]) do
|
||
|
statList[#statList+1] = PlayerStatus[Player.PlayerData.source][k].text
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
cb(statList)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('police:IsSilencedWeapon', function(source, cb, weapon)
|
||
|
local Player = QBCore.Functions.GetPlayer(source)
|
||
|
local itemInfo = Player.Functions.GetItemByName(QBCore.Shared.Weapons[weapon]["name"])
|
||
|
local retval = false
|
||
|
if itemInfo then
|
||
|
if itemInfo.info and itemInfo.info.attachments then
|
||
|
for k in pairs(itemInfo.info.attachments) do
|
||
|
if itemInfo.info.attachments[k].component == "COMPONENT_AT_AR_SUPP_02" or
|
||
|
itemInfo.info.attachments[k].component == "COMPONENT_AT_AR_SUPP" or
|
||
|
itemInfo.info.attachments[k].component == "COMPONENT_AT_PI_SUPP_02" or
|
||
|
itemInfo.info.attachments[k].component == "COMPONENT_AT_PI_SUPP" then
|
||
|
retval = true
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
cb(retval)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('police:GetDutyPlayers', function(_, cb)
|
||
|
local dutyPlayers = {}
|
||
|
local players = QBCore.Functions.GetQBPlayers()
|
||
|
for _, v in pairs(players) do
|
||
|
if v and v.PlayerData.job.name == "police" and v.PlayerData.job.onduty then
|
||
|
dutyPlayers[#dutyPlayers+1] = {
|
||
|
source = v.PlayerData.source,
|
||
|
label = v.PlayerData.metadata["callsign"],
|
||
|
job = v.PlayerData.job.name
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
cb(dutyPlayers)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('police:GetImpoundedVehicles', function(_, cb)
|
||
|
local vehicles = {}
|
||
|
MySQL.query('SELECT * FROM player_vehicles WHERE state = ?', {2}, function(result)
|
||
|
if result[1] then
|
||
|
vehicles = result
|
||
|
end
|
||
|
cb(vehicles)
|
||
|
end)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('police:IsPlateFlagged', function(_, cb, plate)
|
||
|
local retval = false
|
||
|
if Plates and Plates[plate] then
|
||
|
if Plates[plate].isflagged then
|
||
|
retval = true
|
||
|
end
|
||
|
end
|
||
|
cb(retval)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('police:GetCops', function(_, cb)
|
||
|
local amount = 0
|
||
|
local players = QBCore.Functions.GetQBPlayers()
|
||
|
for _, v in pairs(players) do
|
||
|
if v and v.PlayerData.job.name == "police" and v.PlayerData.job.onduty then
|
||
|
amount = amount + 1
|
||
|
end
|
||
|
end
|
||
|
cb(amount)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('police:server:IsPoliceForcePresent', function(_, cb)
|
||
|
local retval = false
|
||
|
local players = QBCore.Functions.GetQBPlayers()
|
||
|
for _, v in pairs(players) do
|
||
|
if v and v.PlayerData.job.name == "police" and v.PlayerData.job.grade.level >= 2 then
|
||
|
retval = true
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
cb(retval)
|
||
|
end)
|
||
|
|
||
|
-- Events
|
||
|
AddEventHandler('onResourceStart', function(resourceName)
|
||
|
if resourceName == GetCurrentResourceName() then
|
||
|
CreateThread(function()
|
||
|
MySQL.query("DELETE FROM stashitems WHERE stash = 'policetrash'")
|
||
|
end)
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent("police:server:addTrunkItems", function(plate, items) exports["ps-inventory"]:addTrunkItems(plate, items) end)
|
||
|
|
||
|
RegisterNetEvent('police:server:policeAlert', function(text)
|
||
|
local src = source
|
||
|
local ped = GetPlayerPed(src)
|
||
|
local coords = GetEntityCoords(ped)
|
||
|
local players = QBCore.Functions.GetQBPlayers()
|
||
|
for _, v in pairs(players) do
|
||
|
if v and v.PlayerData.job.name == 'police' and v.PlayerData.job.onduty then
|
||
|
local alertData = {title = Lang:t('info.new_call'), coords = {x = coords.x, y = coords.y, z = coords.z}, description = text}
|
||
|
-- TriggerClientEvent("qb-phone:client:addPoliceAlert", v.PlayerData.source, alertData)
|
||
|
TriggerClientEvent('police:client:policeAlert', v.PlayerData.source, coords, text)
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:TakeOutImpound', function(plate, garage)
|
||
|
local src = source
|
||
|
local playerPed = GetPlayerPed(src)
|
||
|
local playerCoords = GetEntityCoords(playerPed)
|
||
|
local targetCoords = Config.Locations["impound"][garage]
|
||
|
-- if #(playerCoords - targetCoords) > 10.0 then return DropPlayer(src, "Attempted exploit abuse") end
|
||
|
|
||
|
MySQL.update('UPDATE player_vehicles SET state = ? WHERE plate = ?', {0, plate})
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("success.impound_vehicle_removed"), 'success')
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:CuffPlayer', function(playerId, isSoftcuff)
|
||
|
local src = source
|
||
|
local playerPed = GetPlayerPed(src)
|
||
|
local targetPed = GetPlayerPed(playerId)
|
||
|
local playerCoords = GetEntityCoords(playerPed)
|
||
|
local targetCoords = GetEntityCoords(targetPed)
|
||
|
-- if #(playerCoords - targetCoords) > 2.5 then return DropPlayer(src, "Attempted exploit abuse") end
|
||
|
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
local CuffedPlayer = QBCore.Functions.GetPlayer(playerId)
|
||
|
if not Player or not CuffedPlayer or (not Player.Functions.GetItemByName("handcuffs") and Player.PlayerData.job.name ~= "police") then return end
|
||
|
|
||
|
TriggerClientEvent("police:client:GetCuffed", CuffedPlayer.PlayerData.source, Player.PlayerData.source, isSoftcuff)
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:EscortPlayer', function(playerId)
|
||
|
local src = source
|
||
|
local playerPed = GetPlayerPed(src)
|
||
|
local targetPed = GetPlayerPed(playerId)
|
||
|
local playerCoords = GetEntityCoords(playerPed)
|
||
|
local targetCoords = GetEntityCoords(targetPed)
|
||
|
-- if #(playerCoords - targetCoords) > 2.5 then return DropPlayer(src, "Attempted exploit abuse") end
|
||
|
|
||
|
local Player = QBCore.Functions.GetPlayer(source)
|
||
|
local EscortPlayer = QBCore.Functions.GetPlayer(playerId)
|
||
|
if not Player or not EscortPlayer then return end
|
||
|
|
||
|
if (Player.PlayerData.job.name == "police" or Player.PlayerData.job.name == "ambulance") or (EscortPlayer.PlayerData.metadata["ishandcuffed"] or EscortPlayer.PlayerData.metadata["isdead"] or EscortPlayer.PlayerData.metadata["inlaststand"]) then
|
||
|
TriggerClientEvent("police:client:GetEscorted", EscortPlayer.PlayerData.source, Player.PlayerData.source)
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.not_cuffed_dead"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:KidnapPlayer', function(playerId)
|
||
|
local src = source
|
||
|
local playerPed = GetPlayerPed(src)
|
||
|
local targetPed = GetPlayerPed(playerId)
|
||
|
local playerCoords = GetEntityCoords(playerPed)
|
||
|
local targetCoords = GetEntityCoords(targetPed)
|
||
|
-- if #(playerCoords - targetCoords) > 2.5 then return DropPlayer(src, "Attempted exploit abuse") end
|
||
|
|
||
|
local Player = QBCore.Functions.GetPlayer(source)
|
||
|
local EscortPlayer = QBCore.Functions.GetPlayer(playerId)
|
||
|
if not Player or not EscortPlayer then return end
|
||
|
|
||
|
if EscortPlayer.PlayerData.metadata["ishandcuffed"] or EscortPlayer.PlayerData.metadata["isdead"] or EscortPlayer.PlayerData.metadata["inlaststand"] then
|
||
|
TriggerClientEvent("police:client:GetKidnappedTarget", EscortPlayer.PlayerData.source, Player.PlayerData.source)
|
||
|
TriggerClientEvent("police:client:GetKidnappedDragger", Player.PlayerData.source, EscortPlayer.PlayerData.source)
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.not_cuffed_dead"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:SetPlayerOutVehicle', function(playerId)
|
||
|
local src = source
|
||
|
local playerPed = GetPlayerPed(src)
|
||
|
local targetPed = GetPlayerPed(playerId)
|
||
|
local playerCoords = GetEntityCoords(playerPed)
|
||
|
local targetCoords = GetEntityCoords(targetPed)
|
||
|
-- if #(playerCoords - targetCoords) > 2.5 then return DropPlayer(src, "Attempted exploit abuse") end
|
||
|
|
||
|
local EscortPlayer = QBCore.Functions.GetPlayer(playerId)
|
||
|
if not QBCore.Functions.GetPlayer(src) or not EscortPlayer then return end
|
||
|
|
||
|
if EscortPlayer.PlayerData.metadata["ishandcuffed"] or EscortPlayer.PlayerData.metadata["isdead"] or EscortPlayer.PlayerData.metadata["inlaststand"] then
|
||
|
TriggerClientEvent("police:client:SetOutVehicle", EscortPlayer.PlayerData.source)
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.not_cuffed_dead"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:PutPlayerInVehicle', function(playerId)
|
||
|
local src = source
|
||
|
local playerPed = GetPlayerPed(src)
|
||
|
local targetPed = GetPlayerPed(playerId)
|
||
|
local playerCoords = GetEntityCoords(playerPed)
|
||
|
local targetCoords = GetEntityCoords(targetPed)
|
||
|
-- if #(playerCoords - targetCoords) > 2.5 then return DropPlayer(src, "Attempted exploit abuse") end
|
||
|
|
||
|
local EscortPlayer = QBCore.Functions.GetPlayer(playerId)
|
||
|
if not QBCore.Functions.GetPlayer(src) or not EscortPlayer then return end
|
||
|
|
||
|
if EscortPlayer.PlayerData.metadata["inlaststand"] or EscortPlayer.PlayerData.metadata["isdead"] or EscortPlayer.PlayerData.metadata["ishandcuffed"] then
|
||
|
TriggerClientEvent("police:client:PutInVehicle", EscortPlayer.PlayerData.source)
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.not_cuffed_dead"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:BillPlayer', function(playerId, price)
|
||
|
local src = source
|
||
|
local playerPed = GetPlayerPed(src)
|
||
|
local targetPed = GetPlayerPed(playerId)
|
||
|
local playerCoords = GetEntityCoords(playerPed)
|
||
|
local targetCoords = GetEntityCoords(targetPed)
|
||
|
-- if #(playerCoords - targetCoords) > 2.5 then return DropPlayer(src, "Attempted exploit abuse") end
|
||
|
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
local OtherPlayer = QBCore.Functions.GetPlayer(playerId)
|
||
|
if not Player or not OtherPlayer or Player.PlayerData.job.name ~= "police" then return end
|
||
|
|
||
|
OtherPlayer.Functions.RemoveMoney("bank", price, "paid-bills")
|
||
|
exports['qb-management']:AddMoney("police", price)
|
||
|
TriggerClientEvent('QBCore:Notify', OtherPlayer.PlayerData.source, Lang:t("info.fine_received", {fine = price}))
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:JailPlayer', function(playerId, time)
|
||
|
local src = source
|
||
|
local playerPed = GetPlayerPed(src)
|
||
|
local targetPed = GetPlayerPed(playerId)
|
||
|
local playerCoords = GetEntityCoords(playerPed)
|
||
|
local targetCoords = GetEntityCoords(targetPed)
|
||
|
-- if #(playerCoords - targetCoords) > 2.5 then return DropPlayer(src, "Attempted exploit abuse") end
|
||
|
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
local OtherPlayer = QBCore.Functions.GetPlayer(playerId)
|
||
|
if not Player or not OtherPlayer or Player.PlayerData.job.name ~= "police" then return end
|
||
|
|
||
|
local currentDate = os.date("*t")
|
||
|
if currentDate.day == 31 then
|
||
|
currentDate.day = 30
|
||
|
end
|
||
|
|
||
|
OtherPlayer.Functions.SetMetaData("injail", time)
|
||
|
OtherPlayer.Functions.SetMetaData("criminalrecord", {
|
||
|
["hasRecord"] = true,
|
||
|
["date"] = currentDate
|
||
|
})
|
||
|
TriggerClientEvent("police:client:SendToJail", OtherPlayer.PlayerData.source, time)
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("info.sent_jail_for", {time = time}))
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:SetHandcuffStatus', function(isHandcuffed)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player then
|
||
|
Player.Functions.SetMetaData("ishandcuffed", isHandcuffed)
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('heli:spotlight', function(state)
|
||
|
local serverID = source
|
||
|
TriggerClientEvent('heli:spotlight', -1, serverID, state)
|
||
|
end)
|
||
|
|
||
|
-- RegisterNetEvent('police:server:FlaggedPlateTriggered', function(camId, plate, street1, street2, blipSettings)
|
||
|
-- local src = source
|
||
|
-- for k, v in pairs(QBCore.Functions.GetPlayers()) do
|
||
|
-- local Player = QBCore.Functions.GetPlayer(v)
|
||
|
-- if Player then
|
||
|
-- if (Player.PlayerData.job.name == "police" and Player.PlayerData.job.onduty) then
|
||
|
-- if street2 then
|
||
|
-- TriggerClientEvent("112:client:SendPoliceAlert", v, "flagged", {
|
||
|
-- camId = camId,
|
||
|
-- plate = plate,
|
||
|
-- streetLabel = street1 .. " " .. street2
|
||
|
-- }, blipSettings)
|
||
|
-- else
|
||
|
-- TriggerClientEvent("112:client:SendPoliceAlert", v, "flagged", {
|
||
|
-- camId = camId,
|
||
|
-- plate = plate,
|
||
|
-- streetLabel = street1
|
||
|
-- }, blipSettings)
|
||
|
-- end
|
||
|
-- end
|
||
|
-- end
|
||
|
-- end
|
||
|
-- end)
|
||
|
|
||
|
RegisterNetEvent('police:server:SearchPlayer', function(playerId)
|
||
|
local src = source
|
||
|
local playerPed = GetPlayerPed(src)
|
||
|
local targetPed = GetPlayerPed(playerId)
|
||
|
local playerCoords = GetEntityCoords(playerPed)
|
||
|
local targetCoords = GetEntityCoords(targetPed)
|
||
|
-- if #(playerCoords - targetCoords) > 2.5 then return DropPlayer(src, "Attempted exploit abuse") end
|
||
|
|
||
|
local SearchedPlayer = QBCore.Functions.GetPlayer(playerId)
|
||
|
if not QBCore.Functions.GetPlayer(src) or not SearchedPlayer then return end
|
||
|
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("info.cash_found", {cash = SearchedPlayer.PlayerData.money["cash"]}))
|
||
|
TriggerClientEvent('QBCore:Notify', SearchedPlayer.PlayerData.source, Lang:t("info.being_searched"))
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:SeizeCash', function(playerId)
|
||
|
local src = source
|
||
|
local playerPed = GetPlayerPed(src)
|
||
|
local targetPed = GetPlayerPed(playerId)
|
||
|
local playerCoords = GetEntityCoords(playerPed)
|
||
|
local targetCoords = GetEntityCoords(targetPed)
|
||
|
-- if #(playerCoords - targetCoords) > 2.5 then return DropPlayer(src, "Attempted exploit abuse") end
|
||
|
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
local SearchedPlayer = QBCore.Functions.GetPlayer(playerId)
|
||
|
if not Player or not SearchedPlayer then return end
|
||
|
|
||
|
local moneyAmount = SearchedPlayer.PlayerData.money["cash"]
|
||
|
local info = { cash = moneyAmount }
|
||
|
SearchedPlayer.Functions.RemoveMoney("cash", moneyAmount, "police-cash-seized")
|
||
|
Player.Functions.AddItem("moneybag", 1, false, info)
|
||
|
TriggerClientEvent('inventory:client:ItemBox', src, QBCore.Shared.Items["moneybag"], "add")
|
||
|
TriggerClientEvent('QBCore:Notify', SearchedPlayer.PlayerData.source, Lang:t("info.cash_confiscated"))
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:SeizeDriverLicense', function(playerId)
|
||
|
local src = source
|
||
|
local playerPed = GetPlayerPed(src)
|
||
|
local targetPed = GetPlayerPed(playerId)
|
||
|
local playerCoords = GetEntityCoords(playerPed)
|
||
|
local targetCoords = GetEntityCoords(targetPed)
|
||
|
-- if #(playerCoords - targetCoords) > 2.5 then return DropPlayer(src, "Attempted exploit abuse") end
|
||
|
|
||
|
local SearchedPlayer = QBCore.Functions.GetPlayer(playerId)
|
||
|
if not QBCore.Functions.GetPlayer(src) or not SearchedPlayer then return end
|
||
|
|
||
|
local driverLicense = SearchedPlayer.PlayerData.metadata["licences"]["driver"]
|
||
|
if driverLicense then
|
||
|
local licenses = {["driver"] = false, ["business"] = SearchedPlayer.PlayerData.metadata["licences"]["business"]}
|
||
|
SearchedPlayer.Functions.SetMetaData("licences", licenses)
|
||
|
TriggerClientEvent('QBCore:Notify', SearchedPlayer.PlayerData.source, Lang:t("info.driving_license_confiscated"))
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.no_driver_license"), 'error')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:RobPlayer', function(playerId)
|
||
|
local src = source
|
||
|
local playerPed = GetPlayerPed(src)
|
||
|
local targetPed = GetPlayerPed(playerId)
|
||
|
local playerCoords = GetEntityCoords(playerPed)
|
||
|
local targetCoords = GetEntityCoords(targetPed)
|
||
|
-- if #(playerCoords - targetCoords) > 2.5 then return DropPlayer(src, "Attempted exploit abuse") end
|
||
|
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
local SearchedPlayer = QBCore.Functions.GetPlayer(playerId)
|
||
|
if not Player or not SearchedPlayer then return end
|
||
|
|
||
|
local money = SearchedPlayer.PlayerData.money["cash"]
|
||
|
Player.Functions.AddMoney("cash", money, "police-player-robbed")
|
||
|
SearchedPlayer.Functions.RemoveMoney("cash", money, "police-player-robbed")
|
||
|
TriggerClientEvent('QBCore:Notify', SearchedPlayer.PlayerData.source, Lang:t("info.cash_robbed", {money = money}))
|
||
|
TriggerClientEvent('QBCore:Notify', Player.PlayerData.source, Lang:t("info.stolen_money", {stolen = money}))
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:UpdateBlips', function()
|
||
|
-- KEEP FOR REF BUT NOT NEEDED ANYMORE.
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:spawnObject', function(type)
|
||
|
local src = source
|
||
|
local objectId = CreateObjectId()
|
||
|
Objects[objectId] = type
|
||
|
TriggerClientEvent("police:client:spawnObject", src, objectId, type, src)
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:deleteObject', function(objectId)
|
||
|
TriggerClientEvent('police:client:removeObject', -1, objectId)
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:Impound', function(plate, fullImpound, price, body, engine, fuel)
|
||
|
local src = source
|
||
|
price = price and price or 0
|
||
|
if IsVehicleOwned(plate) then
|
||
|
if not fullImpound then
|
||
|
MySQL.query(
|
||
|
'UPDATE player_vehicles SET state = ?, depotprice = ?, body = ?, engine = ?, fuel = ? WHERE plate = ?',
|
||
|
{0, price, body, engine, fuel, plate})
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("info.vehicle_taken_depot", {price = price}))
|
||
|
else
|
||
|
MySQL.query(
|
||
|
'UPDATE player_vehicles SET state = ?, body = ?, engine = ?, fuel = ? WHERE plate = ?',
|
||
|
{2, body, engine, fuel, plate})
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("info.vehicle_seized"))
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('evidence:server:UpdateStatus', function(data)
|
||
|
local src = source
|
||
|
PlayerStatus[src] = data
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('evidence:server:CreateBloodDrop', function(citizenid, bloodtype, coords)
|
||
|
local bloodId = CreateBloodId()
|
||
|
BloodDrops[bloodId] = {
|
||
|
dna = citizenid,
|
||
|
bloodtype = bloodtype
|
||
|
}
|
||
|
TriggerClientEvent("evidence:client:AddBlooddrop", -1, bloodId, citizenid, bloodtype, coords)
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('evidence:server:CreateFingerDrop', function(coords)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
local fingerId = CreateFingerId()
|
||
|
FingerDrops[fingerId] = Player.PlayerData.metadata["fingerprint"]
|
||
|
TriggerClientEvent("evidence:client:AddFingerPrint", -1, fingerId, Player.PlayerData.metadata["fingerprint"], coords)
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('evidence:server:ClearBlooddrops', function(blooddropList)
|
||
|
if blooddropList and next(blooddropList) then
|
||
|
for _, v in pairs(blooddropList) do
|
||
|
TriggerClientEvent("evidence:client:RemoveBlooddrop", -1, v)
|
||
|
BloodDrops[v] = nil
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('evidence:server:AddBlooddropToInventory', function(bloodId, bloodInfo)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.Functions.RemoveItem("empty_evidence_bag", 1) then
|
||
|
if Player.Functions.AddItem("filled_evidence_bag", 1, false, bloodInfo) then
|
||
|
TriggerClientEvent("inventory:client:ItemBox", src, QBCore.Shared.Items["filled_evidence_bag"], "add")
|
||
|
TriggerClientEvent("evidence:client:RemoveBlooddrop", -1, bloodId)
|
||
|
BloodDrops[bloodId] = nil
|
||
|
end
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.have_evidence_bag"), "error")
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('evidence:server:AddFingerprintToInventory', function(fingerId, fingerInfo)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.Functions.RemoveItem("empty_evidence_bag", 1) then
|
||
|
if Player.Functions.AddItem("filled_evidence_bag", 1, false, fingerInfo) then
|
||
|
TriggerClientEvent("inventory:client:ItemBox", src, QBCore.Shared.Items["filled_evidence_bag"], "add")
|
||
|
TriggerClientEvent("evidence:client:RemoveFingerprint", -1, fingerId)
|
||
|
FingerDrops[fingerId] = nil
|
||
|
end
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.have_evidence_bag"), "error")
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('evidence:server:CreateCasing', function(weapon, coords)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
local casingId = CreateCasingId()
|
||
|
local weaponInfo = QBCore.Shared.Weapons[weapon]
|
||
|
local serieNumber = nil
|
||
|
if weaponInfo then
|
||
|
local weaponItem = Player.Functions.GetItemByName(weaponInfo["name"])
|
||
|
if weaponItem then
|
||
|
if weaponItem.info and weaponItem.info ~= "" then
|
||
|
serieNumber = weaponItem.info.serie
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
TriggerClientEvent("evidence:client:AddCasing", -1, casingId, weapon, coords, serieNumber)
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:UpdateCurrentCops', function()
|
||
|
local amount = 0
|
||
|
local players = QBCore.Functions.GetQBPlayers()
|
||
|
if updatingCops then return end
|
||
|
updatingCops = true
|
||
|
for _, v in pairs(players) do
|
||
|
if v and v.PlayerData.job.name == "police" and v.PlayerData.job.onduty then
|
||
|
amount += 1
|
||
|
end
|
||
|
end
|
||
|
TriggerClientEvent("police:SetCopCount", -1, amount)
|
||
|
updatingCops = false
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('evidence:server:ClearCasings', function(casingList)
|
||
|
if casingList and next(casingList) then
|
||
|
for _, v in pairs(casingList) do
|
||
|
TriggerClientEvent("evidence:client:RemoveCasing", -1, v)
|
||
|
Casings[v] = nil
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('evidence:server:AddCasingToInventory', function(casingId, casingInfo)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
if Player.Functions.RemoveItem("empty_evidence_bag", 1) then
|
||
|
if Player.Functions.AddItem("filled_evidence_bag", 1, false, casingInfo) then
|
||
|
TriggerClientEvent("inventory:client:ItemBox", src, QBCore.Shared.Items["filled_evidence_bag"], "add")
|
||
|
TriggerClientEvent("evidence:client:RemoveCasing", -1, casingId)
|
||
|
Casings[casingId] = nil
|
||
|
end
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.have_evidence_bag"), "error")
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:showFingerprint', function(playerId)
|
||
|
local src = source
|
||
|
TriggerClientEvent('police:client:showFingerprint', playerId, src)
|
||
|
TriggerClientEvent('police:client:showFingerprint', src, playerId)
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:showFingerprintId', function(sessionId)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
local fid = Player.PlayerData.metadata["fingerprint"]
|
||
|
local firstname = Player.PlayerData.charinfo.firstname
|
||
|
local lastname = Player.PlayerData.charinfo.lastname
|
||
|
local flname = firstname .. " " .. lastname
|
||
|
TriggerClientEvent('police:client:showFingerprintId', sessionId, fid, flname)
|
||
|
TriggerClientEvent('police:client:showFingerprintId', src, fid, flname)
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:SetTracker', function(targetId)
|
||
|
local src = source
|
||
|
local playerPed = GetPlayerPed(src)
|
||
|
local targetPed = GetPlayerPed(targetId)
|
||
|
local playerCoords = GetEntityCoords(playerPed)
|
||
|
local targetCoords = GetEntityCoords(targetPed)
|
||
|
-- if #(playerCoords - targetCoords) > 2.5 then return DropPlayer(src, "Attempted exploit abuse") end
|
||
|
|
||
|
local Target = QBCore.Functions.GetPlayer(targetId)
|
||
|
if not QBCore.Functions.GetPlayer(src) or not Target then return end
|
||
|
|
||
|
local TrackerMeta = Target.PlayerData.metadata["tracker"]
|
||
|
if TrackerMeta then
|
||
|
Target.Functions.SetMetaData("tracker", false)
|
||
|
TriggerClientEvent('QBCore:Notify', targetId, Lang:t("success.anklet_taken_off"), 'success')
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("success.took_anklet_from", {firstname = Target.PlayerData.charinfo.firstname, lastname = Target.PlayerData.charinfo.lastname}), 'success')
|
||
|
TriggerClientEvent('police:client:SetTracker', targetId, false)
|
||
|
else
|
||
|
Target.Functions.SetMetaData("tracker", true)
|
||
|
TriggerClientEvent('QBCore:Notify', targetId, Lang:t("success.put_anklet"), 'success')
|
||
|
TriggerClientEvent('QBCore:Notify', src, Lang:t("success.put_anklet_on", {firstname = Target.PlayerData.charinfo.firstname, lastname = Target.PlayerData.charinfo.lastname}), 'success')
|
||
|
TriggerClientEvent('police:client:SetTracker', targetId, true)
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('police:server:SyncSpikes', function(table)
|
||
|
TriggerClientEvent('police:client:SyncSpikes', -1, table)
|
||
|
end)
|
||
|
|
||
|
-- Threads
|
||
|
CreateThread(function()
|
||
|
while true do
|
||
|
Wait(1000 * 60 * 10)
|
||
|
local curCops = GetCurrentCops()
|
||
|
TriggerClientEvent("police:SetCopCount", -1, curCops)
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
CreateThread(function()
|
||
|
while true do
|
||
|
Wait(5000)
|
||
|
UpdateBlips()
|
||
|
end
|
||
|
end)
|