[ESX/QBCORE] Wasabi's Advanced Police Job

Wasabi’s ESX/QBCore Police Job Replacement👮‍


:shopping_cart:Buy Escrowed - $49.99

:shopping_cart:Buy Unlocked - $99.99


Background

I’ve created this script as much more immersive experience for both your law enforcement and your criminals! With features requested from my community members such as resisting arrest, tackling, multiple LEO departments, and full animations/props; this resource will serve as a necessity for your server.


Features

  • Optimized with 0.00ms idle
  • Multiple LEO departments(No need for separate scripts for separate police jobs)
  • Full handcuff props and animations
  • Escorting animation
  • Keybinds for arrest(Configurable)
  • Resisting arrest via skill-check
  • Compatible with ox_inventory, qb-inventory, qs-inventory, and mf_inventory(Code open to incorporate a different inventory)
  • Tackling(Configurable)
  • Job Menu (Configurable)
  • Fine players(Compatible with QBCore, okokBilling and esx billing OR any billing can be added to open code)
  • Boss menu(Compatible with wasabi_multijob, qb-management and esx_society)
  • Cloakroom(Compatible with esx_skin and my fork of fivem-appearance OR any skin script can be added to open code)
  • Optional target(By default compatible with qtarget/qb-target/ox_target)
  • Armory(Configurable by job grade)
  • Garage for land & air(Configurable by job grade)
  • Vehicle interaction menu added to job menu which includes vehicle ownership information, lockpicking vehicle, and impounding vehicle (New As of 1.0.5)
  • Ability to incorporate jail script(See docs)
  • Ability to view suspect’s identification
  • Ability to view and revoke licenses
  • Most if not all of the pre-existing esx_policejob features
  • EXTREMELY configurable
  • Full replacement for any script that depends on esx_policejob
  • And more!

Frequent updates / feature additions planned so stay tuned!


Configuration

config.lua
local seconds, minutes = 1000, 60000
Config = {}

Config.jobMenu = 'F6' -- Default job menu key

Config.customCarlock = false -- If you use wasabi_carlock(Add your own carlock system in client/cl_customize.lua)
Config.billingSystem = false -- Current options: 'esx' (For esx_billing) / 'okok' (For okokBilling) (Easy to add more/fully customize in client/cl_customize.lua)
Config.skinScript = false -- Current options: 'esx' (For esx_skin) / 'appearance' (For wasabi-fivem-appearance) (Custom can be added in client/cl_customize.lua)
Config.customJail = false -- Set to true if you want to add jail option to menu(Requires you to edit wasabi_police:sendToJail event in client/cl_customize.lua)

Config.inventory = 'ox' -- NEEDED FOR SEARCHING PLAYERS - Current options: 'ox' (For ox_inventory) / 'mf' (For mf inventory) / 'qs' (For qs_inventory) / 'custom' (Custom can be added in client/cl_customize.lua)
Config.searchPlayers = true -- Allow police jobs to search players (Must set correct inventory above)

