Resources
Configuration

Configuration

On this page we will go over how to configure TAM_Police. All configuration files are in the data/ directory.

If you need any assistance or have any questions, please join our Discord (opens in a new tab) for support.

Main Configuration

The primary configuration file is data/configuration.lua. Here you will find all of the primary configuration options.

config.enableVersionCheck = true -- Should we check for updates on startup.
 
config.debug = true -- Enables various debug commands.
 
config.useInventory = true -- This is required for most evidence to work & for any of the item checks to function.
 
config.checkDuty = false -- Require that a player is onDuty before allowing them to interact.
 
config.groups = { -- Groups & grades
    -- groupName = groupGrade
    police = 0,
}
 
config.dutySystem = {
    enabled = true, -- Enables the duty system. This allows players to to go on and off duty by interacting with a ped via third eye.
    target = {
        enabled = true, -- Enable or disable the target.
        icon = "fas fa-clipboard-user", -- Font awesome icon.
        distance = 1.5 -- Interact distance.
    },
    commandEnabled = false, -- enable or disable the duty commands.
}
 
config.fines = {
    enabled = true, -- enables or disables the fining system.
    maxAmount = 5000, -- Maximum amount that a player can be fined.
    minAmount = 100, -- Minimum amount that a player can be fined.
    command = {
        enabled = true, -- Enables or disables the fine command.
        distance = 2 -- The distance to check nearby players from.
    },
    target = {
        enabled = true, -- Enables or disables the target
        icon = "fas fa-file-invoice-dollar", -- Font awesome icon
        distance = 2 -- Interact distance.
    }
}
 
config.jailing = {
    enabled = true, -- Enables or disables the jailing system. This currently only integrates with your framework or picke_prisons/xt-prison. You can add more in the bridge files.
    minTime = 5, -- Minimum time in seconds that a player can be jailed for.
    maxTime = 300, -- Maximum time in seconds that a player can be jailed for.
    requireCuffed = true, -- Require the player to be cuffed to jail
    command = {
        enabled = true, -- Enable the jailing command.
        distance = 2 -- The distance to check for nearby players.
    },
    target = {
        enabled = true, -- Enable the target to jail another player.
        icon = "fas fa-user-lock", -- Font awesome icon.
        distance = 2 -- Interact distance
    }
}
 
config.alertPeds = {
    enabled = true, -- Enables or disables the "Alert Police" peds that can spawn at stations.
    target = { -- Target is the only way to interact with these, we plan on adding more ways to in the future.
        icon = 'fa-solid fa-bell', -- Font awesome icon.
        distance = 3 -- Interact Distance
    }
}
 
config.interactions = {
    enabled = true, -- Enable the various interactions
    cuffs = {
        enabled = true, -- Enable cuff system
        requireDuty = false, -- Should players need to be on duty to cuff someone.
        requireHandsUp = false, -- Should players be required to have their hands up in order be cuffed ?
        zipTies = true, -- Enable zip ties
        cuffItem = false, -- Item required to cuff players. Set to false for no restriction. ie "handcuffs"
        unCuffItem = false, -- Item required to un-cuff players. Set to false for no restriction. ie "handcuffkeys"
        zipTieItem = false, -- Item required to zip-tie players. ie "zipties"
        unZipItem = false, -- Item(s) require to un-zip-tie players. ie "wirecutters" | {"cutters", "wirecutters"}
        target = {
            enabled = true, -- Enable target to cuff / ziptie / uncuff players
            icon = "fas fa-handcuffs", -- Font awesome icon
            distance = 1.5 -- Interact distance
        },
        command = {
            enabled = true, -- Enable command to cuff / ziptie / uncuff players
            distance = 2 -- Distance to check for nearby players.
        },
    },
    escorting = {
        enabled = true, -- Enable the escortsystem .
        requireDuty = false, -- Should players need to be on duty to escort someone.
        requiredCuffed = false, -- Should players be required to be cuffed in order to be escorted?
        allowExit = false, -- Should players be able to exit the back seat on their own or do they need to be pulled out?
        target = {
            enabled = true, -- Enable target to escort / seat into vehicles
            icon = "fas fa-hands-bound", -- Font awesome icon
            seatIcon = "fas fa-right-to-bracket", -- Font awesome icon for putting players in a vehicle.
            distance = 1.5 -- Interact distance
        },
        command = {
            enabled = true, -- Enable command to escort / seat into vehicles
            distance = 2.0 -- Distance to check for nearby players.
        }
    },
    searching = {
        enabled = true, -- Enable the ability to search other players.
        requireHandsUp = false, -- Require a player to have their hands up to search.
        requireCuffed = true, -- Should a player need to be cuffed to be searched
        requireDuty = false, -- Should players need to be on duty to search someone.
        target = {
            enabled = true, -- Enable target to search players
            icon = "fas fa-magnifying-glass", -- Font awesome icon
            distance = 1.5 -- Interact distance
        },
        command = {
            enabled = true, -- Enable command to search players
            distance = 2.0 -- The distance to check for nearby players.
        }
    }
}
 
config.handsUp = {
    enabled = true, -- Enables the hands up module.
    keybinds = {
        enabled = true, -- enables or disable the keybinds.
        hu = "X", -- Hands up key.
        huk = "LSHIFT", -- Hands up on knees modifier. Ie you'd hold LSHIFT + X to get on your knees with your hands up
        huh = "LCONTROL" -- Hands on head modifier. Ie you'd hold LCONTROL + X to put your hands on the back of your head.
    },
    enableCommands = true -- Enable the commands.
}
 
config.spikeStrips = {
    enabled = true, -- Enable or disable the spike strips
    maxCount = 5, -- Maximum spike strip size.
    itemName = "spikestrip", -- spike strip item name.
    target = {
        enabled = true, -- Enable/disable target pickup
        icon = "fas fa-road-spikes", -- Font awesome icon
        distance = 2 -- Interaction distance
    },
    command = {
        enabled = true, -- Enable/disable the commands to place/pickup the spikes
        distance = 2.5 -- Distance to check to pickup a spike strip.
    },
    progressBar = {
        type = 'circle', -- Progress type. "circle" | "bar"
        duration = math.random(1000, 5000), -- The time to pickup / place. Supports numbers or math.random(minimum, maximum)
        dict = "amb@prop_human_bum_bin@idle_b", -- Animation dict to play
        clip = "idle_d" -- Animation clip to play.
    },
}
 
