Features

Feature-by-feature reference for oxide-police — departments, MDT, custody, evidence, fleet, armory, field tools, and more.

Feature reference organised by domain. Each section maps to a server module under server/modules/.

Departments and Stations

Departments are the top-level organisation unit. Each department has a name (matching the framework job name), a label, a treasury balance, jail stripping rules, and a list of grades.

Stations live under departments and define physical locations where officers clock in and access services.

ConceptWhere it livesConfigured via
Department recordpolice_departments row/padmin
Grade matrixpolice_department_grades/padmin
Stationpolice_stations row/padmin
Per-station servicesJSON columns on police_stations/padmin

Per-station services that can be enabled / placed:

  • Clock-in zone
  • Armory (with grade-restricted loadouts)
  • Personal locker (where officers apply uniforms)
  • Boss menu point
  • Evidence locker
  • Evidence lab
  • Mugshot booth (camera + photo positions, set in /padmin → Detention Mugshot)
  • Booking desk, holding cells, jail cell, and release point (set in /padmin → Detention Holding)
  • Station bell
  • Trash bin
  • Firearm registration desk (civilian-facing)

Garages are created on the Fleet screens and can be attached to a station.

Several of these service types support multiple points per station — clock-in, armory, boss menu, evidence locker, evidence lab, and personal locker can each have more than one access point placed in /padmin. Stations created before this support continue to work: a single legacy point is read as a one-entry list automatically, with no database migration required.

Officers, Hiring, and Duty

Officers are characters hired into a department at a specific grade. Hiring writes the assignment to police_officers, syncs the framework job, and assigns a badge number.

  • Hire via /phire <serverID> <deptName> <gradeRank> or the boss panel.
  • Fire via /pfire <serverID> [deptName] or the boss panel.
  • Boss panel is available to grades flagged is_boss = true (opened from in-station ox_target) and lets bosses promote, demote, fire, set salary, and view payroll.

The officer roster also tracks framework job changes. When a player's framework job is set to a police department's name (by an external job/management script), they are automatically hired, transferred, or grade-synced into that department's roster, just like /phire. Clearing their job to unemployed removes them from the roster. Switching to a different, non-department job does not remove them, so multi-job setups that swap the active job back and forth will not accidentally fire officers.

Multiple departments per officer (optional). With Config.AllowMultiDepartment = true (shared/config.lua), a character can hold an enrollment in several departments at once, each with its own badge, callsign, grade, and pay. Their active department follows whichever police job they currently have selected, and duty, the boss panel, the MDT, and field tools all act on that active department; switching to a non-police job drops police access without losing any enrollment. This is also what lets Oxide Police integrate with multi-job menus such as g-multijob (see the ESX setup guide). With the setting off (the default), a character belongs to one department and hiring into a second transfers them, exactly as before.

Duty is a separate state. Officers must be hired into a department AND clocked in at a station to access armory, garage, MDT, evidence, and field tools.

  • Clock in at a station's clock-in zone (a third-eye / targeting prompt).
  • Clocking out removes any applied uniform and stops payroll accrual.
  • By default (Config.RequireStationClockIn = true) duty can only be toggled at a station's clock-in zone, and the /duty command and the duty toggle inside the police radial menu are disabled.
  • Set Config.RequireStationClockIn = false to allow toggling duty from anywhere. The /duty command (restricted to hired officers) and the duty toggle then become available; the toggle appears as the first item in the police actions menu (Config.ActionMenuKey, default F2, titled "Police"), and off-duty officers can open the menu to clock in — all other actions still require being on duty. /duty clocks in at the first station configured in the officer's department.

MDT

The MDT (/mdt) is the primary on-duty interface. Officers must be on duty and meet Config.MDT.permissions.accessMdt to open it. Set Config.MDT.allowOffDuty = true to let hired officers open and use the MDT while off duty (the accessMdt minimum grade still applies). When Config.MDT.useItem = true, the MDT is opened by using the Config.MDT.itemName item (default police_tablet) instead of the /mdt command.

Tabs:

TabFunction
DashboardRecent activity feed, KPI tiles, on-duty officer count, live officer map
DispatchLive alerts feed, respond / close (requires oxide-dispatch and Config.MDT.dispatchEnabled)
PersonsSearch citizens; the person profile shows identity, vehicles, criminal record, active warrants, evidence, mugshots, and licenses, and lets officers grant / revoke licenses (manageLicenses)
VehiclesSearch vehicles by plate; record shows owner, model, type, state, and active BOLO flag
WeaponsSearch the firearm registry by serial or owner name; view a weapon's owner of record and set its status (registered / stolen / seized / revoked)
ReportsCreate / search / close case files with attached charges, mugshots, evidence
ChargesProcess arrests and attach charges from the catalog to a case (requires processArrest)
FinesIssue field fines or attach fines to a case (requires issueFine)
WarrantsIssue / search / recall arrest warrants (issueWarrant / recallWarrant)
BOLOsBe on the lookout broadcasts for vehicles (by plate) or persons (by char_id)
Video StorageBrowse and attach bodycam recordings and baitcar dashcam clips to cases (gated on per-department / boss permissions)
CatalogAdmin-only: view / edit the charge catalog

Server-side caps in Config.MDT.limits prevent abuse: maxFinePerCall, maxCountPerCharge, maxTextLength, maxPlateLength.

When Config.MDT.tabletAnimation = true, opening the MDT attaches a tablet prop to the officer's hand and plays a tablet-holding animation so nearby players see them using the device instead of standing idle.

Characters listed in Config.MDT.hidden.charIds are hidden from MDT person search, profile lookups, and vehicle-owner queries. Officers at or above Config.MDT.hidden.bypassMinGrade still see hidden characters; set the bypass to -1 to hide them from everyone.

Charges and Fines

The charge catalog seeds from Config.DefaultCharges (100 entries) on first run, then is managed in the MDT.

  • Charges have a code, title, category (infraction / misdemeanor / felony), description, fine amount, and jail time.
  • Fines can be issued from a case or as a field citation.
  • Config.MDT.fineRevenueSplit (default 50) determines how much of fine revenue routes to the department treasury; the rest is treated as the state's share and leaves the economy.
  • When banking integration is on (Config.UseBankingAccount = true), fines are sent as banking invoices for the player to pay; if invoicing is unavailable, the amount is taken straight from the player's bank account.
  • Jail sentences from charges flow into custody automatically when the booking flow is confirmed.

Garage and Fleet

Each station can have a garage. Vehicles in the garage are sourced from the department's fleet.

  • Fleet vehicles are added through the boss panel from Config.FleetCatalog (ships with Patrol, Pursuit, Tactical, and Motorcycle categories — labels are locale-driven and can be retitled or extended).
  • Each fleet entry has a model, label, cost, optional radar / megaphone addons, and min_grade.
  • Buying a vehicle into the fleet debits the department treasury by cost + addon surcharges.
  • When a fleet vehicle is totalled, replacement debits the treasury by the saved replacement cost.
  • The radar addon (Config.FleetAddons.radar, default 5000) sets has_radar = true on the vehicle, enabling the vehicle radar keybinds.
  • The megaphone addon (Config.FleetAddons.megaphone, default 2500) enables the vehicle PA toggle.

Checking out and returning

  • A checked-out fleet vehicle stays in the world wherever it is left. It is not removed when the officer clocks out, disconnects, or the server restarts — after a restart it respawns in the same spot. A unit only returns to the available pool once it is physically brought back.
  • Returning is a physical act. Any on-duty officer of the department can return any of that department's vehicles by driving it to one of that department's garage bays and using the return option — it does not have to be the car they personally checked out. Returning at any other location, or returning another department's vehicle, is refused with a message explaining why.
  • If every bay at a garage is occupied, checking out another vehicle is refused until one is returned.
  • Tow recovery: the boss menu Fleet screen has a Tow action that lists every unit out in the field — plate, who checked it out, whether that officer is online, and the street it was last seen on — so the boss picks exactly which vehicle to recover. Towing brings that unit back without anyone driving it, charging the treasury Config.FleetRecoveryFee per tow (default 750; 0 = free).

Armory

Armories are per-station and serve grade-restricted loadouts (collections of items + counts) through a dedicated shop NUI with two tabs: Loadouts (buy a whole bundle in one click) and Items (cherry-pick items from the loadouts your rank can access).

  • Loadouts are created and priced in /padmin → Loadouts. Each item carries its own price; the bundle total is the sum.
  • Each loadout has a min_grade and a list of items with counts and per-item prices (cap: Config.MaxLoadoutItems).
  • Funding source is per department: bosses toggle "Treasury Funded" vs "Officer Pays" in the boss menu. Treasury-funded pulls debit police_departments.balance; officer-pays pulls debit the officer's bank.
  • Once equipment is pulled, it stays in the officer's inventory. Going off-duty or disconnecting does not strip armory items.
  • WEAPON_RADAR is added to a loadout to give officers the handheld speed radar.