Config.weaponsAsItems = false -- This is typically for older ESX and inventories that still use weapons as weapons and not items(If you're unsure leave as true!)
Config.esxIdentity = true -- Enable to gain option additional information when checking ID of suspect. (Requires esx_identity or similar)
Config.esxLicense = true -- Enable if you use esx_license or something similar for weapon licenses/etc


Config.tackle = {
    enabled = true, -- Enable tackle?
    policeOnly = true, -- Police jobs only use tackle?
    hotkey = 'G' -- What key to press while sprinting to start tackle of target
}

Config.handcuff = { -- Config in regards to cuffing
    timer = 20 * minutes, -- Time before player is automatically unrestrained(Set to false if not desired)
    hotkey = 'J', -- What key to press to handcuff people(Set to false for no hotkey)
    skilledEscape = {
        enabled = true, -- Allow criminal to simulate resisting by giving them a chance to break free from cuffs via skill check
        difficulty = {'easy', 'easy', 'easy'} -- Options: 'easy' / 'medium' / 'hard' (Can be stringed along as they are in config)
    }
}

Config.policeJobs = { -- Police jobs
    'police',
    'sheriff'
}

Config.Locations = {
    LSPD = {
        blip = {
            enabled = true,
            coords = vec3(464.57, -992.0, 30.69),
            sprite = 60,
            color = 29,
            scale = 1.0,
            string = 'Mission Row PD'
        },

        bossMenu = {
            enabled = true, -- Enable boss menu?
            jobLock = 'police', -- Lock to specific police job? Set to false if not desired
            coords = vec3(460.64, -985.64, 30.73), -- Location of boss menu (If not using target)
            label = '[E] - Access Boss Menu', -- Text UI label string (If not using target)
            distance = 3.0, -- Distance to allow access/prompt with text UI (If not using target)
            target = {
                enabled = false, -- If enabled, the location and distance above will be obsolete
                label = 'Access Boss Menu',
                coords = vec3(460.64, -985.64, 30.73),
                heading = 269.85,
                width = 2.0,
                length = 1.0,
                minZ = 30.73-0.9,
                maxZ = 30.73+0.9
            }
        },

        armoury = {
            enabled = true, -- Set to false if you don't want to use
            coords = vec3(480.32, -996.67, 30.69-0.9), -- Coords of armoury
            heading = 86.95, -- Heading of armoury NPC
            ped = 's_f_y_cop_01',
            label = '[E] - Access Armoury', -- String of text ui
            jobLock = 'police', -- Allow only one of Config.policeJob listings / Set to false if allow all Config.policeJobs
            weapons = {
                [0] = { -- Grade number will be the name of each table(this would be grade 0)
                    ['WEAPON_PISTOL'] = { label = 'Pistol', multiple = false, price = 75 }, -- Set price to false if undesired
                    ['WEAPON_NIGHTSTICK'] = { label = 'Night Stick', multiple = false, price = 50 },
--                    ['ammo-9'] = { label = '9mm Ammo', multiple = true, price = 10 }, -- Set multiple to true if you want ability to purchase more than one at a time
--                    ['armour'] = { label = 'Bulletproof Vest', multiple = false, price = 100 }, -- Example

                },
                [1] = { -- This would be grade 1
                    ['WEAPON_COMBATPISTOL'] = { label = 'Combat Pistol', multiple = false, price = 150 },
                    ['WEAPON_NIGHTSTICK'] = { label = 'Night Stick', multiple = false, price = 50 },
--                    ['ammo-9'] = { label = '9mm Ammo', multiple = true, price = 10 }, -- Example
--                    ['armour'] = { label = 'Bulletproof Vest', multiple = false, price = 100 }, -- Example
                },
                [2] = { -- This would be grade 2
                    ['WEAPON_COMBATPISTOL'] = { label = 'Combat Pistol', multiple = false, price = 150 },
                    ['WEAPON_NIGHTSTICK'] = { label = 'Night Stick', multiple = false, price = 50 },
                    ['WEAPON_ASSAULTRIFLE'] = { label = 'Assault Rifle', multiple = false, price = 1100 },
--                    ['ammo-9'] = { label = '9mm Ammo', multiple = true, price = 10 }, -- Example
--                    ['ammo-rifle'] = { label = '5.56 Ammo', multiple = true, price = 20 }, -- Example
--                    ['armour'] = { label = 'Bulletproof Vest', multiple = false, price = 100 }, -- Example
                },
                [3] = { -- This would be grade 3
                    ['WEAPON_COMBATPISTOL'] = { label = 'Combat Pistol', multiple = false, price = 150 },
                    ['WEAPON_NIGHTSTICK'] = { label = 'Night Stick', multiple = false, price = 50 },
                    ['WEAPON_ASSAULTRIFLE'] = { label = 'Assault Rifle', multiple = false, price = 1100 },
              --    ['ammo-9'] = { label = '9mm Ammo', multiple = true, price = 10 }, -- Example
              --    ['ammo-rifle'] = { label = '5.56 Ammo', multiple = true, price = 20 }, -- Example
              --    ['armour'] = { label = 'Bulletproof Vest', multiple = false, price = 100 }, -- Example
                },
            }
        },

        cloakroom = {
            enabled = true, -- Set to false if you don't want to use (Compatible with esx_skin & wasabi fivem-appearance fork)
            coords = vec3(462.36, -999.62, 30.69), -- Coords of cloakroom
            label = '[E] - Change Clothes', -- String of text ui of cloakroom
            range = 2.0, -- Range away from coords you can use.
            uniforms = { -- Uniform choices

                ['Recruit'] = { -- Name of outfit that will display in menu
                    male = { -- Male variation
                        ['tshirt_1'] = 15,  ['tshirt_2'] = 0,
                        ['torso_1'] = 5,   ['torso_2'] = 2,
                        ['arms'] = 5,
                        ['pants_1'] = 6,   ['pants_2'] = 1,
                        ['shoes_1'] = 16,   ['shoes_2'] = 7,
                        ['helmet_1'] = 44,  ['helmet_2'] = 7,
                    },
                    female = { -- Female variation
                        ['tshirt_1'] = 15,  ['tshirt_2'] = 0,
                        ['torso_1'] = 4,   ['torso_2'] = 14,
                        ['arms'] = 4,
                        ['pants_1'] = 25,   ['pants_2'] = 1,
                        ['shoes_1'] = 16,   ['shoes_2'] = 4,
                    }
                },

                ['Patrol'] = {
                    male = {
                        ['tshirt_1'] = 58,  ['tshirt_2'] = 0,
                        ['torso_1'] = 55,   ['torso_2'] = 0,
                        ['arms'] = 30,
                        ['pants_1'] = 24,   ['pants_2'] = 0,
                        ['shoes_1'] = 10,   ['shoes_2'] = 0,
                        ['helmet_1'] = 46,  ['helmet_2'] = 0,
                    },
                    female = {
                        ['tshirt_1'] = 15,  ['tshirt_2'] = 0,
                        ['torso_1'] = 4,   ['torso_2'] = 14,
                        ['arms'] = 4,
                        ['pants_1'] = 25,   ['pants_2'] = 1,
                        ['shoes_1'] = 16,   ['shoes_2'] = 4,
                    }
                },

                ['Chief'] = {
                    male = {
                        ['tshirt_1'] = 15,  ['tshirt_2'] = 0,
                        ['torso_1'] = 5,   ['torso_2'] = 2,
                        ['arms'] = 5,
                        ['pants_1'] = 6,   ['pants_2'] = 1,
                        ['shoes_1'] = 16,   ['shoes_2'] = 7,
                        ['helmet_1'] = 44,  ['helmet_2'] = 7,
                    },
                    female = {
                        ['tshirt_1'] = 15,  ['tshirt_2'] = 0,
                        ['torso_1'] = 4,   ['torso_2'] = 14,
                        ['arms'] = 4,
                        ['pants_1'] = 25,   ['pants_2'] = 1,
                        ['shoes_1'] = 16,   ['shoes_2'] = 4,
                    }
                },
                
            }

        },

        vehicles = { -- Vehicle Garage
            enabled = true, -- Enable? False if you have you're own way for medics to obtain vehicles.
            jobLock = 'police', -- Job lock? or access to all police jobs by using false
            zone = {
                coords = vec3(463.69, -1019.72, 28.1), -- Area to prompt vehicle garage
                range = 5.5, -- Range it will prompt from coords above
                label = '[E] - Access Garage',
                return_label = '[E] - Return Vehicle'
            },
            spawn = {
                land = {
                    coords = vec3(449.37, -1025.46, 28.59), -- Coords of where land vehicle spawn/return
                    heading = 3.68
                },
                air = {
                    coords = vec3(449.29, -981.76, 43.69), -- Coords of where air vehicles spawn/return
                    heading =  0.01
                }
            },
            options = {

                [0] = { -- Job grade as table name
                    ['police'] = { -- Car/Helicopter/Vehicle Spawn Code/Model Name
                        label = 'Police Cruiser',
                        category = 'land', -- Options are 'land' and 'air'
                    },
                    ['police2'] = { -- Car/Helicopter/Vehicle Spawn Code/Model Name
                        label = 'Police Cruiser #2',
                        category = 'land', -- Options are 'land' and 'air'
                    },
                    ['polmav'] = { -- Car/Helicopter/Vehicle Spawn Code/Model Name
                        label = 'Maverick',
                        category = 'air', -- Options are 'land' and 'air'
                    },
                },

                [1] = { -- Job grade as table name
                    ['police'] = { -- Car/Helicopter/Vehicle Spawn Code/Model Name
                        label = 'Police Cruiser',
                        category = 'land', -- Options are 'land' and 'air'
                    },
                    ['police2'] = { -- Car/Helicopter/Vehicle Spawn Code/Model Name
                        label = 'Police Cruiser #2',
                        category = 'land', -- Options are 'land' and 'air'
                    },
                    ['polmav'] = { -- Car/Helicopter/Vehicle Spawn Code/Model Name
                        label = 'Maverick',
                        category = 'air', -- Options are 'land' and 'air'
                    },
                },

                [2] = { -- Job grade as table name
                    ['police'] = { -- Car/Helicopter/Vehicle Spawn Code/Model Name
                        label = 'Police Cruiser',
                        category = 'land', -- Options are 'land' and 'air'
                    },
                    ['police2'] = { -- Car/Helicopter/Vehicle Spawn Code/Model Name
                        label = 'Police Cruiser #2',
                        category = 'land', -- Options are 'land' and 'air'
                    },
                    ['polmav'] = { -- Car/Helicopter/Vehicle Spawn Code/Model Name
                        label = 'Maverick',
                        category = 'air', -- Options are 'land' and 'air'
                    },
                },

                [3] = { -- Job grade as table name
                    ['police'] = { -- Car/Helicopter/Vehicle Spawn Code/Model Name
                        label = 'Police Cruiser',
                        category = 'land', -- Options are 'land' and 'air'
                    },
                    ['police2'] = { -- Car/Helicopter/Vehicle Spawn Code/Model Name
                        label = 'Police Cruiser #2',
                        category = 'land', -- Options are 'land' and 'air'
                    },
                    ['polmav'] = { -- Car/Helicopter/Vehicle Spawn Code/Model Name
                        label = 'Maverick',
                        category = 'air', -- Options are 'land' and 'air'
                    },
                },

            }
        }

    },

}

Special Note: 100% functional/tested for ESX 1.2 and above; there is no guarantee at this time for older versions of es_extended!


Preview

Link to video(Just in case)


Please report any issues/requests via PM or the support server!


:shopping_cart:Buy Escrowed - $49.99

:shopping_cart:Buy Unlocked - $99.99


:police_car: Police / Ambulance Bundle :ambulance:

Per a few requests I’ve bundled my police and ambulance job scripts in the Tebex store with a discounted price in comparison to purchasing both separately.

:shopping_cart:Escrow PD/EMS BUNDLE: https://store.wasabiscripts.com/category/2080869
:shopping_cart:Open Source PD/EMS BUNDLE: https://store.wasabiscripts.com/category/open-source


My Other Releases:

Code is accessible Partially (Escrowed) / Open Source Option Avaliable
Subscription-based No
Lines (approximately) ~1800+
Requirements es_extended OR qb-core, ox_lib, oxmysql OR mysql-async, wasabi_bridge(included with purchase)
Support Yes
132 Likes

Hello, i’m still waiting to buy this and the ambulance job but i dont use any target system… you said you will do this optional and instead a drawtext or 3dtext…

Although it is expensive, all plug-ins are perfect. I hope more free plug-ins can be released and supported all the time.

2 Likes

If i buy this script in escrow i still can upgrade with other script escort animation with walking suspect ? :thinking:

Amazing😍

1 Like

Very good script!!

1 Like

Seems dope as always!

2 Likes

Another hit by the wizard !!!

1 Like

Awesome as always my dude! :1st_place_medal:

1 Like

Amazon job, wasabi god :heart::heart:

1 Like

Amazing job. Keep up the good work

1 Like

Very good job, i recommend! <3 Love Wasabi scripts!

2 Likes

Hey, I have the ambulance job and its honestly the best job i’ve seen. I really like the target options and all the scripts are high quality as aways! :heart:

2 Likes

As we know, another amazing script from wasabi, as others, very optimize.

1 Like

Great scripts and support from Wasabi and a nice guy too.

1 Like

Always making quality products :heart_eyes:

1 Like

Another great release! Great job!

2 Likes

This one does not require target. I have most of ambulance with target removed I just have 1 more target to convert. Sorry for the wait on the ambulance; one target to go.

Edit: Thank you everyone for all the positive comments! :heart:

1 Like

Super cool! Another nice project, thank you!

cool beans