Before updating, make sure sky_base and sky_jobs_base are up to date.
Latest
Version 2.32.0
Update sky_base to 1.33.0 and sky_jobs_base to 1.36.0 before updating sky_ambulancejob.
Highlights
Patient license management - authorized Ambulance staff can view, add, and remove the first-aid license plus explicitly configured additional licenses from patient records, including supported offline patients.
Diagnosis-based full healing - the conscious-patient full-heal action can require a configurable continuous diagnosis time before it becomes available.
Centralized medical carry - Ambulance carry now uses the shared Jobs Base carry runtime, keeping state, acceptance, cleanup, and vehicle rules consistent across installed jobs.
Live configurator updates - affected Ambulance interactions and feature settings refresh when Job Configurator values change without requiring a resource restart.
Notable Changes
Bleeding pauses still block passive blood regeneration while the underlying wound remains active.
Hospital station blips are restored and blip values are normalized for FiveM's Lua runtime.
Duplicate initial job rows are prevented during concurrent starts.
First-aid license checks wait for a loaded player and support the active Base provider's offline identifier flow.
Body bags can be delivered when the drop-off interaction is reached normally, and death-screen position synchronization no longer adds a vertical offset.
Default medical dispatch recipients now use the registered Fire job group, so every configured Fire job can receive the alert.
Ordered item and weapon image sources are used before the built-in UI fallback.
Serbian and missing localized UI text were completed.
Other Changes
Deterministic manifest loading prevents Ambulance scripts from executing twice.
Redundant access polling was removed in favor of current shared state updates.
Changed Files
sky_ambulancejob/config/config.lua
sky_ambulancejob/config/functions.lua
sky_ambulancejob/config/img/*
sky_ambulancejob/config/locales/*
sky_ambulancejob/fxmanifest.lua
sky_ambulancejob/source/* — delete and reinsert
Update InstructionsA guided update for server owners2.31.12.32.0
Guided update
Update sky_ambulancejob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Back up the complete Ambulance resource and any intentional customer configuration. Install cleanly so the explicit manifest order, shared carry integration, UI, locales, and generated defaults remain from the same package.
Phase 2 of 5
Replace files
Replace fxmanifest.lua, source, the complete built UI, config/locales, config/config.lua, and generated defaults. Start from the new config/functions.lua and reapply only intentional customer dispatch integrations. Do not restore the old Ambulance-owned carry runtime over the new shared integration.
Phase 3 of 5
Merge config
Without /jobconfig, apply these exact public changes:
Still false; set deliberately if management must require duty
Config.DiagnoseInteraction.fullHeal.enabled
New: true
Config.DiagnoseInteraction.fullHeal.delaySeconds
New: 420
Config.MedicCarry.allowCarrierInVehicle
New: false
Config.FirstAid.license remains "firstaidcourse" and is always included in patient license management. additionalLicenses must use names understood by the single provider selected in Base. The radial action continues to manage only the first-aid license.
With /jobconfig, the managed paths are saved through firstAidLicenseManagementAdditionalLicenses, firstAidLicenseManagementAddEnabled, firstAidLicenseManagementRemoveEnabled, diagnoseFullHealEnabled, diagnoseFullHealDelaySeconds, and medicCarryAllowCarrierInVehicle. Review and save them after updating Jobs Base; saved Job Configurator values override their generated Lua defaults.
In config/functions.lua, the default medical dispatch recipient list changed from { "ambulance", "firefighter" } to { "ambulance", "fire" }. fire is the Jobs Base group that expands to every configured Fire job. Keep a deliberate custom recipient list only when your dispatch setup requires it.
Phase 4 of 5
SQL & items
No new Ambulance SQL column, item, image, stream asset, or metadata file is required for 2.32.0. Offline license changes require Base 1.33.0 and a provider that supports persistent identifiers.
Phase 5 of 5
Restart & test
Base 1.33.0, Jobs Base 1.36.0, and Ambulance 2.32.0 are running in order.
Patient records show only the configured manageable license types.
Add/remove license works for an online patient and, on a supported provider, an offline patient.
Full heal appears only after the configured continuous diagnosis time.
Blood does not regenerate while bleeding is paused but still active.
Medical dispatch reaches Ambulance and every configured Fire job intended by the fire group.
Version 2.31.1
Update sky_base to 1.32.1 and sky_jobs_base to 1.35.1 before updating sky_ambulancejob.
Highlights
Compatible custom maximum health - servers can stop Ambulance Job from forcing 200 maximum health and preserve limits managed by skill, progression, or other health resources.
Reliable reconnect restoration - medical state waits for the final visible character ped and retries synchronization until player data has been restored.
Improved ESX revive lifecycle - revived ESX players now receive the expected spawn synchronization so dependent framework resources recover correctly.
Notable Changes
Full healing, death handling, and revival use the character's actual maximum health when the new compatibility setting is disabled.
Multi-character reconnects wait for a stable, unfrozen, visible player before restoring injuries or death state.
Duplicate player-load requests are handled safely and no longer repeat medical restoration.
Unavailable radial actions use clearer feedback.
The embedded tablet shell uses simpler, consistent centering.
Other Changes
Added the new maximum-health setting to /jobconfig under General → Health Compatibility.
Update InstructionsA guided update for server owners2.31.02.31.1
Guided update
Update sky_ambulancejob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Stop the server after updating both base resources. Create these backups:
Back up
Safe location
Complete sky_ambulancejob folder
Outside the live resources folder
Customized config/function files
Separate custom-config folder
Install 2.31.1 as a clean replacement instead of copying it over 2.31.0.
Phase 2 of 5
Replace files
Replace the resource cleanly:
Action
Current server path
New package / destination
Delete
resources/[sky]/sky_ambulancejob
Remove only after the backup exists
Copy
—
Copy the complete new sky_ambulancejob folder
Keep from new release
fxmanifest.lua, source, and source/html
Required for maximum-health compatibility, load synchronization, ESX revive, and tablet layout
Keep from new release
config/locales
Contains the current action feedback
Merge only your values
Backed-up config/function files
Reapply intentional customizations inside the matching new files
Phase 3 of 5
Merge config
Add the new top-level setting when /jobconfig is disabled:
Keeps the existing GTA freemode default and enforces 200 maximum health
false
Preserves the player's current maximum health from another health, skill, or progression resource
When /jobconfig is enabled, open the Ambulance job and review General → Health Compatibility → Enforce 200 max health, then save. Do not maintain a separate runtime override elsewhere.
Phase 4 of 5
SQL & items
No SQL migration, inventory definition, medication, or image installation is required for 2.31.1.
The console reports Base 1.32.1, Jobs Base 1.35.1, and Ambulance 2.31.1.
With Config.EnforceMaxHealth = true, death, full heal, and revive use 200 maximum health.
With it set to false, a character with increased maximum health keeps that limit through death, heal, and revive.
ESX revive restores the expected framework spawn state.
Reconnect and multi-character selection restore the final character's injuries and death state only once.
Ambulance radial errors show the clearer unavailable-action message.
Embedded tablet routes remain centered and fill their expected area.
Version 2.31.0
Update sky_base to 1.32.0 and sky_jobs_base to 1.35.0 before updating sky_ambulancejob.
Highlights
Expanded hands-on treatment minigames - bandage wrapping and bullet extraction can generate varied treatment paths, while blood transfusions can now include a complete venous-access procedure before flow control.
Persistent patient health and injuries - conscious health, unresolved injuries, pain, and authoritative death state are preserved more reliably through reconnects, character selection, resource restarts, and disconnects.
Full-health recovery for conscious patients - medics can restore a conscious patient's health from the Diagnose view without clearing unresolved injuries or pain.
Improved death and revive lifecycle - repeated death-screen synchronization, revive completion, blocked-death hooks, godmode changes, and Tgiann inventory state now remain consistent.
Notable Changes
Added Epinephrine, Ibuprofen, Oxycodone, and Morphine to the shipped Ambulance shop.
Added new illustrated treatment steps for tourniquet use, disinfection, catheter placement, securing venous access, and transfusion flow.
Bullet extraction now tells the medic how many pressure bandages are required after removal.
Billing can show the medical job as invoice source context on supported providers.
Billing presets now load through the Ambulance resource and Diagnose billing opens with reliable input focus.
Ambulance carrying avoids conflicts with other carry systems and cleans up reliably when the resource stops.
Patient restore work performs fewer database queries and related diagnostics respect debug mode.
Missing Base or Jobs Base dependencies are reported clearly during startup.
Other Changes
Restored German characters and added the missing treatment text and imagery.
Updated the resource version to 2.31.0.
Update InstructionsA guided update for server owners2.30.02.31.0
Guided update
Update sky_ambulancejob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Update sky_base to 1.32.0 and sky_jobs_base to 1.35.0, then stop the server.
Back up
Safe location
Complete sky_ambulancejob folder
Outside the live resources folder
Database
A restorable SQL dump
Customized config/function files
Separate custom-config folder
Use the new release as the base. Copying it over 2.30.0 can leave obsolete runtime or interface files behind.
Phase 2 of 5
Replace files
Replace the resource and then merge only your intentional customizations:
Action
Current server path
New package / destination
Delete
resources/[sky]/sky_ambulancejob
Remove only after both backups exist
Copy
—
Copy the new sky_ambulancejob folder to resources/[sky]/sky_ambulancejob
Keep from new release
fxmanifest.lua, source, and source/html
Do not restore these from 2.30.0
Keep from new release
config/locales
Contains the current treatment text
Keep from new release
config/inventory/pressure_bandage.png
Copy it to your inventory later if needed
Merge, do not replace
Your old config/functions.lua edits
Reapply custom hooks inside the new file
Tgiann users must keep the new death/revive synchronization in config/functions.lua. The beforeDeath hook now runs only for a newly detected death, not while restoring an already authoritative death after reconnect or character selection.
Phase 3 of 5
Merge config
Open the newconfig/config.lua and transfer your existing server values into it.
If you do not use /jobconfig, add the medications to every Ambulance shop that should sell them and keep the new minigame blocks:
Set venousAccess = false only when you deliberately want the previous flow-control-only transfusion.
If you use /jobconfig, do not duplicate those edits manually. Open the Ambulance job, review the four shop medications, all three Minigame Randomization switches, and Blood Transfusion → Venous Access, then save.
Phase 4 of 5
SQL & items
Choose one database path:
Your setting
Required action
Config.AutoExecuteQuery = true
Do not import SQL manually. The first resource start creates the new patient identifier index.
Config.AutoExecuteQuery = false
Run the new sky_ambulancejob/import.sql once while the server is stopped.
The migration adds idx_ambulance_users_identifier on ambulance_users(identifier); it does not replace or delete patient data.
Ensure epinephrine, ibuprofen, oxycodon, and morphine exist in your active inventory. Copy config/inventory/pressure_bandage.png into your inventory image folder if images are not loaded from the resource.
The console reports sky_ambulancejob version 2.31.0 without SQL or dependency errors.
A new death, blocked death, revive, reconnect, and character switch preserve the correct state.
Conscious-health restore and full heal do not erase unresolved injuries incorrectly.
Bandage wrapping and bullet extraction randomize when enabled.
Venous access runs before transfusion flow control when enabled.
All four medications can be purchased and used through the configured inventory.
Version 2.30.0
Update sky_base to 1.31.0 and sky_jobs_base to 1.34.0 before updating sky_ambulancejob.
Highlights
Reliable stretcher and body-bag transport - patients, body bags, folded stretchers, and loaded vehicles now stay synchronized through attachment, loading, unloading, ownership changes, and network-control transitions.
Authoritative death and revive state - death, godmode, and revive state is managed consistently by the server and shared framework state, reducing stale or conflicting player conditions.
Optional clear game view while unconscious - servers can enable a Space-key mode that hides the death-screen overlay completely while controls are released, while the existing visible-overlay behavior remains the default.
Improved medical workflow feedback - live treatment shows the current injury checklist, refund management is fully localized, and the doctor NPC opens reliably on the first interaction.
Notable Changes
Added the Full Dark tablet theme to Ambulance tablet views.
Hospital Configurator writes no longer deadlock when related creator data is updated.
Ambulance map blips are removed cleanly when the resource stops.
Stretcher failures now report clearly instead of leaving transport in an uncertain state.
Body bags attach to the intended patient and remain aligned during stretcher use.
Removed the Live Fall Injuries system and its retired Job Configurator settings.
Other Changes
Expanded refund-management translations across the bundled locale catalogue.
Updated the resource version to 2.30.0.
Update sky_base to 1.31.0 and sky_jobs_base to 1.34.0.
Download sky_ambulancejob from the CFX Portal and create a resource backup.
Replace the /source folder, including the rebuilt interface under /source/html.
Replace /fxmanifest.lua so version 2.30.0 is loaded.
Replace /config/locales and /config/style.css, then restore customer-specific translations or styling from your backup.
If you do not use /jobconfig, merge these /config/config.lua changes manually:
Add HideOverlayWithoutFocus = false to Config.DeathScreen. Set it to true only when Space should make the death-screen overlay fully transparent while game controls are active.
Remove the complete obsolete Config.LiveFallInjuries block. Live fall injuries and all of its old thresholds, chances, ignore windows, and zone pools are no longer used.
If you use /jobconfig, verify the Death Screen visibility option before saving. The removed Live Fall Injuries settings should no longer appear.
No SQL migration is required.
Restart sky_ambulancejob after both base resources and test patient/body-bag stretcher placement, vehicle loading/unloading, revive state, the doctor NPC, and both death-screen visibility modes.
Version 2.29.0
Update sky_base to 1.30.0 and sky_jobs_base to 1.33.0 before updating sky_ambulancejob.
Highlights
Reliable AI medic dispatch and recovery - remote offers now use separate delay, timeout, cooldown, destination, and medic-availability rules while staying synchronized with the patient's death screen.
More accurate diagnosis and treatment - treated injuries disappear from MRT/CT results, medical minigames validate the full traced path, treatment resets persist correctly, and routine vehicle movement no longer creates false fractures.
Shared stretcher attachment editor - stretcher positions can be adjusted through the new shared gizmo and saved as reusable attachment settings.
Full Unicode injury storage - injury data now preserves international text safely through an updated UTF-8 database schema.
Notable Changes
Added configurable map blips per Ambulance job and hospital station.
Added separate revive destinations for self-requested and remotely dispatched AI medics.
Added a minimum health-loss threshold for live-damage fractures and removed weapon-specific fracture restrictions.
Admin and exported godmode states are respected by injury handling.
Self Diagnose remains available in the radial menu alongside target-aware patient actions.
Wheelchair and crutch props are detached and removed cleanly when their patient state ends.
Ambulance setup now waits for the authoritative cached player identity after a restart.
Expanded interface and Job Configurator translations across the bundled locale catalogue.
Other Changes
Regenerated and optimized frontend artwork while keeping inventory item images in compatible PNG format.
Added integration examples for supported paintball resources.
Simplified item-image fallback handling and standardized first-aid license refreshes.
Updated the resource version to 2.29.0.
Update sky_base to 1.30.0 and sky_jobs_base to 1.33.0.
Download sky_ambulancejob from the CFX Portal and create a database and resource backup.
Replace the /source folder, including the rebuilt interface under /source/html.
Replace /fxmanifest.lua so version 2.29.0 is loaded.
Replace /config/locales, /config/functions.lua, and the bundled /config/inventory images, then restore customer-specific changes from your backup.
If you do not use /jobconfig, merge these /config/config.lua changes manually:
Add the complete blip table to every entry in Config.Jobs that should show a hospital/station blip. The shipped defaults use enabled = true, useStationName = true, sprite 61, color 2, scale 1.0, display 4, and short-range mode.
Under Config.DeathScreen.AiMedic, add remoteDispatchDelaySeconds = 30 and remoteOfferTimeoutSeconds = 30.
Under Config.DeathScreen.AiMedic.reviveInBed, retain enabled as the legacy fallback and add playerRequestMode = "hospital" plus remoteDispatchMode = "location". Supported mode values are "hospital" and "location".
Under Config.LiveDamageFractures, add minDamagePercent = 12.
If you use /jobconfig, open the Ambulance configuration once and verify the same hospital blip, AI medic destination/timer, and fracture-threshold values before saving.
Run the updated /import.sql if automatic query execution is disabled. It converts ambulance_users.injury_data and its table defaults to utf8mb4.
Restart sky_ambulancejob after both base resources and test self/remote AI medic recovery, imaging after treatment, fracture detection, and stretcher attachment placement.
Version 2.28.0
Update sky_base to 1.29.0 and sky_jobs_base to 1.32.0 before updating sky_ambulancejob.
Highlights
Hospitals can be shared between Ambulance jobs - additional medical jobs can reuse hospital interactions while keeping their own storage, garage, wardrobe, and job configuration.
Reliable medical radial actions - Self Diagnose remains available alongside targeted patient actions, and registered medical actions are ready when the radial opens.
Refund complete death inventories at once - authorized staff can now refund every pending item from a death record in one action, with partial progress preserved if a refund stops.
Smoother diagnosis and treatment animations - kneeling, treatment, CPR, and return-to-diagnosis transitions now feel more natural and use improved defaults.
Live fall injuries added - configurable fall detection can apply wounds, fractures, and unconsciousness while filtering common false positives.
Notable Changes
Modernized medical interface selects - medical, tablet, imaging, and patient screens now use consistent searchable controls with keyboard navigation and reliable dropdown positioning.
Runtime job updates now apply immediately - stations, doctors, insurance desks, imaging, X-ray, body-bag delivery, and access checks refresh after Job Configurator changes.
Hospital bed workflow improved - patient assignment to configured beds is more reliable.
Death and respawn handling stabilized - timeouts, weapon cleanup, hospital coordinates, revive preparation, and clothing restoration now behave more consistently.
Patient profile compatibility improved - keyed tag and condition collections are now accepted.
Death logs can include player perspectives - supported Discord death logs can include victim and attacker screenshots.
Other Changes
Added ready-to-use images for eight medical inventory items.
Refund amount storage now supports larger values.
Doctor range descriptions and configurator integer settings were clarified.
Updated the resource version to 2.28.0.
Update sky_base to 1.29.0 and sky_jobs_base to 1.32.0.
Download sky_ambulancejob from the CFX Portal and create a backup.
Replace the /source folder.
Replace /fxmanifest.lua so version 2.28.0 is loaded.
Copy the new files from /config/inventory if you want to use the bundled medical item images.
Merge the updated Config.DiagnoseInteraction animation defaults from /config/config.lua, or keep your custom animations.
Restart sky_ambulancejob after the two base resources.
No SQL migration is required.
Version 2.27.0
Update sky_base and sky_jobs_base first - install the matching releases before updating sky_ambulancejob.
Highlights
Expanded wound-treatment gameplay - EMS now has broader wound-care options with additional treatment supplies and a more detailed treatment flow for open wounds.
Remote AI medic dispatch - on-duty medics and admins can now send the AI medic to incapacitated players remotely, and the death screen communicates medical help status more clearly.
More advanced injury behavior - leg-shot ragdolling and improved injury handling make medical situations feel more reactive and configurable.
Notable Changes
New EMS treatment supplies - pressure bandages, hemostatic gauze, and tourniquets are now supported in the medical flow and can be sold through configured EMS shops.
Improved diagnose and wound accuracy - injury states, wound treatment progress, and related medical UI feedback now behave more consistently.
Separate remote AI medic limit - remote AI medic dispatch can now use its own medic-limit rule instead of sharing the regular self-request limit.
Death Discord logs can now include POV screenshots - when a player dies, the death log can now include a screenshot from the victim at the moment of death and, when another player caused the death, an additional screenshot from the killer's perspective.
Dedicated custom medications file - custom medication definitions now live in their own plaintext config file, making customer-side medication customization cleaner.
Job Configurator reliability improvements - configurator-managed ambulance settings now stay in sync more reliably during runtime and import/reset flows.
Better client responsiveness - locale loading and general medical UI behavior were refined for a smoother experience during active play.
Other Changes
Locale coverage and treatment wording were updated across the bundled languages.
Shared image and preview handling was refined for ambulance-related UI screens.
Update sky_base and sky_jobs_base first - install the matching releases.
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
Replace /fxmanifest.lua so version 2.27.0 is loaded.
Replace /config/init.lua so the updated locale-loading behavior is active.
Add the new /config/custom_medications.lua file. If your current config/config.lua still contains a Config.CustomMedications block, move your custom entries into the new file and remove the old block from config/config.lua.
Review /config/webhooks.lua and make sure Webhooks.player_death points to your Discord webhook. If you want the new POV screenshots in the death log, also make sure the matching sky_jobs_base release has its FiveManage upload API configured in sky_jobs_base/config/webhooks.lua.
Update /config/config.lua, or merge the changes below:
Enable the new feature toggle inside your existing Config.ToggleFeatures block:
If you use bundled custom medications, replace /config/custom_medications.lua with the shipped file. If you maintain your own entries, copy them into the new file and keep _maxTargetDistance there as well.
No SQL migration is required.
Restart sky_ambulancejob, then verify /jobconfig, the death screen, remote AI medic dispatch, diagnose/treatment flow, the new EMS shop items, and the Discord death log screenshot flow.
Version 2.26.0
Update sky_base and sky_jobs_base first - install the matching releases before updating sky_ambulancejob.
Highlights
Medical billing now follows the shared invoice flow more consistently. Ambulance billing is now aligned more closely with the active framework invoice handling, for a more consistent payment experience across supported servers.
Hospital and respawn configurator flows were improved. Hospital-related configurator setup now behaves more reliably again, including the related respawn selection flow.
Live config-driven EMS behavior is more responsive. Stretcher and other configurable ambulance item behaviors now react more cleanly to synced configuration changes without relying on older static behavior.
Notable Changes
Doctor and medical billing consistency - doctor-related charges and ambulance billing now follow the updated shared billing direction more reliably.
Hospital respawn options restored - configurator-managed hospital respawn choices are available again where expected.
Runtime stretcher updates - stretcher-related configuration changes now apply more predictably during active use.
Config-sync item refreshes - configurable ambulance item handlers now refresh more reliably after configuration updates.
Stretcher deployment range - stretcher deployment now stays tied more consistently to the intended trunk interaction range.
Other Changes
Internal helper cleanup reduced duplicated shared logic across the ambulance job.
Shared utility alignment with the latest base releases improves overall consistency in the resource.
Update sky_base and sky_jobs_base first - install the matching releases.
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
Update /config/config.lua, or merge the changes below:
Billing mode and preset amounts - update your existing Config.Billing block so it uses the shared framework invoice direction and structured presets:
Remove the local EMS prop-placement block - shared prop-item handling now comes from the matching sky_jobs_base release. If your config.lua still contains this top-level block, remove it:
Restart sky_ambulancejob, then verify billing, hospital respawn selection, stretcher deployment, and relevant /jobconfig flows.
Version 2.25.0
Before updating, make sure sky_base and sky_jobs_base are up to date - install the matching releases first.
Highlights
Full Job Configurator integration - configure the ambulance job in-game. The ambulance job now uses the shared in-game Job Configurator (/jobconfig) for more ambulance-specific setup, including stretcher behavior, prop item placement, hospital bed creator options, treatment-related settings, and other job tuning that previously required manual config edits.
Multiple hospitals per job are back in /jobconfig. Ambulance jobs can again manage several hospitals through the in-game configurator instead of being limited to a single hospital setup.
Society-aware medical payments. Early respawn, AI medic, and doctor payments now follow the shared billing flow and can deposit revenue into the configured job society account.
Shared prop and clothing systems. EMS prop placement now uses the shared jobs-base prop flow, and outfit restore behavior uses the shared clothing engine for better consistency across Sky job resources.
Notable Changes
Fatal-wound rules are enforced more reliably - early respawn and AI medic availability now respect the configured fatal-wound settings in both the death screen and server-side flow.
Prop item return option - placed EMS props can return their consumed item when removed, controlled by the new Config.PropPlacement.returnItemOnRemove option.
Shop grade requirements - ambulance shop items can now define an optional minGrade so specific items only appear for higher job grades.
Configurator reliability - follow-up saves, selected entries, hospital bed editing, and several generated configuration sections are more stable.
Hospital editing flow - hospital management now sits inside Jobs -> Locations again, so configuring hospitals follows the familiar job/location editor flow.
Respawn hospital selection - the death-screen respawn hospital setting now lists the configured hospitals again, while still keeping Closest hospital as the fallback option.
Per-job hospital management - hospital entries are again handled per configured ambulance job.
More reliable configurator linkage - hospital changes now refresh linked respawn hospital options more reliably inside the configurator flow.
Cleaner hospital labels - the respawn hospital dropdown now prefers readable hospital names and only adds technical identifiers when duplicate names need to be distinguished.
Cleaner UI controls - select dropdowns, popups, and opened select controls now keep their sizing and background styling more consistently.
Stretcher debug output - stretcher debug messages now follow the configured debug behavior instead of adding unnecessary console noise.
Other Changes
Added documentation comments for interaction ped spawn profiles and shop item grade requirements.
Cleaned up ambulance-specific prop placement code by relying on the shared jobs-base behavior.
Rebuilt and verified the ambulance in-game interface bundle.
Removed temporary debug logging used during the hospital configurator and respawn-option fixes.
Update sky_base and sky_jobs_base first - install the matching releases.
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder (this also contains the rebuilt in-game interface under source/html).
Replace /fxmanifest.lua so version 2.25.0 is loaded.
Replace /config/clothing.lua so the shared clothing engine is used.
Replace /config/style.css if you customized the shipped interface styling.
Replace /config/config.lua, or apply the additive options below.
Add the Job Configurator toggle near the top of config.lua (set false to keep using the plain Lua job definitions only):
Config.PrimaryColor = "#dc3747"
+-- Use the shared /jobconfig UI for Config.Jobs and selected Ambulance Job settings.
+-- Set to false to use only the Lua job definitions below.
+Config.UseJobConfigurator = true
Add the society account to the ambulance job entry:
Add the new prop item return option inside your existing Config.PropPlacement block:
Config.PropPlacement = {
enabled = false,
vehicleAccess = true,
requireOnDuty = true,
consumeItem = true,
+ returnItemOnRemove = true, -- Give the consumed item back when the placed prop is removed.
itemNames = {
-- your existing prop item mapping stays as it is
}
}
Optional: ambulance shop items now accept minGrade:
Review the shipped config.lua for newly configurable ambulance sections in /jobconfig, including stretcher, prop item, hospital bed, payment, and treatment-related settings. Existing values keep working, but copying the new config and reapplying your custom values is the safest update path.
If you manually merge config.lua, also compare the shipped Config.Crutch and Config.Wheelchair blocks. Their model values are now plain model names so they can be managed cleanly through the configurator.
No SQL migration is required.
Restart sky_ambulancejob, then verify the death screen, prop placement, /jobconfig, and doctor / AI medic / respawn payments.
Version 2.24.0
Before updating, make sure sky_base and sky_jobs_base are up to date — install the matching releases first.
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.PropPlacement block (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 /stretchereditor command 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_ambulancejob setups.
Notable Changes
Per-vehicle trunk control — a new Config.Trunk block 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-properties passthrough, 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:onPlayerDeath is 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 /source folder (this also contains the rebuilt in-game interface under source/html).
Replace the /config/locales folder (new cz.lua; expanded imaging strings across languages).
Run the updated import.sql. It converts identifier columns to a fixed-length type; with Config.AutoExecuteQuery enabled (default) the migration runs automatically on start, otherwise import it manually.
Replace /fxmanifest.lua so version 2.24.0 is 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:
Add the new /stretchereditor command to your existing Config.CommandPermissions table (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 = true to 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[*].vehicles lists now accept optional primaryColor, secondaryColor, pearlescentColor, wheelColor, and a raw properties passthrough. All are optional; existing vehicle entries keep working unchanged. The shipped config.lua shows a commented example on the first ambulance vehicle.
Restart sky_ambulancejob.
Version 2.23.0
Before updating, make sure sky_base and sky_jobs_base are up to date.
Highlights
New CT & MRI imaging. A new in-tablet imaging view lets medics capture and review CT/MRI scans on a patient's record through its own interactive interface. Configurable through the new Config.Imaging block.
Safer downed and unconscious players. Players who are knocked out or dead are now better protected against damage, targeting, and unintended animations, and a revive can be performed seamlessly while the player sits in a vehicle — keeping them in the vehicle without re-damaging them.
Smoother CPR and lighter interface. CPR can now run as separate compression and ventilation steps, minigame rendering is more responsive, and unused visual effects were removed for better in-game performance.
Notable Changes
CT/MRI imaging system — a dedicated imaging app visualizes scans and ties them to patient records. Scan timing and interaction distances are set in Config.Imaging (scanDurationSeconds, interactionRange, patientRange).
Separate CPR steps — CPR compressions and ventilation are now individual minigames, toggled via Config.Minigames.enabled.cpr_compressions and cpr_ventilation, alongside the existing combined cpr.
Seamless in-vehicle revives — reviving a player inside a vehicle keeps them seated with their tasks intact instead of ejecting them.
Stronger down-state protection — unconscious and deceased players are guarded more reliably against damage, targeting, and stray animations.
Consistent death state on ESX — the job now synchronizes its death state with the framework, so other ESX scripts no longer desync when a player goes down or is revived.
Respects framework death hooks — the death, injury, and death-screen flows now run through the configurable hooks in config/functions.lua, so server-side overrides are honored.
Medical item image fallbacks — items now fall back to an alternate image when their primary image is unavailable, avoiding blank icons.
Cleaner restarts — ambulance/medic NPCs are removed when the resource restarts, preventing duplicate or orphaned peds.
Imaging UI fix — corrected dropdown sizing in the imaging view so the layout no longer clips.
Other Changes
Removed the no-op backdrop-filter styling from the interface and optimized minigame rendering for better in-game performance.
Documented an optional per-prop streamDistance override for ambulance garage props (overrides the sky_jobs_base default prop streaming distance).
Clarified the example return values in the config/functions.lua hook comments.
Update sky_base and sky_jobs_base first — install the matching releases.
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder (this also contains the rebuilt in-game interface under source/html).
Replace the /config/locales folder (new imaging interface strings in English & German; other languages fall back to English).
Replace /config/functions.lua (clarified hook example comments; death/injury/death-screen hooks).
Replace /config/config.lua, or apply the additive options below (defaults keep the previous behaviour):
Add these two toggles inside the enabled block of your existing Config.Minigames table (leave them true to keep CPR working):
Config.Minigames = {
enabled = {
cpr = true,
+ cpr_compressions = true,
+ cpr_ventilation = true,
-- other minigames stay as they are
}
}
(Optional) ambulance garage props now accept a per-prop streamDistance override. Leave it unset to use the sky_jobs_base default; set it per prop only to fine-tune how close the prop spawns.
Replace the /fxmanifest.lua (version 2.23.0).
No SQL migration required.
Version 2.22.1
Highlights
Standalone minigame exports. All interactive minigames (Bandage Wrap, CPR, Bullet Extraction, Saline Infusion, Blood Transfusion, Bag Valve Mask, Ventilation) are now available as client exports for use in other resources. Call exports["sky_ambulancejob"]:StartMinigame("cpr") from any resource to open a minigame and receive a success/fail result. See the Client Exports documentation for the full API.
Notable Changes
New universal export StartMinigame(type, options) — one entry point for all 7 minigame types.
Minigame difficulty is controlled by the existing Config.Minigames block — exports respect the same configuration.
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder (includes the new minigame_exports.lua and rebuilt frontend).
Replace the /fxmanifest.lua (version 2.22.1).
No config or database changes required.
Version 2.22.0
Before updating, make sure sky_base and sky_jobs_base are up to date — this release's paginated patient roster needs the latest sky_base, and automatic medic dispatch clearing needs the latest sky_jobs_base.
Highlights
Performance — the Patients & Reports apps no longer stall the server. Opening the patients tablet app used to load the entire player directory (every character in the database) and resolve names by looping over every online player — the main cause of server hitches on large servers. The roster is now loaded in pages with server-side search and filters, and the reports app resolves only the patients it actually references. Pairs with the latest sky_base.
Reliable outfit restoration on revive. Revives now restore the exact outfit a player was wearing the moment they were injured or went down — captured and re-applied through game natives, without triggering an external skin reload that could overwrite it with an older saved outfit.
Injuries now persist through a medic revive. A new Config.MedicRevivePersistence block keeps unresolved injuries (fractures, wounds) and pain after a medic treatment or checklist revive, while command and admin heals still clear everything. Wounds also no longer quietly auto-heal on their own.
Notable Changes
Down players are pulled out of houses. A player who goes down while inside a house is now moved outside so medics can reach and treat them, on supported housing systems (rtx_housing, vms_housing, RxHousing).
First aid is blocked on knocked-out players. Knockout and death are now tracked separately, so first aid can no longer be applied to a knocked-out player — fixing a case where the short knockout timer was wrongly stretched to several minutes.
Smoother command revive. Reviving a player who is inside a vehicle now preserves their vehicle and current tasks instead of ejecting them, and skips the screen fade for a cleaner transition.
More stable diagnose view. The treat-patient view no longer closes prematurely during animations or while a server request is pending, first-aid animations always play to completion, and a configurable open delay (Config.DiagnoseInteraction.openDelayMs) was added.
Medic dispatches clear themselves. When the death screen closes after a call was sent, the medic's own dispatch is resolved automatically, so the board no longer shows stale calls. Pairs with the latest sky_jobs_base.
Stretchers clean up on restart. Restarting the resource now detaches players and removes stretcher entities, preventing stuck or stale stretchers.
More flexible body-bag dropoff. Body-bag dropoff points are now registered dynamically, simplifying the addition of new job types or interaction points.
Other Changes
Lighter, more responsive interface — search inputs are debounced, charts load on demand, and several views were optimized to cut unnecessary re-rendering.
The default bandage healing item no longer restores HP on its own (heal = 0); it now only controls bleeding unless you raise the value.
Added a patients-app pagination label (patients.pagination.range) in English & German; other languages fall back to English.
Update sky_base and sky_jobs_base first — install the matching releases. The paginated patient roster relies on the latest sky_base, and automatic medic dispatch clearing relies on the latest sky_jobs_base.
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder (this also contains the rebuilt in-game interface under source/html).
Replace the /fxmanifest.lua (version 2.22.0).
Replace the /config/locales folder (new patients-app pagination label).
Replace /config/clothing.lua, /config/functions.lua, and /config/sv_functions.lua (native outfit snapshot on revive; down players pulled out of houses).
Replace /config/config.lua, or apply the additive options below (defaults keep the previous behaviour):
New medic-revive persistence block:
+Config.MedicRevivePersistence = {
+ keepInjuries = true, -- Human medic revives from treatment/checklist keep unresolved injuries like fractures and wounds
+ keepPain = true -- Only applies when keepInjuries = true; command/admin heals and revives still clear everything
+}
New diagnose open delay, inside Config.DiagnoseInteraction:
The default bandage healing item changed to heal = 0 (bleeding-control only). If you want bandages to restore HP again, set a value:
- heal = 25, -- HP to restore
+ heal = 0, -- 0 = does not restore HP; only controls bleeding unless you raise this value
No SQL migration.
Version 2.21.0
Before updating, make sure sky_base and sky_jobs_base are up to date.
Highlights
Configurable injury-effect visuals — a new Config.InjuryEffects block lets server owners scale the pain-screen and bleeding-overlay intensity independently (visual-only — no effect on damage, blood loss, pain values, or treatment logic).
More flexible healing items — healing / treatment items can now optionally allow movement and use while seated in a vehicle during their progressbar, via per-item allowMovement / allowInVehicle.
Notable Changes
Damage classification was refined for more accurate injury reporting, including foreign-object (bullet) handling from gunshot wounds.
Stretcher vehicle compatibility is now determined from the actual vehicle model, preventing stretcher use on unsupported vehicles.
Loaded stretcher collision state is now persisted correctly.
Command-based revive / heal now preserves the player's current outfit instead of restoring an outdated snapshot.
Reviving now passes the revive reason to the server for more robust, context-aware post-revive handling, and the Config.CustomMedications API gains a :stopBleeding helper.
Client UI, patient lists, and server-side runtime state are now properly reset when a player leaves (via sky_base:playerUnloaded), preventing stale data and incorrect interactions.
Death-screen allowed controls and escape-key blocking are now dynamically configurable and refreshable, with more reliable NUI focus handling.
Other Changes
The bleeding overlay renders more efficiently with improved visual fidelity.
Hardened global config / locale initialization so core tables are set up consistently before other config files load.
Update sky_base and sky_jobs_base first.
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /fxmanifest.lua (now loads the new config/init.lua).
Add the new /config/init.lua file.
Important — the global table initialization moved to config/init.lua. If you keep your own config/config.lua instead of replacing it, remove these two lines from the top of the file (they are now set in init.lua):
Before updating, make sure sky_base and sky_jobs_base are up to date.
Highlights
First-Aid License management — medics can now grant and revoke a player's first-aid license directly from the job radial menu and the tablet patients view. A new Config.FirstAid.licenseManagement block controls whether giving and removing are enabled, whether each action shows in the radial, and whether it requires being on duty, with proximity and permission checks applied. Builds on the First Aid system added in 2.17.0.
Notable Changes
Reviving a player no longer fires internal spawn events and adjusts the default clothing restoration, preventing conflicts with external spawn-management / appearance systems.
Tourniquets are now correctly classified as a bleeding-control item.
Restored live fracture feedback.
Stabilized the self-medication bleeding flow.
Other Changes
Smoother dragging in the bandage-wrap minigame.
The paused-bleeding screen overlay now fades out correctly.
The UI now waits for localization to finish loading before rendering, preventing flicker / incomplete text on startup, and per-locale number and date formatting is now accurate.
Added Portuguese (pt) locale, and localized the bleeding, fracture, and first-aid notifications across all languages.
Update sky_base and sky_jobs_base first.
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder (new pt.lua; extended bleeding, fracture, and first-aid strings across languages).
(Optional) In config/config.lua, add the new licenseManagement block to Config.FirstAid to let medics give / remove the first-aid license. Leaving it out keeps the feature disabled:
Config.FirstAid = {
...
requireLicense = true,
+ licenseManagement = {
+ add = {
+ enabled = false, -- Allow ambulance jobs to give the first aid license (server actions, tablet and radial)
+ radial = false, -- Show the give-license action in the job radial when enabled is true
+ requireDuty = false -- Player must be on duty to give the license
+ },
+ remove = {
+ enabled = false, -- Allow ambulance jobs to remove the first aid license (server actions, tablet and radial)
+ radial = false, -- Show the remove-license action in the job radial when enabled is true
+ requireDuty = false -- Player must be on duty to remove the license
+ }
+ },
...
}
No SQL migration required.
Version 2.19.0
Before updating, make sure sky_base and sky_jobs_base are up to date.
Highlights
ox_target / qb-target support for the core ambulance interactions and stretcher flow — the main ambulance job interactions can now be driven through a target backend, and the stretcher (deploy, carry, load/unload patients, loading into and out of vehicles) was reworked for more reliable entity handling and target-based interaction. Falls back to the existing marker / "press E" prompts when no target backend is running.
Configurable currency & formatting for all paid actions — early respawn, AI medic, health insurance, revive / body-bag rewards, and the NPC doctor (heal self/other, revive) now support sky_base's configurable currencies and formatters via new currency, accountType, and currencyFormatter options. Add custom currencies in sky_base/config/currency.lua. Requires the matching sky_base release.
Notable Changes
Self-administered items can now run a per-item progressbar when used from the inventory — set progressbar = true or a Sky.Functions.Progress options table on entries in Config.Medications, Config.HealingItems, and Config.CustomMedications. Items with an enabled minigame keep using the minigame; use from the treatment menu is unaffected.
Config.PrimaryColor now drives dynamic UI theming with advanced visual effects on the death screen, and accepts FiveM-style ARGB hex (FFRRGGBB, e.g. FF4EC019) in addition to standard hex.
Medical dispatch now resolves the housing entrance as the call location (via sky_base) so emergencies reported from inside houses/apartments point to the correct entrance.
Vehicle Impact Protection improved — death-cause classification now also covers unknown damage causes (e.g. seatbelt / eject resources that emit unknown damage hashes).
Player controls are restricted while unconscious/dead — only the controls listed in the new Config.DeathScreen.AllowedControls are allowed, so emote/animation menus can no longer cancel the death animation.
Cross-player custom medication treatment flow improved; inventory item use now targets the user, while treatment-menu use targets the patient.
The patient roster now uses a database-driven lookup for more reliable patient records.
Diagnose / rescue-shears clothing handling was streamlined into a new, native-based config/clothing.lua; the previous Config.Skin clothing-backend selection was removed.
Other Changes
Optimized online medic count retrieval.
Added and updated localization strings across multiple languages (cn, de, en, es, fi, fr, nl, pl, rs, se).
Update sky_base and sky_jobs_base first (required — the new currency formatting and housing-entrance dispatch rely on the matching sky_base release).
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /fxmanifest.lua (loads the new config/clothing.lua and the new stretcher client files).
Add the new /config/clothing.lua file (native-based diagnose/restore clothing; Config.ClothingRestore + Config.DiagnoseClothing now live here).
In config/config.lua:
Remove the old Config.Skin = { Backend = ... } block and the old Config.DiagnoseClothing block (clothing is now native-only and configured in config/clothing.lua).
Config.PrimaryColor now also accepts ARGB hex, e.g. Config.PrimaryColor = "FF4EC019".
Add AllowedControls to Config.DeathScreen to restrict controls while dead:
Add the optional currency keys to the paid blocks (EarlyRespawn, AiMedic, HealthInsurance, ReviveReward, BodyBagDeliveryReward, DoctorNPC.healSelf/healOther/revive):
+ accountType = "bank", -- "money" or "bank"
+ currency = nil, -- optional custom sky_base currency key; overrides accountType when set
+ currencyFormatter = "money", -- formatter from sky_base/config/currency.lua
Add unknown = true to Config.VehicleImpactProtection causes if you want seatbelt/eject damage covered.
In config/sv_functions.lua, the Config.Functions.PayEarlyRespawn hook was removed — configure early-respawn costs through the new currency / currencyFormatter options on Config.DeathScreen.EarlyRespawn instead.
(Optional) config/functions.luasendDispatch now resolves the housing entrance for the dispatch location — see the shipped file if you customized this hook.
No SQL migration required.
Version 2.18.0
Before updating, make sure sky_base and sky_jobs_base are up to date.
Highlights
Custom early-respawn currency — new Config.Functions.PayEarlyRespawn(source, earlyRespawn) server hook lets the early-respawn button charge any custom resource (timebanks, coins, points, etc.) instead of the built-in bank/cash flow. Return nil to fall through to the existing account / fallbackAccount logic, true / false to allow or deny, or { success = false, reason = "..." } to surface a localized error on the death screen. Pairs with the new Config.DeathScreen.EarlyRespawn.paymentLabel, which overrides the button price label so non-currency costs (e.g. "30 minutes", "5 coins") render in place of the formatted $5000.
beforeInjuries hook + richer beforeDeath context — Config.Functions.beforeDeath(context) now receives a context table (reason, attacker, weapon hash, source of damage, player ped/id, fatal flag) so blocking the death flow can be conditional on the actual incident. New Config.Functions.beforeInjuries(context) runs before each injury is generated and can selectively block a single injury (e.g. "no leg fractures inside the gangwar zone") via fields like injuryType, zone, cause, weapon, and a reason of "liveDamage" / "deathProfile" / "vehicleImpactProtection". Both hooks are opt-in — leaving the bundled stubs returning true keeps the existing behaviour.
Notable Changes
Empty stretchers can now be loaded into and unloaded from vehicles — previously a stretcher could only be (un)loaded when it had a patient attached, which made repositioning an unused stretcher between vehicles impossible.
rcore_clothing revive restoration fixed — reviving a player on rcore_clothing servers no longer leaves them with the default character instead of their saved appearance.
rcore_clothing reconnect fix — players who log back in dead now keep their saved character and clothing instead of briefly appearing as the default character.
Stretchers no longer cause physics issues inside a vehicle — the stretcher prop stays stable while loaded inside an ambulance or carried by a medic.
Other Changes
Stretcher prop models are now preloaded on script start, so the first deploy after a server restart no longer streams the model in mid-animation.
Minor cleanup of verbose deathscreen NUI console logging.
Update sky_base and sky_jobs_base first.
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder.
In config/config.lua, append the new paymentLabel key to the existing Config.DeathScreen.EarlyRespawn block:
In config/functions.lua, update the beforeDeath signature to receive a context table and add the new beforeInjuries hook (see the shipped config/functions.lua for the bundled stub with usage examples). The old function() signature still works — context fields are optional.
In config/sv_functions.lua, add the new Config.Functions.PayEarlyRespawn(source, earlyRespawn) stub (see the shipped file for the bundled example covering custom currencies). Leaving the stub to return nil preserves the existing bank/cash charge.
No SQL migration. No further config.lua changes required.
Version 2.17.0
Before updating, make sure sky_base and sky_jobs_base are up to date.
Highlights
First Aid system — new Config.FirstAid block enables a target- or proximity-based first-aid interaction so civilians (optionally license-gated) can perform CPR on downed players to extend their bleedout timer. Includes a configurable kneel animation, cancellable progress with an error notification on cancel, CPR position offsets to align the helper correctly to the patient, and a "press E nearby" fallback prompt when no target backend (ox_target / qb-target) is running. Progress works with both ox_lib and esx_progressbar. A startup guard automatically disables both Config.FirstAid and Config.PublicTreatment with a server warning if they are enabled simultaneously, since the two flows conflict.
Insurance management API — comprehensive set of new server exports for external scripts to query and manage player insurance, insurance providers, and the runtime insurance config. See the Server Exports API page for the full surface.
Death screen theming — new Config.DeathScreenStyle drives the entire death-screen UI (buttons, heart, shadow, background) from a single primary color, so re-skinning the death screen is now a one-line change.
External voice mute on death — new Config.DeathScreen.MuteExternalVoiceOndeath (default false) automatically mutes the configured external voice system while the player is in the death screen. Supported backends: saltychat (default) and yaca, selectable via Config.DeathScreen.Externalvoicesystem. Unknown backends are skipped with a server-side warning.
qs-appearance support — the SkinAdapter now auto-detects and integrates with qs-appearance in addition to the previously supported skin frameworks. Updated auto-detection order includes the new backend.
Notable Changes
Spawnmanager conflict guard — the default FiveM spawnmanager resource is now detected on startup; if it is running, setAutoSpawn(false) is forced and a red console warning is printed prompting admins to stop the resource (it races the revive flow and can teleport players as random peds shortly after death).
Revive flow hardening — added a revive watchdog and explicit cleanup so a failed respawn no longer leaves the player stuck in a "revive in progress" state. The next post-revive death timeout is also suppressed when the previous timeout was stopped manually (via setDeathTimeout / the existing export), preventing immediate re-deaths after a successful revive.
QBCore revive race fix — the Config.Functions.onRevive hook no longer fires the ESX-style spawn event on QBCore servers (only when ESX or a skin system is actually present), preventing a spawn-handler race that could re-kill or teleport the player right after a revive.
Early respawn bank + cash fallback — new Config.EarlyRespawn.account and Config.EarlyRespawn.fallbackAccount let the early-respawn fee charge bank with a cash fallback (or vice versa) instead of a single hardcoded account.
Stretcher reliability pass — stretcher net IDs are now validated on both client and server, custom stretcher models are preloaded client-side before requesting server entity creation, and stretcher model swaps preserve collision state and verify network control before transferring state. The server also reliably notifies the stretcher owner when a patient is no longer attached.
Stretcher patient position customization — new Config.Stretcher.patientAttach lets you customize the patient's lying position on both deployed and folded stretcher models.
Other Changes
Added 8 new locales for the first-aid system and the hospital-bed respawn flow: cn, es, fi, fr, nl, pl, rs, se. The existing en / de strings were also extended (first-aid set + a new Cancelled notification).
Cosmetic: normalized trailing comma in the stretcher folded config example.
Update sky_base and sky_jobs_base first.
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder (8 new language files added, plus extended en.lua / de.lua).
Recommended — stop or remove the default FiveM spawnmanager resource. The job now forces setAutoSpawn(false) and prints a red console warning when spawnmanager is started, since it races the revive flow.
In config/config.lua, add the new Config.FirstAid block (copy the new bundled defaults). The block configures enable, license requirement, target distance, action duration, bleedout extension, kneel and CPR animations and offsets. Leaving it out keeps first-aid disabled.
In config/config.lua, append the new external-voice keys to the existing Config.DeathScreen block:
In config/config.lua, add the new Config.DeathScreenStyle block to drive the death-screen UI colors from one primary color (see the new bundled config for the default values).
In config/config.lua, append the new account keys to the existing Config.EarlyRespawn block:
In config/config.lua, append the new attach block to the existing Config.Stretcher block to customize the patient's lying position on deployed and folded stretchers (see bundled defaults).
No SQL migration. No further config.lua changes required.
Version 2.16.0
Before updating, make sure sky_base and sky_jobs_base are up to date.
Highlights
Skin framework adapter overhaul — the SkinAdapter (used for duty uniforms, the diagnose temp-strip, and respawn outfit restoration) now fully integrates with fivem-appearance, bl_appearance (Byte Labs), qb-clothing, and esx_skin in addition to the existing rcore_clothing, illenium-appearance, and skinchanger support. New Config.Skin.Backend selector (default "auto") lets you pin a specific backend; auto-detection order is fivem-appearance → bl_appearance → rcore_clothing → illenium-appearance → qb-clothing → esx_skin → skinchanger → native. Outfit restoration now reapplies hair, head blend, and overlays correctly on every supported backend, and native component / prop writes are validated before being applied so CPed::SetVariation: Invalid variation console errors no longer appear when medics cut clothes for treatment. On qb-clothing, duty uniform changes no longer overwrite the player's permanent hair appearance.
Custom Medications fully wired into the patient flow — items declared in Config.CustomMedications now show up in the diagnose UI as a distinct category alongside standard medications, the server-side patient treatment handler applies them automatically, and patient profile / injury data is synced and persisted after every application so the new effects survive disconnects and reloads. The StartCustomMedication server export now returns detailed error codes and accepts an explicit target player, and a new IsCustomMedication(itemName) server export is exposed for programmatic checks. NUI item / vehicle image base URLs are now pulled centrally from Config.Nui (with sky_jobs_base as a fallback) and refreshed on resource start and player spawn, so custom CDNs are picked up reliably across the UI.
Notable Changes
Fixed /hospitalbeds denying everyone except the server console. The Config.CommandPermissions key was hospital_beds (with an underscore) but the slash command and the auto-wired ACE entry are hospitalbeds — the permission lookup therefore never matched. The key has been renamed to hospitalbeds so the ACE entry, the command, and the permission table line up 1:1.
Doctor "downed patient" detection now also includes patients in an ambulance-managed unconscious state, not just truly dead players. Doctors apply revive vs. heal correctly based on the patient's full medical status.
Reduced the delay before the death screen closes after the player spawns, so the world becomes interactive sooner after respawn.
Fixed peds occasionally getting stuck in the death animation after a revive — pending tasks are now cleared immediately when a patient is revived.
Hardened the allow_respawn boolean parsing for hospital beds (database adapters that return TINYINT(1) as a Lua boolean were previously misinterpreted, so the "No Respawn" flag could be applied incorrectly).
Item image rendering across the UI (HotBar, item lists, pulse-check inspector, diagnose view) now falls back to the default Sky-Systems CDN if a custom image base URL fails to load, instead of showing a broken icon.
Other Changes
The shipped Config.Jobs example no longer registers a default firefighter job — the second entry is now a generic hospital ambulance-vehicle slot. Existing server config.lua files are unaffected; this only changes the out-of-the-box example.
fxmanifest.lua documents the optional skin frameworks the SkinAdapter can integrate with (comment-only change).
Update sky_base and sky_jobs_base first.
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace fxmanifest.lua (only a comment line was added documenting optional skin frameworks).
Required — in config/config.lua, rename the hospital_beds permission key to hospitalbeds so /hospitalbeds is grantable again:
Config.CommandPermissions = {
...
- -- Hospital Bed Editor
- hospital_beds = { "god", "superadmin", "admin" },
+ -- /hospitalbeds - Open the Hospital Bed Editor
+ hospitalbeds = { "god", "superadmin", "admin" },
...
}
Without this rename, /hospitalbeds keeps denying everyone except the server console after the update.
7. In config/config.lua, add the new Config.Skin block above Config.CommandPermissions:
Leaving the block out (or keeping Backend = 'auto') preserves the previous behaviour — the adapter auto-detects whichever skin resource is running.
8. No SQL migration. No further config.lua changes required.
Version 2.15.0
Requires sky_base 1.14.0 or newer andsky_jobs_base 1.15.0 or newer. The admin permission system has been replaced — sky_base must be updated and the three bootstrap ACEs must be added to your server.cfg (see sky_base 1.14.0 changelog), otherwise /revive, /setboss, /hospitalcreator, and every other admin command will deny everyone except the server console.
Highlights
New admin permission system — /revive, /stopdeathtimeout, /removemobilityaid, /kill, /refunds, /hospitalcreator, and /hospitalbeds are now resolved through FiveM ACE, auto-wired from Config.CommandPermissions at server start. Config.Functions.HasCommandPermission(source, commandName) in config/sv_functions.lua is preserved as a thin wrapper, so the public export signature is unchanged — only the internal lookup switches to IsPlayerAceAllowed. /hospitalcreator is registered through Sky_Jobs.RegisterCreator with the new unified permission parameter. Fixes admin commands silently denying admins on QBox after qbx_core:HasPermission was deprecated in qbx_core v1.8.0.
Skin framework adapter for outfit save / restore — new internal SkinAdapter module routes outfit save and apply operations through whichever skin framework is active on your server (rcore_clothing, illenium-appearance, skinchanger, or native ped variations as fallback). Fixes players respawning as the GTA default story character (Michael) on rcore_clothing servers, and eliminates CPed::SetVariation: Invalid variation errors when medics cut clothes for treatment. Hair color, head blend, and tattoos are now correctly reapplied from the saved profile after respawn.
Stretcher robustness pass — patients now reliably stay attached to the stretcher across the folded-model swap (added in 2.13.0), instead of detaching mid-swap or getting stuck inside the vehicle. The detach/reattach flow uses robust entity handle retrieval to avoid race conditions where the network ID is known but the local entity isn't yet streamed in, preserves entity state (visibility, frozen, collision) across the model swap, and prevents physics glitches during vehicle unloading.
Notable Changes
Fixed transient knockouts (taser, fists, etc.) persisting as a permanent "dead" state when the player disconnected while knocked out. The client now explicitly classifies unconsciousness reasons (knockout, unconscious, death) and the server treats knockout as transient — only real medical unconsciousness and death are persisted.
Medical unconsciousness (low blood volume / BP) now correctly triggers the death screen on the client via a new dedicated event, so the deathscreen state stays in sync with the server-side persistence.
Fixed permanent blackscreen after a revive or reconnect — the revive flow no longer issues a DoScreenFadeOut that gets stuck before its matching fade-in.
Fixed the stretcher deploy radial action disappearing after parking a vehicle out from the garage. The trunk context is now auto-hydrated on demand, so the action remains available regardless of how the vehicle entered the world.
Auto-carry after stretcher detachment is disabled — the medic now stays free-hands after pulling a patient off the stretcher, instead of having the patient force-attached to the medic's arms.
Other Changes
Added Swedish (se) translation.
Removed the debug-only commands /testrank and /testpatientdebug. These were only registered when Sky.IsDebugActive and are not used by production setups.
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder (new se.lua).
Replace config/sv_functions.lua with the shipped version. The body of Config.Functions.HasCommandPermission now routes through the ACE-based Sky.FW.HasCommandPermission.
Required — update sky_base to 1.14.0 or newer andsky_jobs_base to 1.15.0 or newer before starting the resource.
Required — add the three permission bootstrap ACEs to your server.cfg, beforeensure sky_base:
Without these, every admin command will deny everyone except the server console.
8. Review Config.CommandPermissions in config/config.lua and adjust the allowed groups per command if needed — defaults match the previous behaviour:
No SQL migration. No further config.lua changes required.
Version 2.14.0
Before updating, make sure sky_base and sky_jobs_base are up to date.
Highlights
Custom Medications API — new Config.CustomMedications table for declaring inventory items that combine declarative effects (pain, bleeding, heal, effect, stopBleeding, pauseBleedingSeconds, …) with optional client and server callbacks. Three behaviour modes: medication (one-shot consumable), infusion (timed server-driven drip), custom (pure callback hook for things like defibrillators or non-standard revives). Optional medic-only gating and automatic nearest-player targeting. Full reference and recipes: Custom Medications.
Per-model death animation overrides — new Config.Death.Models (per-model overrides, keyed by model name or hash) and Config.Death.Animal (fallback for non-human peds). Stops the human death pose from being applied to animal/non-human peds, which previously made them clip through the map and go invisible.
Bleedout timer resume on reconnect — players who log out dead and reconnect now resume the bleedout timer from where it left off instead of getting a fresh full timer. New Config.DeathScreen.ResumeBleedOutOnReconnect (default true) and Config.DeathScreen.AutoRespawnOnExpiredReconnect (default true) — the latter auto-respawns on reconnect when the timer already expired during disconnect, respecting the existing preventAutoRespawn / preventReviveOnExpiry rules. Alive players also no longer leave behind a stale dead state in the database when they disconnect.
Notable Changes
Fixed players coming back wearing the framework default skin after logging out dead and reconnecting — the clothing they died in is now restored correctly, and async skin reloads from esx_skin / qb-clothing / illenium-appearance can no longer overwrite it.
Fixed players occasionally relogging into roughly 50 % HP when the framework raised their max HP after spawn.
Fixed female peds being stuck at 175 max HP after a skin reload.
Fixed a crash on knockout wakeup, and a follow-up crash when applying blood pressure medication to a conscious patient.
Fixed the carry radial mode and distance settings silently doing nothing.
Fixed the stretcher prop physics-glitching when attached inside a vehicle (covers both the deployed and the new folded model).
Fixed treatment animations getting out of sync when a medic chained rapid retries.
Tightened diagnose targeting — conscious patients that aren't registered as active can no longer be diagnosed unless diagnoseAllowConscious is explicitly set.
Fixed multi-character setups occasionally applying death or injury state to the preview ped shown before final character selection.
Other Changes
Stretcher editor now previews the folded prop in the in-vehicle preview when Config.Stretcher.folded.enabled is on and a folded model is configured, so Config.Stretcher.vehicleAttach can be tuned against the variant the stretcher actually has while loaded.
General code-quality and stability cleanup across the billing, job access, and several server modules. No behaviour change.
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder.
Make sure sky_base and sky_jobs_base are up to date before starting the resource.
In config/config.lua, append the new Config.Death overrides:
Config.Death = {
...
Animation = {
Dictonary = "dead",
Name = "dead_a"
- }
+ },
+
+ -- Per-model overrides. Highest priority — checked before the Animal fallback.
+ -- Key: model name (string) OR model hash (number, e.g. `a_c_chop`).
+ -- Value: { useAnimation = bool, Animation = { Dictonary, Name } }
+ Models = {
+ -- ["a_c_chop"] = { useAnimation = false },
+ -- ["a_c_deer"] = { useAnimation = false },
+ },
+
+ -- Fallback for any non-human ped (IsPedHuman == false) not listed in Models.
+ Animal = {
+ useAnimation = false,
+ -- Animation = { Dictonary = "...", Name = "..." }
+ }
}
In config/config.lua, append the new bleedout-resume keys to the existing Config.DeathScreen block:
Config.DeathScreen = {
...
medicNearbyRadius = 25,
+ -- If true, the bleedout timer resumes from the death timestamp on reconnect
+ -- instead of resetting to BleedOutTimerSeconds.
+ ResumeBleedOutOnReconnect = true,
+ -- If true, the player auto-respawns on reconnect when the bleedout timer
+ -- already expired during disconnect. Only takes effect when
+ -- ResumeBleedOutOnReconnect = true, preventAutoRespawn = false and
+ -- preventReviveOnExpiry = false.
+ AutoRespawnOnExpiredReconnect = true,
...
}
(Optional) Copy the new Config.CustomMedications block from the shipped config/config.lua. The full field reference and recipes live on the Custom Medications docs page. The feature is opt-in — leaving the table empty (or absent) keeps the existing medication / healing-item flows unchanged.
If Config.AutoExecuteQuery = false (in sky_jobs_base), run the SQL migration manually:
ALTER TABLE `ambulance_users` ADD COLUMN `death_started_at` BIGINT NULL DEFAULT NULL;
Version 2.13.0
Before updating, make sure sky_base and sky_jobs_base are up to date.
Highlights
Per-bed respawn blacklist — added an allow_respawn flag to hospital beds so admins can exclude specific beds from the death respawn pool and the AI medic revive-in-bed selection (e.g. restricted hospital areas). Toggle lives in the Hospital Bed Creator UI; the list view shows a "No Respawn" badge for blacklisted beds. Defaults to allowed, so existing beds keep their current behaviour after the auto-migration.
Configurable hospital bed lie-down and get-up animations — new Config.HospitalBeds.bedAnimation and Config.HospitalBeds.getupAnimation. Both nil by default (no behaviour change for existing servers — falls back to the legacy lying-dead pose and snap-up exit). The get-up animation only plays on voluntary exits (interact key); forced exits (damage, bed deleted, walked too far, resource stop) skip it so a stand-up never plays while the player is dead or teleporting. Invalid clips fall back safely with a console warning.
Optional folded stretcher prop while loaded in a vehicle — new Config.Stretcher.folded swaps the deployed stretcher prop to a folded variant while attached inside a vehicle and swaps back when carried or placed. Community add-on with no official support — bring your own folded prop (.ytyp / .ydr stream) and reference its model name. Disabled by default; an empty model keeps the feature off even if enabled = true.
Notable Changes
Fixed knockout wakeup healing the player — bleeding, pain, and wound state are now preserved across knockouts. Real revives still reset to a healthy baseline as before.
Fixed death and injury state being lost or reset after disconnect, server restart, or knockout. injury_data is now only cleared on explicit revives, not on every alive-read on player load.
Adding new Config.Interactions[*].onSpawn callbacks no longer requires manual hook registration — works through the config entry alone (uses the new sky_jobs_base:creator:pedSpawned event from sky_jobs_base 1.13.0).
Other Changes
No additional changes.
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
Make sure sky_base is at version 1.12.0+ and sky_jobs_base at 1.13.0+ before starting the resource.
In config/config.lua, append bedAnimation and getupAnimation to the existing Config.HospitalBeds block:
Config.HospitalBeds = {
...
models = {
"v_med_bed2",
"v_med_bed1",
"v_med_emptybed"
- }
+ },
+
+ -- Animation that loops while the player lies on the bed.
+ -- Set to nil to fall back to Config.Death.Animation (legacy "lying dead" pose).
+ bedAnimation = nil,
+
+ -- Animation that plays once when the player voluntarily leaves the bed.
+ -- Set to nil to skip the transition (snap-up via ClearPedTasks).
+ getupAnimation = nil
}
Example values once you have a verified clip:
bedAnimation = { dict = "anim@gangops@morgue@table@", name = "body_search" }
getupAnimation = { dict = "random@crash_rescue@help_victim_up", name = "helping_victim_to_feet" }
(Optional) In config/config.lua, append the folded block to Config.Stretcher:
Config.Stretcher = {
...
vehicleModels = {
"ambulance",
"polmav"
- }
+ },
+
+ -- Optional: folded stretcher variant. Community add-on, no support.
+ -- Bring your own folded prop and reference its model name here.
+ -- Leave model empty to keep the feature off even when enabled = true.
+ folded = {
+ enabled = false,
+ model = ""
+ }
}
If Config.AutoExecuteQuery = false (in sky_jobs_base), run the SQL migration manually:
ALTER TABLE `sky_hospital_beds` ADD COLUMN `allow_respawn` TINYINT(1) NOT NULL DEFAULT 1;
Version 2.12.0
Highlights
New Config.DeathScreen.AiMedic.allowFatalWounds and Config.DeathScreen.EarlyRespawn.allowFatalWounds (default false) — when enabled, AI medic and the early-respawn button can bypass otherwise unreviveable injuries (head-shots, explosions). Live-medic, body-bag, and stretcher flows stay strict.
New Config.SelfDiagnose.keybind (default "F6") — players can now open the self-diagnose UI via a rebindable FiveM keybind in addition to the existing /selfdiagnose chat command.
Hospital ox_target marker labels (doctor NPC, body bag drop-off, X-ray station, insurance terminal) and the diagnose / billing player targets now work under both ox_target and qb-target — follows the new Config.target selector introduced in sky_base 1.11.0.
Notable Changes
Breaking:Config.PublicTreatment.key (numeric, default 38) replaced by Config.PublicTreatment.keybind (string, default "E") — each player can now rebind the public-treatment interaction via FiveM Settings → Keybindings. Servers that customized the old numeric key must migrate.
Fixed /revive zeroing the player's body armour — armour is now snapshot before the resurrect and restored afterwards.
Fixed hospital interaction markers showing humanized fallbacks ("Npc Doctor", "Insurance Terminal") instead of the localized labels added in 2.11.1.
Fixed Config.Interactions[*].onSpawn callbacks not firing for hospital creator NPCs (requires sky_jobs_base 1.12.0+).
Added missing insurance.renewButton translation in all 9 locales for the active-provider card.
Added missing conditions / reports save button translations outside English.
Filled in missing Finnish translations: revive-blocked notifications, deathscreen medic-nearby prompt, and self-diagnose billing label.
Other Changes
No additional changes.
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
Requires sky_base 1.11.0+ (for the Config.target selector) and sky_jobs_base 1.12.0+ (for the interaction onSpawn hook registry). Make sure both are updated first.
In config/config.lua, update Config.DeathScreen.EarlyRespawn and Config.DeathScreen.AiMedic:
EarlyRespawn = {
enabled = true,
price = 5000,
secondsTillAvailable = 5,
requireNoMedics = true,
+ allowFatalWounds = false, -- If true, the early-respawn button stays available even with fatal/unreviveable injuries (head-shots, explosions, etc.)
},
AiMedic = {
...
reviveInBed = {
enabled = true,
searchRadius = 250.0
- }
+ },
+ allowFatalWounds = false, -- If true, the AI medic can revive players with fatal/unreviveable injuries (head-shots, explosions, etc.)
},
In config/config.lua, update Config.SelfDiagnose:
Config.SelfDiagnose = {
enabled = true,
requireMedicJob = true,
command = "selfdiagnose",
+ keybind = "F6", -- Default key (rebindable via FiveM Settings → Keybindings → FiveM). Set to nil to disable.
openDelayMs = 1500,
skipFreezeOnSelf = true,
}
Breaking — In config/config.lua, replace the removed Config.PublicTreatment.key:
Config.PublicTreatment = {
enabled = true,
- key = 38, -- Interaction key used for public treatment prompts
+ keybind = "E", -- Interaction key (rebindable via FiveM Settings → Keybindings → FiveM)
promptDistance = 3.0,
...
}
Version 2.11.1
Highlights
Healing items (bandage, firstaid, medkit) can now stop or pause bleeding on all open wounds via new optional stopBleeding and pauseBleedingSeconds fields on Config.HealingItems. Only applied when Config.ToggleFeatures.bleeding = true — otherwise the items keep working as pure HP heals.
Config.PrimaryColor is now honored by the in-game UI. Previously the hardcoded color was used regardless of the config value. The death timeout banner also follows the configured color now.
Hospital interaction labels (doctor NPC, body bag drop-off, X-ray station, insurance terminal, hospital position marker) are now localized via a new InteractionLabels entry in all 9 locales (CN, DE, EN, ES, FI, FR, NL, PL, RS).
Interaction NPCs now support optional scenario and onSpawn fields in Config.Interactions — NPCs can play a GTA scenario on spawn and run custom setup code (outfits, props, extra tasks).
Notable Changes
Fixed death respawn destination drifting away from the actual death location — respawn now resolves against where the player actually died, not the drifted corpse coords.
Fixed player model occasionally reverting to "Michael" after respawn when external skin handlers (esx_skin, qb-clothing, spawnmanager) lost the skin-record race.
Fixed invisible player (alpha 0) after bodybag revive in some cases.
Fixed crutch / wheelchair assignment getting stuck when a medic assigned an aid to an already-loaded player — the server recorded the assignment but the client never actually equipped it.
Hospital bed preview ped in the bed creator is now configurable via Config.HospitalBeds.creatorPedModel.
Rejected obviously invalid respawn coords (nil / zero) and added 1s debounce on concurrent revive triggers.
Other Changes
Hospital lookup now waits for station loading to finish, so players who die very early after join no longer fall back to fallback coords.
General server-side performance improvements.
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
In config/config.lua, add creatorPedModel to the existing Config.HospitalBeds block:
Config.HospitalBeds = {
breakDistance = 2.5,
heightOffset = 0.05,
headingOffset = 180.0,
+ creatorPedModel = "s_m_m_paramedic_01", -- Ped model shown as preview in the bed creator editor
models = { ... }
}
In config/config.lua, update the existing Config.HealingItems entries:
stopBleeding = true — permanently stops bleeding on all open wounds (marks them bandaged)
pauseBleedingSeconds = N — pauses bleeding on all open wounds for N seconds; bleeding resumes after expiry
If both are set, stopBleeding wins. When Config.ToggleFeatures.bleeding = false, both fields are ignored.
(Optional) Each entry in Config.Interactions now accepts scenario and onSpawn:
-- scenario = "CODE_HUMAN_MEDIC_KNEEL" -- GTA scenario to play on spawn
-- onSpawn = function(ped) -- runs once after ped is created
-- SetPedArmour(ped, 100)
-- end
Version 2.11.0
Highlights
Body armor now absorbs bleeding and pain — hits that drop GetPedArmour skip injury effects, so vests actually protect against gunshot bleeds. Headshots and leg shots bypass armor naturally and still bleed.
Knockout respawns now run through a distinct code path — players keep their items, the client-side revive flow runs correctly, and the server-side death snapshot is cleared.
Notable Changes
Fixed intermittent attempt to call a nil value (field 'getDeathInjuryFromHash') at resource start by hoisting the injury helpers into the Sky.Ambulance namespace and deferring gameEventTriggered registration until the resource is fully loaded.
Fixed deathscreen router guard blocking navigation to the hospital spawn route; hospital spawn state now initializes exactly once and prevents the hospital selector from opening multiple times.
Fixed dangling carry sessions on knockout wakeup — ResetCarryState now also runs on the knockout branch of deathscreen:respawned, so carried players wake up detached with no stuck carry animation.
Added Config.InjuryThresholds.respectArmor toggle controlling the new armor-absorption behaviour.
Other Changes
Deathscreen keyboard toggle hint is now only shown when Config.EnableKeyboard is enabled.
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder.
In config/config.lua, update the existing Config.InjuryThresholds block:
Config.InjuryThresholds = {
- bleedingPainMinPercent = 5
+ bleedingPainMinPercent = 5,
+ -- If true, hits absorbed by body armor (GetPedArmour dropped) skip bleeding/pain.
+ -- Headshots, leg shots etc. bypass armor naturally and still bleed.
+ respectArmor = true
}
Version 2.10.0
Highlights
Injury data now persists across reconnects — original death cause, attacker info, weapon, bone zones, and fractures are fully restored from database instead of re-randomized.
Wheelchair timer now persists across reconnects (matching existing crutch pattern) with full cleanup on resource stop.
Death screen is now fully ESC-proof with multiple layers of protection (NUI capture-phase blocking, router guard, focus re-enforcement every frame, and SetFadeOutAfterDeath disabled).
Pain screen effects now use server-side pain level threshold instead of HP loss, fixing unreliable detection with high max health.
Notable Changes
AI medic now falls back to hospital spawn when no bed is available, and force-revives on entity-missing scenarios.
Duplicate revive triggers (knockout timer, deadline loop, AI medic force-revive) no longer fire simultaneously — reviveInProgress guard blocks concurrent calls.
Knockout respawn paths now route through triggerDeathscreenRespawn for correct hospital coords resolution.
Falling-death detection now uses ground proximity checks instead of IsPedFalling, and forces ragdoll physics for airborne deaths.
Player loading now waits for framework-specific spawn (ESX/QB/QBox) before restoring state or equipping mobility aids.
Database migrations must complete before player state is restored during connections and resource restarts.
Added 500ms debounce to status:refresh event in damage handler to prevent event pool overflow during rapid damage.
Radial menu actions now blocked when player is dead.
Self-medication usage now blocked inside vehicles.
Added configurable Config.PainEffects.minPainLevel threshold for pain screen effects.
Other Changes
Fixed LocalPlayer.state.isLoggedIn used in server-side code causing nil errors on QB/QBox.
Fixed wheelchair nil vehicle check.
Fixed pain class notification firing below minimum pain threshold.
Removed redundant manual entity freezing during death sequence.
Removed blood_pressure from suicide injury definition.
Added ForceCleanupWheelchair export for vehicle pull ejection scenarios.
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
Add in config/config.lua:
Config.PainEffects = {
-- Minimum pain level before screen effects are shown (scale 0-10).
-- Pain level comes from injuries + damage hits (1 hit = +2 pain).
-- Set to 0 to always show effects when any pain exists.
minPainLevel = 4,
}
If Config.AutoExecuteQuery = false (in sky_jobs_base), run the SQL migration manually:
ALTER TABLE `ambulance_users` ADD COLUMN `injury_data` LONGTEXT NULL;
ALTER TABLE `ambulance_users` ADD COLUMN `wheelchair_expires_at` BIGINT NULL;
Version 2.9.0
Highlights
Added auto database migration (Config.AutoExecuteQuery) — missing tables and columns are created automatically on resource start.
Added configurable force-revive when AI medic can't reach a downed player (stuck, drive timeout, or mission timeout).
Crutch timer and death timeout now persist across reconnects via database storage.
Death screen UI now uses a handshake between Vue app and client to ensure NUI is fully mounted before sending payloads.
Resource initialization now waits for database migrations to complete before broadcasting beds, registering jobs, and loading stretcher overrides.
Migration logic now uses centralized Sky.DB.Migrate() from sky_base.
VIP vehicle protection now limited to automobiles only — helicopters, planes, and bikes no longer block fatal damage.
Players ejected from non-automobiles or destroyed vehicles now fall to the ground before death animation plays instead of floating.
Refund identifier resolution now handles varied formats and prefixes (e.g. charX:).
Added dedicated "suicide" death cause for forced kills.
Refund list callback now uses batched item lookups to eliminate N+1 query pattern.
removeItems config now supports boolean toggles in addition to table definitions.
Revive exports now accept both string reason and structured context table payloads.
Other Changes
Fixed flexbox constraints and overflow issues across management views for consistent scrolling.
Removed blood_pressure condition from drowning and thirst death injuries.
Reordered resource dependencies in fxmanifest to load sky_jobs_base before sky_base.
Added safety-net re-broadcast of death state to handle edge cases where the initial frame is missed.
Added debug logging throughout death snapshot and item stripping flow.
Download sky_ambulancejob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
If Config.AutoExecuteQuery = false (in sky_jobs_base), run the SQL migration manually:
ALTER TABLE `ambulance_users` ADD COLUMN `crutch_expires_at` BIGINT NULL;
ALTER TABLE `ambulance_users` ADD COLUMN `timeout_ends_at` BIGINT NULL;
Add fuelType to your vehicle catalog entries in config/config.lua if needed:
-- Example for ambulance vehicle catalog:
{
model = "ambulance",
-- ...existing fields...
fuelType = "petrol", -- optional, used by sky_base fuel bridge
}
Add force-revive config to Config.AiMedic in config/config.lua:
Config.AiMedic = {
-- ...existing options...
forceRevive = {
enabled = true, -- true = force-revive player when AI medic can't reach; false = old behavior (medic fails, player stays dead)
missionTimeoutSeconds = 120, -- Max total time from dispatch until force-revive triggers (global safety net)
driveTimeoutSeconds = 90, -- Max driving time before force-revive triggers (prevents infinite driving)
},
}
Version 2.8.0
Highlights
New NUI bleeding screen overlay with procedurally generated veins, pulsing, and intensity driven by bleed level and blood volume.
Self-diagnose feature: medics can open diagnose UI on themselves via /selfdiagnose or radial menu.
AI medic override hook (Config.Functions.onAiMedicRequest) for external dispatch interception/blocking.
Death injury profiles reworked with granular bleeding, pain, and vitals per cause.
Notable Changes
Configurable vehicle damage modifier for occupants (Config.VehicleDamageModifier).
AI medic now adds configurable extra seconds to bleedout timer when requested.
AI medic wait timer: button becomes available only after configurable delay.
AI medic button now shows clear status messages when disabled.
Revive exports now accept both string reason and structured context table payloads.
New client exports: setAiMedicState, getAiMedicState, isAiMedicActive.
New exports for death-timeout management (stop, override, query remaining duration).
New bleeding blacklist for specific weapons (stungun, raypistol).
Added Config.LiveWoundBleedingClass to set initial bleeding intensity per damage cause.
Fractures for conscious players via Config.LiveDamageFractures with per-zone chances.
New stretcher treatment animation config for treating on-stretcher patients.
Stretcher workflow refined with automated carry-to-stretcher transitions and cleanup.
Localized fatal death state title/subtitle across all 9 languages.
Other Changes
3-second grace period after revival to prevent death screen retrigger from sync delay.
Blade weapon classification list separated from blunt trauma.
Fire damage no longer misclassified as gunshot.
Knockout no longer triggers if lethal weapon damage occurred within 15s before fist KO.
Dead players no longer take damage or ragdoll while dead.
Death protections now reset correctly on revive to avoid redeath loops.
/kill now triggers proper death state instead of knockout, with admin permission support.
Existing injuries are preserved when patient profile is re-registered.
Diagnose UI now closes for all observing medics when patient is revived.
Diagnose camera now uses correct overhead view for stretcher patients.
Fixed paid respawn taking money but not reviving.
Fixed AI medic nil crash when clicking respawn with AI medic disabled.
Fixed hospital respawn teleporting to death position instead of hospital.
Fixed respawn failure after payment caused by AI medic cancel crash.
Fixed duplicate hospital blips when sky_jobs_base is running.
Hospital blip now uses sprite 61 instead of 280.
Dead-on-reconnect now waits for framework spawn before applying death state.
NUI bleeding overlay now sends messages only when state actually changes.
Added locale strings for self-diagnose and blade weapon classification.
-- How much damage the player takes while inside a vehicle (1.0 = full, 0.5 = half, 0.0 = none).
Config.VehicleDamageModifier = 0.5
Add in config/config.lua:
-- ============================================================================
-- MELEE WEAPON CLASSIFICATION
-- ============================================================================
-- Melee weapons are split into two damage causes:
-- "knife" = blade/cutting weapons -> high open_wound chance, bleeding
-- "blunt" = blunt trauma weapons -> high fracture chance, less bleeding
--
-- Add weapon names (e.g. "weapon_knife") or raw hashes (numbers).
-- Any melee weapon NOT listed here defaults to "blunt".
-- ============================================================================
Config.BladeWeapons = {
"weapon_knife",
"weapon_dagger",
"weapon_switchblade",
"weapon_machete",
"weapon_bottle",
"weapon_hatchet",
"weapon_stone_hatchet",
"weapon_battleaxe",
}
-- ============================================================================
-- BLEEDING BLACKLIST
-- Weapons listed here will NEVER cause bleeding or open wounds on hit.
-- Uses weapon names (case-insensitive) or raw hashes (numbers).
-- ============================================================================
Config.BleedingBlacklist = {
"weapon_stungun",
"weapon_raypistol",
"weapon_stungun_mp",
}
Config.SelfDiagnose = {
enabled = true, -- Allow players to open the full diagnose UI on themselves
requireMedicJob = true, -- Only medic-job players can self-diagnose (set false for everyone)
command = "selfdiagnose", -- Chat command to open self-diagnose (set to nil to disable)
openDelayMs = 1500, -- Short delay before the UI opens (ms)
skipFreezeOnSelf = true, -- Do not freeze the player when self-treating
}
-- Initial bleeding class per damage cause when a new open wound is created.
-- Higher class = faster bleeding. Classes correspond to Config.BleedingClasses (1-4).
-- Causes not listed here default to 2.
Config.LiveWoundBleedingClass = {
gunshot = 3, -- Flowing (0.6/s per wound)
knife = 3, -- Flowing
blunt = 1, -- Seeping (blunt trauma bleeds less)
fire = 2, -- Oozing
fall = 1, -- Seeping
}
Config.LiveDamageFractures = {
enabled = true,
-- Base chance that a fracture roll happens when a conscious player takes damage.
-- Set to 0 to disable fracture generation from normal damage entirely.
chance = 0.10,
-- Per-zone chances (same format as VehicleImpactProtection.injuries zones).
zones = {
{ zone = "left_lower_leg", chance = 0.3 },
{ zone = "right_lower_leg", chance = 0.3 },
{ zone = "left_lower_arm", chance = 0.25 },
{ zone = "right_lower_arm", chance = 0.25 },
{ zone = "left_upper_leg", chance = 0.15 },
{ zone = "right_upper_leg", chance = 0.15 },
{ zone = "upper_body", chance = 0.10 },
}
}
Replace full part in config/config.lua:
-- ============================================================================
-- DEATH INJURIES
-- ============================================================================
-- Injury profiles applied when a player dies from a specific cause.
-- Each cause maps to a list of injury entries with:
-- type = injury type: "open_wound", "fracture", "unreviveable",
-- "oxygen_level", "blood_pressure"
-- chance = probability (0.0 - 1.0) that this injury is applied
-- state = for vitals (oxygen_level, blood_pressure): "too_low", "too_high", "normal"
-- zones = optional zone-specific chances (overrides base chance per body part)
-- foreignObject = optional: "bullet" (requires extraction during treatment)
--
-- Available zones:
-- head, spine, upper_body, lower_body,
-- left_upper_arm, right_upper_arm, left_lower_arm, right_lower_arm,
-- left_upper_leg, right_upper_leg, left_lower_leg, right_lower_leg,
-- hands, feet
--
-- Available causes:
-- explosion, drowning, rammed_by_car, run_over_by_car, fall, animal,
-- gas, fire, knife, blunt, gunshot, hunger, thirst
-- ============================================================================
Config.DeathInjuries = {
-- TRAUMA
["explosion"] = {
{ type = "unreviveable", chance = 0.25 },
{
type = "open_wound",
chance = 1.0,
bleeding = 3,
pain = 4,
zones = {
{ zone = "upper_body", chance = 0.7 },
{ zone = "lower_body", chance = 0.4 },
{ zone = "left_upper_arm", chance = 0.3 },
{ zone = "right_upper_arm", chance = 0.3 }
}
},
{
type = "fracture",
chance = 0.55,
zones = {
{ zone = "left_upper_arm", chance = 0.4 },
{ zone = "right_upper_arm", chance = 0.4 },
{ zone = "left_lower_leg", chance = 0.5 },
{ zone = "right_lower_leg", chance = 0.5 }
}
},
{ type = "oxygen_level", state = "too_low" },
{ type = "blood_pressure", state = "too_low" },
{ type = "heart_rate", state = "too_high" }
},
["drowning"] = {
{ type = "oxygen_level", state = "too_low" },
{ type = "heart_rate", state = "too_low" },
{ type = "blood_pressure", state = "too_low" }
},
["rammed_by_car"] = {
{
type = "open_wound",
chance = 0.8,
bleeding = 2,
pain = 3,
zones = {
{ zone = "lower_body", chance = 0.7 },
{ zone = "left_lower_leg", chance = 0.6 },
{ zone = "right_lower_leg", chance = 0.6 },
{ zone = "left_upper_leg", chance = 0.3 },
{ zone = "right_upper_leg", chance = 0.3 }
}
},
{
type = "fracture",
chance = 0.85,
zones = {
{ zone = "left_lower_leg", chance = 0.8 },
{ zone = "right_lower_leg", chance = 0.8 },
{ zone = "left_upper_leg", chance = 0.4 },
{ zone = "right_upper_leg", chance = 0.4 },
{ zone = "left_lower_arm", chance = 0.3 },
{ zone = "right_lower_arm", chance = 0.3 }
}
},
{ type = "blood_pressure", state = "too_low" }
},
["run_over_by_car"] = {
{
type = "open_wound",
chance = 1.0,
bleeding = 3,
pain = 4,
zones = {
{ zone = "lower_body", chance = 0.8 },
{ zone = "left_lower_leg", chance = 0.8 },
{ zone = "right_lower_leg", chance = 0.8 },
{ zone = "left_upper_leg", chance = 0.4 },
{ zone = "right_upper_leg", chance = 0.4 }
}
},
{
type = "fracture",
chance = 0.8,
zones = {
{ zone = "left_lower_leg", chance = 0.85 },
{ zone = "right_lower_leg", chance = 0.85 },
{ zone = "left_upper_leg", chance = 0.45 },
{ zone = "right_upper_leg", chance = 0.45 },
{ zone = "lower_body", chance = 0.35 }
}
},
{ type = "blood_pressure", state = "too_low" },
{ type = "heart_rate", state = "too_high" }
},
["fall"] = {
{
type = "open_wound",
chance = 0.7,
bleeding = 1,
pain = 3,
zones = {
{ zone = "left_lower_leg", chance = 0.7 },
{ zone = "right_lower_leg", chance = 0.7 },
{ zone = "left_lower_arm", chance = 0.3 },
{ zone = "right_lower_arm", chance = 0.3 }
}
},
{
type = "fracture",
chance = 1.0,
zones = {
{ zone = "left_lower_leg", chance = 1.0 },
{ zone = "right_lower_leg", chance = 0.6 },
{ zone = "left_upper_leg", chance = 0.3 },
{ zone = "right_upper_leg", chance = 0.3 },
{ zone = "left_lower_arm", chance = 0.2 },
{ zone = "right_lower_arm", chance = 0.2 }
}
},
{ type = "blood_pressure", state = "too_low" }
},
-- ENVIRONMENTAL
["animal"] = {
{
type = "open_wound",
chance = 1.0,
bleeding = 3,
pain = 3,
},
{ type = "blood_pressure", state = "too_low" }
},
["gas"] = {
{ type = "oxygen_level", state = "too_low" },
{ type = "heart_rate", state = "low" }
},
["fire"] = {
{
type = "open_wound",
chance = 1.0,
bleeding = 2,
pain = 4,
zones = {
{ zone = "upper_body", chance = 1.0 },
{ zone = "lower_body", chance = 0.8 },
{ zone = "left_upper_arm", chance = 0.7 },
{ zone = "right_upper_arm", chance = 0.7 },
{ zone = "left_lower_arm", chance = 0.5 },
{ zone = "right_lower_arm", chance = 0.5 }
}
},
{ type = "oxygen_level", state = "too_low" },
{ type = "heart_rate", state = "too_high" }
},
-- WEAPONS
["knife"] = {
{
type = "open_wound",
chance = 1.0,
bleeding = 3,
pain = 3,
},
{ type = "blood_pressure", state = "too_low" }
},
["blunt"] = {
{
type = "open_wound",
chance = 0.4,
bleeding = 1,
pain = 3,
},
{
type = "fracture",
chance = 0.6,
},
{ type = "blood_pressure", state = "too_low" }
},
["gunshot"] = {
{
type = "unreviveable",
zones = {
{ zone = "head", chance = 1.0 }
}
},
{
type = "open_wound",
chance = 1.0,
foreignObject = "bullet",
requiresExtraction = true,
extractionType = "bullet",
bleeding = 3,
pain = 2,
},
{ type = "blood_pressure", state = "too_low" },
{ type = "heart_rate", state = "too_high" }
},
-- STATUS
["hunger"] = {
{ type = "blood_sugar", state = "too_low" },
{ type = "heart_rate", state = "low" }
},
["thirst"] = {
{ type = "heart_rate", state = "too_low" },
{ type = "blood_pressure", state = "low" }
}
}
Add / replace part in config/config.lua:
Config.DiagnoseInteraction = {
promptDistance = 3.0,
interactDistance = 2.0,
key = 38, -- INPUT_CONTEXT
-- Animation played when the medic kneels to open the diagnose view
-- Use { scenario = "..." } for a scenario OR { dict = "...", clip = "..." } for an animation
diagnoseAnim = {
scenario = "CODE_HUMAN_MEDIC_KNEEL",
},
-- Animation played when applying a treatment (e.g. bandaging, splinting)
-- Use { scenario = "..." } for a scenario OR { dict = "...", clip = "..." } for an animation
treatmentAnim = {
scenario = "CODE_HUMAN_MEDIC_TEND_TO_DEAD",
},
+ -- Animation used when treating a patient on a stretcher (standing, bending forward)
+ -- Falls back to treatmentAnim if not set
+ stretcherTreatmentAnim = {
+ dict = "mini@cpr@char_a@cpr_str",
+ clip = "cpr_pumpchest",
+ },
treatmentDurationMs = 3500,
-- CPR animation (dictionary + clip)
cprAnimDict = "mini@cpr@char_a@cpr_def",
cprAnimName = "cpr_pumpchest",
}
Config.CommandPermissions = {
-- /revive [playerId] - Revive a player
revive = { "god", "superadmin", "admin" },
-- /stopdeathtimeout [playerId] - Stop the death timeout for a player
stopdeathtimeout = { "god", "superadmin", "admin" },
-- /refunds - Open the refund system (replaces the old ACE permission)
refunds = { "god", "superadmin", "admin" },
-- Hospital Bed Editor
hospital_beds = { "god", "superadmin", "admin" },
-- /hospitalcreator - Open the Hospital Creator tool
hospitalcreator = { "god", "superadmin", "admin" },
-- /removemobilityaid [playerId] - Remove crutch/wheelchair from a player
removemobilityaid = { "god", "superadmin", "admin" },
+ -- /kill [playerId] - Kill yourself or another player (other players require permission)
+ kill = { "god", "superadmin", "admin" },
}
Version 2.7.0
Highlights
Server-side job check and range validation on stretcher/bodybag events to prevent exploit abuse.
Added onBeforeDeath hook export to allow external scripts to block death screen.
Added Vehicle Impact Protection with configurable low-speed death thresholds.
Player clothing preserved/restored across revive and respawn.
Notable Changes
Entity revalidation before all AttachEntityToEntity calls with bone fallback and 5-second load timeouts.
Nil guards on all joaat() calls to prevent config-related errors.
Added preventAutoRespawn config to unconditionally block auto-respawn on bleedout.
Added server-side stretcher module with respawn:hospital ActionHook.
Bodybag/carry animations and attachments are now fully configurable.
Trunk stretcher refactored for better vehicle detection and attachment.
Vehicle pull now works on dead players in vehicles.
Vehicle pull sync now server-authoritative.
Added detailed Doctor NPC revive failure messages.
Unconscious voice mode now supports none, listen (default), full.
Other Changes
Deathscreen NUI callback wrapped in pcall to prevent "Failed to fetch" errors.
Startup detection/warnings for conflicting medical resources.
Fixed players stuck unrevivable after bleedout until restart.
Fixed paid hospital respawn taking money without reviving.
Female peds now use 200 max health instead of GTA default 175.
breakWindow now triggers only on vehicle entity owner.
Helicopters now use separate stretcher pickup/interact distances.
Fixed AI medic drive-task retarget loop; now retargets only when player moves >30 units.
Fixed early respawn not cancelling AI medic.
AI medic payment now supports fallback to secondary account.
Added Save buttons to Reports and Conditions apps.
Fixed Conditions app not closing after tablet disappears.
Fixed draft-state leak between Reports and Conditions.
Fixed patient card stretching to full height with single entry.
Reduced frequency of background status-effect loops for performance.
Player name lookups now use PlayerCache.
Added Finnish translation.
Added locale keys for revive failure reasons across all languages.
Version 2.6.0
Highlights
Added ActionHooks event system with onAction export for carry, crutch, death, hospital, wheelchair, x-ray, stretcher, billing.
Added insurance copay calculation export for external billing integrations.
Added ox_target support for direct diagnosis, billing, and tablet access.
Notable Changes
Added billing enabled toggle.
Stretcher editor improved with dynamic camera scale/FOV by vehicle dimensions.
Added helicopter-specific preview logic in stretcher editor.
Deathscreen now uses ticketed closure to avoid UI persistence after spawn.
Server now closes diagnosis UI if patient disconnects.
Re-enabled bleeding, pain, fractures, and bed respawning by default.
Other Changes
Diagnose animations now support scenario and dict/clip alternatives.
Fixed helicopter trunk stretcher coordinates.
Refined body-point interaction coordinates and camera positioning.
Improved billing/action button UI styling.
Added Chinese locale keys for new features.
Version 2.5.0
Highlights
Critically low hunger/thirst now blocks health regeneration and blood-based healing.
Added optional revive expiration that permanently blocks recovery after bleedout.
Auto-respawn blocked when medic is within configurable radius.
Billing overlay integrated into diagnosis view.
Notable Changes
Knockout auto-respawn logic refined with immediate deadline revive and fallback scheduling.
Dead medics are now excluded from online medic count.
Patient state (carry, stretcher, bed, body bag) now fully cleared on revive/admin heal.
Insurance can now be renewed by selecting same provider.
Improved death-state persistence across reconnect/resource restart.
Job/duty checks now include ready state.
Table component now has sticky headers and configurable row limits.
Other Changes
Fixed possible deathscreen lock when knockout deadline elapsed.
Disabled G-key interactions while on death screen.
Improved TxAdmin heal payload parsing.
Patients are detached from stretcher before carry.
Locale sync now includes retry mechanism.
Improved player-name retrieval robustness.
Centralized server-side carry-state reset.
Added Chinese translation.
Version 2.4.0
Highlights
Diagnose and treatment animations are now configurable.
Revive checklist now covers low blood sugar, low oxygen, active bleeding, dehydration.
Added blood pressure medication as treatment step.
Knockout auto-respawn timer now dynamically adjusts by medic availability.
Notable Changes
Clothing now auto-restored after revival.
Players can no longer bill themselves.
Improved job-access state synchronization.
Late-registered jobs are now recognized regardless of start order.
Improved ventilation minigame pointer-event handling.
Server-side billing validation now checks target existence.
Other Changes
Hotbar now supports horizontal scrolling.
Fixed health calculation when GetEntityMaxHealth returns invalid values.
Fixed inverted self-check logic in billing target selection.
Updated README links and added suggestion board link.
Removed incorrect comment from German translation file.
Version 2.3.0
Highlights
Added Helicam feature.
Added panic and ping system.
Added major performance improvements.
Notable Changes
Improved dispatch notification.
Vehicle liveries and extras are now configurable in vehicle shop.
Other Changes
Added visible tablet prop animation while tablet is open.
Added additional fixes and improvements from detailed changelog.
Version 2.2.0
Highlights
Added prop system in vehicle trunk UI for medic prop placement and cleanup.
Reworked tablet chat app with cross-job chats and self-managed group chats.
Added option to respawn player in hospital bed.
Added option to revive player in hospital bed via NPC doctor.
Notable Changes
Added configurable command permissions.
Added /removemobilityaid [playerId].
Added automatic regeneration on knockout damage when knockout does not trigger.
Added self-heal HP items independent of bleeding system.
Added back grade change/bonus notifications.
Added confirmation modal on employee actions in boss menu.
Improved stretcher collision handling.
Other Changes
ESX heal command now clears pain/bleeding state.
Added Serbian translation.
Fixed mixed bodycam/dashcam views at long distances.
Fixed tablet video recordings.
Fixed and improved translations.
Fixed reports app stuck state on close.
Fixed society not receiving NPC doctor money when configured.