Skip to content

Config Settings

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

lua
Language = "en",
AdminPermission = "admin",
OptionDescription
LanguageLocale for every notification, prompt, NUI screen, radar LCD and webhook: en, tr, de, fr, es, pt, it, ru, pl, nl, ar
AdminPermissionQBCore / 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

lua
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" },
    },
},
OptionDescription
enabledfalse turns the job check off; every enabled item can be used by anyone
requireOnDutyPlayers must be on duty to use the items
defaultThemeTheme for jobs that are not in jobs
jobs[name].gradeLowest grade that may use the items. false gives the job its theme only: it can use public items but no restricted ones
jobs[name].themeTexture 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.

lua
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 },
},
FieldDescription
nameItem name in your inventory
enabledfalse turns the item off for everyone
publictrue lets every player use it, whatever their job. The megaphone is public by default
gradeOptional. 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

lua
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 } },
    },
},
OptionDescription
itemInventory item name of the kit
enabledfalse 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

lua
Keys = {
    putAway = "G",
    lower = "DOWN",
    raise = "UP",
    adjust = "H",
},
OptionDescription
putAwayPut away what is in your hand, cancel a throw, take the spike or grappler off the vehicle
lowerSpike out, grappler arm down
raiseSpike in, grappler arm up, release a grappler tether
adjustSpike / 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

lua
VehiclePanel = {
    keys = {
        panel = "K",
        switch = "CAPITAL",
    },
},
OptionDescription
keys.panelShows / hides the panel of the gear mounted on your vehicle
keys.switchSwitches between panels when the vehicle carries more than one device (CAPITAL = Caps Lock)

Interaction

lua
Interaction = {
    target = "auto",
    textui = "auto",
    progress = "auto",
},
OptionDescription
targetauto, ox_target, qb-target, interact or textui (key prompt instead of a target)
textuiauto, ox_lib, qb-core, okokTextUI, esx or drawtext
progressauto, ox_lib, progressbar or none

Vehicle gear on plates

lua
VehicleGear = {
    persist = true,
    expireDays = 30,
},
OptionDescription
persistClamps, mobile spikes and grapplers are saved on the plate and come back when the vehicle is spawned again
expireDaysSaved gear of a plate not seen for this many days is deleted (0 = never)

Battering ram

lua
Ram = {
    breakChance = 0,
    DoorLock = {
        system = "auto",
        onlyLocked = true,
    },
},
OptionDescription
breakChancePercent chance the ram breaks on a successful breach (0 = never)
DoorLock.systemauto checks every running doorlock and rams the closest locked door of any of them. A resource name uses only that doorlock
DoorLock.onlyLockedOnly 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

lua
Shield = {
    light = {
        enabled = true,
    },
},
OptionDescription
light.enabledLight on the front of the shield, toggled with Keys.adjust

Deployable shield

lua
DeployShield = {
    enabled = true,
    maxPerPlayer = 2,
},
OptionDescription
enabledTurns the deployable shield off
maxPerPlayerShields one player may have out at once (0 = no limit)

Flashbang

lua
Throwables = {
    Flashbang = {
        radius = 18.0,
        maxEffect = 7000,
    },
},
OptionDescription
radiusRadius players are blinded in, metres
maxEffectLongest blindness in milliseconds, right next to the bang

Throwable camera

lua
ThrowCam = {
    maxPerPlayer = 2,
    maxWorld = 20,
    shareMode = "job",
    maxRange = 80.0,
    keys = {
        connect = "B",
    },
    detonate = {
        enabled = true,
    },
},
OptionDescription
maxPerPlayerCameras one player may have out (0 = unlimited)
maxWorldCameras on the whole server (0 = unlimited)
shareModeWho can connect: job, all or none (owner only)
maxRangeMetres 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.connectConnect to / disconnect from the nearest camera
detonate.enabledH blows the camera up from the feed; the item is lost

Robodog

