1
0
mirror of https://github.com/citizenfx/cfx-server-data.git synced 2025-01-10 15:43:00 +08:00
cfx-server-data/system/virtenv_init.lua
2016-12-15 13:40:07 +01:00

100 lines
2.4 KiB
Lua

local execQueue = {}
local execQueueArgNum = 1
local execResults = {}
local curRoutine
_i = { _a = '_i' }
_f = { _a = '_f' }
function GetResult(argNum)
if not execResults[argNum] then
if #execQueue > 0 then
execQueue.idx = getIdx()
curRoutine = coroutine.running()
coroutine.yield()
execQueue = {}
end
end
local r = execResults[argNum]
execResults[argNum] = nil
return r
end
function HandleResults(results)
for k, v in pairs(results) do
execResults[k] = v
end
if coroutine.status(curRoutine) == 'dead' then
return
end
local success, err = coroutine.resume(curRoutine)
if success then
SendEvents({ getSource = getSource })
else
print(err)
end
end
function SendEvents(env)
TriggerClientEvent('svRpc:run', getSource(), 10, execQueue)
end
function CallNative(hash, ...)
local arguments = {}
local returns = {}
local arg = {...}
for i, v in ipairs(arg) do
local a = v
if type(v) == 'table' then
if v._a then
if v._a == '_i' or v._a == '_f' then
a._i = execQueueArgNum
execQueueArgNum = execQueueArgNum + 1
local fakeRetVal = {
_a = '_z',
_i = a._i
}
-- this will only work in Lua 5.2+; as metamethod yielding got added there
setmetatable(fakeRetVal, {
__call = function()
if not fakeRetVal._value then
fakeRetVal._value = GetResult(fakeRetVal._i)
end
return fakeRetVal._value
end
})
table.insert(returns, fakeRetVal)
end
end
end
table.insert(arguments, a)
end
table.insert(execQueue, {
h = hash,
a = arguments
})
return table.unpack(returns)
end
function PrintStringWithLiteralString(...) return CallNative(0x3F89280B, ...) end
function PrintStringWithLiteralStringNow(...) return CallNative(0xCA539D6, ...) end
function GetCharCoordinates(...) return CallNative(0x2B5C06E6, ...) end
function GetPlayerChar(...) return CallNative(0x511454A9, ...) end