config.armories = {
    enabled = true, -- Should we enable the armory module?
    useInventory = false, -- Should we use the ox_inventory armory (shops) module instead? If you use this, you will need to define the shops in the `data/shops.lua` file of ox_inventory.
    enablePeds = true, -- Should we enable peds or just use target?
    target = { -- Interact method via target. This is currently the only way to open the armory. We will be adding support for other methods in the future.
        enabled = true, -- Enable or disable the target.
        icon = "fas fa-gun", -- Font awesome icon
        distance = 3, -- Interact distance
        drawSprite = false -- Draw sprite, this is ignored if enablePeds = true.
    }
}
 
config.cloakRooms = {
    enabled = true, -- Should we enable cloak rooms?
    icon = "fas fa-shirt", -- Icon to use across UI for the cloak rooms.
    keybind = { 
        enabled = true, -- Enable / disable the keybind interaction method.
        key = 38, -- Interaction key. Default is E
    },
    target = {
        enabled = false, -- Enable the target interaction.
        icon = "fas fa-shirt", -- Font awesome icon.
        distance = 3, -- Distance to interact
        drawSprite = false, -- Draw a sprite.
    }
}
 
config.garages = {
    enabled = true, -- Should we enable the garage system?
    teleport = true, -- Should we teleport the player into the car?
    target = { -- The target interaction method. This is currently the only way to interact with the garages, we will be adding support for other methods in the future.
        icon = "fas fa-warehouse", -- Font awesome icon
        distance = 2 -- Interact distance
    }
}
 
config.sinks = {
    enabled = true, -- Allows players to wash evidence off of their hands. (Ie blood & GSR)
    props = { -- The list of sink props. Please note the usage of backticks (`) and not (") or (')
        `prop_bar_sink_01`,
        `prop_ff_sink_02`,
        `prop_sink_04`,
        `v_res_mbsink`,
        `prop_sink_06`,
        `prop_sink_02`
    },
    progressBar = {
        type = 'circle', -- Progress bar type. "circle" | "bar"
        duration = math.random(5000, 10000), -- Progress bar duration in seconds. Supports a number or math.random(minimumTime, maximumTime)
        animation = { -- Animation to play while washing hands.
            dict = "missheist_agency3aig_23",
            clip = "urinal_sink_loop"
        }
    },
    target = {
        icon = 'fas fa-hands-bubbles', -- Font awesome icon
        distance = 2 -- Distance
    }
}
 
config.tintMeter = {
    enabled = true, -- Enable or disable the tint meter
    UIEnabled = true, -- Enable or disable the tint meter UI
    progressBar = {
        type = 'circle', -- Progress bar type. "circle" | "bar"
        duration = math.random(3000, 7000), -- Progress bar duration in seconds. Supports a number or math.random(minimumTime, maximumTime)
        clip = 'cellphone_text_read_base', -- Animation clip to play while washing hands.
        dict = 'cellphone@' -- Animation dict to play while washing hands.
    },
    target = {
        enabled = true, -- Enable or disable the target system
        icon = 'fas fa-car-side', -- Font awesome icon
        distance = 2, -- Interact distance
        bones = { 'door_dside_f', 'seat_dside_f', 'door_pside_f', 'seat_pside_f' } -- Vehicle bones where you can interact with. Can do bones = false to allow the entire vehicle.
    },
    commands = {
        enabled = true, -- Enable or disable the commands
        distance = 2 -- Distance to check nearby vehicles.
    }
}
 
config.tackle = {
    enabled = true, -- Should we enable the tackle system.
    notify = true, -- Should we notify when someone tackles you?
    ragdollDuration = 5000, -- Time in milliseconds that a player should ragdoll for after being tackled.
    command = {
        enabled = false, -- enable / disable the tackle command.
        distance = 1.6 -- Distance to check for nearby player.
    },
    keybind = {
        enabled = true, -- Should the keybind be enabled?
        defaultKey = "G", -- Default Key. Ref: https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/
        defaultMapper = 'KEYBOARD', -- Key Mapper ID. Ref: https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/
        secondaryKey = nil, -- If you want to specify a controller keybind. Ref: https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/
        secondaryMapper = nil, -- If you want to specify a controller keybind. Ref: https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/
    },
    target = {
        enabled = true, -- Should we enable tackling via target?
        icon = "fas fa-user-ninja", -- Target icon.
        distance = 2.0 -- Target interact distance.
    },
    animation = {
        timeout = 15000, -- timeout to load animation in ms
        tacklerDict = "missmic2ig_11", -- anim dict that the tackler will play
        tacklerClip = "mic_2_ig_11_intro_goon", -- anim clip that the tackler will play
        tackleeDict = "missmic2ig_11", -- anim dict that the tacklee will play
        tackleeClip = "mic_2_ig_11_intro_p_one", -- anim clip that the tacklee will play
    }
}
 
config.objects = { -- Objects are specified in the `data/data_objects.lua` file.
    enabled = true, -- Enable the object spawning system
    useItems = false, -- Enable this to utilize items instead of a menu or commands.
    progressBar = {
        type = 'circle', -- Progress bar type. "circle" | "bar"
        duration = 2500,  -- Progress bar duration in seconds. Supports a number or math.random(minimumTime, maximumTim
        useWhileDead = false, -- block the ability to use while dead
        canCancel = true, -- Can cancel the progress bar
        disable = { -- Disable various inputs
            car = true,
            move = true,
            combat = true,
            mouse = false
        },
        anim = { -- Animation to play
            dict = 'anim@narcotics@trash',
            clip = 'drop_front'
        }
    },
    target = {
        enabled = true, -- Enable the target interaction to pickup objects.
        icon = 'fas fa-boxes-stacked', -- Font awesome icon
        distance = 2, -- Interact distance
    },
    commands = {
        enabled = true, -- Enable the commands to spawn & delete objects, you can specify them in `data/data_objects.lua`
        distance = 2 -- Distance to check for nearby objects.
    }
}
 
config.menu = {
    enabled = true, -- Enable or disable the radial menu.
    icon = "fas fa-building-shield", -- Font awesome Icon
    options = { -- Menu options.
        {
            id = 'panicButton', -- Unique ID for the option.
            icon = 'bell', -- Font awesome icon name.
            label = 'Panic Button', -- Label
            event = 'TAM_Police:triggerPanicButton', -- The event to trigger
        },
        {
            id = 'policeInteractions',
            icon = 'list-check',
            label = 'Police Interactions',
            items = { -- Items for sub-menu
                {
                    id = 'escort',
                    icon = 'user-group',
                    label = 'Escort Player',
                    event = 'TAM_Police:escortPlayer',
                },
                {
                    id = 'search',
                    icon = 'magnifying-glass',
                    label = 'Search Player',
                    event = 'TAM_Police:searchPlayer',
                },
                {
                    id = 'jail',
                    icon = 'user-lock',
                    label = 'Jail Player',
                    event = 'TAM_Police:sendToJail',
                },
            },
        },
        {
            id = 'policeObjects',
            icon = 'road',
            label = 'Police Objects',
            items = {
                {
                    id = 'cone', -- Unique ID
                    icon = 'triangle-exclamation', -- Font awesome Icon
                    label = 'Cone', -- Menu label
                    event = 'TAM_Police:spawnObject', -- event to trigger
                    args = 'Cone', -- Arguments to pass through the event. In this case, it is the object name.
                },
                {
                    id = 'roadsign', -- Unique ID
                    icon = 'sign-hanging', -- Font awesome Icon
                    label = 'Road Sign', -- Menu label
                    event = 'TAM_Police:spawnObject', -- event to trigger
                    args = 'Roadsign', -- Arguments to pass through the event. In this case, it is the object name.
                },
                {
                    id = 'barrier', -- Unique ID
                    icon = 'torii-gate', -- Font awesome Icon
                    label = 'Police Barrier', -- Menu label
                    event = 'TAM_Police:spawnObject', -- event to trigger
                    args = 'Police Barrier', -- Arguments to pass through the event. In this case, it is the object name.
                },
                {
                    id = 'tent', -- Unique ID
                    icon = 'campground', -- Font awesome Icon
                    label = 'Tent', -- Menu label
                    event = 'TAM_Police:spawnObject', -- event to trigger
                    args = 'Tent', -- Arguments to pass through the event. In this case, it is the object name.
                },
                {
                    id = 'whiteboard', -- Unique ID
                    icon = 'chalkboard', -- Font awesome Icon
                    label = 'Whiteboard', -- Menu label
                    event = 'TAM_Police:spawnObject', -- event to trigger
                    args = 'Whiteboard', -- Arguments to pass through the event. In this case, it is the object name.
                },
                {
                    id = 'pinboard', -- Unique ID
                    icon = 'thumbtack', -- Font awesome Icon
                    label = 'Pinboard', -- Menu label
                    event = 'TAM_Police:spawnObject', -- event to trigger
                    args = 'Pinboard', -- Arguments to pass through the event. In this case, it is the object name.
                },
                {
                    id = 'worklight', -- Unique ID
                    icon = 'lightbulb', -- Font awesome Icon
                    label = 'Worklight', -- Menu label
                    event = 'TAM_Police:spawnObject', -- event to trigger
                    args = 'Worklight', -- Arguments to pass through the event. In this case, it is the object name.
                },
                {
                    id = 'worklight', -- Unique ID
                    icon = 'lightbulb', -- Font awesome Icon
                    label = 'Worklight', -- Menu label
                    event = 'TAM_Police:spawnObject', -- event to trigger
                    args = 'Worklight', -- Arguments to pass through the event. In this case, it is the object name.
                },
                {
                    id = 'chair', -- Unique ID
                    icon = 'chair', -- Font awesome Icon
                    label = 'Chair', -- Menu label
                    event = 'TAM_Police:spawnObject', -- event to trigger
                    args = 'Chair', -- Arguments to pass through the event. In this case, it is the object name.
                },
                {
                    id = 'deleteObject',
                    icon = 'trash',
                    label = 'Delete Object',
                    event = 'police:client:deleteObject',
                },
            }
        }
    }
}

Evidence Configuration

The evidence config file is found in data/config_evidence.lua and contains all of the configuration for evidence.

evidenceConfig.GSR = {
    enabled = true, -- Enable or disable the GSR system.
    validGloves = {}, -- Comma-sperated list of drawable variation ids for gloves.
    clearTime = 2880, -- Time in seconds it takes for the GSR to clear.
    clearWaterTime = 30, -- Time in seconds it takes for the GSR to clear off while in water.
    enableSinks = true, -- Can a player wash their hands in a sink to clear the GSR?
    target = {
        enabled = true, -- Enable the target interaction to check a player for GSR
        icon = "fas fa-gun", -- Font awesome icon
        distance = 1.5, -- Interact Distance
        items = false, -- set to nil if not using inventory. An item, array of items, or pairs of items-count required to show the option.
        anyTime = true -- Only require a single item from the items table above to exist.    
    },
    progressBar = {
        type = 'circle', -- Progress bar type. "cirlce" | "bar"
        duration = math.random(3000, 7000), -- Time in seconds that the progress bar lasts. Supports a number or math.random(minTime, maxTime)
        clip = 'cellphone_text_read_base', -- Animation clip
        dict = 'cellphone@' -- Animation dict
    },
    command = {
        enabled = true, -- Enable the command interaction to check a player for GSR
        distance = 2 -- Distance to check for nearby players.
    },
    ignoredWeps = { -- Weapons that should be ignored for GSR. Please note the usage of backticks (`) and not (") or (')
        `weapon_raypistol`,
        `weapon_stungun_mp`,
        `weapon_flaregun`,
        `weapon_stungun`,
        `weapon_raycarbine`,
        `weapon_railgun`,
        `weapon_railgunxm3`,
        `weapon_rayminigun`,
        `weapon_firework`,
        `weapon_compactlauncher`,
        `weapon_rpg`,
        `weapon_grenadelauncher`,
        `weapon_grenadelauncher_smoke`,
        `weapon_grenade`,
        `weapon_bzgas`,
        `weapon_molotov`,
        `weapon_stickybomb`,
        `weapon_proxmine`,
        `weapon_snowball`,
        `weapon_pipebomb`,
        `weapon_ball`,
        `weapon_smokegrenade`,
        `weapon_flare`,
        `weapon_acidpackage`,
        `weapon_petrolcan`,
        `weapon_fireextinguisher`,
        `weapon_hazardcan`,
        `weapon_fertilizercan`,
        `weapon_dagger`,
        `weapon_bat`,
        `weapon_bottle`,
        `weapon_crowbar`,
        `weapon_unarmed`,
        `weapon_flashlight`,
        `weapon_golfclub`,
        `weapon_hammer`,
        `weapon_hatchet`,
        `weapon_knuckle`,
        `weapon_knife`,
        `weapon_machete`,
        `weapon_switchblade`,
        `weapon_nightstick`,
        `weapon_wrench`,
        `weapon_battleaxe`,
        `weapon_poolcue`,
        `weapon_stone_hatchet`,
        `weapon_candycane`
    }
}
 
evidenceConfig.BAC = {
    enabled = true, -- Enable or disable the BAC System
    UIEnabled = true, -- Enable or disable the UI.
    UIDisplayTime = 5000, -- How long it should take for the UI to go away.
    clearInterval = 720, -- How long until each point wears off.
    clearPoint = 0.01, -- The amount to loose per interval above
    itemName = "breathalyzer", -- The item name to use if using inventory.
    autoDetect = true, -- Should we automatically detect & set BAC levels based off of emotes.
    emotes = { -- These are emote names setup to automatically add BAC level when used. Setup default to rp-emotes
        --["emoteName"] = level_to_add
        ["party"] = 0.02,
        ["whiskey"] = 0.03,
        ["whiskeyb"] = 0.04,
        ["whiskeyb2"] = 0.04,
        ["whiskeyb3"] = 0.04,
        ["beer"] = 0.02,
        ["beer2"] = 0.02,
        ["beer3"] = 0.02,
        ["beer5"] = 0.02,
        ["beerf"] = 0.02,
        ["beerf2"] = 0.02,
        ["beerf3"] = 0.02,
        ["beerf4"] = 0.02,
        ["beerf5"] = 0.02,
        ["beercan"] = 0.02,
        ["beercan2"] = 0.02,
        ["beercan3"] = 0.02,
        ["dancedrink"] = 0.03,
        ["dancedrink2"] = 0.03,
        ["dancedrink3"] = 0.03,
        ["dancedrink4"] = 0.03,
        ["dancedrink5"] = 0.03,
        ["dancedrink6"] = 0.02,
        ["dancedrink7"] = 0.02,
        ["dancedrink8"] = 0.02,
        ["dancedrink9"] = 0.02,
        ["wine"] = 0.02,
        ["wine2"] = 0.02,
        ["wine3"] = 0.02
    },
    target = {
        enabled = true, -- Enable the target interaction to breathalyze a player.
        icon = "fas fa-beer-mug-empty", -- Font awesome icon
        distance = 1.5, -- Interact Distance
    },
    command = {
        enabled = true, -- Enable the command to breathalyze a player
        distance = 2, -- The distance to check for nearby players
    },
    progressBar = {
        type = 'circle', -- Progress bar type. "cirlce" | "bar"
        duration = math.random(3000, 7000), -- Time in seconds that the progress bar lasts. Supports a number or math.random(minTime, maxTime)
        clip = 'cellphone_text_read_base', -- Animation clip
        dict = 'cellphone@' -- Animation dict
    },
}
 
evidenceConfig.Casings = {
    enabled = false, -- Enable the bullet casings. This requires the usage of an inventory
    target = {
        drawSprite = true, -- Draw sprites
        icon = "fas fa-magnifying-glass" -- Font awesome icon.
    },
    ammoTypes = { -- The ammo types.
        ['ammo-22'] = { -- Ammo ID
            label = '.22 LR', -- Ammo label
            weight = 1, -- The weight
            projectile = 'projectile-ammo-22', -- Projectile name
            casing = 'casing-ammo-22' -- Casing name
        },
        ['ammo-38'] = {
            label = '.38 LC',
            weight = 3,
            projectile = 'projectile-ammo-38',
            casing = 'casing-ammo-38'
        },
        ['ammo-44'] = {
            label = '.44 Magnum',
            weight = 3,
            projectile = 'projectile-ammo-44',
            casing = 'casing-ammo-44'
        },
        ['ammo-50'] = {
            label = '.50 AE',
            weight = 4,
            projectile = 'projectile-ammo-50',
            casing = 'casing-ammo-50'
        },
        ['ammo-heavysniper'] = {
            label = '.50 BMG',
            weight = 5,
            projectile = 'projectile-ammo-heavysniper',
            casing = 'casing-ammo-heavysniper'
        },
        ['ammo-musket'] = {
            label = '.50 Ball',
            weight = 3,
            projectile = 'projectile-ammo-musket',
            casing = false
        },
        ['ammo-rifle'] = {
            label = '5.56x45mm',
            weight = 2,
            projectile = 'projectile-ammo-rifle',
            casing = 'casing-ammo-rifle'
        },
        ['ammo-rifle2'] = {
            label = '7.62x39mm',
            weight = 2,
            projectile = 'projectile-ammo-rifle2',
            casing = 'casing-ammo-rifle2'
        },
        ['ammo-shotgun'] = {
            label = '12 Gauge Buckshot',
            weight = 4,
            projectile = false,
            casing = 'casing-ammo-shotgun'
        },
        ['ammo-sniper'] = {
            label = '7.62x51mm',
            weight = 4,
            projectile = 'projectile-ammo-sniper',
            casing = 'casing-ammo-sniper'
        },
        ['ammo-9'] = {
            label = '9mm',
            weight = 2,
            projectile = 'projectile-ammo-9',
            casing = 'casing-ammo-9'
        },
        ['ammo-45'] = {
            label = '.45 ACP',
            weight = 2,
            projectile = 'projectile-ammo-45',
            casing = 'casing-ammo-45'
        },
        ['ammo-380'] = {
            label = '.380 ACP',
            weight = 1,
            projectile = 'projectile-ammo-380',
            casing = 'casing-ammo-380'
        },
        ['ammo-41'] = {
            label = '.41 Remington Magnum',
            weight = 2,
            projectile = 'projectile-ammo-41',
            casing = 'casing-ammo-41'
        },
    }
}

Locker Room Configuration

The locker room configuration consists of two different files, the outfits located in data/data_outfits.lua and the configuration located in data/config_outfits.lua

Configuration:

return {
    {
        id = 'stationId', -- A unique identifier.
        label = "Locker Room", -- Label
        coords = vec3(-443.928, 6007.664, 32.228), -- The coords to load the zone in at.
        distance = 5, -- The distance around the zone
        blip = {
            enabled = false, -- Enable or disable blips
            sprite = 73, -- Blip sprite
            color = 12, -- Blip color
            scale = 0.8, -- Blip scale
            label = "Locker Room", -- Blip label
            onlyNearby = true, -- Should we only display the blip when players are nearby.
        },
        options = { -- Locker options
            {
                name = 'Patrol Locker', -- The name of the locker
                id = 'station_patrol_locker', -- A unique identifier to assign to the locker
                description = 'View the Patrol Locker!', -- Description to assign to the option in the menu.
                outfits = { -- The outfits to list under the locker.
                    {
                        name = "Patrol Class A", -- Outfit name
                        image = false, -- Optionally an image to display on the menu.
                        groups = false, -- Groups, can be false or a table of group = grade. Ie { police = 0, swat = 4 }
                        clothing = outfits.patrol_outfit -- The outfit ID from `data/data_outfits.lua`
                    },
                    
                }
            }
        }
    },
}

Outfits:

You can quickly get your current outfit by running the command /getclothing, this will copy it to your clipboard so you can paste it here.

outfits.patrol_outfit = { -- The outfit ID. This is used when specifying the clothing option for outfits.
    male = { -- Male clothes.
        undershirt = { drawable = 262, texture = 1 },
        mask = { drawable = 121, texture = 0 },
        torso = { drawable = 86, texture = 0 },
        torso2 = { drawable = 576, texture = 0 },
        badge = { drawable = 0, texture = 0 },
        bag = { drawable = 148, texture = 0 },
        shoes = { drawable = 109, texture = 1 },
        accessory = { drawable = 275, texture = 0 },
        kevlar = { drawable = 105, texture = 0 },
        leg = { drawable = 208, texture = 0 },
        watch = { drawable = -1, texture = -1 },
        hat = { drawable = -1, texture = -1 },
        glasses = { drawable = -1, texture = -1 },
        ears = { drawable = -1, texture = -1 },
        bracelets = { drawable = -1, texture = -1 },
    },
    female = { -- Female clothes
        undershirt = { drawable = 304, texture = 0 },
        mask = { drawable = 0, texture = 0 },
        torso = { drawable = 0, texture = 0 },
        torso2 = { drawable = 617, texture = 0 },
        badge = { drawable = 0, texture = 0 },
        bag = { drawable = 116, texture = 0 },
        shoes = { drawable = 163, texture = 0 },
        accessory = { drawable = 208, texture = 0 },
        kevlar = { drawable = 0, texture = 0 },
        leg = { drawable = 222, texture = 0 },
        watch = { drawable = -1, texture = -1 },
        hat = { drawable = -1, texture = -1 },
        glasses = { drawable = -1, texture = -1 },
        ears = { drawable = -1, texture = -1 },
        bracelets = { drawable = -1, texture = -1 },
    }
}
 
-- If you want to add more options, just duplicate it and change the id. Ie:
 
 
-- outfits.patrol_outfit2 = { -- The outfit ID. This is used when specifying the clothing option for outfits.
--     male = { -- Male clothes.
--         ...
--     },
--     female = { -- Female clothes
--         ...
--     }
-- }
 
-- If you want to only change certain clothing items, you can just omit the option from the clothing list or set it to -1. Ie:
 
-- male = { -- Male clothes, this will only change the accessory.
--     accessory = { drawable = 275, texture = 0 },
-- },
-- female = { -- Female clothes, this will only change the hat.
--     undershirt = { drawable = -1, texture = 0 },
--     mask = { drawable = -1, texture = 0 },
--     torso = { drawable = -1, texture = 0 },
--     torso2 = { drawable = -1, texture = 0 },
--     badge = { drawable = -1, texture = 0 },
--     bag = { drawable = -1, texture = 0 },
--     shoes = { drawable = -1, texture = 0 },
--     accessory = { drawable = -1, texture = 0 },
--     kevlar = { drawable = -1, texture = 0 },
--     leg = { drawable = -1, texture = 0 },
--     watch = { drawable = -1, texture = -1 },
--     hat = { drawable = 16, texture = 3 },
--     glasses = { drawable = -1, texture = -1 },
--     ears = { drawable = -1, texture = -1 },
--     bracelets = { drawable = -1, texture = -1 },
-- }

Shotspotter Configuration

The shotspotter configuration can be found in the data/config_shotspotter.lua file.

shotSpotterConfig.enabled = true -- Enable the shot spotter module
 
shotSpotterConfig.debug = false -- Should we display zones on the map.
 
shotSpotterConfig.cooldown = 10 -- Time in minutes until the shot spotter can be triggered again.
 
shotSpotterConfig.alertDelay = 30 -- Time in seconds until the shot spotter sends the alert
 
shotSpotterConfig.radius = 500 -- Radius around each shot spotter.
 
shotSpotterConfig.jobCheck = false -- check for jobs to ignore.
 
shotSpotterConfig.ignoredJobs = { -- Jobs to ignore.
    "lspd", "sahp"
}
 
shotSpotterConfig.blips = { -- Blips on each shot spotter
    enabled = true, -- Enable or disable
    sprite = 313, -- Sprite
    color = 1, -- Color
    scale = 0.5, -- Scale
    label = locale("blip.shotspotter.blip_label"), -- Blip label.
}
 
shotSpotterConfig.locations = { -- Shotspotter locations
    vec3(653.42, -648.74, 57.18), -- Los Santos Fwy
    vec3(1015.98, -255.25, 85.58), -- Glory Way
    vec3(329.99, 288.96, 120.10), -- Clinton Ave
    vec3(-202.76, -327.34, 66.04), -- Las Lagunas Blvd
    vec3(31.32, -875.29, 31.46), -- Power St
    vec3(70.1372, -1718.3291, 34.2056), -- Carson Ave
    vec3(1196.9178, -1624.6641, 50.3403), -- Fudge Ln
    vec3(-852.9095, -1215.8782, 9.2463), -- Palimino Ave
    vec3(-932.7648, -448.8844, 42.9436), -- Movie Star Way
    vec3(-1713.6848, 478.4267, 130.3795), -- Ace Jones Dr
    vec3(-596.5602, 515.0753, 109.675), -- Picture Perfect Dr
    vec3(716.6274, -1958.7434, 44.7564), -- Popular St
    vec3(-1889.92, -351.62, 49.31), -- Playa Vista
    vec3(-978.85, -2089.64, 10.19), -- Greenwich Parkway
    vec3(-1169.81, -2763.41, 13.95), -- Runway 1
    -- vec3(-96.09, 6377.95, 31.48), -- Paleto Blvd
    -- vec3(1415.54, 2695.04, 37.42), -- Route 68
    -- vec3(-3069.58, 735.29, 21.70), -- Great Ocean Hwy
    -- vec3(-2729.48, 3.24, 15.51), -- Great Ocean Hwy
    vec3(74.06, -2644.79, 21.90), -- Elysian Fields Fwy
    vec3(984.14, -3117.20, 5.90), -- Buccaneer Way
    vec3(236.19, 1240.05, 229.83), -- Baytree Canyon Road
    -- vec3(1806.03, 3705.84, 33.96), -- Zancudo Ave
    -- vec3(1702.34, 4881.44, 42.03), -- Grapeseed Main St
    -- vec3(2868.15, 3567.91, 53.38), -- Senora Fwy
    -- vec3(2566.92, 383.00, 108.46),-- Palimino Fwy
    vec3(1358.59, -942.04, 69.29), -- Palimino Fwy
    vec3(-1591.69, -1140.81, 2.15), -- Red Desert Ave
    -- vec3(-2380.90, 2136.90, 88.54),-- Tongva Hills
    -- vec3(375.02, 2778.28, 55.97) -- Route 68 / Joshua
}
 
shotSpotterConfig.ignoredWeps = { -- Weapons that are ignored. Please note the usage of backticks (`) instead of (") or (')
    `weapon_raypistol`,
    `weapon_stungun_mp`,
    `weapon_flaregun`,
    `weapon_stungun`,
    `weapon_raycarbine`,
    `weapon_railgun`,
    `weapon_railgunxm3`,
    `weapon_rayminigun`,
    `weapon_firework`,
    `weapon_compactlauncher`,
    `weapon_rpg`,
    `weapon_grenadelauncher`,
    `weapon_grenadelauncher_smoke`,
    `weapon_grenade`,
    `weapon_bzgas`,
    `weapon_molotov`,
    `weapon_stickybomb`,
    `weapon_proxmine`,
    `weapon_snowball`,
    `weapon_pipebomb`,
    `weapon_ball`,
    `weapon_smokegrenade`,
    `weapon_flare`,
    `weapon_acidpackage`,
    `weapon_petrolcan`,
    `weapon_fireextinguisher`,
    `weapon_hazardcan`,
    `weapon_fertilizercan`,
    `weapon_dagger`,
    `weapon_bat`,
    `weapon_bottle`,
    `weapon_crowbar`,
    `weapon_unarmed`,
    `weapon_flashlight`,
    `weapon_golfclub`,
    `weapon_hammer`,
    `weapon_hatchet`,
    `weapon_knuckle`,
    `weapon_knife`,
    `weapon_machete`,
    `weapon_switchblade`,
    `weapon_nightstick`,
    `weapon_wrench`,
    `weapon_battleaxe`,
    `weapon_poolcue`,
    `weapon_stone_hatchet`,
    `weapon_candycane`
}
 
shotSpotterConfig.suppressors = { -- Possible supressors to check for.
    `COMPONENT_AT_PI_SUPP_02`, -- Pistol, Pistol Mk2, SNS Pistol Mk2.
    `COMPONENT_AT_PI_SUPP`, -- Combat Pistol, AP Pistol, Heavy Pistol, Vintage Pistol, SMG, SMG Mk2, Machine Pistol.
    `COMPONENT_AT_AR_SUPP_02`, -- .50 Pistol, Micro SMG, Assault SMG, Bullpup Shotgun, Heavy Shotgun, Assault Rifle, Special Carbine, Special Carbine Mk2, Assault Rifle Mk2, Sniper Rifle.
    `COMPONENT_AT_AR_SUPP`, -- Assault Shotgun, Combat Shotgun, Carbine Rifle, Advanced Rifle, Bullpup Rifle, Bullpup Rifle Mk2, Carbine Rifle Mk2, Military Rifle, Marksman Rifle Mk2, Marksman Rifle.
    `COMPONENT_AT_SR_SUPP` -- Pump Shotgun.
}

Armory Configuration

The armory config file can be found in data/data_armories.lua. You can quickly get your current loadout by running /getloadout, this will copy the information to your clipboard to paste into the file.

⚠️

In order for addon weapons to work with the /getloadout command, you need to add them to data/data_weapons.lua and their components if they have any to data/data_components.lua

return {
    {
        shopType = "PoliceArmory", -- Ox inventory shop type if you're using their shop functions.
        id = 1, -- Ox inventory shop ID if you're using their shop functions.
        coords = vec3(361.171, -1601.652, 29.307), -- Armory coords
        distance = 100, -- Distance to load in at.
        ped = { -- Ped configuration
            model = `S_M_M_AmmuCountry`, -- Ped model
            scenario = "WORLD_HUMAN_CLIPBOARD", -- Ped scenario. Also supports animations.
            coords = vec3(361.171, -1601.652, 29.307), -- Ped coords
            heading = 231.808, -- Ped heading
        },
        blip = { -- Blip configuration
            enabled = false, -- Enable or disable the blips for armories
            sprite = 110, -- Blip sprite
            color = 12, -- Blip color
            scale = 0.8, -- Blip scale
            label = "Armory", -- Blip Label
            onlyNearby = true, -- Should we only display the blip when nearby.
        },
        loadouts = { -- Loadout options
            {
                id = "pd_patrol_loadout", -- Unique ID for the loadoout option
                name = 'Patrol Loadout', -- Loadout name
                optionLabel = "View Patrol Loadout", -- Loadout option Label
                optionDescription = 'View the Patrol weapon loadout!', -- Loadout option description
                weapons = { -- Loadout weapons
                    -- { name = "Weapon Name", weapon = `weapon hash`, ammo = ammoAmount, components = { `comma`, `seperated`, `list`, `of`, `component`, `hashes`}, tint = tintNumber },
                    { name = "Flashlight", weapon = -1951375401, ammo = 100, components = { }, tint = 0 },
                    { name = "Combat Pistol", weapon = 1593441988, ammo = 100, components = { 119648377, 899381934 }, tint = 0 },
                    { name = "Stungun", weapon = 911657153, ammo = 100, components = { }, tint = 0 },
                    { name = "Pump Shotgun", weapon = 487013001, ammo = 100, components = { 2076495324 }, tint = 0 },
                    { name = "Carbine MkII", weapon = -86904375, ammo = 100, components = { 1283078430, -1654288262, 2076495324 }, tint = 0 },
                    { name = "Road Flares", weapon = 1233104067, ammo = 100, components = { }, tint = 0 },
                    { name = "Jerry Can", weapon = 883325847, ammo = 100, components = { }, tint = 0 },
                    { name = "Fire Extinguisher", weapon = 101631238, ammo = 100, components = { }, tint = 0 },
                }
            },
 
            -- To add more options, just copy the table like this:
 
            -- {
            --     id = "pd_patrol_loadout2", -- Unique ID for the loadoout option
            --     name = 'Patrol Loadout', -- Loadout name
            --     optionLabel = "View Patrol Loadout", -- Loadout option Label
            --     optionDescription = 'View the Patrol weapon loadout!', -- Loadout option description
            --     weapons = { -- Loadout weapons
            --         -- { name = "Weapon Name", weapon = `weapon hash`, ammo = ammoAmount, components = { `comma`, `seperated`, `list`, `of`, `component`, `hashes`}, tint = tintNumber },
            --         { name = "Flashlight", weapon = -1951375401, ammo = 100, components = { }, tint = 0 },
            --         { name = "Combat Pistol", weapon = 1593441988, ammo = 100, components = { 119648377, 899381934 }, tint = 0 },
            --     }
            -- },
        }
    },
 
    -- To add more armories, just copy the above table like this:
 
    -- {
    --     shopType = "PoliceArmory", -- Ox inventory shop type if you're using their shop functions.
    --     id = 1, -- Ox inventory shop ID if you're using their shop functions.
    --     coords = vec3(361.171, -1601.652, 29.307), -- Armory coords
    --     distance = 100, -- Distance to load in at.
    --     ped = { -- Ped configuration
    --         model = `S_M_M_AmmuCountry`, -- Ped model
    --         scenario = "WORLD_HUMAN_CLIPBOARD", -- Ped scenario. Also supports animations.
    --         coords = vec3(361.171, -1601.652, 29.307), -- Ped coords
    --         heading = 231.808, -- Ped heading
    --     },
    --     blip = { -- Blip configuration
    --         enabled = false, -- Enable or disable the blips for armories
    --         sprite = 110, -- Blip sprite
    --         color = 12, -- Blip color
    --         scale = 0.8, -- Blip scale
    --         label = "Armory", -- Blip Label
    --         onlyNearby = true, -- Should we only display the blip when nearby.
    --     },
    --     loadouts = { -- Loadout options
    --         {
    --             id = "pd_patrol_loadout", -- Unique ID for the loadoout option
    --             name = 'Patrol Loadout', -- Loadout name
    --             optionLabel = "View Patrol Loadout", -- Loadout option Label
    --             optionDescription = 'View the Patrol weapon loadout!', -- Loadout option description
    --             weapons = { -- Loadout weapons
    --                 -- { name = "Weapon Name", weapon = `weapon hash`, ammo = ammoAmount, components = { `comma`, `seperated`, `list`, `of`, `component`, `hashes`}, tint = tintNumber },
    --                 { name = "Flashlight", weapon = -1951375401, ammo = 100, components = { }, tint = 0 },
    --                 { name = "Combat Pistol", weapon = 1593441988, ammo = 100, components = { 119648377, 899381934 }, tint = 0 },
    --                 { name = "Stungun", weapon = 911657153, ammo = 100, components = { }, tint = 0 },
    --                 { name = "Pump Shotgun", weapon = 487013001, ammo = 100, components = { 2076495324 }, tint = 0 },
    --                 { name = "Carbine MkII", weapon = -86904375, ammo = 100, components = { 1283078430, -1654288262, 2076495324 }, tint = 0 },
    --                 { name = "Road Flares", weapon = 1233104067, ammo = 100, components = { }, tint = 0 },
    --                 { name = "Jerry Can", weapon = 883325847, ammo = 100, components = { }, tint = 0 },
    --                 { name = "Fire Extinguisher", weapon = 101631238, ammo = 100, components = { }, tint = 0 },
    --             }
    --         },
 
    --         -- To add more options, just copy the table like this:
 
    --         -- {
    --         --     id = "pd_patrol_loadout2", -- Unique ID for the loadoout option
    --         --     name = 'Patrol Loadout', -- Loadout name
    --         --     optionLabel = "View Patrol Loadout", -- Loadout option Label
    --         --     optionDescription = 'View the Patrol weapon loadout!', -- Loadout option description
    --         --     weapons = { -- Loadout weapons
    --         --         -- { name = "Weapon Name", weapon = `weapon hash`, ammo = ammoAmount, components = { `comma`, `seperated`, `list`, `of`, `component`, `hashes`}, tint = tintNumber },
    --         --         { name = "Flashlight", weapon = -1951375401, ammo = 100, components = { }, tint = 0 },
    --         --         { name = "Combat Pistol", weapon = 1593441988, ammo = 100, components = { 119648377, 899381934 }, tint = 0 },
    --         --     }
    --         -- },
    --     }
    -- },
}

Object Configuration

The object list configuration file can be found in data/data_objects.lua.

return {
    -- ["Object Name"] = { -- The name in the menu
    --     command = "command_name_to_spawn_object", -- Command to spawn object
    --     model = `object_model_name`, -- Object model to spawn
    --     freeze = true, -- Should an object be frozen?
    --    vehicleShouldAvoid = false, -- Should AI traffic try and reroute around the objects?
    -- },
 
    ["Police Barrier"] = { -- The name in the menu
        command = "barrier", -- Command to spawn object
        model = `prop_barrier_work05`, -- Object model to spawn
        freeze = false, -- Should an object be frozen?
        vehicleShouldAvoid = true, -- Should AI traffic try and reroute around the objects?
    },
    ["Roadsign"] = { -- The name in the menu
        command = "roadsign", -- Command to spawn object
        model = `prop_snow_sign_road_06g`, -- Object model to spawn
        freeze = false, -- Should an object be frozen?
        vehicleShouldAvoid = true, -- Should AI traffic try and reroute around the objects?
    },
    ["Cone"] = { -- The name in the menu
        command = "cone", -- Command to spawn object
        model = `prop_roadcone02a`, -- Object model to spawn
        freeze = false, -- Should an object be frozen?
        vehicleShouldAvoid = true, -- Should AI traffic try and reroute around the objects?
    },
    ["Tent"] = { -- The name in the menu
        command = "tent", -- Command to spawn object
        model = `prop_gazebo_03`, -- Object model to spawn
        freeze = true, -- Should an object be frozen?
        vehicleShouldAvoid = false, -- Should AI traffic try and reroute around the objects?
    },
    ["Whiteboard"] = { -- The name in the menu
        command = "whiteboard", -- Command to spawn object
        model = `prop_w_board_blank`, -- Object model to spawn
        freeze = true, -- Should an object be frozen?
        vehicleShouldAvoid = false, -- Should AI traffic try and reroute around the objects?
    },
    ["Pinboard"] = { -- The name in the menu
        command = "pinboard", -- Command to spawn object
        model = `vw_prop_vw_board_01a`, -- Object model to spawn
        freeze = true, -- Should an object be frozen?
        vehicleShouldAvoid = false, -- Should AI traffic try and reroute around the objects?
    },
    ["Worklight"] = { -- The name in the menu
        command = "worklight", -- Command to spawn object
        model = `prop_worklight_03b`, -- Object model to spawn
        freeze = true, -- Should an object be frozen?
        vehicleShouldAvoid = false, -- Should AI traffic try and reroute around the objects?
    },
    ["Chair"] = { -- The name in the menu
        command = "chair", -- Command to spawn object
        model = `prop_chair_08`, -- Object model to spawn
        freeze = true, -- Should an object be frozen?
        vehicleShouldAvoid = false, -- Should AI traffic try and reroute around the objects?
    },
}

Ped Configuration

The ped configuration file can be found in data/data_peds.lua and includes all of the duty peds or alert peds.

return {
    {
        type = "alert", -- The type of ped: "alert" | "duty"
        coords = vec3(-1403.4, -560.99, 30.19), -- Spawn coordinates of the ped
        distance = 100, -- The distance at which to load the ped in.
        ped = {
            model = `S_M_Y_XMech_01`, -- Ped model to spawn. Please note the usage of backticks (`) and not (") or (')
            scenario = "WORLD_HUMAN_CLIPBOARD", -- Scenario to play on the ped.
            -- anim = { -- You can also specify an animation instead of scenario.
            --     clip = "animation_clip",
            --     dict = "animation_dict"
            -- }
        },
        blip = {
            enabled = false, -- Enable or disable the blip.
            sprite = 357, -- Blip Sprite
            color = 3, -- Blip Color
            scale = 0.8, -- Blip Scale
            label = "Front Desk Ped", -- Blip Label
            onlyNearby = false, -- Should we only display the blip when a player is within the distance specified above?
        },
    },
    {
        type = "duty",
        coords = vec3(-1403.4, -556.99, 30.19),
        distance = 100,
        ped = {
            model = `S_M_Y_XMech_01`,
            scenario = "WORLD_HUMAN_CLIPBOARD",
        },
        blip = {
            enabled = false,
            sprite = 357,
            color = 3,
            scale = 0.8,
            label = "Go On Duty",
            onlyNearby = false,
        },
    }
}

Bridge & Integration Configuration

All of the framework and resource integrations can be found in the bridge directory, we expect you to have atleast a basic understanding of Lua & how to integrate with other resources to edit these. Minimal support will be provided. If you have anything you want to recommend we integrate with, please let us know and we'll try our best to add it!

Locals / Language

All of the respective language/locales & command names can be changed in the locales directory.

Users can set their language via the /ox_lib command in-game if its enabled. If the language file doesn't exist, it defaults to English.