Version 1.16.0
Highlights
- New Speed Cams (Blitzer) app. A new police tablet app shows speed-camera locations on the map and warns the driver as they approach one while in a vehicle. It supports an optional weekly subscription and is fully configurable through the new
Config.BlitzerAppblock. - Lighter, faster interface. The speed-cam photo capture was rebuilt on the game's native rendering (dropping a large rendering dependency and switching to on-demand capture), no-op blur styling was removed, and jail props now stream in around the player — all for better in-game performance.
Notable Changes
- Speed Cams app — shows speed-cam locations and in-vehicle proximity warnings, with an optional subscription (
Config.BlitzerApp.subscription, default15000per week) and a configurable license-plate overlay on capture photos (plateImageOverlay). Subscriptions are stored in a new database table that is created automatically on start. - codem-phone support — the police apps now also work on
codem-phone, detected automatically, so players on that phone can use them too. - WebGL speed-cam capture — the speed-cam photo is now captured directly through the game view instead of a constant render loop, removing a large dependency and reducing overhead.
- Distance-streamed jail props — solitary-cell props and persistent jail objects (dumpsters, electric boxes) now only spawn while a player is nearby, via
Config.Jail.cellStreamDistanceandConfig.Jail.objectStreamDistance, so they no longer render across the whole map. - Jail job task blips — jail tasks now show map blips so they are easier to find.
- Billing options — new
Config.Billing.currencyandConfig.Billing.depositToSocietycontrol which account/currency fines use and whether the money is deposited into the society account. - Interaction & billing fixes — a round of fixes to police interactions, billing, jail zones and the speed-cam flow for more reliable behaviour.
- Item image fallbacks — the interface now falls back to an alternate image when an item's image is unavailable, avoiding blank icons.
Other Changes
- Removed the no-op
backdrop-filterstyling from the interface for better in-game performance. - Widened the dropdown menus in the interface for readability.
- Documented an optional per-prop
streamDistanceoverride for props (overrides thesky_jobs_basedefault prop streaming distance). - Removed an obsolete speed-cam capture locale string.
- Update sky_base and sky_jobs_base first — install the matching releases.
- Download sky_policejob from the CFX Portal.
- Create a backup.
- Replace the
/sourcefolder (this also contains the rebuilt in-game interface undersource/html). - Run the updated
import.sqlto add the Speed Cams subscription tablesky_job_blitzer_app_subscriptions. It is also created automatically on start whileConfig.AutoExecuteQueryis enabled. - Replace the
/config/localesfolder (new Speed Cams app strings; an obsolete speed-cam capture string was removed). - Replace
/config/config.lua, or add the new options below (defaults keep the previous behaviour):- New Speed Cams block — add this complete new top-level section:
+Config.BlitzerApp = { + enabled = true, + identifier = "sky_speedcams", + name = "Speed Cams", + description = "Shows locations of speed cams.", + developer = "Sky-Systems", + icon = "nui://sky_policejob/source/html/blitzer-icon.svg", + defaultApp = false, + size = 5120, + route = "/blitzer-app", + plateImageOverlay = { + enabled = false, + x = 0.5, -- Normalized image position from left to right. + y = 0.84, -- Normalized image position from top to bottom. + fontScale = 0.032, + background = "rgba(0, 0, 0, 0.72)", + color = "#ffffff", + border = "rgba(255, 255, 255, 0.45)" + }, + header = { + eyebrow = "Los Santos", + title = "Speed Cams" + }, + theme = { + text = "#f6f7f9", + mutedText = "rgba(246, 247, 249, 0.72)", + subtleText = "rgba(246, 247, 249, 0.62)", + background = "linear-gradient(180deg, #063445 0%, #0a1419 100%)", + spotlight = "rgba(0, 211, 241, 0.28)", + surface = "rgba(8, 19, 25, 0.76)", + surfaceSoft = "rgba(0, 211, 241, 0.08)", + border = "rgba(0, 211, 241, 0.18)", + inactiveBorder = "rgba(0, 211, 241, 0.38)", + overlay = "rgba(0, 0, 0, 0.66)", + modal = "#0b1c23", + primaryFrom = "#00d3f1", + primaryTo = "#0098b7", + danger = "#c12630", + success = "#37d67a", + accent = "#00d3f1", + ghost = "rgba(0, 211, 241, 0.12)", + gradientSoft = "rgba(0, 211, 241, 0.16)", + buttonText = "#ffffff", + ghostText = "#dfe3ea", + pillText = "#d8faff", + shadow = "rgba(0, 0, 0, 0.25)" + }, + subscription = { + enabled = true, + price = 15000, + intervalDays = 7, + account = "bank" + }, + speedcams = { + notifyDistanceMeters = 100.0, + clearDistanceMeters = 130.0, + onlyInVehicle = true, + minimumVehicleSpeedKmh = 20.0, + warningUiSeconds = 6, + requireInFront = true, + inFrontDot = 0.25 + }, + warningUi = { + background = { 8, 19, 25, 224 }, + accent = { 0, 211, 241, 235 }, + icon = { 0, 152, 183, 235 }, + iconText = { 255, 255, 255, 255 }, + title = { 0, 211, 241, 255 }, + text = { 246, 247, 249, 255 }, + subText = { 217, 221, 228, 240 } + }, + sound = { + enabled = true, + name = "CHECKPOINT_MISSED", + soundSet = "HUD_MINI_GAME_SOUNDSET", + range = 5.0, + frontend = true, + coord = true, + layers = 2, + repeatCount = 2, + repeatDelayMs = 90 + } +}- Add these two keys inside your existing
Config.Jailtable:
Config.Jail = { + cellStreamDistance = 100.0, -- only spawn solitary-cell props while a player is nearby + objectStreamDistance = 100.0, -- only spawn persistent jail objects (dumpsters, electric boxes) while a player is nearby -- the rest of your Config.Jail settings stay as they are }- Add these two keys inside your existing
Config.Billingtable:
Config.Billing = { + currency = nil, -- nil = default currency; set e.g. "bank" or a custom currency key + depositToSociety = nil, -- nil = deposit except for time-format currencies; true/false forces the behaviour -- the rest of your Config.Billing settings stay as they are } - Replace the
/fxmanifest.lua(version1.16.0).