🖥️Code Snippets
Here are some examples of how you can integrate with specific scripts
QBCore: qb-ambulancejob custom checkin event
If you are using qb-ambulancejob
, their eventqb-ambulancejob:checkin
does a distance check in their check-in event that will prevent the player from checking in when dropped off outside by the AI EMS because they are too far from the checkin location.
The simplest way to fix this is to add a new checkin event that we will call from wp-ai-ems.
Here is an example of what a new event could look like that works with qb-ambulancejob.
-- This will check the player into the hospital that they spawn near
-- The hospitalIndex provided by wp-ai-ems must match the index for the hospital locations defined in this script
RegisterNetEvent('qb-ambulancejob:aiems-checkin', function(hospitalIndex)
QBCore.Functions.Progressbar("hospital_checkin", Lang:t('progress.checking_in'), 2000, false, true, {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
}, {}, {}, {}, function() -- Done
-- Gets a bed that is not occupied at this hospital to place the player in
local bedId = getClosestAvailableBed(hospitalIndex)
if bedId then
TriggerServerEvent("hospital:server:SendToBed", bedId, true, hospitalIndex)
hospitalLocation = hospitalIndex
-- HospitalOutfit() -- Optional if you have this defined
else
QBCore.Functions.Notify(Lang:t('error.beds_taken'), "error")
end
end)
end)
PS-MDT: Dispatch AI EMS on downed person alerts from the MDT

At the bottom of
client/main.lua
add:
-- Custom Waypoint Events
RegisterNUICallback("dispatchLocalEMS", function(data, cb)
local targetSourceId = data.playerSource
TriggerServerEvent('ps-mdt:server:dispatchLocalEMS', targetSourceId)
cb(true)
end)
At the bottom of
server/main.lua
add:
-- Custom Waypoint Events
-- Handles dispatching AI EMS to a target downed player
RegisterNetEvent("ps-mdt:server:dispatchLocalEMS", function(targetSourceId)
local src = source
local targetPlayer = QBCore.Functions.GetPlayer(targetSourceId)
local isTargetPlayerDead = targetPlayer.PlayerData.metadata["isdead"] or targetPlayer.PlayerData.metadata["inlaststand"]
if isTargetPlayerDead then
local isInstantDispatch = true
TriggerEvent('wp-ai-ems:server:DispatchAIEMS', targetSourceId, isInstantDispatch)
TriggerClientEvent('QBCore:Notify', src, 'Local EMS dispatched')
else
TriggerClientEvent('QBCore:Notify', src, 'Patient no longer needs EMS', 'error')
end
end)
In
ui/app.js
we need to make several changes to add the "Dispatch Local EMS" context menu itemLook for
$(".contextmenu").on("click", ".attached-units", function () {...}
and under that code block add:// Waypoint custom code for dispathcing AI EMS $(".contextmenu").on("click", ".dispatch-local-ems", function () { const playerSource = $(this).data("playersource"); $.post( `https://${GetParentResourceName()}/dispatchLocalEMS`, JSON.stringify({ playerSource: playerSource, }) ); });
Look for
const canRespond = $(this).data("canrespond");
and add these lines beneath:const playersource = $(this).data("playersource"); const dispatchcodename = $(this).data("dispatchcodename");
Look for
if (canRespond == true) {...} elseif (canRespond == false) { ... }
, after the if/else we want to add another conditional to make it only render this new item if its for civdown dispatchcodenameif (dispatchcodename == "civdown") { args = [ ...args, { className: "dispatch-local-ems", icon: "fa-solid fa-ambulance", text: "Dispatch Local EMS", info: callId, playersource, status: "", }, { className: "notify-ems-enroute", icon: "fa-solid fa-medkit", text: "Notify EMS enroute", info: callId, playersource, status: "", }, ]; }
We now need to add data attributes onto the items so we can pluck off the
playersource
anddispatchcodenames
. Look forDispatchItem =
there should be 4 results. Add the following attributes onto each of them:data-playersource=${value.source} data-dispatchcodename=${value.dispatchcodename}
Look for
<li class="contextmenu-item ${value.className}" data-info="${value.info}" data-status="${value.status}
and update to include the new attribute, you should now have:<li class="contextmenu-item ${value.className}" data-info="${value.info}" data-status="${value.status}" data-playersource="${value.playersource}">
In
ui/style.css
add these lines:dispatch-local-ems:hover { background-color: rgb(156, 156, 156); } .notify-ems-enroute:hover { background-color: rgb(156, 156, 156); } .respond-call:hover { background-color: rgb(156, 156, 156); }
Wasabi Ambulance Integration
If you use wasabi_ambulance and want to dispatch AI EMS as part of the distress signal, follow these snippets.
In
cl_customize.lua
find theSendDistressSignal
function and add thisTriggerServerEvent('hospital:server:RequestEMS')
.SendDistressSignal = function() -- Edit distress signal to implement custom dispatch TriggerEvent('wasabi_bridge:notify', Strings.distress_sent_title, Strings.distress_sent_desc, 'success') TriggerServerEvent('hospital:server:RequestEMS') local ped = cache.ped ...
In
sv_customize.lua
add the following new event.-- If there are no active EMS online, dispatch AI EMS RegisterNetEvent('hospital:server:RequestEMS', function() local src = source local players = GetPlayers() local isActiveEMS = false for _, playerIdString in ipairs(players) do local playerId = tonumber(playerIdString) local player = wsb.getPlayer(playerId) if player and wsb.hasGroup(playerId, Config.ambulanceJobs) then if wsb.framework == 'qb' and player.PlayerData and player.PlayerData.job.onduty then isActiveEMS = true break else isActiveEMS = true break end end end if not isActiveEMS then -- Change this to true if you want to instantly dispatch EMS local isInstantDispatch = false TriggerClientEvent('wp-ai-ems:client:DispatchAIEMS', src, isInstantDispatch) end end)
Ensure that you have updated
Config.HospitalLocations
andConfig.DefaultHospital
to match the keys defined inwasabi-ambulance config.lua - Config.Locations
.As of writing this (5/8/24), the key values should be updated to strings, where the string matches the hospital names you've configured.
Example:
Config.DefaultHospital = "Pillbox" Config.HospitalLocations = { ["hospital"] = { ["Pillbox"] = { ["name"] = "Pillbox", ...
Update
Config.HospitalCheckinEvent
toConfig.HospitalCheckinEvent = "wasabi_ambulance:hospitalCheckIn"
Last updated