Version 2.24.0
Highlights
- Scene prop placement. Medics can now deploy EMS scene items — traffic cones, barriers, a medical crate, defibrillator, medical bag, and work lights — directly from usable inventory items. Fully configurable through the new
Config.PropPlacementblock (on-duty requirement, item consumption, and the prop-to-item mapping). - Improved stretcher system. Stretcher deployment is more reliable, supports placing the stretcher as a prop, and a new in-game
/stretchereditorcommand lets admins fine-tune stretcher placement per vehicle model. - Stronger, framework-consistent down-state handling. Player death and downed-state flags are now kept consistent across ESX, QBCore, and QBox, and ESX death/revive integration is more robust — including recognizing revives from external
esx_ambulancejobsetups.
Notable Changes
- Per-vehicle trunk control — a new
Config.Trunkblock can disable the vehicle trunk entirely (enabled) or just the placeable trunk props (propsEnabled) for the whole resource. - Per-vehicle paint & properties — ambulance job vehicles now accept optional paint indices (
primaryColor,secondaryColor,pearlescentColor,wheelColor) and a raw vehicle-propertiespassthrough, applied to freshly bought vehicles (a player's stored customization wins after they repaint and park). Pairs with the matching sky_jobs_base release. - ESX death events —
esx:onPlayerDeathis now fired exactly once when a player goes down (no more duplicate triggers for listeners), and the event payload carries richer context (victim/killer coordinates, killer IDs, distance, and the death cause / weapon) for downstream logging and mechanics. - Official-API death state on ESX — dead-state handling now goes through the framework's own APIs instead of manipulating player data directly, improving compatibility with other ESX scripts.
- External revive sync — revives triggered by external ESX ambulance systems are now recognized, preventing death-timeout inconsistencies.
- Patient target actions — fixed target actions so they apply to the selected patient.
- Billing now matches the police job payment flow — medic invoices are charged through the shared sky_base currency system and deposited into the configured job society account instead of depending on an external billing resource. Health-insurance co-pay handling is preserved.
- Death screen focus — the death screen can now be opened with the spacebar when the Escape key is suppressed (
DeathScreen.blockEscape), improving UX in those setups. - More reliable doctor location — doctor interactions now send the player's client-side coordinates as a fallback, so the location resolves reliably even if the server-side lookup fails.
- Database reliability — identifier columns were converted to a fixed-length type so their unique keys build correctly on InnoDB servers without
innodb_large_prefix(existing tables are migrated automatically).
Other Changes
- Added Czech (
cz) localization and expanded the imaging interface strings across the bundled languages. - Documented example per-vehicle attributes (paint / properties) in the ambulance job config.
- Update sky_base and sky_jobs_base first — install the matching releases.
- Download sky_ambulancejob from the CFX Portal.
- Create a backup.
- Replace the
/sourcefolder (this also contains the rebuilt in-game interface undersource/html). - Replace the
/config/localesfolder (newcz.lua; expanded imaging strings across languages). - Run the updated
import.sql. It converts identifier columns to a fixed-length type; withConfig.AutoExecuteQueryenabled (default) the migration runs automatically on start, otherwise import it manually. - Replace
/fxmanifest.luaso version2.24.0is loaded. - Replace
/config/config.lua, or apply the additive options below (defaults keep the previous behaviour):- Add the society account to the ambulance job entry:
Config.Jobs = { { name = "ambulance", countsAsMedic = true, color = Config.PrimaryColor, + societyAccount = "society_ambulance", offDutyJob = { enabled = false, job = "off_ambulance" },- Add the new billing payment options:
Config.Billing = { enabled = true, - account = "society_ambulance", + account = "society_ambulance", -- Legacy fallback. Prefer per-job Config.Jobs[*].societyAccount. + currency = nil, -- nil = Sky.Currency.GetDefaultCurrency(); set e.g. "bank" or a custom Config.Currency.currencies key. + depositToSociety = nil, -- nil = deposit except time-format currencies; true/false forces the behavior. range = 6.0, refreshSeconds = 1.5, closeOnSuccess = true, customBillingReasons = true, + maxReasonLength = 80, reasonPresets = { "Medical Treatment",- Add the new
/stretchereditorcommand to your existingConfig.CommandPermissionstable (do not create a second table):
Config.CommandPermissions = { hospitalcreator = { "god", "superadmin", "admin" }, -- already there + stretchereditor = { "god", "superadmin", "admin" }, -- /stretchereditor [model] - open the stretcher editor for a vehicle model -- the rest of your Config.CommandPermissions entries stay as they are }- New top-level trunk control block:
+Config.Trunk = { + enabled = true, -- Set false to disable the vehicle trunk feature entirely for this resource. + propsEnabled = true, -- Set false to disable vehicle trunk props while keeping normal trunk storage enabled. +}- New top-level prop placement block (disabled by default — set
enabled = trueto allow placing EMS props from items):
+Config.PropPlacement = { + enabled = false, -- Set true to allow placing configured EMS props from usable inventory items. + vehicleAccess = true, -- Set false when props should only be placed by item instead of through vehicle trunk props. + requireOnDuty = true, + consumeItem = true, + itemNames = { + prop_roadcone02a = "ambulance_traffic_cone", + prop_mp_barrier_02b = "ambulance_barrier", + xm_prop_smug_crate_s_medical = "ambulance_medical_crate", + v_med_oscillator3 = "ambulance_defibrillator", + xm_prop_x17_bag_med_01a = "ambulance_medical_bag", + v_31a_worklight_03b = "ambulance_worklight_stand", + prop_worklight_02a = "ambulance_worklight" + } +}- (Optional) Per-vehicle paint / properties — entries in your
Config.Jobs[*].vehicleslists now accept optionalprimaryColor,secondaryColor,pearlescentColor,wheelColor, and a rawpropertiespassthrough. All are optional; existing vehicle entries keep working unchanged. The shippedconfig.luashows a commented example on the first ambulance vehicle.
- Restart
sky_ambulancejob.