modlib/init.lua

140 lines
3.4 KiB
Lua
Raw Normal View History

2019-05-01 16:53:01 +02:00
-- Lua version check
if _VERSION then
if _VERSION < "Lua 5" then
2020-02-09 01:39:54 +01:00
error("Outdated Lua version! modlib requires Lua 5 or greater.")
2019-05-01 16:53:01 +02:00
end
2020-03-23 20:20:43 +01:00
if _VERSION > "Lua 5.1" then
2020-02-09 01:39:54 +01:00
-- not throwing error("Too new Lua version! modlib requires Lua 5.1 or smaller.") anymore
2020-03-13 18:13:45 +01:00
unpack = unpack or table.unpack -- unpack was moved to table.unpack in Lua 5.2
2020-02-09 01:39:54 +01:00
loadstring = load
function setfenv(fn, env)
local i = 1
while true do
name = debug.getupvalue(fn, i)
if name == "_ENV" then
debug.setupvalue(fn, i, env)
break
elseif not name then
break
2019-07-13 19:55:49 +02:00
end
end
2020-02-09 01:39:54 +01:00
return fn
2019-07-13 19:55:49 +02:00
end
2020-02-09 01:39:54 +01:00
function getfenv(fn)
local i = 1
local name, val
repeat
name, val = debug.getupvalue(fn, i)
if name == "_ENV" then
return val
2019-05-01 16:53:01 +02:00
end
2020-02-09 01:39:54 +01:00
i = i + 1
until not name
2019-05-05 15:09:26 +02:00
end
2019-05-03 19:04:47 +02:00
end
2020-02-09 01:39:54 +01:00
end
2019-07-13 19:55:49 +02:00
2021-02-01 16:22:37 +01:00
modlib = {
dir_delim = rawget(_G, "DIR_DELIM") or "/",
_RG = setmetatable({}, {
__index = function(_, index)
return rawget(_G, index)
end,
__newindex = function(_, index, value)
return rawset(_G, index, value)
end
2021-03-24 20:27:02 +01:00
}),
assertdump = function(v, value)
if not v then
2021-03-25 11:47:34 +01:00
error(dump(value), 2)
2021-03-24 20:27:02 +01:00
end
end
2021-02-01 16:22:37 +01:00
}
local function get_resource(modname, resource, ...)
2020-09-22 19:18:47 +02:00
if not resource then
resource = modname
modname = minetest.get_current_modname()
end
2021-02-01 16:22:37 +01:00
return table.concat({minetest.get_modpath(modname), resource, ...}, modlib.dir_delim)
2020-02-29 12:55:02 +01:00
end
2020-02-28 22:12:05 +01:00
local function loadfile_exports(filename)
2020-09-22 19:18:47 +02:00
local env = setmetatable({}, {__index = _G})
2020-02-09 01:39:54 +01:00
local file = assert(loadfile(filename))
setfenv(file, env)
file()
return env
end
2021-03-04 12:18:26 +01:00
local minetest_only = {
mod = true,
minetest = true,
data = true,
log = true,
player = true,
-- not actually minetest-only, but a deprecated component
conf = true
}
for _, component in ipairs{
"mod",
"conf",
"schema",
"data",
"file",
"func",
"log",
"math",
"player",
"table",
"text",
"vector",
2021-02-02 10:38:21 +01:00
"quaternion",
{
name = "minetest",
"misc",
"collisionboxes",
"liquid",
"raycast",
"wielditem_change",
"colorspec"
},
2021-01-16 17:17:29 +01:00
"trie",
2021-02-07 00:40:25 +01:00
"kdtree",
2021-01-25 21:18:56 +01:00
"heap",
2021-01-31 21:41:42 +01:00
"ranked_set",
"binary",
"b3d",
"bluon"
} do
if component.name then
if minetest then
modlib[component.name] = loadfile_exports(get_resource(minetest.get_current_modname(), component.name, component[1] .. ".lua"))
for index = 2, #component do
modlib.mod.include_env(get_resource(minetest.get_current_modname(), component.name, component[index] .. ".lua"), modlib[component.name])
end
end
elseif minetest or not minetest_only[component] then
2021-03-04 12:18:26 +01:00
local path = minetest and get_resource(component .. ".lua") or component .. ".lua"
modlib[component] = loadfile_exports(path)
end
2020-02-09 01:39:54 +01:00
end
2019-05-01 16:53:01 +02:00
-- Aliases
modlib.string = modlib.text
modlib.number = modlib.math
2021-03-04 12:18:26 +01:00
if minetest then
modlib.conf.build_setting_tree()
2021-03-04 12:18:26 +01:00
modlib.mod.get_resource = get_resource
modlib.mod.loadfile_exports = loadfile_exports
end
2020-02-28 22:12:05 +01:00
2020-09-22 19:18:47 +02:00
_ml = modlib
2020-03-23 20:20:43 +01:00
2020-09-22 19:18:47 +02:00
--[[
--modlib.mod.include"test.lua"
2021-03-04 12:18:26 +01:00
]]
return modlib