mirror of
https://github.com/citizenfx/cfx-server-data.git
synced 2025-01-10 15:43:00 +08:00
290 lines
6.7 KiB
Lua
290 lines
6.7 KiB
Lua
|
-- local resource init stuff (similar to client resource_init)
|
||
|
RegisterInitHandler(function(initScript, isPreParse)
|
||
|
local env = {
|
||
|
_VERSION = _VERSION,
|
||
|
assert = assert,
|
||
|
error = error,
|
||
|
getmetatable = getmetatable,
|
||
|
ipairs = ipairs,
|
||
|
next = next,
|
||
|
pairs = pairs,
|
||
|
pcall = pcall,
|
||
|
print = print,
|
||
|
rawequal = rawequal,
|
||
|
rawget = rawget,
|
||
|
rawlen = rawlen,
|
||
|
rawset = rawset,
|
||
|
select = select,
|
||
|
setmetatable = setmetatable,
|
||
|
tonumber = tonumber,
|
||
|
tostring = tostring,
|
||
|
type = type,
|
||
|
xpcall = xpcall,
|
||
|
bit32 = {
|
||
|
arshift = bit32.arshift,
|
||
|
band = bit32.band,
|
||
|
bnot = bit32.bnot,
|
||
|
bor = bit32.bor,
|
||
|
btest = bit32.btest,
|
||
|
bxor = bit32.bxor,
|
||
|
extract = bit32.extract,
|
||
|
lrotate = bit32.lrotate,
|
||
|
lshift = bit32.lshift,
|
||
|
replace = bit32.replace,
|
||
|
rrotate = bit32.rrotate,
|
||
|
rshift = bit32.rshift
|
||
|
},
|
||
|
coroutine = {
|
||
|
create = coroutine.create,
|
||
|
resume = coroutine.resume,
|
||
|
running = coroutine.running,
|
||
|
status = coroutine.status,
|
||
|
wrap = coroutine.wrap,
|
||
|
yield = coroutine.yield
|
||
|
},
|
||
|
math = {
|
||
|
abs = math.abs,
|
||
|
acos = math.acos,
|
||
|
asin = math.asin,
|
||
|
atan = math.atan,
|
||
|
atan2 = math.atan2,
|
||
|
ceil = math.ceil,
|
||
|
cos = math.cos,
|
||
|
cosh = math.cosh,
|
||
|
deg = math.deg,
|
||
|
exp = math.exp,
|
||
|
floor = math.floor,
|
||
|
fmod = math.fmod,
|
||
|
frexp = math.frexp,
|
||
|
huge = math.huge,
|
||
|
ldexp = math.ldexp,
|
||
|
log = math.log,
|
||
|
max = math.max,
|
||
|
min = math.min,
|
||
|
modf = math.modf,
|
||
|
pi = math.pi,
|
||
|
pow = math.pow,
|
||
|
rad = math.rad,
|
||
|
random = math.random,
|
||
|
randomseed = math.randomseed,
|
||
|
sin = math.sin,
|
||
|
sinh = math.sinh,
|
||
|
sqrt = math.sqrt,
|
||
|
tan = math.tan,
|
||
|
tanh = math.tanh
|
||
|
},
|
||
|
string = {
|
||
|
byte = string.byte,
|
||
|
char = string.char,
|
||
|
dump = string.dump,
|
||
|
find = string.find,
|
||
|
format = string.format,
|
||
|
gmatch = string.gmatch,
|
||
|
gsub = string.gsub,
|
||
|
len = string.len,
|
||
|
lower = string.lower,
|
||
|
match = string.match,
|
||
|
rep = string.rep,
|
||
|
reverse = string.reverse,
|
||
|
sub = string.sub,
|
||
|
upper = string.upper
|
||
|
},
|
||
|
table = {
|
||
|
concat = table.concat,
|
||
|
insert = table.insert,
|
||
|
pack = table.pack,
|
||
|
remove = table.remove,
|
||
|
sort = table.sort,
|
||
|
unpack = table.unpack
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TriggerEvent('getResourceInitFuncs', isPreParse, function(key, cb)
|
||
|
env[key] = cb
|
||
|
end)
|
||
|
|
||
|
local pr = print
|
||
|
|
||
|
if not isPreParse then
|
||
|
env.server_scripts = function(n)
|
||
|
if type(n) == 'string' then
|
||
|
n = { n }
|
||
|
end
|
||
|
|
||
|
for _, d in ipairs(n) do
|
||
|
AddServerScript(d)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
env.server_script = env.server_scripts
|
||
|
else
|
||
|
-- and add our native items
|
||
|
env.solution = function(n)
|
||
|
SetResourceInfo('clr_solution', n)
|
||
|
end
|
||
|
|
||
|
env.description = function(n)
|
||
|
SetResourceInfo('description', n)
|
||
|
end
|
||
|
|
||
|
env.version = function(n)
|
||
|
SetResourceInfo('version', n)
|
||
|
end
|
||
|
|
||
|
env.client_scripts = function(n)
|
||
|
if type(n) == 'string' then
|
||
|
n = { n }
|
||
|
end
|
||
|
|
||
|
for _, d in ipairs(n) do
|
||
|
AddClientScript(d)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
env.client_script = env.client_scripts
|
||
|
|
||
|
env.files = function(n)
|
||
|
if type(n) == 'string' then
|
||
|
n = { n }
|
||
|
end
|
||
|
|
||
|
for _, d in ipairs(n) do
|
||
|
AddAuxFile(d)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
env.file = env.files
|
||
|
|
||
|
env.dependencies = function(n)
|
||
|
if type(n) == 'string' then
|
||
|
n = { n }
|
||
|
end
|
||
|
|
||
|
for _, d in ipairs(n) do
|
||
|
AddResourceDependency(d)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
env.dependency = env.dependencies
|
||
|
end
|
||
|
|
||
|
local rawget_ = rawget
|
||
|
local print_ = print
|
||
|
|
||
|
local mt = {
|
||
|
__index = function(t, k) : object
|
||
|
if env[k] ~= nil then
|
||
|
return env[k]
|
||
|
end
|
||
|
|
||
|
if rawget_(t, k) ~= nil then
|
||
|
return rawget_(t, k)
|
||
|
end
|
||
|
|
||
|
-- as we're not going to return nothing here (to allow unknown directives to be ignored)
|
||
|
local f = function()
|
||
|
return f
|
||
|
end
|
||
|
|
||
|
return function() return f end
|
||
|
end
|
||
|
}
|
||
|
|
||
|
for k, v in pairs(env) do
|
||
|
if type(v) == 'function' then
|
||
|
env[k] = function(...)
|
||
|
_G.__metatable = nil
|
||
|
|
||
|
local rv = v(...)
|
||
|
|
||
|
_G.__metatable = mt
|
||
|
|
||
|
return rv
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
_G.__metatable = mt
|
||
|
--setmetatable(env, mt)
|
||
|
--setfenv(initScript, env)
|
||
|
|
||
|
initScript()
|
||
|
|
||
|
--env = nil
|
||
|
|
||
|
--setfenv(initScript, _G)
|
||
|
|
||
|
_G.__metatable = nil
|
||
|
|
||
|
-- print('rc', findallpaths(rt))
|
||
|
end)
|
||
|
|
||
|
-- nothing, yet
|
||
|
|
||
|
-- TODO: cleanup RPC environment stuff on coroutine end/error
|
||
|
local function RunRPCFunction(f, env)
|
||
|
local co = coroutine.create(f)
|
||
|
env.__co = client
|
||
|
|
||
|
local success, err = coroutine.resume(co)
|
||
|
|
||
|
if success then
|
||
|
env.SendEvents()
|
||
|
else
|
||
|
print(err)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local rpcIdx = 1
|
||
|
local rpcEnvironments = {}
|
||
|
|
||
|
function CreateRPCContext(cl, f)
|
||
|
local idx = rpcIdx
|
||
|
rpcIdx = rpcIdx + 1
|
||
|
|
||
|
local key = cl .. '_' .. idx
|
||
|
|
||
|
local env = {
|
||
|
getIdx = function()
|
||
|
return idx
|
||
|
end,
|
||
|
getSource = function()
|
||
|
return cl
|
||
|
end
|
||
|
}
|
||
|
|
||
|
local lastEnv = _ENV
|
||
|
|
||
|
setmetatable(env, {__index = _G})
|
||
|
|
||
|
local _ENV = env
|
||
|
rpcEnvironments[key] = env
|
||
|
|
||
|
setfenv(f, env)
|
||
|
|
||
|
local fRun = f()
|
||
|
|
||
|
local virtenv_init = loadfile('system/virtenv_init.lua', 't', env)
|
||
|
virtenv_init()
|
||
|
|
||
|
_ENV = lastEnv
|
||
|
|
||
|
RunRPCFunction(fRun, env)
|
||
|
end
|
||
|
|
||
|
RegisterServerEvent('svRpc:results')
|
||
|
|
||
|
AddEventHandler('svRpc:results', function(results)
|
||
|
if not results.idx then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local key = source .. '_' .. results.idx
|
||
|
|
||
|
if not rpcEnvironments[key] then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
rpcEnvironments[key].HandleResults(results)
|
||
|
end)
|