Jixryo Police
Restraints placed as paired scenes, movement that follows them, escorts, holding someone down, searches worked through a camera on the spot, hidden stacks, and big items everyone sees. The server decides every step.
Version 0.6.1 Updated See it on its script page
On this page
Jixryo Police takes over cuffing, escorting and searching from qbx_police, which keeps everything else. Cuffs go on as GTA's own paired arrest scenes, the restraint decides how the person can move, searches are worked zone by zone through a camera on the spot, and the server checks every item, distance, position and hold before anything changes. It works with Evidence, Prison and MDT.
What players get
- Restraints that change how you move. Cuffs behind let you walk, but jogging can trip you face down, and sprinting, jumping and doors are out. Cuffs in front let you jog and open doors. Zip ties move like cuffs behind. Leg shackles make you shuffle. Cuffs plus shackles are a transport shuffle with no doors. With your hands restrained you have no weapons, phone, inventory or third eye, you are never the driver, and deep water pulls you under.
- The struggle. Standing and not complying while cuffs go on, you get a skill check during the first part of the hold. Win it and you pull free. Once a minute.
- Ways out. A cuff key takes cuffs and shackles off, anything sharp cuts zip ties, someone else can pick your cuffs with a lockpick (and may snap it), and single-locked cuffs can be slipped yourself with G on a hard skill check, every two minutes. Double-locked cuffs give nothing.
- A card on your screen says what you wear, who put it on and what you can still do.
- Everyone sees the cuffs. Worn cuffs and leg cuffs are networked props. Zip ties do not show.
- Escort. You are held in front of the officer and to their right, where their hand holds your arm, and you walk GTA's cuffed walk at their pace. H pushes you ahead a step; G lets you go, standing upright on the ground.
- Held down. On the floor (tackled, ragdolled, prone, in last stand) anyone with free hands can hold you down. SPACE and a skill check gets you up, harder when cuffed, once every six seconds. The one holding you has about a second to press E and shove you back down.
- Searches you can see coming. A pat-down by anyone who is not on-duty police asks you first, Accept or Decline on your screen, unless you are restrained or down. A pat-down names only hard or sharp things; soft things are only felt. Hidden things need a second, longer hold. A search left open ends on its own after three minutes.
- Hiding things.
/concealhides up to two small stacks on your body: under an insole, in the waistband lining or in your hair. The third eye on an unlocked vehicle hides a stack behind a door panel (a screwdriver), in the spare tire well or the engine bay. - Big items. A TV, a statue or a photocopier in your inventory is carried in both hands for everyone to see. No sprint, jump, fight or driving, and one at a time. Load it into a trunk and it stands there for everyone; G puts it down as a drop with its prop.
What staff get
Officers work through the third eye on a person or a vehicle, and through the search page.
| On a person | Shows when |
|---|---|
| Pat down | Your hands are free |
| Search (full) | They are restrained |
| Cuff behind, Cuff in front | You carry handcuffs and their hands are free |
| Zip-tie hands | You carry zip ties and their hands are free |
| Shackle legs | Their hands are restrained and you carry leg shackles; the server also needs on-duty police |
| Double-lock cuffs | They wear single-locked cuffs; the server needs a cuff key or on-duty police |
| Take restraints off | Cuffs or shackles; the server needs a cuff key or on-duty police |
| Cut the zip ties | Zip ties, and you carry something sharp |
| Pick the cuffs | Cuffs, and you carry a lockpick |
| Escort | They are restrained and nobody holds them |
| Hold them down | They are on the floor, your hands are free and nobody holds them |
| Help them up | You are holding them down |
| On a vehicle | Shows when |
|---|---|
| Search the vehicle | Unlocked, and you are outside it |
| Hide something in it | Unlocked; the door panels need a screwdriver |
| Seat them in the back, Take them out | You escort someone; someone restrained is inside |
| Load into the trunk, Pick up the big item | At the back: you carry a big item; one stands in the trunk |
- Scenes, not teleports. For cuffs, shackles and the uncuff the officer walks into place with collision on, then both play their side of GTA's paired clip at one origin, so the hands meet the wrists however the person stands. The cuffs click onto the wrists, then a second click tightens them. If the officer cannot get there the server says "Get closer." and nothing happens.
- The hold is the server's. Each scene's length is the minimum hold, counted from the moment the officer is in place. Finishing early is refused.
- Using the item works too. Using handcuffs, zip ties or leg shackles from the inventory starts it on the nearest person, behind or in front by where you stand.
- The search page. One panel on the right holds the zones and their results, the finds (weapons first, felt items as "?"), your free pocket slots and the keys. A marker sits on the spot and a line sweeps it while E is held. Each find flies into the list, and when a person's search is done the camera pulls back with a pin where each zone held something. Only a full search, or a search by on-duty police, takes things; a taken item lands in your pockets tagged as evidence with who, when and from whom.
- Vehicle searches open what they need. The driver door for its pocket, the passenger door for the glovebox, the rear door, the trunk and the hood, with the vehicle's network control so everyone sees it, and everything shuts when the search ends.
- The radial menu keeps working: with the included patch, qbx_radialmenu's Cuff, Escort, Put In Vehicle, Take Out and Search buttons come here.
/unrestraintakes every restraint off a player, for staff with the ACE inConfig.staffAce.- An audit trail. Restraining, unlocking, a won struggle, a picked or slipped cuff, holding someone down and their escape, seating, every search started, every item taken, hiding something in a vehicle and the staff command all go to Core's audit log.
Install
Police replaces qbx_police's cuffing and searching through a patch; qbx_police itself keeps running.
Items. Add two to
ox_inventory's items, with pictures named after them inweb/images:lua ['leg_shackles'] = { label = 'Leg Shackles', weight = 900, stack = true, description = 'Steel around the ankles. Walk slow.' }, ['cuff_key'] = { label = 'Cuff Key', weight = 10, stack = true, description = 'Opens handcuffs and shackles.' },Police also uses
handcuffs,zipties,lockpickandscrewdriver, and the big itemssmall_tv,x_pantherstatueandphotocopier. Add any your inventory does not have, or change the names inconfig.lua.Patch qbx_police and qbx_radialmenu. Patched copies of both come with Police; every changed line in them is marked with a comment. Either make the same edits in your own copies (23 lines in qbx_police, 7 event names in the radial menu's
config/client.lua), or upload the patched copies after copying your ownconfig/folders over them. The patch only acts while Police runs, so stopping Police brings stock behaviour back.Upload
jixryo_policeas it is. Its page is already built.Start it after Core and the two patched resources:
server.cfg ensure jixryo_core ensure qbx_police ensure qbx_radialmenu ensure jixryo_policeIt needs
ox_lib,qbx_core,ox_inventory,ox_targetandjixryo_core. Three resources are optional and found when they run:interact-soundplays the cuff clicks,scully_emotemenuis held while someone is restrained, held down or searched, and aqbx_tackletackle counts as being on the floor.No database. Police keeps no tables. A restraint survives a reconnect in the character's qbx_core metadata.
Restart the whole server.
How other scripts' calls behave
Police answers as no other resource. The patch and a few hooks make the scripts around it behave.
| Resource | What happens |
|---|---|
qbx_police | With the patch: /cuff and /sc refuse and point to the third eye; police:server:CuffPlayer is refused; its escort, kidnap, seat and unseat events refuse people Police restrains but still work on people who are down, for EMS and kidnapping; using handcuffs starts Police's flow; its own cuffed-controls loop steps aside while Police runs. |
qbx_radialmenu | Cuff fires jixryo_police:radial:cuff (cuffs, else zip ties; behind or in front by where you stand), Escort fires jixryo_police:radial:escort, Put In Vehicle jixryo_police:radial:seat, Take Out Vehicle jixryo_police:radial:unseat and Search jixryo_police:radial:search. Escort, seat and unseat fall back to qbx_police for people who are down. |
qbx_core | The ishandcuffed metadata follows the hands, so phones, tablets and other scripts react as before. The record itself is kept in the jx_restraint metadata and comes back on reconnect. |
qbx_tackle | Its tackle:server:TacklePlayer event is heard: a tackle from within two metres counts as being on the floor for eight seconds. |
scully_emotemenu | Its setLimitation export holds emotes, hands up and the ragdoll key while a player is restrained, being restrained, held down or searched. |
interact-sound | Plays the Cuff and Uncuff clicks, heard by both players, when it runs. |
ox_inventory | Two hooks: swapItems keeps one big item in your hands at a time and none in a glovebox, and openInventory on a trunk refreshes what stands in it. Items taken in a search carry evidence = { by, at, from }; hidden stacks carry jx_hidden = { spot, in }, which only counts while the stack stays where it was hidden. Nothing in ox_inventory is changed. |
| Evidence | A seized item dragged into an evidence bag keeps Police's { by, at, from } as "Seized by" at the top of its chain of custody once the bag is sealed. |
Its own API
Server exports, called as exports.jixryo_police:Name(...).
| Export | What it does |
|---|---|
IsRestrained(src) | true, kind (cuffs_back, cuffs_front, zipties, shackles or transport) or false. |
GetRestraint(src) | A copy of the record { hands, legs, double, by }, or nil. |
SetRestraint(src, hands, legs, double, by) | For other scripts (prison transport, admin tools): puts restraints on with no item and no animation. hands is a hands kind or nil, legs a boolean. |
Release(src) | Takes every restraint off. |
IsEscorted(src) | The server id of the officer holding them, or nil. |
IsPinned(src) | The server id of the one holding them down, or nil. |
Client exports (display only, the server's exports decide): exports.jixryo_police:IsRestrained() and GetRestraint().
State bags. The server owns the first five; a write from a player's game is put back.
| State bag | On | What it carries |
|---|---|---|
jxRestraint | A player | { hands, legs, double, by } while restrained. |
jxEscort | A player | The officer's server id while they are held. |
jxEscorting | A player | The server id of the person they hold. |
jxPinned | A player | { by, side, anchor } while held down; anchor is where their floor arrest starts, from their own game. |
jxPinning | A player | The server id of the person they hold down. |
jxCarry | A player | The name of the big item they carry (visual only). |
jxCargo | A vehicle | The big items standing in its trunk. |
Client events another resource may raise: the five jixryo_police:radial:* events above (they answer only to qbx_radialmenu), and jixryo_police:search:start with a server id, which opens a pat-down, or a full search when that person is restrained.
Commands and keybinds
| Command | Who | What |
|---|---|---|
/conceal | Anyone with free hands | Pick a small stack in your pockets and a spot on your body, or bring a hidden stack back out. The name is Config.conceal.command. |
/unrestrain [id] | Staff with an ACE in Config.staffAce | Every restraint off that player (yourself when empty). Audited. |
Every key is rebindable in the game's settings.
| Key | Default | Does |
|---|---|---|
| Let go / put down / slip | G | Lets go of who you hold, puts down the big item you carry, or (single-locked cuffs) tries to slip a hand. |
| Help up / push | H | Helps up the person you hold down, or pushes ahead the person you escort. |
| Put them back down | E | While the person you hold down is getting up. |
| Try to get up | SPACE | Held down: a skill check. |
On the search page: hold E to search the zone under the marker; W / S or a click picks a vehicle zone; Up / Down picks a find, R takes it, Shift + R takes everything found; F turns a pat-down into a full search once they are restrained; Esc stops.
Configuration
Everything is in config.lua. The main settings and their defaults:
| Setting | Default | What it does |
|---|---|---|
Config.reach | 1.6 | Metres between the two people for anything hands-on, checked on the server. |
Config.items | handcuffs, zipties, leg_shackles, cuff_key, lockpick | The item names. |
Config.cutItems | knife, switchblade, dagger, machete, hatchet, bottle, wire_cutter | Anything that cuts zip ties. |
Config.leo | job type leo, on duty | Who unlocks and double-locks without a key, and who takes things in a pat-down. |
Config.usableItems | true | Using the item in the inventory starts it on the person in front of you. |
Config.kinds | cuffs_back, cuffs_front, zipties, shackles | Each restraint: its item, where you must stand, its time, whether the item comes back, whether it double-locks or can be cut, and who may put it on (shackles: on-duty police). |
Config.move | per kind | Walk, jog, sprint, jump and doors for each state, and the way out shown on the card. |
Config.compliantTime | 0.65 | Someone kneeling, with their hands up or on the ground takes this share of the time and gets no struggle. |
Config.struggle | on, window 0.7, cooldown 60, easy and medium | The struggle check and how often one person gets it. |
Config.trip | speed 2.6, after 1.2 s, chance 0.35, ragdoll 1800 ms | Running cuffed behind. |
Config.shuffleRate | 0.72 | Shuffle speed in shackles. |
Config.sinkInWater | true | Cuffed behind in deep water: pulled under. |
Config.slip | on, G, 4000 ms, chance 0.25, cooldown 120 s | Slipping single-locked cuffs yourself. |
Config.pick | 6000 ms, chance single 0.7 / double 0.35, break 0.3 | Someone else picking the cuffs. |
Config.times | unlock 2000, cut 1500, double 900 | Milliseconds. |
Config.escort | offset 0.30, 0.58, 0, maxDistance 4.0, letGoKey G, walkSpeed 1.25, rate 0.75 to 1.35, push 0.45 m over 1100 ms every 2.0 s | Where the held person sits against the officer, the hold, the walk clips and the push. |
Config.vehicle | reach 4.0, seats 1, 2, 0 | Seating someone, in that order. |
Config.place | maxStep 2.5, timeout 1600, arrive 0.45, slide 0.12, stand 1.0, lying 0.45 | Walking into place, and when a body counts as on the floor. |
Config.anims, Config.scenes, Config.floorArrests | GTA's own clips | Every animation, with fallbacks; each scene's clips, offsets, length and when the cuffs click and tighten. |
Config.ground | reach 1.8, tackledFor 8000, askMs 1500, keys SPACE / E / H, window 1200 + slack 300, cooldown 6 | Holding someone down and their try to get up. |
Config.props | p_cs_cuffs_02_s on the left hand and left foot | The worn cuffs. |
Config.sounds | interact-sound, Cuff / Uncuff, volume 0.25 | The clicks. |
Config.compliant | six poses | Hands up or kneeling clips that count as complying. |
Config.staffAce | group.god, group.admin, jixryo.police.admin | Who may /unrestrain. |
Config.search.body | 8 zones, head to shoes | Each zone's hold, camera frame and marker size. |
Config.search.vehicle | 10 zones, door pocket to engine bay | Each zone's hold, which inventory it reads, its camera view, and whether it is a hidden spot or needs a tool. |
Config.search.fullTime, deeperMs | 1.35, 2800 | A full search takes longer per zone; the extra hold for a hidden spot. |
Config.search.items, sharpWeapons, hardWeight | per item, six weapons, 300 g | How things feel through clothes and where they sit. |
Config.search.fullNeedsRestraint | true | A full search needs the person restrained. |
Config.search.consent, consentMs, closeAfter | 'civilians', 15000, 180000 | Who asks first ('everyone', 'civilians' or 'nobody'), how long the person has to answer, and when an open search ends on its own. |
Config.search.vehicleReach, letGo | 3.5, 3.0 | How close to a vehicle, and how far the officer may step from a person before they are let go. |
Config.search.camera | on, fov 50, glide 900 ms, hold 700 ms, wideFrame 2.6 m, panel 31 rem | The search camera, its angles on someone standing or on the floor, and each vehicle view's lens. |
Config.conceal | /conceal, 250 g, 2 stacks, three body spots, three vehicle spots, 3000 g in a vehicle, 3500 ms | Hiding things. |
Config.bigItems | small_tv, x_pantherstatue, photocopier | Each big item's prop and where it sits in the hands and in a trunk. Add any item the same way. |
Config.cargo | max 2, spacing 0.55, reach 3.0 | How many big items stand in a trunk, and from how close you load. |
Config.searchAnims | GTA's own clips | The pat-down, the kneel for the low zones, and the vehicle search. |
Security
- The server decides everything. A player's game only asks. The server checks the item, the distance, where the officer stands, who may do what, and that every hold really took its time, counted from when the officer was in place. The item is checked again at the end, in case it left their pockets.
- The record is the server's.
jxRestraint,jxEscort,jxEscorting,jxPinnedandjxPinningare written by the server alone; a write from a player's game is put back. - Searches read the real inventory on the server. The page receives only what a zone has given up so far. What is still hidden never leaves the server, not even as a count. Taking an item checks that the officer can carry it, removes it, adds it, and puts it back if the add fails. Only a full search, or on-duty police, take things.
- Vehicles must be unlocked and in reach for a search, a hidden stack, a load or an unload.
- Holding someone down needs them really down: in last stand or dead by qbx_core's metadata, tackled in the last eight seconds by a tackle the server heard from within two metres, or their own game asked. Where they lie comes only from their own game, and only within 2.5 metres of where the server has them.
- Skill checks run in the player's game, so the server limits them: the struggle once a minute and only in the first part of the hold, slipping every two minutes, a try to get up every six seconds, and the server's own odds on picks and slips.
- Everything is rate-limited on the server: beginning an action, escorting, seating, pushing, holding down, helping up, starting a search, taking an item and hiding a stack.
- Big items are kept to one in your hands and none in a glovebox by inventory hooks. ox_inventory itself is not modified.
- Movement limits run in the restrained player's game, as in every FiveM script. What others can do to that player is checked on the server.
- Every action is audited through Core's log.
Tests
Three suites run the real script in real Lua 5.4 on a stand-in server with stand-in players' games, 59 tests in all, every one passing on 2026-10-31:
- 15 on the restraint scenes and searches: which scene the server picks from behind, in front, on the floor, for shackles and the uncuff; that both players are told it and that the scene's length is the minimum hold counted from when the officer is in place; the pat-down telling the person who searches them; asking first and who is spared; only a full search or police taking things; a search left open ending on its own.
- 13 on the ground: a hold only on someone really on the floor; the anchor only from them and only near them; only the holder cuffing them there; every outcome of a try to get up; helping up into the escort; holds ending on their own; the server's state bags written once and a player's own write put back once.
- 31 in the players' games: the escort on the officer's body root with the cuffed walk at their pace; the floor arrest for the holder's side at one origin; the standing pairs solved from where the person stands; a blocked walk saying "Get closer." and nothing done; the push; the cuffed movement set; the search camera's framing, holds, glides, pins, vehicle doors and shut-down; the consent question and the search that times out.
Check it in game
- Hands up, A cuffs B from behind: A walks into place, both play the paired arrest, the cuffs click onto B's wrists and tighten, and C sees them. B's card says what B can still do; jogging trips B.
- B not complying gets the struggle. A win frees B; a loss cuffs B. Double-lock the cuffs: B's G does nothing.
- A tackles B, holds B down, then cuffs B on the floor. B presses SPACE and wins: A gets "Put them back down" and presses E in time. Then H: B gets up cuffed into A's escort.
- A pats B down: B's hands go up, the camera frames B's head over A's shoulder and the marker sits on it. A knife shows at the chest, soft things only as "?". F after cuffing: everything shows, and the insole stack needs the longer hold. R moves the pistol into A's pockets as evidence.
- A searches a car: the driver door opens, W / S moves to the glovebox, rear seats, trunk and hood as each opens; Esc shuts them all.
- B picks up a
small_tv: everyone sees it carried, B cannot sprint or drive, and "Load into the trunk" stands it in a trunk for everyone.resmon 1reads 0.00 ms when nothing is happening near you.