---
description: A lot of handlers/functions are available to you in cl_open.lua.
---

# Event/Functions

## Client

<pre class="language-lua"><code class="lang-lua">function DisableControls()
    -- List of controls here: https://docs.fivem.net/docs/game-references/controls/
    DisableAllControlActions(0)
    EnableControlAction(0, 1, true)
    EnableControlAction(0, 2, true)
    EnableControlAction(0, 245, true)
    EnableControlAction(0, 0, true)
    EnableControlAction(0, 322, true)
    EnableControlAction(0, 288, true)
    EnableControlAction(0, 213, true)
    EnableControlAction(0, 249, true)
    EnableControlAction(0, 46, true)
    EnableControlAction(0, 47, true)
    EnableControlAction(0, 33, true)
    EnableControlAction(0, 32, true)
end

function DispatchAlert()
    -- Triggered when a player presses E to alert ems. Cooldown of 2 minutes between calls.
    local data = exports['cd_dispatch']:GetPlayerInfo()
    TriggerServerEvent('cd_dispatch:AddNotification', {
        job_table = {'police', 'ambulance'}, 
        coords = data.coords,
        title = 'Civilian Down',
        message = 'A '..data.sex..' is requesting medical at '..data.street, 
        flash = 1,
        unique_id = data.unique_id,
        sound = 1,
        blip = { sprite = 431, scale = 1.2, colour = 3, flashes = false, text = '911 - Civilian Down', time = 5, radius = 0, }
    })
end

function dropBlood(coords)
    -- I grabbed this from qb-ambulancejob incase people still needed it. Will get triggered everytime a blood splat is on the floor.
    -- If you don't want to use this function, you can just leave it empty.
    TriggerServerEvent('evidence:server:CreateBloodDrop', PlayerData.citizenid, PlayerData.metadata.bloodtype, coords)
end

function preventLogging()
    -- This function will be called and is used to prevent death logs. Use case as an example is if you're in pug-paintball or something. See below:
    -- You'll be returning a true value to cancel the logging.
    if exports["pug-paintball"]:IsInPaintball() then
        return true -- This is just an example. You can remove this, add your own but keep the return false at the bottom.
    end

    return false
end

AddEventHandler('randol_medical:onPlayerDeath', function()
    -- gets triggered on death.
    if not LocalPlayer.state.invBusy then
        LocalPlayer.state:set('invBusy', true, true)
    end
    if not LocalPlayer.state.inv_busy then
        LocalPlayer.state:set('inv_busy', true, false)
    end
end)

AddEventHandler('randol_medical:onPlayerLastStand', function()
    -- gets triggered on laststand
    if not LocalPlayer.state.invBusy then
        LocalPlayer.state:set('invBusy', true, true)
    end
    if not LocalPlayer.state.inv_busy then
        LocalPlayer.state:set('inv_busy', true, false)
    end
end)

AddEventHandler('randol_medical:onCheckIn', function()
    -- Triggered when a player checks in/third eyes a bed.
    TriggerEvent('police:client:DeEscort')
end)

AddEventHandler('randol_medical:onRevive', function()
    -- gets triggered on revive
    if LocalPlayer.state.invBusy then
        LocalPlayer.state:set('invBusy', false, true)
    end
    if LocalPlayer.state.inv_busy then
        LocalPlayer.state:set('inv_busy', false, false)
    end
    TriggerEvent('police:client:DeEscort')
    TriggerServerEvent('evidence:server:RemoveNetPedImpacts') -- R14 Evidence thingy.
end)

-- Local player states which can be called across resources
<strong>if LocalPlayer.state.dead then
</strong><strong>    print('do something, player is dead')
</strong><strong>end
</strong>
if LocalPlayer.state.laststand then
    print('do something, player is in last stand')
end

<strong>if LocalPlayer.state.isInHospitalBed then
</strong>    print('player is in hospital bed')
end

if LocalPlayer.state.knockedOut then
    print('player is knocked tf out')
end

<strong>if LocalPlayer.state.bleeding > 0 then
</strong><strong>    print(LocalPlayer.state.bleeding) -- Prints the player's bleed level
</strong><strong>end
</strong>
-- Event handlers if you wanna use radial menu.
AddEventHandler('randol_medical:reviveNearestPlayer', function()
    reviveNearestPlayer()
end)

AddEventHandler('randol_medical:healNearestPlayer', function()
    healNearestPlayer()
end)

AddEventHandler('randol_medical:viewInjuries', function()
    viewInjuries()
end)

AddEventHandler('randol_medical:toggleCheckins', function()
    toggleCheckins()
end)

