1
0
Fork 0
forked from Simnation/Main
Main/resources/[standalone]/utility_lib/client/functions/utilityNet_states.lua
2025-08-12 16:56:50 +02:00

114 lines
No EOL
3.2 KiB
Lua

EntitiesStates = {}
local function IsEntityStateLoaded(uNetId)
return EntitiesStates[uNetId] ~= -1
end
local function EnsureStateLoaded(uNetId)
if not IsEntityStateLoaded(uNetId) then
local start = GetGameTimer()
while not IsEntityStateLoaded(uNetId) do
if GetGameTimer() - start > 5000 then
error("WaitUntilStateLoaded: entity "..tostring(uNetId).." state loading timed out")
break
end
Citizen.Wait(1)
end
end
end
RegisterNetEvent("Utility:Net:UpdateStateValue", function(uNetId, key, value)
EnsureStateLoaded(uNetId)
if not EntitiesStates[uNetId] then
EntitiesStates[uNetId] = {}
end
EntitiesStates[uNetId][key] = value
end)
GetEntityStateValue = function(uNetId, key)
if not UtilityNet.GetEntityFromUNetId(uNetId) then -- If trying to get state of entity that isnt loaded
local start = GetGameTimer()
local entity = nil
while not entity do
entity = UtilityNet.InternalFindFromNetId(uNetId)
if GetGameTimer() - start > 2000 then
error("GetEntityStateValue: entity "..tostring(uNetId).." doesnt exist, attempted to retrieve key: "..tostring(key))
break
end
Citizen.Wait(1)
end
return ServerRequestEntityKey(uNetId, key)
else
EnsureStateLoaded(uNetId)
if not EntitiesStates[uNetId] then
warn("GetEntityStateValue: entity "..tostring(uNetId).." has no loaded states, attempted to retrieve key: "..tostring(key))
return
end
return EntitiesStates[uNetId][key]
end
end
ServerRequestEntityKey = function(uNetId, key)
local p = promise:new()
local event = nil
event = RegisterNetEvent("Utility:Net:GetStateValue"..uNetId, function(value)
RemoveEventHandler(event)
p:resolve(value)
end)
TriggerServerEvent("Utility:Net:GetStateValue", uNetId, key)
return Citizen.Await(p)
end
ServerRequestEntityStates = function(uNetId)
EntitiesStates[uNetId] = -1 -- Set as loading
local p = promise:new()
local event = nil
event = RegisterNetEvent("Utility:Net:GetState"..uNetId, function(states)
RemoveEventHandler(event)
p:resolve(states)
end)
TriggerServerEvent("Utility:Net:GetState", uNetId)
local states = Citizen.Await(p)
EntitiesStates[uNetId] = states or {}
end
exports("GetEntityStateValue", GetEntityStateValue)
--[[ RegisterNetEvent("Utility:Net:OnRender", function(uNetid, obj, model)
print("Attaching change handler to", uNetid)
Citizen.CreateThread(function()
while true do
local state = UtilityNet.State(uNetid)
if state.random then
DrawText3Ds(GetEntityCoords(obj), "key: "..state.random.key.." key2: "..state.random.key2)
if state.random.deep then
DrawText3Ds(GetEntityCoords(obj) + vec3(0.0, 0.0, 0.5), "deep: "..state.random.deep.deep2)
end
end
Citizen.Wait(1)
end
end)
UtilityNet.AddStateBagChangeHandler(uNetid, function(key, value)
print("Updated", key, value)
end)
end) ]]