mirror of
https://github.com/ErikasKontenis/SabrehavenServer.git
synced 2025-10-17 07:43:27 +02:00
Resolve "Merge the best from 7.40 branch"
This commit is contained in:
376
SabrehavenOTClient/modules/corelib/util.lua
Normal file
376
SabrehavenOTClient/modules/corelib/util.lua
Normal file
@@ -0,0 +1,376 @@
|
||||
-- @docfuncs @{
|
||||
|
||||
function print(...)
|
||||
local msg = ""
|
||||
local args = {...}
|
||||
local appendSpace = #args > 1
|
||||
for i,v in ipairs(args) do
|
||||
msg = msg .. tostring(v)
|
||||
if appendSpace and i < #args then
|
||||
msg = msg .. ' '
|
||||
end
|
||||
end
|
||||
g_logger.log(LogInfo, msg)
|
||||
end
|
||||
|
||||
function pinfo(msg)
|
||||
g_logger.log(LogInfo, msg)
|
||||
end
|
||||
|
||||
function perror(msg)
|
||||
g_logger.log(LogError, msg)
|
||||
end
|
||||
|
||||
function pwarning(msg)
|
||||
g_logger.log(LogWarning, msg)
|
||||
end
|
||||
|
||||
function pdebug(msg)
|
||||
g_logger.log(LogDebug, msg)
|
||||
end
|
||||
|
||||
function fatal(msg)
|
||||
g_logger.log(LogFatal, msg)
|
||||
end
|
||||
|
||||
function exit()
|
||||
g_app.exit()
|
||||
end
|
||||
|
||||
function quit()
|
||||
g_app.exit()
|
||||
end
|
||||
|
||||
function connect(object, arg1, arg2, arg3)
|
||||
local signalsAndSlots
|
||||
local pushFront
|
||||
if type(arg1) == 'string' then
|
||||
signalsAndSlots = { [arg1] = arg2 }
|
||||
pushFront = arg3
|
||||
else
|
||||
signalsAndSlots = arg1
|
||||
pushFront = arg2
|
||||
end
|
||||
|
||||
for signal,slot in pairs(signalsAndSlots) do
|
||||
if not object[signal] then
|
||||
local mt = getmetatable(object)
|
||||
if mt and type(object) == 'userdata' then
|
||||
object[signal] = function(...)
|
||||
return signalcall(mt[signal], ...)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if not object[signal] then
|
||||
object[signal] = slot
|
||||
elseif type(object[signal]) == 'function' then
|
||||
object[signal] = { object[signal] }
|
||||
end
|
||||
|
||||
if type(slot) ~= 'function' then
|
||||
perror(debug.traceback('unable to connect a non function value'))
|
||||
end
|
||||
|
||||
if type(object[signal]) == 'table' then
|
||||
if pushFront then
|
||||
table.insert(object[signal], 1, slot)
|
||||
else
|
||||
table.insert(object[signal], #object[signal]+1, slot)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function disconnect(object, arg1, arg2)
|
||||
local signalsAndSlots
|
||||
if type(arg1) == 'string' then
|
||||
if arg2 == nil then
|
||||
object[arg1] = nil
|
||||
return
|
||||
end
|
||||
signalsAndSlots = { [arg1] = arg2 }
|
||||
elseif type(arg1) == 'table' then
|
||||
signalsAndSlots = arg1
|
||||
else
|
||||
perror(debug.traceback('unable to disconnect'))
|
||||
end
|
||||
|
||||
for signal,slot in pairs(signalsAndSlots) do
|
||||
if not object[signal] then
|
||||
elseif type(object[signal]) == 'function' then
|
||||
if object[signal] == slot then
|
||||
object[signal] = nil
|
||||
end
|
||||
elseif type(object[signal]) == 'table' then
|
||||
for k,func in pairs(object[signal]) do
|
||||
if func == slot then
|
||||
table.remove(object[signal], k)
|
||||
|
||||
if #object[signal] == 1 then
|
||||
object[signal] = object[signal][1]
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function newclass(name)
|
||||
if not name then
|
||||
perror(debug.traceback('new class has no name.'))
|
||||
end
|
||||
|
||||
local class = {}
|
||||
function class.internalCreate()
|
||||
local instance = {}
|
||||
for k,v in pairs(class) do
|
||||
instance[k] = v
|
||||
end
|
||||
return instance
|
||||
end
|
||||
class.create = class.internalCreate
|
||||
class.__class = name
|
||||
class.getClassName = function() return name end
|
||||
return class
|
||||
end
|
||||
|
||||
function extends(base, name)
|
||||
if not name then
|
||||
perror(debug.traceback('extended class has no name.'))
|
||||
end
|
||||
|
||||
local derived = {}
|
||||
function derived.internalCreate()
|
||||
local instance = base.create()
|
||||
for k,v in pairs(derived) do
|
||||
instance[k] = v
|
||||
end
|
||||
return instance
|
||||
end
|
||||
derived.create = derived.internalCreate
|
||||
derived.__class = name
|
||||
derived.getClassName = function() return name end
|
||||
return derived
|
||||
end
|
||||
|
||||
function runinsandbox(func, ...)
|
||||
if type(func) == 'string' then
|
||||
func, err = loadfile(resolvepath(func, 2))
|
||||
if not func then
|
||||
error(err)
|
||||
end
|
||||
end
|
||||
local env = { }
|
||||
local oldenv = getfenv(0)
|
||||
setmetatable(env, { __index = oldenv } )
|
||||
setfenv(0, env)
|
||||
func(...)
|
||||
setfenv(0, oldenv)
|
||||
return env
|
||||
end
|
||||
|
||||
function loadasmodule(name, file)
|
||||
file = file or resolvepath(name, 2)
|
||||
if package.loaded[name] then
|
||||
return package.loaded[name]
|
||||
end
|
||||
local env = runinsandbox(file)
|
||||
package.loaded[name] = env
|
||||
return env
|
||||
end
|
||||
|
||||
local function module_loader(modname)
|
||||
local module = g_modules.getModule(modname)
|
||||
if not module then
|
||||
return '\n\tno module \'' .. modname .. '\''
|
||||
end
|
||||
return function()
|
||||
if not module:load() then
|
||||
error('unable to load required module ' .. modname)
|
||||
end
|
||||
return module:getSandbox()
|
||||
end
|
||||
end
|
||||
table.insert(package.loaders, 1, module_loader)
|
||||
|
||||
function import(table)
|
||||
assert(type(table) == 'table')
|
||||
local env = getfenv(2)
|
||||
for k,v in pairs(table) do
|
||||
env[k] = v
|
||||
end
|
||||
end
|
||||
|
||||
function export(what, key)
|
||||
if key ~= nil then
|
||||
_G[key] = what
|
||||
else
|
||||
for k,v in pairs(what) do
|
||||
_G[k] = v
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function unexport(key)
|
||||
if type(key) == 'table' then
|
||||
for _k,v in pairs(key) do
|
||||
_G[v] = nil
|
||||
end
|
||||
else
|
||||
_G[key] = nil
|
||||
end
|
||||
end
|
||||
|
||||
function getfsrcpath(depth)
|
||||
depth = depth or 2
|
||||
local info = debug.getinfo(1+depth, "Sn")
|
||||
local path
|
||||
if info.short_src then
|
||||
path = info.short_src:match("(.*)/.*")
|
||||
end
|
||||
if not path then
|
||||
path = '/'
|
||||
elseif path:sub(0, 1) ~= '/' then
|
||||
path = '/' .. path
|
||||
end
|
||||
return path
|
||||
end
|
||||
|
||||
function resolvepath(filePath, depth)
|
||||
if not filePath then return nil end
|
||||
depth = depth or 1
|
||||
if filePath then
|
||||
if filePath:sub(0, 1) ~= '/' then
|
||||
local basepath = getfsrcpath(depth+1)
|
||||
if basepath:sub(#basepath) ~= '/' then basepath = basepath .. '/' end
|
||||
return basepath .. filePath
|
||||
else
|
||||
return filePath
|
||||
end
|
||||
else
|
||||
local basepath = getfsrcpath(depth+1)
|
||||
if basepath:sub(#basepath) ~= '/' then basepath = basepath .. '/' end
|
||||
return basepath
|
||||
end
|
||||
end
|
||||
|
||||
function toboolean(v)
|
||||
if type(v) == 'string' then
|
||||
v = v:trim():lower()
|
||||
if v == '1' or v == 'true' then
|
||||
return true
|
||||
end
|
||||
elseif type(v) == 'number' then
|
||||
if v == 1 then
|
||||
return true
|
||||
end
|
||||
elseif type(v) == 'boolean' then
|
||||
return v
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function fromboolean(boolean)
|
||||
if boolean then
|
||||
return 'true'
|
||||
else
|
||||
return 'false'
|
||||
end
|
||||
end
|
||||
|
||||
function booleantonumber(boolean)
|
||||
if boolean then
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
end
|
||||
end
|
||||
|
||||
function numbertoboolean(number)
|
||||
if number ~= 0 then
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
function protectedcall(func, ...)
|
||||
local status, ret = pcall(func, ...)
|
||||
if status then
|
||||
return ret
|
||||
end
|
||||
|
||||
perror(ret)
|
||||
return false
|
||||
end
|
||||
|
||||
function signalcall(param, ...)
|
||||
if type(param) == 'function' then
|
||||
local status, ret = pcall(param, ...)
|
||||
if status then
|
||||
return ret
|
||||
else
|
||||
perror(ret)
|
||||
end
|
||||
elseif type(param) == 'table' then
|
||||
for k,v in pairs(param) do
|
||||
local status, ret = pcall(v, ...)
|
||||
if status then
|
||||
if ret then return true end
|
||||
else
|
||||
perror(ret)
|
||||
end
|
||||
end
|
||||
elseif param ~= nil then
|
||||
error('attempt to call a non function value')
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function tr(s, ...)
|
||||
return string.format(s, ...)
|
||||
end
|
||||
|
||||
function getOppositeAnchor(anchor)
|
||||
if anchor == AnchorLeft then
|
||||
return AnchorRight
|
||||
elseif anchor == AnchorRight then
|
||||
return AnchorLeft
|
||||
elseif anchor == AnchorTop then
|
||||
return AnchorBottom
|
||||
elseif anchor == AnchorBottom then
|
||||
return AnchorTop
|
||||
elseif anchor == AnchorVerticalCenter then
|
||||
return AnchorHorizontalCenter
|
||||
elseif anchor == AnchorHorizontalCenter then
|
||||
return AnchorVerticalCenter
|
||||
end
|
||||
return anchor
|
||||
end
|
||||
|
||||
function makesingleton(obj)
|
||||
local singleton = {}
|
||||
if obj.getClassName then
|
||||
for key,value in pairs(_G[obj:getClassName()]) do
|
||||
if type(value) == 'function' then
|
||||
singleton[key] = function(...) return value(obj, ...) end
|
||||
end
|
||||
end
|
||||
end
|
||||
return singleton
|
||||
end
|
||||
|
||||
function comma_value(amount)
|
||||
local formatted = amount
|
||||
while true do
|
||||
formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2')
|
||||
if (k==0) then
|
||||
break
|
||||
end
|
||||
end
|
||||
return formatted
|
||||
end
|
||||
|
||||
-- @}
|
Reference in New Issue
Block a user