message_1
message_1
function table.maxn(t)
local max = 0
for k,v in pairs(t) do
local n = tonumber(k)
if n and n > max then max = n end
end
return max
end
function async(func)
if func then
Citizen.CreateThreadNow(func)
else
return setmetatable({ wait = wait, p = promise.new() },
{ __call = areturn })
end
end
function parseInt(v)
local n = tonumber(v)
if n == nil then
return 0
else
return math.floor(n)
end
end
function parseDouble(v)
local n = tonumber(v)
if n == nil then n = 0 end
return n
end
function parseFloat(v)
return parseDouble(v)
end
local sanitize_tmp = {}
function sanitizeString(str, strchars, allow_policy)
local r = ""
local chars = sanitize_tmp[strchars]
if chars == nil then
chars = {}
local size = string.len(strchars)
for i=1,size do
local char = string.sub(strchars,i,i)
chars[char] = true
end
sanitize_tmp[strchars] = chars
end
size = string.len(str)
for i=1,size do
local char = string.sub(str,i,i)
if (allow_policy and chars[char]) or (not allow_policy and not
chars[char]) then
r = r..char
end
end
return r
end
local t={}
local i=1
return t
end
local Tools = {}
local IDGenerator = {}
function Tools.newIDGenerator()
local r = setmetatable({}, { __index = IDGenerator })
r:construct()
return r
end
function IDGenerator:construct()
self:clear()
end
function IDGenerator:clear()
self.max = 0
self.ids = {}
end
function IDGenerator:gen()
if #self.ids > 0 then
return table.remove(self.ids)
else
local r = self.max
self.max = self.max+1
return r
end
end
function IDGenerator:free(id)
table.insert(self.ids,id)
end
local Tunnel = {}
Tunnel.delays = {}
function Tunnel.setDestDelay(dest,delay)
Tunnel.delays[dest] = { delay,0 }
end
if SERVER then
TriggerRemoteEvent(iname..":tunnel_req",dest,fname,args,identifier,rid)
else
TriggerRemoteEvent(iname..":tunnel_req",fname,args,identifier,rid)
end
end)
else
local rid = -1
if r then
rid = ids:gen()
callbacks[rid] = r
end
if SERVER then
TriggerRemoteEvent(iname..":tunnel_req",dest,fname,args,identifier,rid)
else
TriggerRemoteEvent(iname..":tunnel_req",fname,args,identifier,rid)
end
end
if r then
if profile then
local rets = { r:wait() }
return table.unpack(rets,1,table.maxn(rets))
else
return r:wait()
end
end
end
itable[key] = fcall
return fcall
end
function Tunnel.bindInterface(name,interface)
RegisterLocalEvent(name..":tunnel_req")
AddEventHandler(name..":tunnel_req",function(member,args,identifier,rid)
local source = source
local f = interface[member]
local rets = {}
if type(f) == "function" then
rets = { f(table.unpack(args,1,table.maxn(args))) }
end
TriggerRemoteEvent(name..":"..identifier..":tunnel_res",source,rid,rets)
else
TriggerRemoteEvent(name..":"..identifier..":tunnel_res",rid,rets)
end
end
end)
end
function Tunnel.getInterface(name,identifier)
if not identifier then identifier = GetCurrentResourceName() end
RegisterLocalEvent(name..":"..identifier..":tunnel_res")
AddEventHandler(name..":"..identifier..":tunnel_res",function(rid,args)
local callback = callbacks[rid]
if callback then
ids:free(rid)
callbacks[rid] = nil
callback(table.unpack(args,1,table.maxn(args)))
end
end)
return r
end
local Proxy = {}
if no_wait then
rid = -1
else
r = async()
rid = ids:gen()
callbacks[rid] = r
end
function Proxy.addInterface(name,itable)
AddEventHandler(name..":proxy",function(member,args,identifier,rid)
local f = itable[member]
local rets = {}
if type(f) == "function" then
rets = {f(table.unpack(args,1,table.maxn(args)))}
end
if rid >= 0 then
TriggerEvent(name..":"..identifier..":proxy_res",rid,rets)
end
end)
end
function Proxy.getInterface(name,identifier)
if not identifier then identifier = GetCurrentResourceName() end
local ids = Tools.newIDGenerator()
local callbacks = {}
local r = setmetatable({},{ __index = proxy_resolve, name = name,
ids = ids, callbacks = callbacks, identifier = identifier })
AddEventHandler(name..":"..identifier..":proxy_res",
function(rid,rets)
local callback = callbacks[rid]
if callback then
ids:free(rid)
callbacks[rid] = nil
callback(table.unpack(rets,1,table.maxn(rets)))
end
end)
return r
end
vRP = Proxy.getInterface("vRP")