Every setting a server owner usually changes lives in shared/config.lua. Advanced settings such as prop lists, access rules, control ids and door lists live in shared/defaults.lua (see Advanced settings at the bottom). Fine tuning such as animations, offsets, timings and sounds is kept as constants at the top of the client or server file that uses it, so the config stays short.
General
Language = "en",
AdminPermission = "admin",
| Option | Description |
|---|---|
Language | Locale for every notification, prompt, NUI screen, radar LCD and webhook: en, tr, de, fr, es, pt, it, ru, pl, nl, ar |
AdminPermission | QBCore / Qbox permission or ESX group allowed to run the admin commands |
To add a language, copy locales/en.lua, change Locale['en'] at the top to your code, translate the texts and set Language to that code. Keep placeholders such as %s and %d in the same order.
Jobs and themes
JobRestriction = {
enabled = true,
requireOnDuty = false,
defaultTheme = "civilian",
jobs = {
["police"] = { grade = 0, theme = "police" },
["lspd"] = { grade = 0, theme = "police" },
["sasp"] = { grade = 0, theme = "police" },
["sheriff"] = { grade = 0, theme = "sheriff" },
["bcso"] = { grade = 0, theme = "sheriff" },
["fbi"] = { grade = 0, theme = "fbi" },
["fib"] = { grade = 0, theme = "fbi" },
["ambulance"] = { grade = 0, theme = "ems" },
["ems"] = { grade = 0, theme = "ems" },
},
},
| Option | Description |
|---|---|
enabled | false turns the job check off; every enabled item can be used by anyone |
requireOnDuty | Players must be on duty to use the items |
defaultTheme | Theme for jobs that are not in jobs |
jobs[name].grade | Lowest grade that may use the items. false gives the job its theme only: it can use public items but no restricted ones |
jobs[name].theme | Texture the job's gear wears: police, sheriff, ems, fbi or civilian (unmarked) |
There is one item per tool. The texture is chosen by the theme of the player using it, so adding a job is one line: ["sheriff2"] = { grade = 0, theme = "sheriff" },
Items
Every tool is one line. The key on the left is used by the script: change the values, never the key.
Items = {
ram = { name = "frkn_ram", enabled = true },
shield = { name = "frkn_shield", enabled = true },
deployshield = { name = "frkn_deployshield", enabled = true },
flashbang = { name = "frkn_flashbang", enabled = true },
nvg = { name = "frkn_nvg", enabled = true },
throwcam = { name = "frkn_throwcam", enabled = true },
robodog = { name = "frkn_robodog", enabled = true },
megaphone = { name = "frkn_megaphone", enabled = true, public = true },
bolawrap = { name = "frkn_bolawrap", enabled = true },
chaincuffs = { name = "frkn_chaincuffs", enabled = true },
mouthtape = { name = "frkn_mouthtape", enabled = true },
pepperspray = { name = "frkn_pepperspray", enabled = true },
radar = { name = "frkn_radar", enabled = true },
roadcontrol = { name = "frkn_roadcontrol", enabled = true },
clamp = { name = "frkn_clamp", enabled = true },
clampHeavy = { name = "frkn_clamp_heavy", enabled = true },
mobilespike = { name = "frkn_mobilespike", enabled = true },
grappler = { name = "frkn_grappler", enabled = true },
},
| Field | Description |
|---|---|
name | Item name in your inventory |
enabled | false turns the item off for everyone |
public | true lets every player use it, whatever their job. The megaphone is public by default |
grade | Optional. Lowest job grade for this item only, on top of the grade in jobs. Example: clampHeavy = { name = "frkn_clamp_heavy", enabled = true, grade = 2 } |
Unless an item is public, players still need one of the jobs in JobRestriction.jobs.
Kits
Kits = {
traffic = {
item = "frkn_kit_traffic",
enabled = true,
items = { { "radar", 1 }, { "roadcontrol", 1 }, { "clamp", 2 }, { "clampHeavy", 1 }, { "mobilespike", 1 }, { "grappler", 1 } },
},
assault = {
item = "frkn_kit_assault",
enabled = true,
items = { { "ram", 1 }, { "shield", 1 }, { "deployshield", 1 }, { "flashbang", 3 }, { "nvg", 1 }, { "throwcam", 1 } },
},
restraint = {
item = "frkn_kit_restraint",
enabled = true,
items = { { "bolawrap", 1 }, { "chaincuffs", 2 }, { "mouthtape", 3 }, { "pepperspray", 1 } },
},
support = {
item = "frkn_kit_support",
enabled = true,
items = { { "robodog", 1 }, { "megaphone", 1 } },
},
},
| Option | Description |
|---|---|
item | Inventory item name of the kit |
enabled | false turns the kit off |
items | { item, amount } pairs. item is a key of Items or any item name from your inventory |
Nothing is taken if the contents do not fit in the inventory. The description shown in the inventory lists the contents automatically; update the static description in your items.lua if you change a kit.
Keys
Keys = {
putAway = "G",
lower = "DOWN",
raise = "UP",
adjust = "H",
},
| Option | Description |
|---|---|
putAway | Put away what is in your hand, cancel a throw, take the spike or grappler off the vehicle |
lower | Spike out, grappler arm down |
raise | Spike in, grappler arm up, release a grappler tether |
adjust | Spike / grappler position, shield light, radar unit, clear night vision marks |
A key only acts on what is in your hand or on the vehicle panel that is open, so every tool shares the same four keys. Players can rebind them in Settings → Key Bindings → FiveM.
Vehicle panel
VehiclePanel = {
keys = {
panel = "K",
switch = "CAPITAL",
},
},
| Option | Description |
|---|---|
keys.panel | Shows / hides the panel of the gear mounted on your vehicle |
keys.switch | Switches between panels when the vehicle carries more than one device (CAPITAL = Caps Lock) |
Interaction
Interaction = {
target = "auto",
textui = "auto",
progress = "auto",
},
| Option | Description |
|---|---|
target | auto, ox_target, qb-target, interact or textui (key prompt instead of a target) |
textui | auto, ox_lib, qb-core, okokTextUI, esx or drawtext |
progress | auto, ox_lib, progressbar or none |
Vehicle gear on plates
VehicleGear = {
persist = true,
expireDays = 30,
},
| Option | Description |
|---|---|
persist | Clamps, mobile spikes and grapplers are saved on the plate and come back when the vehicle is spawned again |
expireDays | Saved gear of a plate not seen for this many days is deleted (0 = never) |
Battering ram
Ram = {
breakChance = 0,
DoorLock = {
system = "auto",
onlyLocked = true,
},
},
| Option | Description |
|---|---|
breakChance | Percent chance the ram breaks on a successful breach (0 = never) |
DoorLock.system | auto checks every running doorlock and rams the closest locked door of any of them. A resource name uses only that doorlock |
DoorLock.onlyLocked | Only locked doors can be rammed |
Supported out of the box: frkn-doorlockv2, qb-doorlock, ox_doorlock, rcore_doorlock, cd_doorlock, doors_creator, esx_doorlock and nui_doorlock. Doors your doorlock does not know, extra door models, door black / white lists and bridges for your own doorlock are under Advanced settings.
Ballistic shield
Shield = {
light = {
enabled = true,
},
},
| Option | Description |
|---|---|
light.enabled | Light on the front of the shield, toggled with Keys.adjust |
Deployable shield
DeployShield = {
enabled = true,
maxPerPlayer = 2,
},
| Option | Description |
|---|---|
enabled | Turns the deployable shield off |
maxPerPlayer | Shields one player may have out at once (0 = no limit) |
Flashbang
Throwables = {
Flashbang = {
radius = 18.0,
maxEffect = 7000,
},
},
| Option | Description |
|---|---|
radius | Radius players are blinded in, metres |
maxEffect | Longest blindness in milliseconds, right next to the bang |
Throwable camera
ThrowCam = {
maxPerPlayer = 2,
maxWorld = 20,
shareMode = "job",
maxRange = 80.0,
keys = {
connect = "B",
},
detonate = {
enabled = true,
},
},
| Option | Description |
|---|---|
maxPerPlayer | Cameras one player may have out (0 = unlimited) |
maxWorld | Cameras on the whole server (0 = unlimited) |
shareMode | Who can connect: job, all or none (owner only) |
maxRange | Metres a camera may be from its viewer. Past it the camera is removed and the item returns to the owner's inventory (0 = off) |
keys.connect | Connect to / disconnect from the nearest camera |
detonate.enabled | H blows the camera up from the feed; the item is lost |
Robodog
Robodog = {
maxPerPlayer = 1,
maxWorld = 8,
shareMode = "job",
maxRange = 80.0,
keys = {
control = "M",
},
taser = {
enabled = true,
cooldown = 5000,
},
},
| Option | Description |
|---|---|
maxPerPlayer | Units one player may have out (0 = unlimited) |
maxWorld | Units on the whole server (0 = unlimited) |
shareMode | Who can drive a unit: job, all or none (owner only) |
maxRange | Metres a unit may go from its driver. Past it the unit is removed and the item returns to the owner's inventory (0 = off) |
keys.control | Jump back into your unit |
taser.enabled / taser.cooldown | Left click fires the taser; milliseconds between two shots |
Night vision goggles
Nvg = {
thermal = {
enabled = true,
},
keys = {
toggle = "N",
mark = "E",
},
Marks = {
enabled = true,
shareMode = "job",
},
},
| Option | Description |
|---|---|
thermal.enabled | The toggle key also cycles to thermal vision |
keys.toggle | Cycles the vision mode |
keys.mark | Marks the spot you look at |
Marks.enabled | Players wearing the goggles can mark spots with keys.mark and clear them with Keys.adjust |
Marks.shareMode | Who sees marks: job, all or none (owner only) |
BolaWrap
Bolawrap = {
maxShootDistance = 20.0,
reloadTime = 5000,
selfRelease = false,
},
| Option | Description |
|---|---|
maxShootDistance | Range in metres |
reloadTime | Milliseconds before the next shot |
selfRelease | Wrapped players may free themselves |
Chain cuffs
ChainCuffs = {
length = 4.0,
},
| Option | Description |
|---|---|
length | Chain length in metres |
Mouth tape
MouthTape = {
requireTarget = "any",
selfRemove = false,
},
| Option | Description |
|---|---|
requireTarget | Who can be taped: any, cuffed or downed |
selfRemove | The taped player can peel the tape off themselves |
Voice
Voice = {
system = "auto",
muteRadio = true,
},
| Option | Description |
|---|---|
system | auto, pma-voice, mumble-voip, saltychat or native |
muteRadio | The radio is muted too while a player wears mouth tape |
SaltyChat has no way to mute proximity only, so a taped player is muted on both proximity and radio there and muteRadio has no effect.
Pepper spray
PepperSpray = {
charge = {
enabled = true,
},
},
| Option | Description |
|---|---|
charge.enabled | The can empties as it is used and shows its charge on the item; false = never runs out |
Speed radar
Radar = {
unit = "kmh",
speedLimit = 90,
webhook = "",
},
| Option | Description |
|---|---|
unit | kmh or mph; players can also switch it with Keys.adjust |
speedLimit | Readings above this are flagged as speeding |
webhook | Discord webhook for speeding readings, empty = off |
Wheel clamp
Clamp = {
lockpick = {
enabled = true,
item = "lockpick",
advancedItem = "advancedlockpick",
alertPolice = true,
},
webhook = "",
},
| Option | Description |
|---|---|
lockpick.enabled | Standard clamps can be lockpicked off; heavy clamps never can |
lockpick.item / advancedItem | Lockpick items; the advanced one gives more time |
lockpick.alertPolice | Fires frkn-tacticalpack:server:onClampLockpick for dispatch scripts |
webhook | Discord webhook for clamp logs, empty = off |
Mobile spike
MobileSpike = {
policeVehiclesOnly = false,
returnItem = true,
webhook = "",
},
| Option | Description |
|---|---|
policeVehiclesOnly | Only emergency class vehicles can carry a mobile spike |
returnItem | The item comes back when the spike is taken off |
webhook | Discord webhook for spike logs, empty = off |
Police grappler
Grappler = {
policeVehiclesOnly = false,
returnItem = true,
webhook = "",
},
| Option | Description |
|---|---|
policeVehiclesOnly | Only emergency class vehicles can carry a grappler |
returnItem | The item comes back when the grappler is taken off |
webhook | Discord webhook for grappler logs, empty = off |
Road control device
The road control device places both the road barriers and the road blocker plate. It is never used up, and placed props are not taken from the inventory.
Bollard = {
enabled = true,
maxPerPlayer = 6,
},
TacBlocker = {
enabled = true,
maxPerPlayer = 6,
},
| Option | Description |
|---|---|
Bollard.enabled / TacBlocker.enabled | Turns the barriers / the road blocker plate off |
maxPerPlayer | Props one player may have out at once (0 = no limit). All barrier props share one limit; plates have their own |
The prop list, who may raise / lower and pick up a prop, and raising a bollard from the driver's seat are under Advanced settings.
Megaphone
Megaphone = {
voice = {
ranges = {
hand = 30.0,
stage = 100.0,
},
},
stage = {
enabled = true,
requireJob = false,
},
},
| Option | Description |
|---|---|
voice.ranges.hand | Default range of the handheld megaphone in metres; players change it with the arrow keys |
voice.ranges.stage | Range of a microphone stand in metres |
stage.enabled | Microphone props in the world work as a megaphone |
stage.requireJob | false lets anybody speak at a microphone stand |
The megaphone sound needs setr voice_useNativeAudio true in server.cfg.
Hands up fix
HandsUpFix = {
enabled = true,
resource = "qb-smallresources",
command = "hu",
},
| Option | Description |
|---|---|
enabled | Cancels another script's hands up pose when it shares a key with the pack |
resource | Resource that owns the hands up command |
command | Its hands up toggle command |
Advanced settings
These settings are not in shared/config.lua; their defaults live in shared/defaults.lua. To change one, copy the line into the same section of shared/config.lua. A value in the config always wins over the default, and everything you leave out keeps its default.
For example, to let anyone pick up road barriers:
Bollard = {
enabled = true,
maxPerPlayer = 6,
access = {
toggle = { job = true, owner = true, anyone = false },
pickup = { job = true, owner = true, anyone = true },
},
},
Lists such as Bollard.props, Shield.allowedGroups or Megaphone.stage.models are replaced as a whole when you copy them into the config, so copy the full list and change it there.
Battering ram
Ram = {
DoorLock = {
nativeFallback = true,
doorModels = {},
blacklist = {},
whitelist = {},
custom = {},
},
},
| Option | Description |
|---|---|
DoorLock.nativeFallback | Any real door can be rammed, even one your doorlock does not know |
DoorLock.doorModels | Extra models counted as doors, e.g. { "v_ilev_bk_gate" } |
DoorLock.blacklist | Door ids that can never be rammed |
DoorLock.whitelist | If not empty, only these door ids can be rammed |
DoorLock.custom | Bridges for your own doorlock, see below |
A bridge for your own doorlock goes into Ram.DoorLock in the config:
custom = {
["my_doorlock"] = {
doors = function() return exports["my_doorlock"]:GetDoorList() end,
unlock = function(source, doorId)
exports["my_doorlock"]:SetDoorLocked(doorId, false)
return true
end,
locked = function(doorId) return exports["my_doorlock"]:IsDoorLocked(doorId) end,
},
},
| Function | Side | Description |
|---|---|---|
doors | Client | Returns { [doorId] = { coords = vector3(...), locked = true } }; qb-doorlock style entries also work |
unlock | Server | Unlocks the door, returns true when it worked |
locked | Server | Optional, returns true while the door is locked |
A custom bridge is only used while its resource is started.
Ballistic shield
Shield = {
allowedGroups = { "GROUP_PISTOL", "GROUP_STUNGUN" },
allowedWeapons = {},
},
| Option | Description |
|---|---|
allowedGroups | Weapon groups that can be held behind the shield |
allowedWeapons | Extra weapons, e.g. { "WEAPON_FLASHLIGHT" } |
Deployable shield, road barriers and road blocker plate
DeployShield = {
access = {
toggle = { job = true, owner = true, anyone = false },
pickup = { job = true, owner = true, anyone = false },
},
},
Bollard = {
props = {
{ model = "as_police_bollard", label = "bollard_prop_bollard", animated = true },
{ model = "prop_roadcone02a", label = "bollard_prop_cone", loose = true },
{ model = "prop_barrier_work05", label = "bollard_prop_work", loose = true },
{ model = "prop_mp_barrier_02b", label = "bollard_prop_police" },
{ model = "prop_mp_arrow_barrier_01", label = "bollard_prop_arrow" },
{ model = "prop_barrier_work06a", label = "bollard_prop_work_lights" },
{ model = "prop_snow_sign_road_06g", label = "bollard_prop_road_closed" },
{ model = "prop_barier_conc_05a", label = "bollard_prop_concrete" },
{ model = "prop_roadcone01a", label = "bollard_prop_big_cone", loose = true },
{ model = "prop_mp_cone_01", label = "bollard_prop_small_cone", loose = true },
{ model = "prop_worklight_03b", label = "bollard_prop_work_light" },
{ model = "prop_gazebo_03", label = "bollard_prop_tent" },
},
access = {
toggle = { job = true, owner = true, anyone = false },
pickup = { job = true, owner = true, anyone = false },
},
vehicle = {
enabled = true,
},
},
TacBlocker = {
access = {
toggle = { job = true, owner = true, anyone = false },
pickup = { job = true, owner = true, anyone = false },
},
},
| Option | Description |
|---|---|
access.toggle / access.pickup | Who may raise / lower and pick up the prop: anyone with the job, the owner, or anyone at all |
Bollard.props | Props the placement menu offers, in CAPS LOCK order. label is a locale key |
props[].animated | Raises and lowers, and blocks traffic while raised |
props[].loose | Vehicles can knock it over |
Bollard.vehicle.enabled | Raise / lower the nearest bollard from the driver's seat |
To add your own prop, copy the whole props list into Bollard in the config and add the prop at the end. Any prop works; add a locale key for its label in every file in locales/.
Night vision goggles
Nvg = {
flipWithVision = true,
keys = {
flip = "X",
},
Marks = {
requireNvgToSee = true,
playerColors = true,
},
},
| Option | Description |
|---|---|
flipWithVision | The goggles flip down with the vision; false adds a separate flip key |
keys.flip | Flips the goggles, only when flipWithVision = false |
Marks.requireNvgToSee | Marks are only shown to players wearing the helmet |
Marks.playerColors | Every player marks in their own colour |
Speed radar
Radar = {
keys = {
limitUp = 172,
limitDown = 173,
},
},
| Option | Description |
|---|---|
keys.limitUp / keys.limitDown | Control ids that change the limit (arrow up / down) |
Wheel clamp
Clamp = {
lockpick = {
useItem = false,
pins = 3,
},
removePermission = {
owner = true,
job = true,
admin = true,
},
},
| Option | Description |
|---|---|
lockpick.useItem | Using the lockpick item next to a clamp starts the minigame. Keep false if another script already uses the lockpick item |
lockpick.pins | Stages to beat in the minigame |
removePermission | Who may take a clamp off: the officer who put it on, anyone with the required job, admins |
Megaphone
Megaphone = {
voice = {
volume = -1.0,
},
stage = {
models = { "v_club_roc_micstd", "prop_table_mic_01", "prop_mic_stand_01", "prop_micandstand_01" },
},
},
| Option | Description |
|---|---|
voice.volume | -1.0 fades the voice out with distance; 0.0 - 1.0 forces one volume for every listener |
stage.models | Props that work as a microphone stand |
Hands up fix
HandsUpFix = {
export = "getHandsup",
},
| Option | Description |
|---|---|
export | Its "are the hands up" export; empty string checks the animation instead |