Browse docs

Introduction

sky_jobs_base is the shared foundation for all Sky-Systems job scripts — providing the tablet system, dispatch, radial menu, garage, storage, and more.

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:

BackendBehavior
autoDetects the best available integration automatically
skyUses the built-in Sky ESX wardrobe editor. Requires esx_skin and skinchanger
qb-clothingOpens the qb-clothing outfit menu
17movementOpens the 17movement Character System outfit menu
qs-appearanceOpens the qs-appearance outfit menu
ak47-clothingOpens the ak47_clothing outfit menu
ak47-qb-clothingOpens the ak47_qb_clothing outfit menu
tgiann-clothingOpens the tgiann-clothing wardrobe menu
nf-skinOpens the nf-skin outfit menu
bl-appearanceOpens the bl_appearance outfit menu
izzy-appearanceOpens the izzy-appearance clothing menu
codem-appearanceOpens the codem-appearance wardrobe menu
hex-clothingOpens the hex_clothing outfit menu
illeniumOpens the illenium-appearance outfit menu
customUses your custom Config.Cloakroom.custom.open(context) hook
disabledDisables 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

FeatureDescription
Tablet SystemIn-game tablet with customizable apps per job
DispatchDispatch system with blips, notifications, and job filtering
Radial MenuConfigurable radial menu with per-action availability
GarageJob vehicle garage with spawn/despawn management
StorageStation storage, vehicle trunks, and trunk props
WardrobeOutfit management per job
ShopJob-specific item shops
Player InteractionsShared cuffs, zipties, leg restraints, escort, vehicle transport, head bags, and player search
CCTVCamera system for monitoring
Heli CamHelicopter camera with night vision and spotlight
BodycamRecording system with gallery upload
Panic ButtonEmergency alert system
ManagementEmployee management panel via tablet
CalendarShared job calendar for scheduling
ChatIn-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 blockPurpose
Config.JobPlayerInteractionsJob-group access, duty requirements, and the enabled interaction permissions
Config.PoliceCuffsHandcuffs, zipties, cutters, hands-up behavior, animations, and escape opportunities
Config.LegRestraintsItem use, cuff requirement, range, and apply animation
Config.HeadBagItem use, restraint requirement, prop, self-removal, range, and apply animation
Config.PoliceEscortEscort and vehicle-interaction distances
Config.PlayerSearchPlayer-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:

SettingPurpose
enabledEnables or disables escape opportunities
chancePercentServer-side chance rolled once when restraints are applied
delayMinSeconds / delayMaxSecondsRandom wait before the minigame may start
cooldownSecondsPer-player cooldown between opportunities
roundsNumber of correct inputs required
windowMsVisible input time per round
minimumInputMsRejects impossibly fast inputs
latencyGraceMsServer-side network tolerance
decoyCountNumber of visual decoy keys
allowZiptiesAlso permits escape attempts from zipties
keyPoolAllowed 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.Jobs entry 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