-- 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)