简体   繁体   中英

GetPlayerPed(-1) pointing to nil on FiveM ESX LUA Coding

I am trying to program a FiveM LUA ESX script which essentially allows players to "/previve" when there are no EMS on. This makes them do an animation, and revives the player. However, the issue is, for some reason GetPlayerPed(-1) returns nil, when it's supposed to return the ped of whoever issued the /previve command.

Here is the server file that is producing the error:

ESX=nil
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)

ESX.RegisterCommand('previve','user', function(playerId)
local src=GetPlayerPed(-1)
RevivePlayer(src)
end)

And here is the client file with the RevivePlayer function:

ESX=nil
Citizen.CreateThread(function()
    while ESX==nil do
        TriggerEvent('esx:getSharedObject',function(obj) ESX=obj end)
        Citizen.Wait(0)
    end
end)





    function RevivePlayer(src)
    
    local closestPlayer, closestDistance = ESX.Game.GetClosestPlayer(src) 
    if closestPlayer == -1 or closestDistance > 1.0 then
        ESX.ShowNotification(_U('no_players'))
    elseif closestPlayer ~=-1 and closestDistance<1.0 and EmsCount==0 then
            local closestPlayerPed = GetPlayerPed(closestPlayer)

            if IsPedDeadOrDying(closestPlayerPed, 1) then
                local playerPed = PlayerPedId()
                local lib, anim = 'mini@cpr@char_a@cpr_str', 'cpr_pumpchest'
                ESX.ShowNotification(_U('revive_inprogress'))

                for i=1, 15 do
                    Citizen.Wait(900)

                    ESX.Streaming.RequestAnimDict(lib, function()
                        TaskPlayAnim(playerPed, lib, anim, 8.0, -8.0, -1, 0, 0.0, false, false, false)
                    end)
                end

                
                TriggerServerEvent('esx_ambulancejob:revive', GetPlayerServerId(closestPlayer))
            else
                ESX.ShowNotification(_U('player_not_unconscious'))
            end

        end
    end


    Citizen.CreateThread(function()
        EmsCount=0
        local xPlayer = ESX.GetExtendedPlayers('job', 'ambulance') -- Returns xPlayers with the ambulance job
         for _, xPlayer in pairs(xPlayer) do
            EmsCount=EmsCount+1
        end
        return EmsCount
    end)
    

Here is the error produced:

[      script:previve] SCRIPT ERROR: @previve/server/previve-s.lua:6: attempt to call a nil value (global 'RevivePlayer')
[      script:previve] > ref (@previve/server/previve-s.lua:6)
[      script:previve] > ref (@es_extended/server/functions.lua:130)

Any advice on how to fix this?

Thank you very much :)

Which version of es_extended are you using?

If you are using the latest version this should work.

Server Side :

ESX=nil
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)

ESX.RegisterCommand('previve', 'user', function(playerId, args, showError)
    TriggerClientEvent('previve:RevivePlayer', playerId)
end, false, {help = 'Help text to use the command'})

Client Side :

ESX=nil

Citizen.CreateThread(function()
    while ESX == nil do
        TriggerEvent('esx:getSharedObject',function(obj) ESX=obj end)
        Citizen.Wait(0)
    end
end)

RegisterNetEvent('previve:RevivePlayer')
AddEventHandler('previve:RevivePlayer', function()
    local playerPed = PlayerPedId()
    local playerCoords = GetEntityCoords(playerPed)
    local closestPlayer, closestDistance = ESX.Game.GetClosestPlayer(playerCoords)

    if closestPlayer == -1 or closestDistance > 1.0 then
        ESX.ShowNotification(_U('no_players'))
    elseif closestPlayer ~= -1 and closestDistance < 1.0 and EmsCount == 0 then
        local closestPlayerPed = GetPlayerPed(closestPlayer)

        if IsPedDeadOrDying(closestPlayerPed, 1) then
            local lib, anim = 'mini@cpr@char_a@cpr_str', 'cpr_pumpchest'

            ESX.ShowNotification(_U('revive_inprogress'))

            for i=1, 15 do
                Citizen.Wait(900)

                ESX.Streaming.RequestAnimDict(lib, function()
                    TaskPlayAnim(playerPed, lib, anim, 8.0, -8.0, -1, 0, 0.0, false, false, false)
                end)
            end

            TriggerServerEvent('esx_ambulancejob:revive', GetPlayerServerId(closestPlayer))
        else
            ESX.ShowNotification(_U('player_not_unconscious'))
        end
    end
end)

The last function must be on the server side.

Citizen.CreateThread(function()
    EmsCount = 0
    for _,xPlayer in pairs(ESX.GetExtendedPlayers('job', 'ambulance')) do
        EmsCount = EmsCount + 1
    end
    return EmsCount
end)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM