QBCore Installation
Install oxide-ems on QBCore — items, disabling qb-ambulancejob, and what the QBCore compatibility shim keeps working.
QBCore-specific steps for oxide-ems. Follow Installation first — this page only covers what differs on QBCore.
Disable qb-ambulancejob
oxide-ems replaces it entirely. Running both will fight over the death state.
If you start resources one by one in server.cfg, remove or comment out the line:
# ensure qb-ambulancejobIf you start a whole folder (ensure [qb]), the resource starts because it is inside that folder, so removing a line is not enough. Move the folder out:
resources/[qb]/qb-ambulancejob -> resources/[disabled]/qb-ambulancejobDo not add ensure [disabled] to your config. Anything in there stays off.
oxide-ems declares provide 'qb-ambulancejob', so scripts that check whether that resource exists keep working after it is gone.
Do not delete qb-core. QBCore itself has no death handling of its own — only two metadata fields, isdead and inlaststand, that qb-ambulancejob used to maintain. oxide-ems maintains them now, so qb-inventory, qb-phone, qb-hud and qb-radialmenu keep behaving correctly around death.
What oxide-ems takes over on QBCore
QBCore is the framework where oxide-ems inherits the most, because qb-ambulancejob owned the whole death loop and nothing in qb-core replaces it.
oxide-ems runs:
- the downed (laststand) phase and its bleedout timer
- the dead phase and the hold-E respawn
- the downed screen overlay
- the hospital respawn teleport
- the
isdead/inlaststandmetadata
Timings for all of that live under Field Care → Downed in /ems settings.
Downed players can be finished off. A player in laststand is resurrected at 150 health and is not invincible, which matches how stock qb-ambulancejob behaved. Further damage kills them properly.
Register the items
Open qb-core/shared/items.lua and paste these into the item list. These are the exact names oxide-ems looks for — do not rename them:
-- Oxide EMS
['medical_bag'] = { name = 'medical_bag', label = 'Medical Bag', weight = 3000, type = 'item', image = 'medical_bag.png', unique = true, useable = true, shouldClose = true, description = 'A packed EMS bag. Use it to unpack the supplies inside.' },
['medical_bandage'] = { name = 'medical_bandage', label = 'Medical Bandage', weight = 100, type = 'item', image = 'medical_bandage.png', unique = false, useable = true, shouldClose = true, description = 'A sterile bandage used to stop bleeding.' },
['medical_splint'] = { name = 'medical_splint', label = 'Splint', weight = 300, type = 'item', image = 'medical_splint.png', unique = false, useable = true, shouldClose = true, description = 'A rigid splint used to set fractures.' },
['medical_surgical_kit'] = { name = 'medical_surgical_kit', label = 'Surgical Kit', weight = 1500, type = 'item', image = 'medical_surgical_kit.png', unique = false, useable = false, shouldClose = true, description = 'A sterile kit required for surgical procedures.' },oxide-medical needs three cure items as well. If you are installing both (and you should be), add these too:
-- Oxide Medical
['antacid'] = { name = 'antacid', label = 'Antacid', weight = 100, type = 'item', image = 'antacid.png', unique = false, useable = true, shouldClose = true, description = 'Relieves nausea and stomach sickness.' },
['antibiotics'] = { name = 'antibiotics', label = 'Antibiotics', weight = 100, type = 'item', image = 'antibiotics.png', unique = false, useable = true, shouldClose = true, description = 'Treats bacterial infections.' },
['antiviral'] = { name = 'antiviral', label = 'Antiviral', weight = 100, type = 'item', image = 'antiviral.png', unique = false, useable = true, shouldClose = true, description = 'Treats viral infections.' },Weights, labels and descriptions are sensible defaults — change them to taste. The item names must stay as written.
Items you already have
QBCore ships firstaid, bandage, ifaks and painkillers. oxide-ems re-registers firstaid, bandage and ifaks as usable items, so there is nothing to add — but check all four are actually in qb-core/shared/items.lua. Trimmed or hand-written item lists drop them more often than you would expect, and a missing entry is silent: the item does nothing and no error appears anywhere.
ifaks and bandage heal the same small amount stock QBCore did, and ifaks still relieves stress through qb-hud.
painkillers belongs to oxide-medical, which uses it as the cure for fever. Only one resource can own a usable item, so oxide-ems leaves it alone whenever oxide-medical is installed. Nothing is lost by that: the damage-effect suppression painkillers used to do belonged to qb-ambulancejob's own wound and bleed system, which left with the resource, so there is no wound state left for it to act on. Injuries on a QBCore server running oxide-ems are tracked by oxide-medical and treated by medics.
Without oxide-medical installed, oxide-ems registers painkillers as stock did. To take it back with oxide-medical installed, set ClaimPainkillers = true under ['qb-core'] in shared/config/compat.lua and restart — the fever cure stops working when you do.
firstaid is also the default item medics need to revive and stabilize. Change it under Field Care in /ems settings, or enter none there to require no item at all.
Nothing else is missing
Every item in the medical bag's default contents is either registered in the step above or already stock on QBCore. The bag also hands over one firstaid — it works out your framework's first-aid item automatically, so there is no extra item to register.
Copy the images
Copy every .png from oxide-ems/itemimages/ into:
qb-inventory/html/images/That covers medical_bag, medical_bandage, medical_splint, medical_surgical_kit, antacid, antibiotics and antiviral. Stock QBCore items such as firstaid, bandage and painkillers already have their own images.
What the QBCore shim keeps working
You should not have to change any other resource. These surfaces are re-provided:
| Surface | Who uses it |
|---|---|
hospital:server:emergencyAlert | qb-radialmenu's dead-radial EMS button |
hospital:server:ambulanceAlert | Police resources relaying "officer down" |
hospital:client:CheckStatus / TreatWounds / RevivePlayer | qb-radialmenu EMS options |
hospital:client:Revive / KillPlayer / adminHeal | qb-adminmenu, txAdmin |
hospital:client:SetLaststand | o-link's DownPlayer — stock QBCore never registered this, so this is new |
hospital:server:SetDeathStatus / SetLaststandStatus | Anything reading the death metadata |
hospital:server:resetHungerThirst | The admin heal path |
hospital:GetDoctors callback | Robbery scripts and anything gating on medic count |
exports['oxide-ems']:GetDoctorCount() | The replacement for qb-ambulancejob's export |
txAdmin:events:healedPlayer | The txAdmin heal button |
Usable items ifaks, bandage, firstaid (and painkillers without oxide-medical) | Players |
/revive, /aheal, /kill, /status, /heal, /revivep | Admins and medics |
One deliberate improvement over stock: medical items are consumed only when the action finishes, not the moment they are used. Cancelling a bandage no longer eats the bandage.
Set up the EMS job
The department's internal name in /ems admin must match a job in qb-core/shared/jobs.lua. Stock QBCore ships an ambulance job, so naming the department ambulance needs no change.
If you name the department something else, add a matching job to qb-core/shared/jobs.lua first, so other QBCore resources recognise it.
Grades in /ems admin should line up with the grades on that QBCore job.
Restart the whole server
Not restart oxide-ems. The stretcher prop is streamed and needs a full server start to register. See Installation — Restart the whole server.
Verification on QBCore
qb./ems admin opens; create a department named ambulance with grades and a facility.G sends a distress signal.qb-inventory behaves correctly while you are dead — the metadata is being kept truthful.qb-radialmenu while downed and confirm the EMS alert button still works./revive and confirm you are healed and standing.medical_bag and confirm the supplies arrive.