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
/selfdiagnoseor 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.LiveWoundBleedingClassto set initial bleeding intensity per damage cause. - Fractures for conscious players via
Config.LiveDamageFractureswith 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.
/killnow 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_baseis running. - Hospital blip now uses sprite
61instead of280. - 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.
- Split client modules into focused files (knockout, vehicle impact, healing, fractures).
- Download sky_ambulancejob from the CFX Portal.
- Create a backup.
- Replace the
/sourcefolder. - Replace the
/config/localesfolder. - Add in
config/config.lua:
-- 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" },
}