Uniforms

Uniforms are saved outfit presets defined per department. Officers put them on at a station's personal locker point — uniforms are not applied automatically on clock-in.

  • Created and managed in /padmin → Uniforms (separate male / female outfits, with a min_grade per uniform).
  • Officers use the personal locker point at a station to pick a uniform their rank can access, or to change back to their own clothes.
  • Any applied uniform is removed automatically on clock-out.
  • The inmate uniform is separate (Config.Custody.Uniform).

Custody and Booking

The custody pipeline turns a cuffed suspect into a sentenced inmate.

StageWhat happens
CuffOfficer applies cuffs (front / rear / dead variant detected automatically)
SearchOfficer pats down the suspect (configurable in Config.Search)
EscortOfficer drags the suspect to the booking station
BookingOfficer opens OpenBookingFlow at the station; charges + fines + jail time totalled
MugshotCaptured during booking via screenshot-basic and uploaded
ConfirmSentence is committed to police_custody; suspect teleported to a configured jail cell
StripInmate inventory is processed per the department's stripping mode
SentenceSentence ticks down on Config.Custody.TickInterval; prisoner jobs reduce remaining time
ReleaseInmate is released to a configured release point with their stripped items returned (per stripping mode)

Stripping modes (per department, set in /padmin → Jail Policy):

  • none — inmates keep their items
  • locker — items moved to a per-character locker stash and returned on release
  • wipe — items destroyed

A separate whitelist (also on the Jail Policy screen) lists items the inmate always keeps — it applies in both locker and wipe modes.

The locker stash uses the prefix Config.Custody.Locker.StashPrefix (default 'police_jail_locker_') with Slots = 50 and MaxWeight = 500000 g.

When Config.Custody.ReduceOfflineTime = true, sentences keep counting down while the inmate is offline. The server decrements remaining_seconds on the same cadence as the live tick and auto-releases records that hit zero — players who log in mid-sentence resume with the time already burned. Leave it false if you want serving time to require active play.

/jail <id> <months> and the JailPlayer export use Config.Custody.SecondsPerMonth (default 60) to convert months to real seconds.

A prisoner's remaining sentence can be adjusted after booking with /addtime <id> <±minutes> (add or reduce) and /setsentence <id> <minutes> (set an exact length). Both work on offline prisoners and release the prisoner when the remaining time reaches zero. They are usable by admins or by on-duty officers of a high enough rank — see the Admin Guide.

Prison revive

When an inmate dies during their sentence, Config.Custody.Revive runs a fade-to-black cutscene and teleports them to the global revive point configured in /padmin → Detention → Revive Point. Non-jailed deaths fall through to the framework's medical resource untouched.

The revive point row must exist in police_prison_revive_point for the cutscene to fire.

Mugshot

Mugshots are captured via screenshot-basic and uploaded to the endpoint configured in Config.Mugshot.PresignedUrlEndpoint (default Fivemanage). Requires the convar FIVEMANAGE_MEDIA_API_KEY.

  • Capture from the booking flow or directly via CaptureMugshot export.
  • The /padmin panel includes a Preview button under Detention Mugshot that places you at the photo mark and shows the camera framing — useful for lining up the booth. Preview does not take or upload a photo; test the upload with a real booking.
  • An optional Discord webhook (Config.Mugshot.Webhook) posts the embed defined by Config.Mugshot.BuildEmbed.
  • Config.Mugshot.SendPhoto can be overridden to route to S3, Loki, or any custom destination.

Prisoner Jobs

Inmates can reduce their remaining sentence by completing prisoner jobs. Job points are placed by admins through /padmin → Detention → Prisoner Jobs.

JobMechanicTime per swing / pickup / success
MiningHit rocks with a pickaxe (8 swings to break)10s per swing
CleaningPick up trash bags around the prison yard8s per pickup
ElectricalWelding scenario + wireMatch / circuitTrace / voltageTune minigame60s on success

Optional money rewards (Config.PrisonerJobs.<job>.Money) and item drops (ItemDrops) ship empty by default — configure them per server.

Prison Shop

A prison shop vendor is placed via /padmin → Detention → Prison Shop. Until a location is placed, the shop is dormant.

  • Vendor model: Config.PrisonShop.model (default s_m_y_prismuscl_01).
  • Free meal item: Config.PrisonShop.freeItem (default prison_food_tray), handed out during configured meal windows.
  • Paid catalog: defined per-server through the admin UI under categories food, drink, misc.
  • Inmates pay with cash; transactions deduct the configured price.

Evidence

The evidence registry tracks crime-scene drops and forensic data.

TypeSourceExpire (min)Notes
Blood70% chance on player damage6010s cooldown per player. Tagged with the player's character ID. If oxide-medical is installed, it takes over blood drops instead (DNA-tagged — see below)
BulletSpawned on weapon discharge60Officers can be excluded — see Config.Evidence.OfficersDropBullets below
Fingerprint80% chance on entering a vehicle without gloves120Glove check via Config.Evidence.CheckPlayerGloves

Other features:

  • GSR (gunshot residue) — set on the shooter on weapon discharge; Config.Evidence.gsr.duration = 600s and washes off in water if washInWater = true.
  • Vehicle fingerprints — recorded against the specific vehicle; other resources can look them up via the GetVehicleFingerprints export.
  • Weapon ballisticsConfig.Evidence.Weapons lists each weapon's name and ammo type so ballistics reports can identify what was fired.
  • Drop controlsConfig.Evidence.OfficersDropBullets (default true): set to false so on-duty officers leave no bullet casings, keeping range training and duty firefights from littering collectable evidence. Config.Evidence.IsDropExempt is a function you can edit to suppress every world-evidence drop (casings, blood, vehicle fingerprints) for a player — handy for excluding paintball or other minigame states. See Configuration for the example.
  • Blood drop source — by default, blood is dropped when a player takes damage and is tagged with their character ID. If the optional oxide-medical resource is installed, it takes over blood entirely: a bleeding suspect drops blood evidence carrying their DNA, character ID, and wounded body part, and the basic damage-triggered drop is turned off so the two never both appear for one wound. With oxide-medical absent, the basic damage-triggered blood drop is used.
  • Case-based evidence lockers — each case file has its own evidence locker keyed by case number. The station is the access gate (officer must be on duty with access to the station's department), but which locker opens is decided by the selected case. Officers select a case before opening, processing, or registering evidence. Locker capacity uses Config.Evidence.locker.slots / weight, with access gated by Config.Evidence.locker.minGrade.
  • Registry submission — items in Config.Evidence.registrableItems and any item matching Config.Evidence.registrablePatterns (default weapon_*) can be logged to a case's registry and moved into that case's locker. Registering a firearm (weapon_*) also records its serial in the weapon registry — a ghost gun with no owner data is captured with no owner, which flags it as unregistered in the MDT Weapons tab.
  • Processing — items in Config.Evidence.processing can be processed for a result label (DNA Analysis, Ballistics Report, Print Match Report).

Evidence Camera

The evidence_camera item lets officers photograph evidence drops at a crime scene. Photos are tagged to the case and uploaded through the same screenshot-basic pipeline as mugshots.

CCTV

CCTV cameras are placed by officers through the placement UI (cctv_camera item).

  • Placement: aim, scroll// to rotate, LMB to place, RMB to cancel.
  • After placing, arrow keys aim the default view, E confirms.
  • Placed cameras live for Config.Cctv.temporaryDurationSeconds (default 24h) and are cleaned up by a server tick (Config.Cctv.expiryTickSeconds).
  • Open the viewer with /cameras to browse all cameras the officer can access.
  • Viewer applies Config.Cctv.timecycleEffect (Island_CCTV_ChannelFuzz) at Config.Cctv.timecycleStrength.

Speed Cameras

Speed cameras are placed by admins through /speedcam_create and stored in the database.

  • Models offered: Config.SpeedCam.Models (default: prop_cctv_pole_03).
  • Per-camera config: speed limit, sensor radius (default Config.SpeedCam.DefaultSensorRadius = 3.0), fine multiplier (cap: Config.SpeedCam.MaxFineMultiplier = 3).
  • Catch cooldown: Config.SpeedCam.CatchCooldown (default 30s) prevents repeat triggers.
  • Plays a catch sound (volume Config.SpeedCam.SoundVolume) and fines the driver of the vehicle.
  • Departments can list speedcam_ignored_jobs (set in /padmin) to exclude specific framework jobs from triggering.
  • Speed unit follows Config.SpeedUnit (MPH or KMH).

Bodycam

The body_cam item streams the wearer's POV to other officers via /bodycams.

  • Camera attaches to bone Config.Bodycam.headBone with offset Config.Bodycam.cameraOffset.
  • FOV: Config.Bodycam.fov (default 50).
  • Watcher distance check every Config.Bodycam.pollIntervalMs (default 2.5s); resets the view to the wearer if distance exceeds Config.Bodycam.maxWatchDistance (default 60m), and the watch session continues.
  • Roster filter: Config.Bodycam.sameDepartmentOnly (default true) restricts the roster to officers in the watcher's department.
  • Bosses can override the roster filter for senior ranks per department. The min rank is stored on police_departments.bodycam_view_all_min_rank and toggled from the boss menu — officers at or above the rank see every active wearer regardless of department.

Recording

Watching another officer's feed can capture clips (mic + best-effort page audio). Recording runs on the watcher's machine, never on the wearer.

  • Auto-records once per watch session when Config.Bodycam.recording.autoRecordOnWatchStart = true.
  • Manual hotkey (F6 by default, Config.Bodycam.recording.hotkey) toggles additional clips during the same watch session.
  • Provider: 'fivemanage' (uploads via FIVEMANAGE_MEDIA_API_KEY) or 'discord' (POSTs to Config.Bodycam.recording.discordWebhook).
  • Caps: maxDurationS (default 45s), videoBitrate (default 600 kbps), discordMaxBytes (default 25 MB).
  • Wearers receive a "you are being recorded" notification when a clip is rolling against them.
  • Recordings are stored in police_bodycam_recordings with the recorder, wearer, department, trigger type (auto / manual), duration, provider, video URL, and optional thumbnail / case attachment.
  • The MDT exposes a Video Storage tab for officers to browse, attach to cases, and delete recordings (gated on per-department / boss permissions). The same tab also surfaces baitcar dashcam clips uploaded by oxide-baitcar, so all archived video is in one place.

Megaphone

The megaphone item enables PA mode (handheld and vehicle).

ModeRangeTrigger
HandheldConfig.Megaphone.handheldRange = 30mUse the item
VehicleConfig.Megaphone.vehicleRange = 50m+oxide_police_vehicle_pa keybind (default B), driver only by default

Listeners within range are force-subscribed to the speaker's voice channel (bypassing pma-voice / yaca-voice proximity falloff).

Breathalyzer

The breathalyzer item reads BAC from your drunk system. The reader tries each entry in Config.Breathalyzer.sources in order and uses the first numeric result.

Supported source types: metadata (via o-link.character.GetMetadata), export (server-side), client_export (client-side via export call), client_callback (target client registers oxide:police:client:reportBac).

The display value is raw * Config.Breathalyzer.multiplier, clamped to [0, Config.Breathalyzer.maxDisplay]. Thresholds: cautionLimit (default 50) flips the colour, overLimit (default 80) flashes OVER LIMIT.

Field Tools

ToolItemBehaviour
Wheel clampwheel_clampAttaches to the front-left wheel, immobilising the vehicle
Mouth tapemouthtapeDisables pma-voice / yaca-voice on the target
Tracking bandtracking_bandLive blip + GPS coords on the target every 1s
Vehicle impound(no item)Tows a registered vehicle for a configurable fee (default $500, max $50000)

All field tools are gated on duty by default. Distances, durations, and bone attachments are configurable in shared/config/field_tools.lua.

Radio

The police radio (+oxidepoliceradio, default Y) is an in-world voice channel browser. It requires the police_radio item by default.

  • Configurable channels per department through /padmin → Radio.
  • pma-voice and yaca-voice integration via channel mapping.
  • Talking-state debounce: Config.Radio.TalkingDelay (default 50ms).
  • The SetRadioDead server export lets external resources (e.g. oxide-death) flag a downed officer as unable to use the radio.

Treasury and Payroll

Each department has a treasury balance stored in police_departments.balance.

  • Optional banking account through oxide-banking (Config.UseBankingAccount = true), starting balance Config.BankingAccountStartBalance = 30000.
  • Funded via FundDepartment export, manual top-up in the boss panel, fines (per Config.MDT.fineRevenueSplit), and external sources.
  • Payroll runs every Config.SalaryInterval (default 15 min) and pays each on-duty officer their grade salary.
  • When Config.PlayerManagement = true:
    • Salaries debit the department treasury.
    • Unpaid ticks accrue in police_unpaid_payroll for boss settlement.
    • Rows older than Config.UnpaidHoursDecayDays are pruned.
  • When Config.PlayerManagement = false:
    • Salaries are paid directly from the framework with no treasury impact.
  • Armory pulls debit the treasury when the dept's armory_treasury_funded flag is on (boss-toggled). When off, officers pay personally and the treasury is untouched.

Respawn

When an on-duty officer dies, the respawn module routes them to the configured station respawn / hospital point instead of running the framework's death flow. This is independent of the prison revive cutscene (which only applies to inmates with an active sentence).

Station Services

Per-station amenities configured in Config.FieldActions.StationServices.

ServiceConfig flagNotes
Station bellbellsEnabledCooldown: bellCooldownMs = 30s
Trash bintrashEnabled30 slots, 50000g cap, auto-clear every 1h
Trash cleartrashClearableMin grade: trashClearMinGrade = 0
Firearm registration deskfirearmRegistrationEnabledCivilian-facing; fee firearmRegistrationFee = 250 per firearm

Firearm Registration Desk

The firearm registration desk is a civilian-facing service point placed on a station in /padmin (Stations → Firearm Registration). Any player can target the desk to register the firearms they are carrying.

  • The desk lists only the player's eligible firearms: weapons that have a serial and have never been registered. Already-registered weapons and deliberately unregistered ghost guns are excluded.
  • A fee of Config.FieldActions.StationServices.firearmRegistrationFee (default $250) is charged per firearm from the registrant's bank.
  • The fee is deposited into the station's department treasury.
  • Each registered firearm is recorded in the weapon registry under the registrant as the owner of record.

The eligible list is always re-derived on the server, so a tampered client cannot register a weapon it isn't actually carrying or launder a ghost gun.

Weapon Registry

The weapon registry is a statewide, durable record of who each firearm is registered to, keyed by the weapon's serial. It survives the physical item being sold, destroyed, or carried offline, giving officers a permanent owner-of-record to trace.

The registry is populated from two places:

  • Civilian registration desk — registering a firearm records it to the registrant as the owner, with status registered.
  • Evidence submission — registering a weapon_* item to a case records the seized weapon with status seized. A ghost gun (no owner data) is recorded with no owner, which flags it as unregistered.

Officers work the registry from the MDT Weapons tab:

  • Search by weapon serial or owner name.
  • View a weapon's details, including its owner of record (resolved to the current character name).
  • Set a weapon's status: registered, stolen, seized, or revoked. Marking a weapon stolen or revoked automatically flags it.

Other resources can register, seize, look up, and flag weapons directly via the Weapon Registry exports.

Field Interactions

Officer-on-suspect interactions handled by Config.Cuffing / Escort / Search / Tackle / HandsUp / Carry.

InteractionDefault key / commandNotes
CuffAction menu (F2)Front / rear / dead detection (Animation = 'advanced')
Lockpick cuffsAction menu (suspect side)Requires lockpick, three skill-check rounds
Break cuffsAction menu (suspect side)BreakMinigame = true, EscapeCooldown = 30s
EscortAction menuOfficer-target attach with walk / idle anims
SearchAction menu5.5s body-search anim
Tackle+policetackle (default G)3.0m reach, 10s cooldown, animation or ragdoll
Hands uphandsup (default X)Marks the player as surrendering (other resources can read the oxide:handsup state)
CarryAction menu, stop with EFireman's-carry attach
HeadbagAction menuBlack-out overlay on target screen
ZiptieAction menuAuto-release after 5min if autoReleaseSeconds > 0

Action menu (F2, configurable via Config.ActionMenuKey) opens a contextual radial of available actions based on the officer's target.

Most of these actions are also available through the officer target menu (third-eye) on a player. The options shown there are controlled per-action by Config.OfficerTargetMenu.Actions — cuff, search, and escort are on by default; hard cuff, carry, headbag, put/take out of vehicle, GSR check, and issue ticket can each be enabled individually.

Each interaction also carries its own duty requirement. Escort, carry, headbag, and the vehicle actions expose a per-action requireDuty flag (default true); setting one to false lets off-duty officers or civilians use that action — for example, allowing civilians to restrain a target with zip-ties while keeping everything else on-duty-only. See Configuration → OfficerTargetMenu.

Placeable Objects

The +policeactions menu (default F2) includes a Place Object option that opens a picker of items defined in Config.PlaceableObjects.props.

  • Cap: Config.PlaceableObjects.maxPerOfficer (default 15) per officer.
  • Placement shows a translucent preview positioned by a camera raycast (out to Config.PlaceableObjects.placementMaxDepth); confirm to drop, or rotate before placing.
  • Spike strips set spikeStrip = true and trigger tire-pop logic on driver-over.

Shipped props: do-not-cross barriers, A-frame barriers (with and without lights), road-work barriers, traffic barriers (with and without lights), three traffic cone variants, road poles, spike strips.

Next Steps