# qb-policejob Police Job for QB-Core Framework :police_officer: # License QBCore Framework Copyright (C) 2021 Joshua Eger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see ## Dependencies - [qb-core](https://github.com/qbcore-framework/qb-core) - [qb-bossmenu](https://github.com/qbcore-framework/qb-bossmenu) (Deprecated) - For the boss menu - [qb-management](https://github.com/qbcore-framework/qb-management) (Replaces qb-bossmenu) - For the boss/gang menu - [qb-garages](https://github.com/qbcore-framework/qb-garages) - For the vehicle spawner - [qb-clothing](https://github.com/qbcore-framework/qb-clothing) - For the locker room - [qb-phone](https://github.com/qbcore-framework/qb-phone) - For the MEOS app and notifications etc. - [qb-log](https://github.com/qbcore-framework/qb-logs) - (Deprecated) - For logging certain events - [qb-smallresources](https://github.com/qbcore-framework/qb-smallresources) (Replaces qb-log) - qb-log was added to qb-smallresources - [qb-menu](https://github.com/qbcore-framework/qb-menu) - For the vehicle menus - [qb-input](https://github.com/qbcore-framework/qb-input) - For accessing evidence stashes ## Screenshots ![On Duty / Off Duty](https://imgur.com/KO2ydlt.png) ![Whitelisted Police Armory](https://imgur.com/TQVIYFb.png) ![Whitelisted Police Stash](https://imgur.com/Hh2fbs4.png) ![Vehicle Spawner](https://imgur.com/plgZ9oD.png) ![Helicopter Spawner](https://imgur.com/jE2IoqK.png) ![Fingerprint Scan](https://imgur.com/btmurxh.png) ![Evidence Stash](https://imgur.com/KBOoUy5.png) ![Spike Placing](https://imgur.com/mTN6c0h.png) ![Object Placing](https://imgur.com/7Jate4f.png) ![Police Alert](https://imgur.com/rAIiWYH.png) ![Securty Cam](https://imgur.com/vFr8nWf.png) ## Features - Classical requirements like on duty/off duty, clothing, vehicle, stash etc. - Citizen ID based armory (Whitelisted) - Fingerprint test - Evidence locker (stash) - Whitelisted vehicles - Speed radars across the map - Stormram - Impounding player vehicle (permanent / for an amount of money) - Integrated jail system - Bullet casings - GSR - Blood drop - Evidence bag & Money bag - Police radar - Handcuff as an item (Can used via command too. Check Commands section.) - Emergency services can see each other on map ### Commands - /spikestrip - Places spike strip on ground. - /pobject [pion/barier/schotten/tent/light/delete] - Places or deletes an object on/from ground. - /cuff - Cuffs/Uncuffs nearby player - /escort - Escorts nearby plyer. - /callsign [text] - Sets the player a callsign on database. - /clearcasings - Clears nearby bullet casings. - /jail [id] [time] - Sends a player to the jail. - /unjail [id] - Takes the player out of jail. - /clearblood - Clears nearby blood drops. - /seizecash - Seizes nearby player's cash. (Puts in money bag) - /sc - Puts soft cuff on nearby player. - /cam [cam] - Shows the selected security cam display. - /flagplate [plate] [reason] - Flags the vehicle. - /unflagplate [plate] - Removes the flag of a vehicle. - /plateinfo [plate] - Displays if a vehicle is marked or not. - /depot [price] - Depots nearby vehicle. Player can take it after paying the cost. - /impound - Impounds nearby vehicle permanently. - /paytow [id] - Makes payment to the tow driver. - /paylawyer [id] - Makes payment to the lawyer. - /radar - Toggles the police radar. - /911 [message] - Sends a report to emergency services. - /911r [id] - Used to respond the emergency alerts. - /911a [message] - Sends an anonymous report to emergency services (gives no location). - /anklet - Places anklet (tracking device) on nearby player. - /removeanklet [citizenid] - Removes the anklet from player. - /ebutton - Used to respond an emergency alert. - /takedrivinglicense - Takes the driving license from nearby player. - /takedna [id] - Takes a DNA sample from the player. ## Installation ### Manual - Download the script and put it in the `[qb]` directory. - Add the following code to your server.cfg/resouces.cfg ``` ensure qb-core ensure qb-policejob ``` ## Configuration ``` Config = {} Config.Objects = { -- Objects to be placed with /pobject [object] ["cone"] = {model = `prop_roadcone02a`, freeze = false}, ["barier"] = {model = `prop_barrier_work06a`, freeze = true}, ["schotten"] = {model = `prop_snow_sign_road_06g`, freeze = true}, ["tent"] = {model = `prop_gazebo_03`, freeze = true}, ["light"] = {model = `prop_worklight_03b`, freeze = true}, } Config.Locations = { ["duty"] = { -- On Duty/Off Duty Marker [1] = vector4(440.085, -974.924, 30.689, 90.654), [2] = vector4(-449.811, 6012.909, 31.815, 90.654), }, ["vehicle"] = { -- Vehicle Spawner Marker [1] = vector4(448.159, -1017.41, 28.562, 90.654), [2] = vector4(471.13, -1024.05, 28.17, 274.5), [3] = vector4(-455.39, 6002.02, 31.34, 87.93), }, ["stash"] = { -- Stash Marker [1] = vector4(453.075, -980.124, 30.889, 90.654), }, ["impound"] = { -- Impounded Vehicles Marker [1] = vector4(436.68, -1007.42, 27.32, 180.0), [2] = vector4(-436.14, 5982.63, 31.34, 136.0), }, ["helicopter"] = { -- Helicopter Spawner Marker [1] = vector4(449.168, -981.325, 43.691, 87.234), [2] = vector4(-475.43, 5988.353, 31.716, 31.34), }, ["armory"] = { -- Armory Marker [1] = vector4(462.23, -981.12, 30.68, 90.654), }, ["trash"] = { -- Trash Marker [1] = vector4(439.0907, -976.746, 30.776, 93.03), }, ["fingerprint"] = { -- Fingerprint Scan Marker [1] = vector4(460.9667, -989.180, 24.92, 358.5), }, ["evidence"] = { -- Evidence Closet 1 Marker [1] = vector4(442.1722, -996.067, 30.689, 187.5), }, ["evidence2"] = { -- Evidence Closet 2 Marker [1] = vector4(451.7031, -973.232, 30.689, 1.741), }, ["evidence3"] = { -- Evidence Closet 3 Marker [1] = vector4(455.1456, -985.462, 30.689, 2.854), }, ["stations"] = { -- Police Stations Blips [1] = {label = "Police Station", coords = vector4(428.23, -984.28, 29.76, 3.5)}, [2] = {label = "Prison", coords = vector4(1845.903, 2585.873, 45.672, 272.249)}, [3] = {label = "Police Station Paleto", coords = vector4(-451.55, 6014.25, 31.716, 223.81)}, }, } Config.ArmoryWhitelist = {} -- Citizen ID Based Armory Whitelist (With Export for Other Scripts) Config.Helicopter = "POLMAV" -- Model of the Helicopter for Helicopter Spawner Config.SecurityCameras = { -- Security Cam Locations hideradar = false, -- Don't change cameras = { [1] = {label = "Pacific Bank CAM#1", coords = vector3(257.45, 210.07, 109.08), r = {x = -25.0, y = 0.0, z = 28.05}, canRotate = false, isOnline = true}, [2] = {label = "Pacific Bank CAM#2", coords = vector3(232.86, 221.46, 107.83), r = {x = -25.0, y = 0.0, z = -140.91}, canRotate = false, isOnline = true}, [3] = {label = "Pacific Bank CAM#3", coords = vector3(252.27, 225.52, 103.99), r = {x = -35.0, y = 0.0, z = -74.87}, canRotate = false, isOnline = true}, [4] = {label = "Limited Ltd Grove St. CAM#1", coords = vector3(-53.1433, -1746.714, 31.546), r = {x = -35.0, y = 0.0, z = -168.9182}, canRotate = false, isOnline = true}, [5] = {label = "Rob's Liqour Prosperity St. CAM#1", coords = vector3(-1482.9, -380.463, 42.363), r = {x = -35.0, y = 0.0, z = 79.53281}, canRotate = false, isOnline = true}, [6] = {label = "Rob's Liqour San Andreas Ave. CAM#1", coords = vector3(-1224.874, -911.094, 14.401), r = {x = -35.0, y = 0.0, z = -6.778894}, canRotate = false, isOnline = true}, [7] = {label = "Limited Ltd Ginger St. CAM#1", coords = vector3(-718.153, -909.211, 21.49), r = {x = -35.0, y = 0.0, z = -137.1431}, canRotate = false, isOnline = true}, [8] = {label = "24/7 Supermarkt Innocence Blvd. CAM#1", coords = vector3(23.885, -1342.441, 31.672), r = {x = -35.0, y = 0.0, z = -142.9191}, canRotate = false, isOnline = true}, [9] = {label = "Rob's Liqour El Rancho Blvd. CAM#1", coords = vector3(1133.024, -978.712, 48.515), r = {x = -35.0, y = 0.0, z = -137.302}, canRotate = false, isOnline = true}, [10] = {label = "Limited Ltd West Mirror Drive CAM#1", coords = vector3(1151.93, -320.389, 71.33), r = {x = -35.0, y = 0.0, z = -119.4468}, canRotate = false, isOnline = true}, [11] = {label = "24/7 Supermarkt Clinton Ave CAM#1", coords = vector3(383.402, 328.915, 105.541), r = {x = -35.0, y = 0.0, z = 118.585}, canRotate = false, isOnline = true}, [12] = {label = "Limited Ltd Banham Canyon Dr CAM#1", coords = vector3(-1832.057, 789.389, 140.436), r = {x = -35.0, y = 0.0, z = -91.481}, canRotate = false, isOnline = true}, [13] = {label = "Rob's Liqour Great Ocean Hwy CAM#1", coords = vector3(-2966.15, 387.067, 17.393), r = {x = -35.0, y = 0.0, z = 32.92229}, canRotate = false, isOnline = true}, [14] = {label = "24/7 Supermarkt Ineseno Road CAM#1", coords = vector3(-3046.749, 592.491, 9.808), r = {x = -35.0, y = 0.0, z = -116.673}, canRotate = false, isOnline = true}, [15] = {label = "24/7 Supermarkt Barbareno Rd. CAM#1", coords = vector3(-3246.489, 1010.408, 14.705), r = {x = -35.0, y = 0.0, z = -135.2151}, canRotate = false, isOnline = true}, [16] = {label = "24/7 Supermarkt Route 68 CAM#1", coords = vector3(539.773, 2664.904, 44.056), r = {x = -35.0, y = 0.0, z = -42.947}, canRotate = false, isOnline = true}, [17] = {label = "Rob's Liqour Route 68 CAM#1", coords = vector3(1169.855, 2711.493, 40.432), r = {x = -35.0, y = 0.0, z = 127.17}, canRotate = false, isOnline = true}, [18] = {label = "24/7 Supermarkt Senora Fwy CAM#1", coords = vector3(2673.579, 3281.265, 57.541), r = {x = -35.0, y = 0.0, z = -80.242}, canRotate = false, isOnline = true}, [19] = {label = "24/7 Supermarkt Alhambra Dr. CAM#1", coords = vector3(1966.24, 3749.545, 34.143), r = {x = -35.0, y = 0.0, z = 163.065}, canRotate = false, isOnline = true}, [20] = {label = "24/7 Supermarkt Senora Fwy CAM#2", coords = vector3(1729.522, 6419.87, 37.262), r = {x = -35.0, y = 0.0, z = -160.089}, canRotate = false, isOnline = true}, [21] = {label = "Fleeca Bank Hawick Ave CAM#1", coords = vector3(309.341, -281.439, 55.88), r = {x = -35.0, y = 0.0, z = -146.1595}, canRotate = false, isOnline = true}, [22] = {label = "Fleeca Bank Legion Square CAM#1", coords = vector3(144.871, -1043.044, 31.017), r = {x = -35.0, y = 0.0, z = -143.9796}, canRotate = false, isOnline = true}, [23] = {label = "Fleeca Bank Hawick Ave CAM#2", coords = vector3(-355.7643, -52.506, 50.746), r = {x = -35.0, y = 0.0, z = -143.8711}, canRotate = false, isOnline = true}, [24] = {label = "Fleeca Bank Del Perro Blvd CAM#1", coords = vector3(-1214.226, -335.86, 39.515), r = {x = -35.0, y = 0.0, z = -97.862}, canRotate = false, isOnline = true}, [25] = {label = "Fleeca Bank Great Ocean Hwy CAM#1", coords = vector3(-2958.885, 478.983, 17.406), r = {x = -35.0, y = 0.0, z = -34.69595}, canRotate = false, isOnline = true}, [26] = {label = "Paleto Bank CAM#1", coords = vector3(-102.939, 6467.668, 33.424), r = {x = -35.0, y = 0.0, z = 24.66}, canRotate = false, isOnline = true}, [27] = {label = "Del Vecchio Liquor Paleto Bay", coords = vector3(-163.75, 6323.45, 33.424), r = {x = -35.0, y = 0.0, z = 260.00}, canRotate = false, isOnline = true}, [28] = {label = "Don's Country Store Paleto Bay CAM#1", coords = vector3(166.42, 6634.4, 33.69), r = {x = -35.0, y = 0.0, z = 32.00}, canRotate = false, isOnline = true}, [29] = {label = "Don's Country Store Paleto Bay CAM#2", coords = vector3(163.74, 6644.34, 33.69), r = {x = -35.0, y = 0.0, z = 168.00}, canRotate = false, isOnline = true}, [30] = {label = "Don's Country Store Paleto Bay CAM#3", coords = vector3(169.54, 6640.89, 33.69), r = {x = -35.0, y = 0.0, z = 5.78}, canRotate = false, isOnline = true}, [31] = {label = "Vangelico Jewelery CAM#1", coords = vector3(-627.54, -239.74, 40.33), r = {x = -35.0, y = 0.0, z = 5.78}, canRotate = true, isOnline = true}, [32] = {label = "Vangelico Jewelery CAM#2", coords = vector3(-627.51, -229.51, 40.24), r = {x = -35.0, y = 0.0, z = -95.78}, canRotate = true, isOnline = true}, [33] = {label = "Vangelico Jewelery CAM#3", coords = vector3(-620.3, -224.31, 40.23), r = {x = -35.0, y = 0.0, z = 165.78}, canRotate = true, isOnline = true}, [34] = {label = "Vangelico Jewelery CAM#4", coords = vector3(-622.57, -236.3, 40.31), r = {x = -35.0, y = 0.0, z = 5.78}, canRotate = true, isOnline = true}, }, } Config.AuthorizedVehicles = { -- Police Vehicles and required grade -- Grade 0 [0] = { ["police"] = "Police Car 1", ["police2"] = "Police Car 2", ["police3"] = "Police Car 3", ["police4"] = "Police Car 4", ["policeb"] = "Police Car 5", ["policet"] = "Police Car 6", ["sheriff"] = "Sheriff Car 1", ["sheriff2"] = "Sheriff Car 2", }, -- Grade 1 [1] = { ["police"] = "Police Car 1", ["police2"] = "Police Car 2", ["police3"] = "Police Car 3", ["police4"] = "Police Car 4", ["policeb"] = "Police Car 5", ["policet"] = "Police Car 6", ["sheriff"] = "Sheriff Car 1", ["sheriff2"] = "Sheriff Car 2", }, -- Grade 2 [2] = { ["police"] = "Police Car 1", ["police2"] = "Police Car 2", ["police3"] = "Police Car 3", ["police4"] = "Police Car 4", ["policeb"] = "Police Car 5", ["policet"] = "Police Car 6", ["sheriff"] = "Sheriff Car 1", ["sheriff2"] = "Sheriff Car 2", }, -- Grade 3 [3] = { ["police"] = "Police Car 1", ["police2"] = "Police Car 2", ["police3"] = "Police Car 3", ["police4"] = "Police Car 4", ["policeb"] = "Police Car 5", ["policet"] = "Police Car 6", ["sheriff"] = "Sheriff Car 1", ["sheriff2"] = "Sheriff Car 2", }, -- Grade 4 [4] = { ["police"] = "Police Car 1", ["police2"] = "Police Car 2", ["police3"] = "Police Car 3", ["police4"] = "Police Car 4", ["policeb"] = "Police Car 5", ["policet"] = "Police Car 6", ["sheriff"] = "Sheriff Car 1", ["sheriff2"] = "Sheriff Car 2", } } Config.WhitelistedVehicles = {} Config.AmmoLabels = { -- Labels for Weapon Ammo ["AMMO_PISTOL"] = "9x19mm parabellum bullet", ["AMMO_SMG"] = "9x19mm parabellum bullet", ["AMMO_RIFLE"] = "7.62x39mm bullet", ["AMMO_MG"] = "7.92x57mm mauser bullet", ["AMMO_SHOTGUN"] = "12-gauge bullet", ["AMMO_SNIPER"] = "Large caliber bullet", } Config.Radars = { -- Radar Locations vector4(-623.44421386719, -823.08361816406, 25.25704574585, 145.0), vector4(-652.44421386719, -854.08361816406, 24.55704574585, 325.0), vector4(1623.0114746094, 1068.9924316406, 80.903594970703, 84.0), vector4(-2604.8994140625, 2996.3391113281, 27.528566360474, 175.0), vector4(2136.65234375, -591.81469726563, 94.272926330566, 318.0), vector4(2117.5764160156, -558.51013183594, 95.683128356934, 158.0), vector4(406.89505004883, -969.06286621094, 29.436267852783, 33.0), vector4(657.315, -218.819, 44.06, 320.0), vector4(2118.287, 6040.027, 50.928, 172.0), vector4(-106.304, -1127.5530, 30.778, 230.0), vector4(-823.3688, -1146.980, 8.0, 300.0), } Config.CarItems = { -- Default Trunk Items for Police Vehicles [1] = { name = "heavyarmor", amount = 2, info = {}, type = "item", slot = 1, }, [2] = { name = "empty_evidence_bag", amount = 10, info = {}, type = "item", slot = 2, }, [3] = { name = "police_stormram", amount = 1, info = {}, type = "item", slot = 3, }, } Config.Items = { -- Items to be displayed on Armory label = "Police Armory", slots = 30, items = { [1] = { name = "weapon_pistol", price = 0, amount = 1, info = { serie = "", attachments = { {component = "COMPONENT_AT_PI_FLSH", label = "Flashlight"}, } }, type = "weapon", slot = 1, authorizedJobGrades = {0, 1, 2, 3, 4} }, [2] = { name = "weapon_stungun", price = 0, amount = 1, info = { serie = "", }, type = "weapon", slot = 2, authorizedJobGrades = {0, 1, 2, 3, 4} }, [3] = { name = "weapon_pumpshotgun", price = 0, amount = 1, info = { serie = "", attachments = { {component = "COMPONENT_AT_AR_FLSH", label = "Flashlight"}, } }, type = "weapon", slot = 3, authorizedJobGrades = {0, 1, 2, 3, 4} }, [4] = { name = "weapon_smg", price = 0, amount = 1, info = { serie = "", attachments = { {component = "COMPONENT_AT_SCOPE_MACRO_02", label = "1x Scope"}, {component = "COMPONENT_AT_AR_FLSH", label = "Flashlight"}, } }, type = "weapon", slot = 4, authorizedJobGrades = {0, 1, 2, 3, 4} }, [5] = { name = "weapon_carbinerifle", price = 0, amount = 1, info = { serie = "", attachments = { {component = "COMPONENT_AT_AR_FLSH", label = "Flashlight"}, {component = "COMPONENT_AT_SCOPE_MEDIUM", label = "3x Scope"}, } }, type = "weapon", slot = 5, authorizedJobGrades = {0, 1, 2, 3, 4} }, [6] = { name = "weapon_nightstick", price = 0, amount = 1, info = {}, type = "weapon", slot = 6, authorizedJobGrades = {0, 1, 2, 3, 4} }, [7] = { name = "pistol_ammo", price = 0, amount = 5, info = {}, type = "item", slot = 7, authorizedJobGrades = {0, 1, 2, 3, 4} }, [8] = { name = "smg_ammo", price = 0, amount = 5, info = {}, type = "item", slot = 8, authorizedJobGrades = {0, 1, 2, 3, 4} }, [9] = { name = "shotgun_ammo", price = 0, amount = 5, info = {}, type = "item", slot = 9, authorizedJobGrades = {0, 1, 2, 3, 4} }, [10] = { name = "rifle_ammo", price = 0, amount = 5, info = {}, type = "item", slot = 10, authorizedJobGrades = {0, 1, 2, 3, 4} }, [11] = { name = "handcuffs", price = 0, amount = 1, info = {}, type = "item", slot = 11, authorizedJobGrades = {0, 1, 2, 3, 4} }, [12] = { name = "weapon_flashlight", price = 0, amount = 1, info = {}, type = "weapon", slot = 12, authorizedJobGrades = {0, 1, 2, 3, 4} }, [13] = { name = "empty_evidence_bag", price = 0, amount = 50, info = {}, type = "item", slot = 13, authorizedJobGrades = {0, 1, 2, 3, 4} }, [14] = { name = "police_stormram", price = 0, amount = 50, info = {}, type = "item", slot = 14, authorizedJobGrades = {0, 1, 2, 3, 4} }, [15] = { name = "armor", price = 0, amount = 50, info = {}, type = "item", slot = 15, authorizedJobGrades = {0, 1, 2, 3, 4} }, [16] = { name = "radio", price = 0, amount = 50, info = {}, type = "item", slot = 16, authorizedJobGrades = {0, 1, 2, 3, 4} }, [17] = { name = "heavyarmor", price = 0, amount = 50, info = {}, type = "item", slot = 17, authorizedJobGrades = {0, 1, 2, 3, 4} } } } ```