Version 1.26.0
Highlights
- New Multi-Job system — a configurable in-game menu (
/jobs) lets players hold several jobs and switch between them, including on- and off-duty switching, per-player persistence, admin commands to grant or remove jobs, and full localization. - Job Configurator additions — a settings search, per-location on-/off-duty access control, and expanded tuning controls (per-stage enable plus paint/color presets).
- Lighter, faster in-game interface — the bodycam and tablet camera were rebuilt on native WebGL for a much smaller interface bundle, no-op visual effects were removed, and job-member lists load faster for snappier menus.
Notable Changes
- Multi-Job menu — configurable through the new
Config.MultiJobblock (enabled, the/jobscommand, an optional keybind,defaultJob,maxJobs, and off-duty switching). Each player's job list is stored persistently, and admins can manage it with the new/givejoband/removejobcommands. - Off-duty job pairs —
Config.MultiJob.autoDetectOffDutyJobswithConfig.MultiJob.offDutyPrefixautomatically links framework pairs such asballasandoff_ballas. The menu itself gained dynamic colors (policeColor/medicalColor), active-job indicators, a scrollable list, and a protected default job. - Per-location duty access — Job Configurator locations can now allow or restrict access for off-duty players.
- Tuning controls — tuning values can be enabled or disabled per stage, with color/paint presets, decimal steps for number inputs, and the feature navigation staying visible after a job is saved.
- Tablet improvements — page swipes now work across the whole app grid, the tile layout and tap-to-open were restored, and notifications are routed through their registered app actions.
- Camera & bodycam — the tablet camera and the bodycam recorder now capture directly through WebGL. The bodycam gained a configurable bitrate cap (
recordBitrateKbps) to keep uploads within the storage provider's limits. - Configurable ped images — the ped image source can now be set directly from the in-game interface, and the shop supports per-item image overrides.
- Performance & stability — faster job-member lookups backed by new database indexes for job logs and member queries, removal of no-op
backdrop-filter/will-changestyling for better interface performance, distance-based streaming of placed job props (propStreamDistance/propStreamDespawnBuffer), and colleague minimap blips that respect access control (showOnMinimap). - Reliability — creators clean up correctly when their owning resource stops, creator markers and draw distance are consistent, duty-toggle traffic was reduced, and startup waits for the shared library to be ready to avoid early errors.
Other Changes
- Added a confiscated-items label and a creator-cleanup notification across all supported locales.
- Rebuilt and verified the jobs-base NUI production bundle.
- Update sky_base first.
- Download sky_jobs_base from the CFX Portal.
- Create a backup.
- Replace the
/sourcefolder (this includes the rebuilt in-game interface undersource/html). - Replace the
/config/localesfolder (multi-job menu strings, creator-cleanup notification, confiscated-items label). - Run the updated
import.sqlto add the multi-job storage table. Database indexes are added automatically on startup — no further SQL is required. - Add the new options to
config/config.lua. The easiest way is to take the newconfig/config.luafrom the download and copy your old custom values into it. If you prefer to edit your existing file by hand, follow the steps below.
a) Add the brand-new Config.MultiJob block. This is the multi-job menu (the /jobs window where a player switches between several jobs). It is a completely new section, so you can paste it anywhere in config.lua — a good spot is right after Config.CommandPermissions. Each line is explained in the comments:
+Config.MultiJob = {
+ enabled = true, -- turn the whole multi-job menu on/off
+ command = "jobs", -- chat command that opens the menu (/jobs)
+ giveJobCommand = "givejob", -- admin command name to give a player a job
+ removeJobCommand = "removejob", -- admin command name to take a job away
+ giveJobGroups = { "god", "superadmin", "admin" }, -- who may use /givejob
+ removeJobGroups = { "god", "superadmin", "admin" }, -- who may use /removejob
+ defaultJob = "unemployed", -- job a player falls back to when they have no jobs left
+ defaultGrade = 0, -- the grade/rank of that fallback job
+ fallbackJob = nil, -- leave nil unless you want a different fallback than defaultJob
+ fallbackGrade = nil, -- same, leave nil to use defaultGrade
+ maxJobs = 8, -- how many jobs one player may hold at once
+ includeCurrentJob = true, -- also list the player's current framework job in the menu
+ switchOffDuty = true, -- allow switching while off duty
+ allowUnregisteredFrameworkJobs = true,-- allow jobs that exist in your framework but not in a Sky config
+ autoDetectOffDutyJobs = true, -- automatically pairs jobs like "ballas" with their off-duty "off_ballas"
+ offDutyPrefix = "off_", -- the name prefix used for those off-duty jobs
+ policeColor = "#173B73", -- accent color used for police-type jobs in the menu
+ medicalColor = "#C73535", -- accent color used for medical/EMS jobs in the menu
+ openKey = nil -- optional keybind, e.g. "F6". Leave nil to open with /jobs only
+}
b) Add the two new admin commands to the table you already have. Do not create a second Config.CommandPermissions — open the existing one near the top of config.lua and add these two lines next to jobconfig/setboss. The group names ("god", "superadmin", "admin") decide who is allowed to run each command:
Config.CommandPermissions = {
jobconfig = { "god", "superadmin", "admin" }, -- already there
setboss = { "god", "superadmin", "admin" }, -- already there
+ givejob = { "god", "superadmin", "admin" }, -- /givejob <playerId> <job> [grade]
+ removejob = { "god", "superadmin", "admin" }, -- /removejob <playerId> <job>
}
c) Add the remaining new keys inside the tables that already exist. These belong in sections you already have — pasting them on their own will cause an error. Use Ctrl+F to find each section name, then add the line(s) among that section's settings.
Add inside your existing Config.Cctv table:
Config.Cctv = {
+ recordBitrateKbps = 1500, -- caps the bodycam upload size (lower = smaller file)
-- the rest of your Config.Cctv settings stay as they are
}
Add inside the trunk block of your existing Config.JobGarage table:
Config.JobGarage = {
trunk = {
+ propStreamDistance = 150.0, -- how close (in meters) a placed prop spawns
+ propStreamDespawnBuffer = 25.0, -- extra distance before a spawned prop is removed again
-- the rest of your trunk settings stay as they are
}
}
Add inside your existing Config.ColleagueMapBlips table:
Config.ColleagueMapBlips = {
+ showOnMinimap = false, -- also show on-duty colleagues on the minimap (false = off)
-- the rest of your Config.ColleagueMapBlips settings stay as they are
}
- Replace
/fxmanifest.luaso version1.26.0is loaded. - Restart
sky_jobs_base, then open/jobsto verify the multi-job menu.