Configuration
Overview
Configuration is split by feature under shared/config/, plus a server-only file. There is no single shared/config.lua table; edit each value in its feature file.
1shared/config/
2├── core.lua # Debug, Locale, Theme, native regen toggle
3├── blood_groups.lua # Blood-type weights, compatibility modes and transfusion reactions
4├── vitals.lua # MaxHealth, Blood, Armor, Wound levels, BloodTrails, Casts
5├── bodyparts.lua # Single table for the 9 body parts
6├── diseases.lua # Disease definitions, stages, contagion, treatments
7├── items.lua # Medical items + XP cooldown
8├── anim_presets.lua # Reusable animation presets referenced by items
9├── masks.lua # Masks (item + drawable) and clothing protection
10├── effects.lua # Visual effects, Voice, Flare, Vehicle crash, NPC behavior
11├── fractures.lua # Fall-fracture chance + per-part fracture penalties
12├── integrations.lua # Radiation, contact infection, LifePoints zones
13├── item_diseases.lua # Food/item → disease map
14├── lifecycle.lua # Last stand + Death
15├── respawn.lua # Spawn points, cinematic cam, bed, respawn tent
16├── security.lua # AntiBunnyHop (Enabled + Sensitivity preset)
17├── ui.lua # Scan UI, Medic jobs, Commands
18├── zombie.lua
19└── open.lua # Open-handler event toggles
20server/config_server.lua # Webhooks, LifePoints, inventory wipe, revive/hospital resetinternal/balance/*.lua is encrypted by Cfx escrow and cannot be edited. It holds Config.Performance (tick intervals), Config.DamageControl (anti-exploit thresholds), per-weapon LifePoints penalties, AntiBunnyHop sensitivity presets and per-body-part balance numbers. internal/engine/*.lua contains visible technical data such as bone IDs, weapon hashes and cast prop offsets. The settings documented below are editable in shared/config/*.lua or server/config_server.lua. Blood-type weights, compatibility and reactions are configured in shared/config/blood_groups.lua. Do not edit the technical engine data.
Core
1Config.Debug = false
2Config.Locale = 'en'
3Config.Theme = 'default'
4Config.DisableHealthRegen = trueDebug: enables console DebugLog output. Keep off in production.Locale: language code. Default'en'. Use any file present in thelocales/folder.Theme: UI theme:default,cyberpunk,wasteland,noir,fantasy.DisableHealthRegen: blocks GTA native health regeneration so wounds do not self-heal.
Vitals
1Config.MaxHealth = 200
2Config.BleedRateMultiplier = 0.5
3Config.ArmorDamageThreshold = 2
4
5Config.ArmorSettings = {
6 BleedReduction = 0.80,
7 DamageReduction = 0.20,
8 MinArmorForProtection = 5.0,
9}
10
11Config.Casts.Duration = 3600MaxHealth: player max health ceiling (GTA caps usable health; 200 is the engine max).BleedRateMultiplier: multiplier on blood lost per bleeding tick.1.0is the unscaled rate.ArmorDamageThreshold: minimum incoming damage before armor degradation logic applies.ArmorSettings.BleedReduction: fraction of bleed chance removed while armored.ArmorSettings.DamageReduction: fraction of damage absorbed while armored.ArmorSettings.MinArmorForProtection: minimum armor value before any protection counts.Casts.Duration: fallback cast duration in seconds when a body part does not define its own. Per-part durations live inbodyparts.lua.
Blood
1Config.Blood.MaxVolume = 6.0
2Config.Blood.WeaknessThreshold = 4.5
3Config.Blood.CriticalLevel = 3.0
4Config.Blood.DeathThreshold = 0.0
5Config.Blood.DrawAmount = 0.25
6Config.Blood.RegenRate = 0.05
7Config.Blood.RegenBoost = 0.2
8Config.Blood.BleedingRates = {
9 [1] = 0.008,
10 [2] = 0.017,
11 [3] = 0.033,
12 [4] = 0.067,
13}MaxVolume: maximum blood volume in liters.WeaknessThreshold: below this liter level the player takes movement penalties.CriticalLevel: below this level screen effects and severe debuffs apply.DeathThreshold: blood level at which the player dies from blood loss.DrawAmount: liters drawn perempty_syringeuse.RegenRate: liters regenerated per natural regen tick.RegenBoost: liters regenerated per tick while a saline/regen buff is active.BleedingRates: liters lost per tick at each bleeding level (1-4).
Blood types and transfusions
1Config.Blood.Probabilities = {
2 ['0+'] = 37,
3 ['A+'] = 36,
4 ['B+'] = 8,
5 ['AB+'] = 3,
6 ['0-'] = 6,
7 ['A-'] = 6,
8 ['B-'] = 2,
9 ['AB-'] = 2,
10}Probabilities: positive relative weights used only when assigning a new blood type. The defaults total 100, so they give 37% 0+, 36% A+, 8% B+, 3% AB+, 6% 0-, 6% A-, 2% B- and 2% AB-. Changing these weights preserves existing player types.
1Config.Blood.Transfusion = {
2 Compatibility = 'abo_rh',
3 IncompatibleAction = 'reject',
4 IncompatibleDamage = 50,
5 AllowFatalReaction = false,
6 UnknownBagType = 'reject',
7 LegacyRh = 'abo',
8 DiseaseTransmission = true,
9}Compatibility:offaccepts any bag without a blood-type check;abochecks A, B, AB and 0 while ignoring the Rh sign;abo_rhchecks both ABO and Rh;customusesConfig.Blood.Compatibility.IncompatibleAction:rejectstops an incompatible transfusion before consuming the bag or causing damage.damageconsumes the bag and applies the configured reaction.IncompatibleDamage: health damage from an incompatible transfusion whenIncompatibleActionisdamage.AllowFatalReaction:falsekeeps damage from the incompatible reaction above the alive threshold.trueallows that reaction to be fatal. Other medical effects continue normally.UnknownBagType:rejectblocks bags with a missing type.universalaccepts bags whose type is absent or blank. Invalid non-empty types remain blocked when compatibility checks are enabled.LegacyRh: inabo_rhmode,abochecks only ABO if the recipient or donor has a standard type without + or -.rejectblocks that transfusion until both types include a sign. Stored types are preserved; no sign is assigned automatically.DiseaseTransmission: allows diseases stored in a blood bag to infect the recipient after a successful transfusion. This setting is independent of the compatibility mode; withoff, disease transmission still follows this field. Rejected transfusions do not transmit the bag's diseases.
Blood types accept O or 0, upper or lower case, and surrounding spaces. The normalized form uses 0. A bag can store its type in metadata.type, metadata.bloodType or metadata.blood_type. A missing type is never assumed to be A+. Newly drawn bags show the group in their label and description.
Custom compatibility
1Config.Blood.Compatibility = {
2 ['0-'] = { ['0-'] = true, ['0'] = true },
3 ['0+'] = { ['0-'] = true, ['0+'] = true, ['0'] = true },
4 ['A-'] = { ['0-'] = true, ['A-'] = true, ['0'] = true, ['A'] = true },
5 ['A+'] = { ['0-'] = true, ['0+'] = true, ['A-'] = true, ['A+'] = true, ['0'] = true, ['A'] = true },
6 ['B-'] = { ['0-'] = true, ['B-'] = true, ['0'] = true, ['B'] = true },
7 ['B+'] = { ['0-'] = true, ['0+'] = true, ['B-'] = true, ['B+'] = true, ['0'] = true, ['B'] = true },
8 ['AB-'] = { ['0-'] = true, ['A-'] = true, ['B-'] = true, ['AB-'] = true, ['0'] = true, ['A'] = true, ['B'] = true, ['AB'] = true },
9 ['AB+'] = { ['0-'] = true, ['0+'] = true, ['A-'] = true, ['A+'] = true, ['B-'] = true, ['B+'] = true, ['AB-'] = true, ['AB+'] = true, ['0'] = true, ['A'] = true, ['B'] = true, ['AB'] = true },
10 ['0'] = { ['0'] = true, ['0+'] = true, ['0-'] = true },
11 ['A'] = { ['0'] = true, ['A'] = true, ['0+'] = true, ['0-'] = true, ['A+'] = true, ['A-'] = true },
12 ['B'] = { ['0'] = true, ['B'] = true, ['0+'] = true, ['0-'] = true, ['B+'] = true, ['B-'] = true },
13 ['AB'] = { ['0'] = true, ['A'] = true, ['B'] = true, ['AB'] = true, ['0+'] = true, ['0-'] = true, ['A+'] = true, ['A-'] = true, ['B+'] = true, ['B-'] = true, ['AB+'] = true, ['AB-'] = true },
14}Compatibility[recipient][donor]: only entries set totrueallow a donor type for that recipient incustommode. Missing rows or invalid entries are rejected. Include any legacy recipient and donor types that the server still uses.
Disable blood-type checks
1Config.Blood.Transfusion.Compatibility = 'off'Stored blood types remain available and new characters still receive a type. Any bag can be used regardless of its type; disease transmission follows DiseaseTransmission.
Wound levels and blood trails
1Config.WoundLevels = {
2 [1] = { movementRate = 0.98, label = 'Minor' },
3 [2] = { movementRate = 0.85, label = 'Painful' },
4 [3] = { movementRate = 0.72, label = 'Severe' },
5 [4] = { movementRate = 0.59, label = 'Critical' },
6}
7
8Config.BloodTrails = {
9 Enabled = true,
10 Threshold = 2,
11}WoundLevels[n].movementRate: movement-speed multiplier at each wound severity.WoundLevels[n].label: name shown for that severity.BloodTrails.Enabled: leave blood decals on the ground while bleeding.BloodTrails.Threshold: minimum bleeding level (1-4) before trails start.
Body Parts
1Config.BodyParts = {
2 head = {
3 armored = false,
4 canFracture = true,
5 fracture = { allowShoot = true, allowDrive = true, allowSprint = true },
6 },
7}A single table defines all 9 parts (head, neck, chest, spine, pelvis, left_arm, right_arm, left_leg, right_leg).
armored: whether worn armor reduces damage to this part.canFracture: whether the part can fracture. Shipstrueon every part except the pelvis.fracture.allowShoot/allowDrive/allowSprint: what the player may do while this part is fractured.cast.duration: optional per-part cast duration in seconds, overridingConfig.Casts.Duration.
breakThreshold, fractureChance, staggerMult, and shakeIntensity for each part live in internal/balance/balance.lua and cannot be edited.
Lifecycle (Last Stand and Death)
1Config.LastStand = {
2 Duration = 60,
3 InstantDeathOnDamage = false,
4 MinimumDamageToKill = 50,
5 Anim = { dict = 'move_injured_ground', name = 'front_loop' },
6}
7
8Config.Death = {
9 Duration = 600,
10 AutoRespawnOnZero = false,
11 AutoRespawnGracePeriod = 600,
12 RespawnUITimeout = 60,
13 Anim = { dict = 'dead', name = 'dead_a' },
14 AnimVeh = { dict = 'veh@low@front_ps@idle_duck', name = 'sit' },
15}LastStand.Duration: seconds in last stand before death.LastStand.InstantDeathOnDamage:truekills immediately if damaged while downed.LastStand.MinimumDamageToKill: damage needed to kill during last stand whenInstantDeathOnDamageisfalse.LastStand.Anim: downed ground animation dict/name.Death.Duration: seconds before the respawn UI opens.Death.AutoRespawnOnZero: auto-respawn when the timer reaches zero.Death.AutoRespawnGracePeriod: whenAutoRespawnOnZeroistrue, seconds the "Hold E" prompt stays open before a forced respawn.0ornil= instant auto-respawn with no prompt.Death.RespawnUITimeout: seconds before the respawn UI auto-selects.Death.Anim/Death.AnimVeh: death animation on foot / in a vehicle.
Effects
1Config.Effects = {
2 CameraShake = true,
3 ScreenEffects = true,
4 WeaknessEffects = true,
5 AimShake = true,
6 ExternalRecoilScript = false,
7 FlashOnFracture = true,
8 Blackout = {
9 Enabled = true,
10 OnHeadShot = true,
11 OnExplosion = true,
12 Chance = 80,
13 Duration = 4000,
14 MinDamage = 20,
15 },
16}CameraShake: camera shake on injury.ScreenEffects: screen post-FX at critical blood levels.WeaknessEffects: movement penalties at low blood.AimShake: weapon sway while injured.ExternalRecoilScript: settruewhen a standalone recoil script is present, to avoid conflicts.FlashOnFracture: screen flash on fracture.Blackout.Enabled: knockout on headshot/explosion.Blackout.OnHeadShot/OnExplosion: which events can trigger a blackout.Blackout.Chance: percent chance to trigger.Blackout.Duration: blackout length in ms.Blackout.MinDamage: minimum damage that can trigger a blackout.
NPC behavior and voice
1Config.NPCInteraction = {
2 IgnoreOnDeath = true,
3 IgnoreInLastStand = true,
4}
5
6Config.Voice = {
7 Enable = true,
8 System = 'pma-voice',
9 MuteDead = true,
10 MuteLastStand = false,
11}NPCInteraction.IgnoreOnDeath/IgnoreInLastStand: NPCs ignore the player while dead / downed.Voice.Enable: enable voice muting integration.Voice.System: voice resource name.Voice.MuteDead: mute the player while dead.Voice.MuteLastStand: mute the player while in last stand.
Flare
1Config.Flare = {
2 Enabled = true,
3 RequireItem = true,
4 VisualEffect = true,
5 Item = 'WEAPON_FLARE',
6 RemoveItem = true,
7 Cooldown = 60000,
8 Key = 47,
9 AlertDispatch = {
10 Enabled = true,
11 Jobs = { 'ambulance', 'police' },
12 Code = '10-52',
13 Blip = { sprite = 153, color = 1, scale = 1.2 },
14 },
15}Enabled: allow downed players to fire a flare for help.RequireItem: require the flare item to use it.VisualEffect: fire the visual flare into the sky. Off sends the alert with no flare shot and the death-screen prompt becomes a plain call for help.Item: inventory weapon key.WEAPON_FLAREis the base-game flare weapon (case-sensitive).RemoveItem: consume the flare on use.Cooldown: ms between flare uses.Key: control index that fires the flare.AlertDispatch.Enabled: alert police and medics through your dispatch when a downed player uses the flare.AlertDispatch.Jobs: jobs that receive the call.AlertDispatch.Code: dispatch code sent with the alert.VisualEffectandAlertDispatchboth off hide the signal prompt on the death screen.
Vehicle crash
1Config.VehicleCrash = {
2 Enabled = true,
3 Tiers = {
4 { minSpeed = 100.0, damage = 15, bleedChance = 10, fractureChance = 12, stagger = true },
5 { minSpeed = 70.0, damage = 7, bleedChance = 5, fractureChance = 4, stagger = false },
6 { minSpeed = 40.0, damage = 3, bleedChance = 0, fractureChance = 0, stagger = false },
7 },
8}Enabled: apply crash injuries from high-speed impacts.Tiers[n].minSpeed: speed threshold for the tier.Tiers[n].damage: health damage applied.Tiers[n].bleedChance/fractureChance: percent chance to start bleeding / fracture.Tiers[n].stagger: whether the impact staggers the player.
Security (Anti-Bunny Hop)
1Config.AntiBunnyHop = {
2 Enabled = true,
3 Sensitivity = 'medium',
4 Notify = true,
5 Message = "Slow down! Don't jump so often.",
6}Enabled: toggle the anti-bunny-hop ragdoll.Sensitivity: preset:low(only extreme hops),medium(recommended),high(aggressive),extreme(ragdoll almost always).Notify: show a notification on a violation.Message: notification text.
The concrete cooldown, ragdoll duration, and trigger chance behind each preset live in internal/balance/antibunnyhop.lua and cannot be edited. Pick a preset; the numbers are fixed.
Fractures
1Config.Fractures = {
2 enabled = true,
3 MaxConcurrent = 2,
4 Legs = {
5 FallOnlyRunning = true,
6 FallChanceRun = 10,
7 FallChanceSprint = 15,
8 FallChanceWalk = 5,
9 },
10}enabled: turns fractures on or off. Shipstrue. Parts withcanFracture = falseinbodyparts.luanever breakMaxConcurrent: most fractures a player can have at once.0stops fractures from damageLegs.FallOnlyRunning: only count fall fractures while moving.Legs.FallChanceRun/FallChanceSprint/FallChanceWalk: percent chance of a leg fracture from a fall at each movement state.
1Config.FracturePenalties = {
2 ['left_arm'] = { allowShoot = true, aimShake = true, shakeIntensity = 2.5 },
3 ['right_arm'] = { allowShoot = false, allowDrive = true },
4 ['left_leg'] = { limp = true, sprint = false, allowDrive = true },
5 ['right_leg'] = { limp = true, sprint = false, allowDrive = false },
6}Config.FracturePenalties is built at start from the fracture block of each part in bodyparts.lua. Change the penalties there. Per part, it restricts:
allowShoot: whether the player can shoot with this part fractured.allowDrive: whether the player can drive.aimShake/shakeIntensity: add aim sway and how strong it is.limp/sprint: apply a limp / block sprint.
Masks
1Config.MaskSystem = {
2 EnableItemMode = true,
3 EnableClothingMode = true,
4 Anim = {
5 dict = 'mp_masks@on_foot',
6 putOn = 'put_on_mask',
7 takeOff = 'put_on_mask',
8 flags = 49,
9 },
10}
11
12Config.Masks = {
13 ['mask_surgical'] = { protection = 90, component = { id = 7, male = 38, female = 38, texture = 0 }, label = 'Surgical Mask' },
14 ['mask_n95'] = { protection = 99, component = { id = 7, male = 120, female = 120, texture = 0 }, label = 'N95 Mask' },
15 ['mask_dust_unisex'] = { protection = 30, component = { id = 7, male = 46, female = nil, texture = 0 }, label = 'Dust Mask', itemless = true },
16 ['helmet_full_male'] = { protection = 100, component = { id = 1, male = 36, female = 36, texture = 0 }, label = 'Full Helmet', itemless = true },
17 ['helmet_half_male'] = { protection = 50, component = { id = 1, male = 46, female = nil, texture = 0 }, label = 'Half Helmet', itemless = true },
18}MaskSystem.EnableItemMode: mask items from inventory grant disease protection.MaskSystem.EnableClothingMode: worn clothing components grant protection.MaskSystem.Anim: put-on / take-off animation.Config.Masks: single source of truth for masks.Config.MaskItems(per-item lookup) and the mask entries inConfig.ProtectiveClothingare derived from this table at runtime.protection: filtering percentage (0-100).component: clothing slot{ id, male, female, texture }. Setfemale = nilif the drawable is male-only.label: display name.itemless:truemeans protection comes from the worn drawable only, with no dedicated inventory item.
Config.ProtectiveClothing (also in masks.lua) maps individual male/female drawable IDs for component slot [1] to a protection value (40 or 80), letting plain clothing offer partial protection without a mask item.
Add or edit an entry in Config.Masks only. The item lookup and the clothing check are generated from it, no need to edit three tables. These are shipped defaults, not fixed values; add, remove, or rebalance them freely.
Diseases
Diseases live in shared/config/diseases.lua. They are shipped defaults, add, remove, or rebalance them freely. Each disease defines:
severity:mild,moderate,severe, orcritical.contagious:enabled,distance,chance,interval,useMasks.trigger: optional auto-infect on injury (type = 'injury',parts,chance).stages: timed progression; each stage hasafter,name, and aneffectslist.treatment:cureitem, optionalmaxCurableStage,tooLateMessage,suppressors,naturalRecovery.
The six shipped diseases:
influenza(Viral Flu), mild, contagious, 4 stages. Cure:paracetamol. Suppressors:vitalex,vitamin_cocktail.patogeno_vx_9(VX-9 Pathogen), critical, 5 stages (stage 5 terminal). Cure:retroxin(max curable stage 4).radiazioni(Radiation Sickness), severe, 4 stages (stage 4 terminal). Cure:radiation_antidote(max curable stage 3). Wired to the radiation integration.infezione(Wound Infection), moderate, triggered bycut/gunshotinjuries (30%), 5 stages (stage 5 terminal). Cure:antibiotics.intossicazione(Food Poisoning), mild, 3 stages with natural recovery. Cure:herbal_infusion.tetano(Tetanus), severe, triggered bycutinjuries (25%), 4 stages (stage 4 terminal). Cure:antibiotics.
Effect types usable in a stage: cough, stumble, damage, bleed, fever, movePenalty, vomit, lastStand, death, notify. Time format: '30s', '15m', '2h', '1d'. Add terminal = true to a stage to make it fatal.
Kill switch
1Config.DiseasesEnabled = true
2Config.AlwaysEnabledDiseases = {
3 'radiazioni',
4}DiseasesEnabled:falsedisables every disease except those inAlwaysEnabledDiseases.AlwaysEnabledDiseases: diseases that survive the kill switch. Keepradiazioniwhile the radiation integration is on, otherwise its silent terminal progression can cause "random" deaths.
Add an entry to Config.Diseases in shared/config/diseases.lua:
1['my_disease'] = {
2 label = 'My Disease',
3 icon = 'fa-virus',
4 severity = 'moderate',
5 contagious = { enabled = false },
6 stages = {
7 [1] = { after = '0s', name = 'disease_my_disease_s1', effects = {} },
8 [2] = { after = '30m', name = 'disease_my_disease_s2', effects = {
9 { type = 'damage', amount = 2, interval = '10m' },
10 { type = 'notify', message = 'disease_my_disease_s2_msg' },
11 }},
12 },
13 treatment = {
14 cure = 'antibiotics',
15 },
16}name and notify message fields are locale keys. Add the matching keys to every file in locales/: a missing key renders on screen as the literal MISSING: key, not a fallback. The cure item must exist in items.lua with type = 'cure_disease' and disease = 'my_disease'.
Item-triggered diseases
1Config.ItemDiseases = {
2 ['cibo_marcio'] = { disease = 'intossicazione', chance = 100 },
3 ['carne_rossa'] = { disease = 'intossicazione', chance = 50 },
4 ['carne_squalo'] = { disease = 'intossicazione', chance = 30 },
5}Maps inventory items (raw meat, spoiled food, undercooked fish) to a disease applied on consumption. disease must exist in diseases.lua; chance is rolled per use (0-100). The shipped entries map to intossicazione. Edit freely to match your server's food items.
Zombie transformation
Player zombie transformation is disabled by default. The default profile keeps the player's original ped and clothing, with zombie-like movement, optional restrictions and a local screen effect.
1Config.ZombieTransformation = {
2 Enabled = false,
3 DefaultProfile = 'default',
4 TickInterval = 1000,
5 ExportAllowlist = {},
6 Diseases = {
7 ['patogeno_vx_9'] = {
8 Stage = 'terminal',
9 Profile = 'default',
10 },
11 },
12 Lifecycle = {
13 Respawn = 'cure',
14 Revive = 'preserve',
15 OfflineProgress = false,
16 },
17 Cure = {
18 Enabled = false,
19 Item = 'zombie_antidote',
20 MedicOnly = true,
21 AllowSelf = false,
22 TreatmentDuration = 6000,
23 },
24 MeleeInfection = {
25 Enabled = false,
26 Chance = 35,
27 Distance = 2.5,
28 Cooldown = 3000,
29 ConfirmationWindow = 1500,
30 },
31 Profiles = {
32 ['default'] = {
33 Duration = 0,
34 ExpiryAction = 'cure',
35 IgnoreByZombies = true,
36 Movement = {
37 Clipset = 'move_m@drunk@verydrunk',
38 Speed = 0.75,
39 Transition = 0.5,
40 },
41 Restrictions = {
42 BlockWeapons = true,
43 BlockInventory = true,
44 BlockSprint = true,
45 BlockJump = true,
46 BlockVehicleEntry = true,
47 BlockClimbing = true,
48 BlockSwimming = false,
49 BlockMelee = false,
50 },
51 Appearance = {
52 Mode = 'original',
53 Model = 's_m_y_zombie_01',
54 Provider = false,
55 EyeColor = 31,
56 },
57 Screen = {
58 Modifier = 'NG_filmic01',
59 Strength = 0.25,
60 },
61 Decay = {
62 Amount = 0,
63 Interval = 30,
64 },
65 },
66 },
67}Enable and permissions
Config.ZombieTransformation.Enabled defaults to false. Set to true to enable player transformation. Disabled mode keeps the existing disease terminal behavior.
Config.ZombieTransformation.DefaultProfile defaults to 'default'. Name of the profile used when a transformation export does not select one. The name must exist in Profiles.
Config.ZombieTransformation.TickInterval defaults to 1000. Milliseconds between server checks for watched infections and transformed characters. The server clamps the interval to 250 to 10000 milliseconds.
Config.ZombieTransformation.ExportAllowlist defaults to {}. Allowed callers of the mutating server exports. An empty table allows any server resource. Use a list of resource names or map names to true. This setting does not control read exports or validated medical item treatment.
Disease triggers
Config.ZombieTransformation.Diseases.patogeno_vx_9.Stage defaults to 'terminal'. The 'terminal' option transforms at the first stage marked terminal in Config.Diseases. An integer from 1 to 100 transforms at that stage or later; choose a stage defined for the disease. Add other entries using existing disease names. Only configured diseases have their terminal effects replaced by transformation.
Config.ZombieTransformation.Diseases.patogeno_vx_9.Profile defaults to 'default'. Profile applied by this disease trigger. The profile name must exist in Profiles.
Death, recovery and offline time
Config.ZombieTransformation.Lifecycle.Respawn defaults to 'cure'. Use 'cure' to remove the transformation and its trigger infections after an authorized respawn. Use 'preserve' to keep the transformation.
Config.ZombieTransformation.Lifecycle.Revive defaults to 'preserve'. Use 'preserve' to resume zombie behavior after a revive, or 'cure' to remove the transformation and its trigger infections. Death suspends zombie presentation and does not cure the character. A client external respawn reset does not clear the transformation.
Config.ZombieTransformation.Lifecycle.OfflineProgress defaults to false. False pauses watched disease progression, transformation duration and the next decay deadline during offline time. True lets those timers continue. Health damage from missed decay intervals is not accumulated or replayed.
Special cure item
Config.ZombieTransformation.Cure.Enabled defaults to false. Enables a separate zombie antidote treatment in the medical interaction system. Ordinary cures for the configured trigger diseases do not clear an active transformation; other disease treatments remain available.
Config.ZombieTransformation.Cure.Item defaults to 'zombie_antidote'. Name of an item registered in the server inventory. This setting does not create the inventory item. When enabled, the script creates its medical treatment entry if Config.MedicalItems has no entry for that item. An existing entry must use type cure_zombie to route through the zombie treatment.
Config.ZombieTransformation.Cure.MedicOnly defaults to true. Requires a job listed in Config.MedicJobs. False allows other players to use the treatment.
Config.ZombieTransformation.Cure.AllowSelf defaults to false. Allows self treatment when true. The medic requirement still applies when MedicOnly is enabled.
Config.ZombieTransformation.Cure.TreatmentDuration defaults to 6000. Milliseconds for treatment progress and the medical animation.
Melee infection
Config.ZombieTransformation.MeleeInfection.Enabled defaults to false. Enables infection from a transformed player's confirmed unarmed attack. Config.ZombieBite.Enabled and Config.ContactInfection.Enabled must also be true. The disease comes from Config.ContactInfection.Disease. Weapon damage alone or a client damage report alone does not infect the victim.
Config.ZombieTransformation.MeleeInfection.Chance defaults to 35. Infection chance from 0 to 100 percent after a confirmed attack.
Config.ZombieTransformation.MeleeInfection.Distance defaults to 2.5. Maximum attacker-to-victim distance in meters. The server also requires both players to be in the same routing bucket.
Config.ZombieTransformation.MeleeInfection.Cooldown defaults to 3000. Milliseconds between infection attempts by the same attacker, including attempts that fail the chance roll.
Config.ZombieTransformation.MeleeInfection.ConfirmationWindow defaults to 1500. Milliseconds allowed to correlate server weapon damage with the victim's damage report. Keep this long enough for the server's expected network latency.
Profiles and duration
Config.ZombieTransformation.Profiles.default.Duration defaults to 0. Transformation duration in seconds. Zero keeps it until a cure or a lifecycle recovery removes it. Positive values use ExpiryAction when the timer expires. Duration strings such as '5m' or '1h' are also accepted; the maximum is 31536000 seconds. Add named entries under Profiles for other server modes.
Config.ZombieTransformation.Profiles.default.ExpiryAction defaults to 'cure'. Use 'cure' for automatic recovery that also clears trigger infections. Use 'death' for a fatal timeout through the medical death system; the transformation remains until its recovery policy or a cure removes it.
Config.ZombieTransformation.Profiles.default.IgnoreByZombies defaults to true. Marks an active transformed player as a target that cooperating zombie AI can ignore. The NPC resource must use the health system's server API when choosing and keeping targets.
Movement
Config.ZombieTransformation.Profiles.default.Movement.Clipset defaults to 'move_m@drunk@verydrunk'. Movement animation set. False leaves the walking animation unchanged.
Config.ZombieTransformation.Profiles.default.Movement.Speed defaults to 0.75. Accepted range 0.1 to 2.0. The medical movement controller caps the resulting rate at normal speed and applies stronger medical movement penalties.
Config.ZombieTransformation.Profiles.default.Movement.Transition defaults to 0.5. Animation blend duration in seconds, from 0.0 to 5.0.
Restrictions
Config.ZombieTransformation.Profiles.default.Restrictions.BlockWeapons defaults to true. Prevents weapon equipment while transformed and rejects non-unarmed weapon damage on the server.
Config.ZombieTransformation.Profiles.default.Restrictions.BlockInventory defaults to true. Locks the inventory through the built-in ox inventory adapter or a registered inventory provider. Other inventories require a provider for a complete lock; blocked keys alone do not prevent inventory commands or exports.
Config.ZombieTransformation.Profiles.default.Restrictions.BlockSprint defaults to true. Blocks sprinting while zombie behavior is active.
Config.ZombieTransformation.Profiles.default.Restrictions.BlockJump defaults to true. Blocks jumping while zombie behavior is active.
Config.ZombieTransformation.Profiles.default.Restrictions.BlockVehicleEntry defaults to true. Blocks entering vehicles. It does not eject a player already inside a vehicle.
Config.ZombieTransformation.Profiles.default.Restrictions.BlockClimbing defaults to true. Blocks climbing and vaulting.
Config.ZombieTransformation.Profiles.default.Restrictions.BlockSwimming defaults to false. Blocks swimming controls when true.
Config.ZombieTransformation.Profiles.default.Restrictions.BlockMelee defaults to false. Blocks unarmed melee attacks when true. Keep false to allow zombie attacks and optional melee infection.
Appearance
Config.ZombieTransformation.Profiles.default.Appearance.Mode defaults to 'original'. Use 'original' to retain the player's ped, face and clothing. Use 'model' for a temporary ped model, with a complete appearance provider.
Config.ZombieTransformation.Profiles.default.Appearance.Model defaults to 's_m_y_zombie_01'. Installed ped model name used only in model mode. No model is downloaded or installed by the health system.
Config.ZombieTransformation.Profiles.default.Appearance.Provider defaults to false. Registered appearance provider name. False delegates provider selection to open/client/zombie_handlers.lua. Model mode requires Capture and Restore support for the original appearance.
Config.ZombieTransformation.Profiles.default.Appearance.EyeColor defaults to 31. Temporary freemode eye color from 0 to 31. False preserves the original color. When zombie presentation ends, the original color is restored only if the same freemode ped still has the color applied by this feature. Later changes made by other resources are preserved.
Screen effect
Config.ZombieTransformation.Profiles.default.Screen.Modifier defaults to 'NG_filmic01'. Local timecycle effect name. False disables this zombie screen effect. Medical emergencies take priority.
Config.ZombieTransformation.Profiles.default.Screen.Strength defaults to 0.25. Effect strength from 0.0 to 1.0.
Health decay
Config.ZombieTransformation.Profiles.default.Decay.Amount defaults to 0. Health lost per decay tick, from 0 to 100. Zero disables decay. Fatal decay uses the medical death system.
Config.ZombieTransformation.Profiles.default.Decay.Interval defaults to 30. Seconds between decay ticks, from 1 to 86400. Duration strings are also accepted. The saved deadline is preserved across reconnects.
Model mode keeps the original ped if its provider is missing, capture fails or the requested model cannot load. Complete appearance recovery requires a provider that restores all captured appearance data, including the saved face. Its Restore handler must finish synchronously, including during resource stop.
Medical Items
Items live in shared/config/items.lua under Config.MedicalItems. The resource ships 28 medical items plus the respawn_tent. Item keys are English and must match the ox_inventory entries in _INSTALL/ox_items.txt exactly.
1Config.XpCooldownSeconds = 1800
2
3Config.MedicalItems = {
4 ['field_dressing'] = {
5 quickAccess = true,
6 type = 'heal_wound',
7 allowSelf = true,
8 remove = true,
9 target = { 'cut', 'gunshot' },
10 amount = 1,
11 health = 20,
12 anim = 'bandage_shirt',
13 duration = 13000,
14 xp = { medico = 5 },
15 client = { labelKey = 'item_field_dressing', descKey = 'item_field_dressing_desc', icon = 'bandage' },
16 },
17}Config.XpCooldownSeconds: seconds between XP awards on the same(healer, patient, treatmentType)tuple. Treatment still applies during cooldown; only the XP is suppressed.0disables the anti-grind. Default1800.
Per-item fields:
type: action:heal_wound,fix_fracture,revive_player,cure_disease,boost_regen,draw_blood,transfuse_blood,relieve_pain.allowSelf: usable on self.remove: consumed on use.falsewithdurabilityLoss+removeWhen0makes a reusable item (the defibrillator).quickAccess: appears in the quick-access panel.target: wound types (cut, gunshot, blunt, burn, bite) or body parts the item treats.amount/health/stopBleeding: wound severity reduced, health restored, and bleed-stop strength.job: restricts use to a job (most advanced items requiremedico).disease: forcure_disease, the disease(s) cured.anim: references a preset inanim_presets.lua(syringe,pill,bandage,cast_anim,cpr,bandage_shirt,medkit,pill_capsule,bottle_herbal,bottle_pills,syringe_morphine).animSelf/animTarget: explicit animations override the preset.xp: XP awarded per category on a real success, integrating withml_skills(e.g.{ medico = 10 }). Self-treatments grant nothing.requiredSkill: lock the item until the player has unlocked a specific ml_skills skill. Needs Config.Skills.Enabled. Always set category: it lets the client block the item before the use animation and hide it from the medic panel.requiredLevel: lock the item below a minimum ml_skills category level. Combine with requiredSkill; both must pass.allowDrive,allowShoot: on casts, whether the player can drive or shoot while wearing it.driveWobbleanddrivePull = 'left'or'right'make the steering wandereffectDuration: seconds arelieve_painitem lastsmaxDoses,doseCooldown,doseGroup: how many doses fit inside the cooldown in seconds. Items with the samedoseGroupshare one counteroverdoseEffect: screen effect of an overdose, such as'blur'receiveItem: item given back after use, such as the full blood bag fromempty_syringeclient:labelKey,descKey(locale keys) andicon.
The shipped items, grouped by purpose:
- Bandages / dressings:
crafted_gauze,field_dressing,elastic_bandage,packing_bandage,ifak,surgical_kit,improvised_tourniquet,tourniquet,suture_kit - Casts:
arm_cast,leg_cast,neck_brace,body_cast - Disease cures:
retroxin,herbal_infusion,paracetamol,radiation_antidote,antibiotics,vitalex,vitamin_cocktail - Pain relief:
painkillers,morphine - Blood:
empty_syringe,blood_bag_500,saline_500 - Revival:
revive_kit,ecg(defibrillator, reusable),epinephrine - Survival:
respawn_tent
Items with quickAccess = true appear in the HUD quick bar for fast use during combat.
Skill lock (ml_skills)
With ml_skills installed, an item can require an unlocked skill or a category level before it is usable. Locked items are stopped before the use animation starts and the message names the missing skill. The rule is enforced server-side and fails open, so a stopped ml_skills never locks players out of medical gear. requiredSkill and requiredLevel are optional fields in a medical item entry.
1Config.Skills = {
2 Enabled = false,
3 FailOpen = true,
4 XpOnSelfUse = false,
5 HideLockedItems = false,
6}
7
8['surgical_kit'] = {
9 requiredSkill = { category = 'medico', skill = 'first_aid' },
10 requiredLevel = { category = 'medico', level = 5 },
11}Enabled: turn the skill lock on. Off leaves every item usable (default).FailOpen: if ml_skills is stopped or errors, allow the item anyway.XpOnSelfUse: also grant item-use XP when a player treats themselves.HideLockedItems: hide locked items from the medic panel. Off (default) keeps them listed and blocks them on use.
Weapons
shared/config/weapons.lua decides what each weapon does to the body.
1Config.WeaponClasses = {
2 ['MEDIUM_CALIBER'] = {
3 woundType = 'gunshot',
4 boneDamage = 12,
5 fractureChance = 6,
6 bleedChance = 10,
7 impact = 'minor',
8 staggerMult = 0.3,
9 minSeverity = 2,
10 maxSeverity = 3,
11 label = 'Medium Caliber',
12 },
13}
14
15Config.WeaponMap[`WEAPON_PISTOL`] = 'MEDIUM_CALIBER'
16
17Config.BodyHealth = {
18 ['chest'] = { breakThreshold = 200 },
19}woundType: wound the hit leaves,gunshot,cut,blunt,burnorbiteboneDamage,fractureChance,bleedChance: bone damage per hit, and percent chances of a fracture and of bleedingimpact,staggerMult: how hard the hit shakes the playerminSeverity,maxSeverity: wound severity range from 1 to 4minDamageThreshold: hits below this damage leave no woundConfig.WeaponMap: weapon hash to class. Add your custom weapons to the list in the fileConfig.BodyHealth: bone damage each body part takes before it breaks
Respawn
1Config.RespawnSettings = {
2 UISelection = true,
3 GTAcam = true,
4 ShowAllSpawns = true,
5 RandomSpawn = false,
6 FallbackSpawn = vector4(1651.01, 2543.6, 45.56, 53.03),
7 CinematicCam = true,
8}UISelection: show the spawn-selection UI on death.GTAcam: use the GTA selection camera.ShowAllSpawns: show all spawn points instead of only the nearest.RandomSpawn: pick a random spawn instead of showing the UI.FallbackSpawn: fallback respawn coord. Replace the example with one valid on your map.CinematicCam: enable the cinematic fly-in camera.
Config.StartSpawn defines named spawn groups, each with a label, center, and a list of spawns. The shipped entry (prison, "Prison") is an example; replace its coordinates with your own hospitals or safe zones. HospitalRespawn selects this entry by its key, not its label.
Bed respawn
1Config.HrsBase = {
2 Enable = true,
3 UseCinematicCam = false,
4 Anim = {
5 dict = 'switch@trevor@bed',
6 name = 'trevor_bed_exit_f_trevor',
7 duration = 8000,
8 blendIn = 8.0,
9 blendOut = -8.0,
10 },
11}Enable: offers respawn in your own bed when a supported base building resource runs, such as Outpost (ml_base_building). Safe to leave on without one.UseCinematicCam: cinematic camera on bed respawn.Anim: bed exit animation.Config.HrsBase.PropSettingsdefines per-propzOffset/headingOffset.
Respawn tent
1Config.RespawnTent = {
2 Enabled = true,
3 Item = 'respawn_tent',
4 Model = `prop_skid_tent_01`,
5 MaxPerPlayer = 2,
6 PlacementRange = 50.0,
7 InteractionDistance = 2.5,
8 SpawnLOD = 200.0,
9 Permissions = {
10 Pickup = 'owner',
11 Destroy = 'all',
12 },
13 Placement = {
14 RayCastDistance = 10.0,
15 Anim = { dict = 'anim@narcotics@trash', name = 'drop_front', duration = 3000 },
16 },
17 SpawnOffset = vec3(0.0, 1.5, 1.0),
18}Enabled:falsefully disables the tent feature.Item: inventory item that starts placement (respawn_tent).Model: tent prop.prop_skid_tent_01is a base-game GTA prop, no stream needed.MaxPerPlayer: maximum active tents per player.PlacementRange: max placement distance (m) and minimum distance between two tents.InteractionDistance: distance (m) the target menu appears at.SpawnLOD: distance (m) within which the prop renders.Permissions.Pickup/Destroy:'owner'(only owner) or'all'(anyone nearby). Pickup returns the item; destroy does not.Placement.RayCastDistance: aim range (m).Placement.Anim: placement confirmation animation and progress-bar duration.SpawnOffset: respawn offset from the tent so the player does not spawn inside the prop.
Placed tents persist in the ml_health_tents table, created automatically.
Base Building
These settings only apply when Outpost (ml_base_building) runs.
1Config.BaseBuilding = {
2 enabled = 'auto',
3 canPlaceOutsideBase = true,
4 permission = false,
5 blockDuringRaid = false,
6 whileLoading = 'deny',
7 protectTentsInsideBases = true,
8 blockRespawnInsideForeignBase = true,
9 useBaseBeds = true,
10}enabled:'auto'follows the base script,trueforces it on,falseturns it offcanPlaceOutsideBase: allows respawn tents outside bases. Tents in another player's base are always refusedpermission: base permission needed to place a tent in a base you belong to.falsefor noneblockDuringRaid: refuses tents while the base is raidedwhileLoading:'deny'or'allow'while the base script loads after a restartprotectTentsInsideBases: only players who can remove base pieces can clear a tent inside a baseblockRespawnInsideForeignBase: refuses respawn on a tent that ended up in someone else's baseuseBaseBeds: shows beds built in a base on the death screen
UI, Medic Jobs, Commands
1Config.MedicJobs = {
2 'medico',
3}
4
5Config.SelfAlwaysAdvanced = false
6
7Config.ScanUI = {
8 Mode = 'modern',
9 DragSensitivity = 1.0,
10 CloseUpOnSelect = true,
11 IntroDuration = 800,
12 RevealMissingItems = true,
13}
14
15Config.Commands = {
16 Revive = 'revive',
17 ReviveRadius = 'reviveall',
18 Debug = 'meddebug',
19}
20
21Config.HealthMenu = {
22 Command = 'health',
23 Keybind = 'F9',
24}MedicJobs: jobs that get full medical info (exact BPM, blood liters, blood type, numeric severity, disease names). Non-medics see vague symptoms. Empty{}disables gating (everyone sees everything).SelfAlwaysAdvanced:truegives every player full self-diagnosis even when not a medic.ScanUI.Mode:'modern'(body labels + orbital camera) or'classic'(2D grid).ScanUI.DragSensitivity: mouse drag sensitivity when rotating the camera.ScanUI.CloseUpOnSelect: cinematic zoom when a body part is clicked.ScanUI.IntroDuration: open-animation duration in ms (0instant).ScanUI.RevealMissingItems:trueshows valid-but-unowned items grayed out with a "MISSING" badge;falseshows only owned items.Commands.Revive/ReviveRadius/Debug: command names. Defaults are/revive,/reviveall,/meddebug.HealthMenu.Command: chat command that opens the player's own health panel.falsedoes not register it.HealthMenu.Keybind: default key for that command, for example'H'. It is registered through the FiveM key mapping system, so players can rebind or clear it in the game settings.falseleaves it unbound. Other resources can open the same panel withexports.ml_healthsystem:OpenHealthPanel().
Integrations
1Config.RadiationIntegration = {
2 Enabled = true,
3 PollInterval = 5000,
4 DiseaseName = 'radiazioni',
5 CureThreshold = 2.0,
6 EntryGrace = { Enabled = true, Duration = 15000, MaxRadiation = 15 },
7 RequireAntidoteForCure = true,
8 Thresholds = {
9 { level = 5, action = 'infect' },
10 { level = 250, action = 'accelerate', speedMult = 2 },
11 { level = 650, action = 'escalade', forceStage = 3 },
12 { level = 1000, action = 'escalade', forceStage = 4 },
13 },
14 CureItems = {
15 ['radiation_antidote'] = 'all',
16 },
17}Enabled: connect toml_radiation.PollInterval: ms between radiation polls.DiseaseName: disease applied (radiazioni).CureThreshold: radiation level below which the disease may auto-cure.EntryGrace: grace window on zone entry (Durationms,MaxRadiation) before infect/accelerate/escalade fires.RequireAntidoteForCure:trueblocks natural-decay auto-cure; only the antidote cleans the player.Thresholds: radiation levels thatinfect,accelerate(withspeedMult), orescalade(withforceStage).CureItems: items that also remove radiation.'all'clears it fully (recommended so the player is not re-infected on the next poll).
1Config.ContactInfection = {
2 Enabled = true,
3 Disease = 'patogeno_vx_9',
4 Chance = 35,
5 SignalCooldown = 1000,
6}Enabled: master toggle for the contact-infection API. Inert until an external script calls it, so it is safe to ship enabled.Disease: disease applied on contact (must exist indiseases.lua).Chance: percent chance per contact.SignalCooldown: minimum ms between client contact signals (anti-spam).
1Config.ZombieBite = {
2 Enabled = true,
3 WeaponClass = 'ZOMBIE_BITE',
4 Damage = 12,
5 Infect = true,
6 Chance = nil,
7 Parts = { 'left_arm', 'right_arm', 'neck', 'chest', 'left_leg', 'right_leg' },
8}Bite wound for zombie and creature scripts, applied through exports.ml_healthsystem:ApplyZombieBite. Like the contact infection above, it stays inert until an external script calls it.
Enabled: master toggle for the bite API.WeaponClass: entry in Config.WeaponClasses (shared/config/weapons.lua) that sets the bite bleeding and severity.Damage: wound damage passed to the medical engine when the caller does not send its own.Infect: also roll the contact infection on every bite.Chance: infection chance in percent for a bite.niluses the Chance of the contact infection above.Parts: body zones a bite can land on when the caller does not pick one.
1Config.LifePoints.Zones = {
2 -- ['nuclear_plant'] = {
3 -- type = 'sphere', coords = vec3(2700.0, 1500.0, 30.0),
4 -- radius = 200.0, penalty = 25, label = 'Nuclear Plant',
5 -- },
6}Geographic zones that apply an extra LifePoints penalty on death inside them. Each zone is type = 'sphere' (coords + radius) or type = 'poly' (points + thickness), plus a required penalty and a label. Ships empty (commented examples only).
Open-Handler Events
1Config.OpenHandlers = {
2 EnableDeathEvent = true,
3 EnableLastStandEvent = true,
4 EnableRespawnEvent = true,
5}EnableDeathEvent: fireml_healthsystem:onPlayerDeath.EnableLastStandEvent: fireml_healthsystem:onPlayerLastStand.EnableRespawnEvent: fireml_healthsystem:onPlayerRespawned.
Your own resources can listen to these events, see the Developer page.
Server Config
server/config_server.lua holds the server-only values: webhooks, LifePoints, inventory wipe, and reset behavior. A reference copy ships as _INSTALL/config_server.example.lua.
Discord webhooks
1Config.Log = {
2 AdminRevive = 'INSERT_WEBHOOK_LINK_HERE',
3 AdminAction = 'INSERT_WEBHOOK_LINK_HERE',
4 PlayerDeath = 'INSERT_WEBHOOK_LINK_HERE',
5 PlayerRevive = 'INSERT_WEBHOOK_LINK_HERE',
6 ItemUsed = 'INSERT_WEBHOOK_LINK_HERE',
7 Treatment = 'INSERT_WEBHOOK_LINK_HERE',
8 Disease = 'INSERT_WEBHOOK_LINK_HERE',
9 Injury = 'INSERT_WEBHOOK_LINK_HERE',
10 ExploitDetected = 'INSERT_WEBHOOK_LINK_HERE',
11 LifePoints = 'INSERT_WEBHOOK_LINK_HERE',
12}Each key logs one event category. Replace the placeholder with a webhook URL to enable that log; leave the placeholder (or set false) to disable it.
Life Points
1Config.LifePoints.Enabled = true
2Config.LifePoints.StartingPoints = 100
3Config.LifePoints.MinPoints = 0
4Config.LifePoints.DefaultPenalty = 10
5Config.LifePoints.PlayerKillPenalty = 3
6
7Config.LifePoints.NPCOverrides = {
8 [`Lurker`] = 7,
9 [`Gasbag`] = 7,
10}
11
12Config.LifePoints.ExternalReasons = {
13 ['radiazioni'] = 9,
14 ['infezione'] = 5,
15 ['patogeno_vx_9'] = 7,
16 ['bleedout'] = 5,
17 ['starvation'] = 2,
18 ['dehydration'] = 2,
19 ['overdose'] = 5,
20}
21
22Config.LifePoints.StaffPermissions = {
23 'god',
24 'admin',
25}
26
27Config.LifePoints.ExportAllowlist = {}Enabled: toggle the LifePoints system.StartingPoints: points each character starts with.MinPoints: floor (points cannot drop below this).DefaultPenalty: points lost per death without a more specific rule.PlayerKillPenalty: points lost when killed by another player.NPCOverrides: per-NPC-model penalty overrides (hashed model names).ExternalReasons: penalties for non-combat death causes.StaffPermissions: ACE / framework group names exempt from penalties and allowed to call the modify exports.ExportAllowlist: resources permitted to callSet/Add/RemoveLifePoints. Empty allows any server resource (still blocks non-staff player context); populate to restrict.
Config.LifePoints.PlayerKillWeapons and per-weapon penalty values live in internal/balance/weapon_penalties.lua and cannot be edited.
Life Points recovery
When a character's life points reach MinPoints, it enters a recovery period and cannot be played until the timer ends. Each character has its own timer, so the player can use another character in the meantime.
1Config.LifePoints.Recovery = {
2 Enabled = false,
3 Duration = 3600,
4 Mode = 'hospital',
5 CountOffline = true,
6 RestorePoints = 100,
7}Enabled: turns the recovery period on. Whenfalseor missing, reaching the minimum has no effect.Duration: recovery length in real seconds (minimum 60).3600is one hour,86400is 24 hours.Mode:'hospital'holds the character at the nearest hospital spawn, frozen and invincible, with controls and inventory disabled and an on-screen countdown.'logout'returns the player to character selection.'kick'disconnects the player with the remaining time.CountOffline:truecounts real time, also while the player is offline.falsecounts only time spent online in recovery. Only applies to'hospital'; the other modes always count real time.RestorePoints: life points the character gets back when recovery ends.
Raising life points above MinPoints (/addlifepoints or the AddLifePoints export) ends the recovery immediately, without applying RestorePoints. In hospital mode, respawns during recovery always land at a hospital.
In 'logout' mode the client first calls RecoveryHandlers.Logout() in open/client/recovery_handlers.lua, which supports ml_multicharacter. If the character is still loaded after a few seconds, the framework logout runs, then a kick. Edit that function to use a different character selection resource.
Inventory wipe
1Config.InventoryWipe = {
2 Enabled = true,
3 Whitelist = {
4 ['water'] = true,
5 ['id_card'] = true,
6 ['driver_license'] = true,
7 ['money'] = true,
8 ['phone'] = true,
9 },
10}Enabled: wipe non-whitelisted inventory on respawn.Whitelist: items kept on respawn; everything else is removed. The shipped list is a survival-server example, replace it with your server's protected items (IDs, licenses, owned weapons, blueprints).
Revive and hospital reset
1Config.ReviveSettings = {
2 RestoreHealth = true,
3 RestoreBlood = true,
4 ResetBleeding = true,
5 ClearInjuries = true,
6 ClearFractures = true,
7 ClearCasts = true,
8 ClearDiseases = true,
9 ResetHungerThirst = true,
10}
11
12Config.HospitalReset = {
13 RestoreHealth = true,
14 RestoreBlood = true,
15 ResetBleeding = true,
16 ClearInjuries = true,
17 ClearFractures = true,
18 ClearCasts = true,
19 ClearDiseases = true,
20 ResetHungerThirst = true,
21}ReviveSettings: Defaults applied on admin revives and calls toRevivePlayer. The export accepts a partial settings table to override fields for one call.HospitalReset: Defaults applied on hospital/safe-zone respawn and calls toHospitalRespawn. The export accepts a partial settings table to override fields for one call.
Set ClearFractures / ClearCasts / ClearDiseases to false to keep fractures, casts, and diseases after hospital treatment. Medics can then treat fractures and diseases with casts and antibiotics.
1Config.ReviveSettings.ClearDiseases = false
2Config.HospitalReset.ClearDiseases = falseThese set the global defaults for their respective flows. To keep diseases for a single call without changing the configuration, pass only the field to override:
1local ok, reason = exports.ml_healthsystem:RevivePlayer(source, { ClearDiseases = false })1local ok, reason = exports.ml_healthsystem:HospitalRespawn(source, { ClearDiseases = false })Both exports accept the eight boolean fields listed above. Omitted fields inherit Config.ReviveSettings for RevivePlayer or Config.HospitalReset for HospitalRespawn. Neither export modifies the configuration or the supplied table. RestoreHealth = false keeps pre-reset health clamped between 101 and Config.MaxHealth. Preserved diseases, low blood volume, and bleeding continue their normal effects.
ClearFractures = false with ClearInjuries = true causes a "ped slow after respawn / cannot sprint" bug because the leg fracture activates the limp clipset. Keep ClearFractures = true unless your medical workflow applies a cast post-respawn.
Database Tables
The resource creates three tables automatically on first start (no manual SQL):
ml_healthsystem: persisted per-character medical state (identifier,health_dataLONGTEXT). Live in-session state runs on live states; this table is the save/load snapshot.ml_health_tents: placed respawn tents bound to their owner.ml_lifepoints: per-character life points and the recovery timer (recovery_until,recovery_left).