mirror of
https://github.com/esx-framework/esx_core.git
synced 2026-08-30 17:58:54 +00:00
5aa50f5ac7
The event was added to esx_status late 2018 but never utilised anywhere; using it here drops ms to 0.0 at all times. #### Note: This event can and should also be used in various HUDs to improve performance. Many of them use 500ms threaded loops, despite status only updating every 1s by default. They also use individual event callbacks to retrieve each status value, while each value is already being sent in the event.
135 lines
3.7 KiB
Lua
135 lines
3.7 KiB
Lua
ESX = nil
|
|
local IsDead = false
|
|
local IsAnimated = false
|
|
|
|
Citizen.CreateThread(function()
|
|
while ESX == nil do
|
|
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
|
|
Citizen.Wait(0)
|
|
end
|
|
end)
|
|
|
|
AddEventHandler('esx_basicneeds:resetStatus', function()
|
|
TriggerEvent('esx_status:set', 'hunger', 500000)
|
|
TriggerEvent('esx_status:set', 'thirst', 500000)
|
|
end)
|
|
|
|
RegisterNetEvent('esx_basicneeds:healPlayer')
|
|
AddEventHandler('esx_basicneeds:healPlayer', function()
|
|
-- restore hunger & thirst
|
|
TriggerEvent('esx_status:set', 'hunger', 1000000)
|
|
TriggerEvent('esx_status:set', 'thirst', 1000000)
|
|
|
|
-- restore hp
|
|
local playerPed = PlayerPedId()
|
|
SetEntityHealth(playerPed, GetEntityMaxHealth(playerPed))
|
|
end)
|
|
|
|
AddEventHandler('esx:onPlayerDeath', function()
|
|
IsDead = true
|
|
end)
|
|
|
|
AddEventHandler('esx:onPlayerSpawn', function(spawn)
|
|
if IsDead then
|
|
TriggerEvent('esx_basicneeds:resetStatus')
|
|
end
|
|
|
|
IsDead = false
|
|
end)
|
|
|
|
AddEventHandler('esx_status:loaded', function(status)
|
|
|
|
TriggerEvent('esx_status:registerStatus', 'hunger', 1000000, '#CFAD0F', function(status)
|
|
return Config.Visible
|
|
end, function(status)
|
|
status.remove(100)
|
|
end)
|
|
|
|
TriggerEvent('esx_status:registerStatus', 'thirst', 1000000, '#0C98F1', function(status)
|
|
return Config.Visible
|
|
end, function(status)
|
|
status.remove(75)
|
|
end)
|
|
|
|
end)
|
|
|
|
AddEventHandler('esx_status:onTick', function(data)
|
|
local playerPed = PlayerPedId()
|
|
local prevHealth = GetEntityHealth(playerPed)
|
|
local health = prevHealth
|
|
|
|
for i=1, #data do
|
|
if data[i].name == 'hunger' and data[i].percent == 0 then
|
|
if prevHealth <= 150 then
|
|
health = health - 5
|
|
else
|
|
health = health - 1
|
|
end
|
|
elseif data[i].name == 'thirst' and data[i].percent == 0 then
|
|
if prevHealth <= 150 then
|
|
health = health - 5
|
|
else
|
|
health = health - 1
|
|
end
|
|
end
|
|
end
|
|
|
|
if health ~= prevHealth then SetEntityHealth(playerPed, health) end
|
|
end)
|
|
|
|
AddEventHandler('esx_basicneeds:isEating', function(cb)
|
|
cb(IsAnimated)
|
|
end)
|
|
|
|
RegisterNetEvent('esx_basicneeds:onEat')
|
|
AddEventHandler('esx_basicneeds:onEat', function(prop_name)
|
|
if not IsAnimated then
|
|
prop_name = prop_name or 'prop_cs_burger_01'
|
|
IsAnimated = true
|
|
|
|
Citizen.CreateThread(function()
|
|
local playerPed = PlayerPedId()
|
|
local x,y,z = table.unpack(GetEntityCoords(playerPed))
|
|
local prop = CreateObject(GetHashKey(prop_name), x, y, z + 0.2, true, true, true)
|
|
local boneIndex = GetPedBoneIndex(playerPed, 18905)
|
|
AttachEntityToEntity(prop, playerPed, boneIndex, 0.12, 0.028, 0.001, 10.0, 175.0, 0.0, true, true, false, true, 1, true)
|
|
|
|
ESX.Streaming.RequestAnimDict('mp_player_inteat@burger', function()
|
|
TaskPlayAnim(playerPed, 'mp_player_inteat@burger', 'mp_player_int_eat_burger_fp', 8.0, -8, -1, 49, 0, 0, 0, 0)
|
|
|
|
Citizen.Wait(3000)
|
|
IsAnimated = false
|
|
ClearPedSecondaryTask(playerPed)
|
|
DeleteObject(prop)
|
|
end)
|
|
end)
|
|
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('esx_basicneeds:onDrink')
|
|
AddEventHandler('esx_basicneeds:onDrink', function(prop_name)
|
|
if not IsAnimated then
|
|
prop_name = prop_name or 'prop_ld_flow_bottle'
|
|
IsAnimated = true
|
|
|
|
Citizen.CreateThread(function()
|
|
local playerPed = PlayerPedId()
|
|
local x,y,z = table.unpack(GetEntityCoords(playerPed))
|
|
local prop = CreateObject(GetHashKey(prop_name), x, y, z + 0.2, true, true, true)
|
|
local boneIndex = GetPedBoneIndex(playerPed, 18905)
|
|
AttachEntityToEntity(prop, playerPed, boneIndex, 0.12, 0.028, 0.001, 10.0, 175.0, 0.0, true, true, false, true, 1, true)
|
|
|
|
ESX.Streaming.RequestAnimDict('mp_player_intdrink', function()
|
|
TaskPlayAnim(playerPed, 'mp_player_intdrink', 'loop_bottle', 1.0, -1.0, 2000, 0, 1, true, true, true)
|
|
|
|
Citizen.Wait(3000)
|
|
IsAnimated = false
|
|
ClearPedSecondaryTask(playerPed)
|
|
DeleteObject(prop)
|
|
end)
|
|
end)
|
|
|
|
end
|
|
end)
|