lua
Robodog = {
    maxPerPlayer = 1,
    maxWorld = 8,
    shareMode = "job",
    maxRange = 80.0,
    keys = {
        control = "M",
    },
    taser = {
        enabled = true,
        cooldown = 5000,
    },
},
OptionDescription
maxPerPlayerUnits one player may have out (0 = unlimited)
maxWorldUnits on the whole server (0 = unlimited)
shareModeWho can drive a unit: job, all or none (owner only)
maxRangeMetres 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.controlJump back into your unit
taser.enabled / taser.cooldownLeft click fires the taser; milliseconds between two shots

Night vision goggles

lua
Nvg = {
    thermal = {
        enabled = true,
    },
    keys = {
        toggle = "N",
        mark = "E",
    },
    Marks = {
        enabled = true,
        shareMode = "job",
    },
},
OptionDescription
thermal.enabledThe toggle key also cycles to thermal vision
keys.toggleCycles the vision mode
keys.markMarks the spot you look at
Marks.enabledPlayers wearing the goggles can mark spots with keys.mark and clear them with Keys.adjust
Marks.shareModeWho sees marks: job, all or none (owner only)

BolaWrap

lua
Bolawrap = {
    maxShootDistance = 20.0,
    reloadTime = 5000,
    selfRelease = false,
},
OptionDescription
maxShootDistanceRange in metres
reloadTimeMilliseconds before the next shot
selfReleaseWrapped players may free themselves

Chain cuffs

lua
ChainCuffs = {
    length = 4.0,
},
OptionDescription
lengthChain length in metres

Mouth tape

lua
MouthTape = {
    requireTarget = "any",
    selfRemove = false,
},
OptionDescription
requireTargetWho can be taped: any, cuffed or downed
selfRemoveThe taped player can peel the tape off themselves

Voice

lua
Voice = {
    system = "auto",
    muteRadio = true,
},
OptionDescription
systemauto, pma-voice, mumble-voip, saltychat or native
muteRadioThe 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

lua
PepperSpray = {
    charge = {
        enabled = true,
    },
},
OptionDescription
charge.enabledThe can empties as it is used and shows its charge on the item; false = never runs out

Speed radar

lua
Radar = {
    unit = "kmh",
    speedLimit = 90,
    webhook = "",
},
OptionDescription
unitkmh or mph; players can also switch it with Keys.adjust
speedLimitReadings above this are flagged as speeding
webhookDiscord webhook for speeding readings, empty = off

Wheel clamp

lua
Clamp = {
    lockpick = {
        enabled = true,
        item = "lockpick",
        advancedItem = "advancedlockpick",
        alertPolice = true,
    },
    webhook = "",
},
OptionDescription
lockpick.enabledStandard clamps can be lockpicked off; heavy clamps never can
lockpick.item / advancedItemLockpick items; the advanced one gives more time
lockpick.alertPoliceFires frkn-tacticalpack:server:onClampLockpick for dispatch scripts
webhookDiscord webhook for clamp logs, empty = off

Mobile spike

lua
MobileSpike = {
    policeVehiclesOnly = false,
    returnItem = true,
    webhook = "",
},
OptionDescription
policeVehiclesOnlyOnly emergency class vehicles can carry a mobile spike
returnItemThe item comes back when the spike is taken off
webhookDiscord webhook for spike logs, empty = off

Police grappler

lua
Grappler = {
    policeVehiclesOnly = false,
    returnItem = true,
    webhook = "",
},
OptionDescription
policeVehiclesOnlyOnly emergency class vehicles can carry a grappler
returnItemThe item comes back when the grappler is taken off
webhookDiscord 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.

lua
Bollard = {
    enabled = true,
    maxPerPlayer = 6,
},

TacBlocker = {
    enabled = true,
    maxPerPlayer = 6,
},
OptionDescription
Bollard.enabled / TacBlocker.enabledTurns the barriers / the road blocker plate off
maxPerPlayerProps 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

lua
Megaphone = {
    voice = {
        ranges = {
            hand = 30.0,
            stage = 100.0,
        },
    },
    stage = {
        enabled = true,
        requireJob = false,
    },
},
OptionDescription
voice.ranges.handDefault range of the handheld megaphone in metres; players change it with the arrow keys
voice.ranges.stageRange of a microphone stand in metres
stage.enabledMicrophone props in the world work as a megaphone
stage.requireJobfalse lets anybody speak at a microphone stand

