Version 1.27.0
Highlights
- Multi-Job admin tooling — a new
/multijobadmincommand lets admins inspect and edit a player's multi-job list (list / add / set / remove), and a newConfig.MultiJob.selfRemoveBlacklistprevents players from removing protected jobs (e.g.police,ambulance) from their own menu. Each stored job now keeps its job and grade labels, so the menu shows consistent names even when framework job definitions change later. - Full per-vehicle job-garage attributes — job vehicles can now define livery, vehicle extras, fuel type, primary / secondary / pearlescent / wheel colours, a minimum grade requirement, and a raw vehicle-properties passthrough. These apply to freshly bought vehicles; once a player repaints and parks a vehicle, its stored customization wins. The in-game Job Configurator gained an editable vehicle-attribute table to manage all of this without editing config files.
- Configurable interaction marker draw distance — interaction points can now set an optional
drawDistanceto extend marker visibility beyond the default range, with safeguards so it never shrinks below the standard interaction buffer.
Notable Changes
- Multi-Job switching is cleaner — switching jobs no longer carries the previous job's grade into the target job, and a player's duty state is preserved across a switch. Removing a member from a job now also clears the matching multi-job entry.
- Per-vehicle trunk control — job vehicles can disable the trunk entirely (
trunkEnabled) or just the placeable trunk props (trunkPropsEnabled), and the ambulance stretcher action can be hidden per vehicle (hasStretcher). Trunk interactions now register reliably for vehicles that load late or are spawned dynamically (e.g. externally registered vehicles), with job-gated access. - Garage vehicle list stays fresh — the list of allowed job vehicles now refreshes when a job is registered or unregistered and every time the garage menu opens, preventing stale entries. A per-vehicle minimum grade is enforced across the catalog, owned list, purchase, and spawn paths.
- Job Configurator improvements — long setting lists are now grouped into logical subsections for easier navigation, props gained an item-name field, the active section stays open after saving an entry, and the interaction table scrolls correctly for long lists instead of overflowing.
- Storage fixes — the transfer popup now opens with an amount of 1 selected (instead of the full stack) while still allowing the maximum, and items that were missing a display name now resolve their label through the active inventory, falling back to the technical name and truncating long labels so cards no longer overflow.
- Database reliability — identifier columns were converted to a fixed-length type so their unique keys and indexes build correctly on InnoDB servers without
innodb_large_prefix(existing tables are migrated automatically). Framework-owned table indexing is now gated by the active framework, so indexes are only attempted on tables that actually belong to your framework. - Radial menu — improved selection in hold mode and preserved the target context so radial actions stay reliable.
Other Changes
- Added Czech (
cz) localization and expanded translation coverage for the wardrobe, configurator, and related features across the bundled languages. - Migrated internal item add/remove calls to the new sky_base inventory signature (slot + metadata).
- Rebuilt and verified the jobs-base NUI production bundle.
- Update sky_base first — install the matching release. This release's inventory calls depend on it; an older sky_base can break storage / locker / trunk item handling.
- 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 (newcz.lua; expanded wardrobe / configurator strings across languages). - Run the updated
import.sql. It adds the new multi-job label columns and converts identifier columns to a fixed-length type; withConfig.AutoExecuteQuery = true(default) the migration runs automatically on start, otherwise import it manually. - Replace
/fxmanifest.luaso version1.27.0is loaded. - 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 new admin command to the Config.CommandPermissions table you already have. Do not create a second table — add the line next to the existing givejob / removejob entries:
Config.CommandPermissions = {
givejob = { "god", "superadmin", "admin" }, -- already there
removejob = { "god", "superadmin", "admin" }, -- already there
+ multijobadmin = { "god", "superadmin", "admin" }, -- /multijobadmin <playerId> [list|add|set|remove] [job] [grade]
dutytest = { "god", "superadmin", "admin" }, -- already there
}
b) Update your existing Config.MultiJob block. The per-command giveJobGroups / removeJobGroups keys are replaced by a single adminCommand, and a new selfRemoveBlacklist is added:
Config.MultiJob = {
command = "jobs",
giveJobCommand = "givejob",
removeJobCommand = "removejob",
- giveJobGroups = { "god", "superadmin", "admin" },
- removeJobGroups = { "god", "superadmin", "admin" },
+ adminCommand = "multijobadmin", -- command name used for /multijobadmin (permissions live in Config.CommandPermissions)
-- ... your other Config.MultiJob settings stay as they are ...
+ -- Jobs listed here cannot be removed by the player from the self-service menu.
+ -- Admin commands and exports can still remove them.
+ selfRemoveBlacklist = {
+ -- "police",
+ -- "ambulance"
+ },
}
c) (Optional) Per-interaction drawDistance. Any entry in Config.Interactions may now set an optional visual marker draw range. Leave it out to keep the previous behaviour:
duty_terminal = {
duty = false,
+ -- drawDistance = 25.0, -- optional: visual marker draw range; lower values keep the default buffer
-- the rest of this interaction's settings stay as they are
}
d) (Optional) Per-vehicle job-garage attributes. Job vehicles are defined in each job's own Config.Jobs[*].vehicles list (e.g. sky_ambulancejob/config/config.lua), not here. Each entry now additionally supports minGrade, livery, extras, fuelType, primaryColor / secondaryColor / pearlescentColor / wheelColor, trunkEnabled, trunkPropsEnabled, hasStretcher (ambulance only), and a raw properties passthrough. All are optional — existing vehicle entries keep working unchanged. The new documentation block above Config.JobGarage in the shipped config.lua lists every field.
9. Restart sky_jobs_base, then verify the multi-job menu (/jobs) and the Job Configurator (/jobconfig).