AddEventHandler('randol_medical:forceWalkNear', function()
    forceWalkNear()
end)

AddEventHandler('randol_medical:aiMedicCalled', function()
    -- gets triggered when an ai medical is called.
end)

RegisterNetEvent('hospital:client:Revive', function() revivePlayer() end)
RegisterNetEvent('esx_ambulancejob:revive', function() revivePlayer() end)
RegisterNetEvent('qbx_medical:client:playerRevived', function() revivePlayer() end)

function allowBleeding()
    -- This function will be called and is used to prevent bleeding. Use case as an example is if you're in pug-paintball or something. See below:
    -- You'll be returning a false value to cancel the bleeding being set.
    if GetResourceState('pug-paintball') == 'started' and exports["pug-paintball"]:IsInPaintball() then
        return false -- This is just an example. You can remove this, add your own but keep the return true at the bottom.
    end

    -- If you want to disable bleeding everywhere, you can just return false and remove the above portion.
    return true -- return true otherwise.
end

function preventKnockout()
     -- Just an example. If you want to avoid knockouts happening whilst using third party scripts, you must define something in that script and call it here
     -- to return true
    if LocalPlayer.state.isBoxing then -- EXAMPLE.
        return true
    end

    return false
end
</code></pre>

## Server

```lua
-- This handles reviving from the txadmin menu (sv_open.lua)
AddEventHandler('txAdmin:events:healedPlayer', function(eventData)
    if GetInvokingResource() ~= 'monitor' or type(eventData) ~= 'table' or type(eventData.id) ~= 'number' then
        return
    end
    TriggerClientEvent('randol_medical:client:revivePlayer', eventData.id)
end)

function PayForRevive(src)
    -- You can use this to pay the player or send it to a business account.
    local player = GetPlayer(src)
    if not player then return end

    addMoney(player, 'bank', Server.PayPerRevive.amount)
    DoNotification(src, ('You received $%s for treating the patient.'):format(Server.PayPerRevive.amount))
end

RegisterNetEvent('prison:server:SetJailStatus', function(jailTime)
     -- [Experimental] Using this qb-prison server event to set player state for in prison so I can tell where to respawn them.
     -- May need to adapt to third party prison resources.

     -- Would recommend using exports.randol_medical:SetJailState(src, true) for entering instead 
     -- and exports.randol_medical:SetJailState(src, false) for exiting in your actual prison script.
     
    local src = source
    if jailTime > 0 then
        Player(src).state:set('jail', true, true)
    else
        Player(src).state:set('jail', false, true)
    end
end)

function AddSocietyFunds(amount, reason)
    if amount == 0 then return end

    if GetResourceState('Renewed-Banking') == 'started' then
        return exports['Renewed-Banking']:addAccountMoney('ambulance', amount)
    end

    if GetResourceState('qb-banking') == 'started' then
        return exports['qb-banking']:AddMoney('ambulance', amount, reason)
    end

    if GetResourceState('qb-management') == 'started' then
        return exports['qb-management']:AddMoney('ambulance', amount)
    end

    -- local society = exports.esx_society:GetSociety('ambulance')
    -- if society then
    --     TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account)
    --         account.addMoney(amount)
    --     end)
    -- end

    lib.print.error('You must add your society funds export for function "AddSocietyFunds".')
end

function AutoBillPlayer(id, job) -- Adjust this yourself, example below.
    if not Server.AutoBill.enable then return end

    local player = GetPlayer(id)
    if not player then return end

    RemoveMoney(player, 'bank', Server.AutoBill.amount)

    if GetResourceState('Renewed-Banking') == 'started' then
        return exports['Renewed-Banking']:addAccountMoney(job, Server.AutoBill.amount)
    end

    if GetResourceState('qb-banking') == 'started' then
        return exports['qb-banking']:AddMoney(job, Server.AutoBill.amount, 'ems-bill')
    end

    if GetResourceState('qb-management') == 'started' then
        return exports['qb-management']:AddMoney(job, Server.AutoBill.amount)
    end

    -- local society = exports.esx_society:GetSociety('ambulance')
    -- if society then
    --     TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account)
    --         account.addMoney(amount)
    --     end)
    -- end

    lib.print.error('You must add your society funds export for function "AutoBillPlayer".')
end

 -- This is the revive event that can only be invoked from server side.
TriggerClientEvent('randol_medical:client:revivePlayer', source)
-- I have put the old qb-ambulance revive event in cl_open ('hospital:client:Revive') for compatability although i'd prefer not to use it.

-- Player states:
if Player(source).state.dead then
    print('player is dead')
end
```