The megaphone sound needs setr voice_useNativeAudio true in server.cfg.

Hands up fix

lua
HandsUpFix = {
    enabled = true,
    resource = "qb-smallresources",
    command = "hu",
},
OptionDescription
enabledCancels another script's hands up pose when it shares a key with the pack
resourceResource that owns the hands up command
commandIts 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:

lua
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

lua
Ram = {
    DoorLock = {
        nativeFallback = true,
        doorModels = {},
        blacklist = {},
        whitelist = {},
        custom = {},
    },
},
OptionDescription
DoorLock.nativeFallbackAny real door can be rammed, even one your doorlock does not know
DoorLock.doorModelsExtra models counted as doors, e.g. { "v_ilev_bk_gate" }
DoorLock.blacklistDoor ids that can never be rammed
DoorLock.whitelistIf not empty, only these door ids can be rammed
DoorLock.customBridges for your own doorlock, see below

A bridge for your own doorlock goes into Ram.DoorLock in the config:

lua
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,
    },
},
FunctionSideDescription
doorsClientReturns { [doorId] = { coords = vector3(...), locked = true } }; qb-doorlock style entries also work
unlockServerUnlocks the door, returns true when it worked
lockedServerOptional, returns true while the door is locked

A custom bridge is only used while its resource is started.

Ballistic shield

lua
Shield = {
    allowedGroups = { "GROUP_PISTOL", "GROUP_STUNGUN" },
    allowedWeapons = {},
},
OptionDescription
allowedGroupsWeapon groups that can be held behind the shield
allowedWeaponsExtra weapons, e.g. { "WEAPON_FLASHLIGHT" }

Deployable shield, road barriers and road blocker plate

lua
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 },
    },
},
OptionDescription
access.toggle / access.pickupWho may raise / lower and pick up the prop: anyone with the job, the owner, or anyone at all
Bollard.propsProps the placement menu offers, in CAPS LOCK order. label is a locale key
props[].animatedRaises and lowers, and blocks traffic while raised
props[].looseVehicles can knock it over
Bollard.vehicle.enabledRaise / 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

lua
Nvg = {
    flipWithVision = true,
    keys = {
        flip = "X",
    },
    Marks = {
        requireNvgToSee = true,
        playerColors = true,
    },
},
OptionDescription
flipWithVisionThe goggles flip down with the vision; false adds a separate flip key
keys.flipFlips the goggles, only when flipWithVision = false
Marks.requireNvgToSeeMarks are only shown to players wearing the helmet
Marks.playerColorsEvery player marks in their own colour

Speed radar

lua
Radar = {
    keys = {
        limitUp = 172,
        limitDown = 173,
    },
},
OptionDescription
keys.limitUp / keys.limitDownControl ids that change the limit (arrow up / down)

Wheel clamp

lua
Clamp = {
    lockpick = {
        useItem = false,
        pins = 3,
    },
    removePermission = {
        owner = true,
        job = true,
        admin = true,
    },
},
OptionDescription
lockpick.useItemUsing the lockpick item next to a clamp starts the minigame. Keep false if another script already uses the lockpick item
lockpick.pinsStages to beat in the minigame
removePermissionWho may take a clamp off: the officer who put it on, anyone with the required job, admins

Megaphone

lua
Megaphone = {
    voice = {
        volume = -1.0,
    },
    stage = {
        models = { "v_club_roc_micstd", "prop_table_mic_01", "prop_mic_stand_01", "prop_micandstand_01" },
    },
},
OptionDescription
voice.volume-1.0 fades the voice out with distance; 0.0 - 1.0 forces one volume for every listener
stage.modelsProps that work as a microphone stand

Hands up fix

lua
HandsUpFix = {
    export = "getHandsup",
},
OptionDescription
exportIts "are the hands up" export; empty string checks the animation instead