forked from Simnation/Main
114 lines
No EOL
3.2 KiB
Lua
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) ]] |