Browse docs
Introduction
What is sky_jobs_base?
sky_jobs_base is the shared core that powers every Sky-Systems job resource (ambulancejob, policejob, etc.). It provides common features so individual job scripts can focus on job-specific logic instead of re-implementing the same systems.
Installation Notes
Wardrobe / Clothing compatibility
The wardrobe can now be configured for different clothing systems in sky_jobs_base/config/config.lua under Config.Cloakroom.backend.
Supported values:
| Backend | Behavior |
|---|---|
auto | Detects the best available integration automatically |
sky | Uses the built-in Sky ESX wardrobe editor. Requires esx_skin and skinchanger |
qb-clothing | Opens the qb-clothing outfit menu |
17movement | Opens the 17movement Character System outfit menu |
qs-appearance | Opens the qs-appearance outfit menu |
ak47-clothing | Opens the ak47_clothing outfit menu |
ak47-qb-clothing | Opens the ak47_qb_clothing outfit menu |
tgiann-clothing | Opens the tgiann-clothing wardrobe menu |
nf-skin | Opens the nf-skin outfit menu |
bl-appearance | Opens the bl_appearance outfit menu |
izzy-appearance | Opens the izzy-appearance clothing menu |
codem-appearance | Opens the codem-appearance wardrobe menu |
hex-clothing | Opens the hex_clothing outfit menu |
illenium | Opens the illenium-appearance outfit menu |
custom | Uses your custom Config.Cloakroom.custom.open(context) hook |
disabled | Disables wardrobe interactions |
If rcore_clothing is running, do not use the Sky wardrobe marker as a direct outfit menu. Add the location as a Job Changing Room in the rcore_clothing config instead.
For tgiann-clothing, Sky opens the saved clothing wardrobe through the documented export. If you want native job or gang clothing rooms, add them in the tgiann-clothing config under config.clothingRooms.
Custom integrations can be added without editing client files:
Config.Cloakroom.backend = "custom"
Config.Cloakroom.custom = {
resource = "my_clothing",
open = function(context)
TriggerEvent("my_clothing:client:openOutfits", context)
return true
end
}
Key Features
| Feature | Description |
|---|---|
| Tablet System | In-game tablet with customizable apps per job |
| Dispatch | Dispatch system with blips, notifications, and job filtering |
| Radial Menu | Configurable radial menu with per-action availability |
| Garage | Job vehicle garage with spawn/despawn management |
| Storage | Station storage, vehicle trunks, and trunk props |
| Wardrobe | Outfit management per job |
| Shop | Job-specific item shops |
| Player Interactions | Shared cuffs, zipties, leg restraints, escort, vehicle transport, head bags, and player search |
| CCTV | Camera system for monitoring |
| Heli Cam | Helicopter camera with night vision and spotlight |
| Bodycam | Recording system with gallery upload |
| Panic Button | Emergency alert system |
| Management | Employee management panel via tablet |
| Calendar | Shared job calendar for scheduling |
| Chat | In-tablet job chat |
Shared player interactions
sky_jobs_base owns the complete restraint runtime. The Police Job and Crime System only provide their own menus, targets, and localized labels around the shared API.
The relevant files are grouped below source/client/interactions/restraints and source/server/interactions/restraints. The behavior is configured only in sky_jobs_base/config/config.lua:
| Config block | Purpose |
|---|---|
Config.JobPlayerInteractions | Job-group access, duty requirements, and the enabled interaction permissions |
Config.PoliceCuffs | Handcuffs, zipties, cutters, hands-up behavior, animations, and escape opportunities |
Config.LegRestraints | Item use, cuff requirement, range, and apply animation |
Config.HeadBag | Item use, restraint requirement, prop, self-removal, range, and apply animation |
Config.PoliceEscort | Escort and vehicle-interaction distances |
Config.PlayerSearch | Player-search behavior and range |
Config.PoliceCuffs, Config.LegRestraints, Config.HeadBag, Config.PoliceEscort, and
Config.PlayerSearch are intentionally not managed by /jobconfig. Edit them in
sky_jobs_base/config/config.lua, then restart sky_jobs_base and its dependent resources.The shipped access policies allow Police jobs to use cuffs, zipties, leg restraints, escort, vehicle transport, head bags, and player search while on duty. Crime jobs do not require duty and can use zipties, leg restraints, escort, vehicle transport, head bags, and search by default. Metal handcuffs remain disabled for Crime unless Config.JobPlayerInteractions.groups.crime.cuffs is enabled manually.
sky_policejob and sky_crimesystem register their current Config.Jobs automatically, including after Job Configurator updates. Another resource can use the same systems without installing Police Job by registering its jobs through the server export registerInteractionJobs.
The shared /admincuff <playerId> <handcuffs|zipties> and /adminuncuff <playerId> commands
force-apply or remove restraints without requiring Police Job. Their groups are configured through
Config.CommandPermissions.admincuff and Config.CommandPermissions.adminuncuff in Jobs Base.
See the Commands page for usage and permission setup.
Shared inventory items
The restraint items and their available preview images are installed from Jobs Base, not Police Job.
Register handcuffs, zipties, wire_cutter, legcuffs, and headbag according to the enabled
requirements. Also review the enabled tablet, employee GPS jammer, colleague-map GPS, and
prop-placement item bindings. The Inventory Items page contains restraint
definitions, lists every additional default item key, and identifies which preview images are included.
Handcuff escape opportunities
Config.PoliceCuffs.escape controls the rare minigame opportunity offered to a restrained player:
| Setting | Purpose |
|---|---|
enabled | Enables or disables escape opportunities |
chancePercent | Server-side chance rolled once when restraints are applied |
delayMinSeconds / delayMaxSeconds | Random wait before the minigame may start |
cooldownSeconds | Per-player cooldown between opportunities |
rounds | Number of correct inputs required |
windowMs | Visible input time per round |
minimumInputMs | Rejects impossibly fast inputs |
latencyGraceMs | Server-side network tolerance |
decoyCount | Number of visual decoy keys |
allowZipties | Also permits escape attempts from zipties |
keyPool | Allowed input keys |
The server owns the chance roll, delay, session, expected key, deadlines, progress, and final cuff removal. Clients cannot request an opportunity or report a successful escape directly. Lower chancePercent, longer delays and cooldowns, more rounds and decoys, and a smaller windowMs make successful escapes considerably rarer.
For UI development, start the sky_jobs_base/frontend dev server and open /cuff-escape-test. This preview uses the live minigame component without waiting for the random in-game opportunity.
Importing config.lua into the Job Configurator
When Config.UseJobConfigurator is enabled, editing a resource's local Config.Jobs or another configurator-managed value does not automatically replace the saved database state. Import the local snapshot explicitly:
/jobconfigimport sky_policejob
Replace sky_policejob with the registered configuration key, for example sky_ambulancejob, sky_mechanicjob, sky_firejob, or sky_crimesystem. The command uses the same sky_jobs_base.jobconfig permission as /jobconfig.
The import now applies the complete local snapshot:
- Every local
Config.Jobsentry is inserted or updated. - Registered settings, feature toggles, and interactions are replaced with their local deviations.
- Runtime job and garage registries are rebuilt immediately.
- The effective configuration is broadcast to connected clients and dependent resources.
- A Job Configurator history entry is recorded.
Existing database row IDs are preserved. Jobs created only inside /jobconfig are retained when they are absent from the local file, so importing config.lua cannot silently delete a live configured job. No resource restart is required after a successful import.
Job garage runtime
Config.Jobs[].vehicles defines the current job vehicle catalog. A vehicle already stored in the server-owned job fleet remains parkable even if its model is later removed from that catalog. Parking validates the persisted fleet record instead of treating the current purchase catalog as proof of ownership.
After /jobconfigimport, updated job vehicle catalogs and settings are available in the live garage registry immediately.
Manage salaries
Job-grade salaries are managed in the in-game tablet:
Tablet > Management (Boss Menu) > Roles > select a role > Salary / Payout interval
/jobconfig does not manage salaries. Framework salary values such as ESX job_grades.salary are only relevant when preventing a second framework payroll from paying the same job in parallel.
Relationship to sky_base
- sky_base provides the low-level framework bridge (ESX/QBCore), utilities, and global configuration.
- sky_jobs_base builds on top of sky_base and provides the shared job infrastructure that all job scripts use.
sky_base (framework bridge, utilities)
└── sky_jobs_base (tablet, dispatch, radial, garage, storage, ...)
├── sky_ambulancejob
├── sky_policejob
└── ...
Support
Need help? Our support team is always ready to assist
Join Discord