2021-04-23 12:43:05 +02:00
|
|
|
local rawget, rawset = rawget, rawset
|
|
|
|
|
2019-05-01 16:53:01 +02:00
|
|
|
-- Lua version check
|
|
|
|
if _VERSION then
|
2021-03-27 20:10:49 +01:00
|
|
|
if _VERSION < "Lua 5" then
|
|
|
|
error("Outdated Lua version! modlib requires Lua 5 or greater.")
|
|
|
|
end
|
|
|
|
if _VERSION > "Lua 5.1" then
|
|
|
|
-- not throwing error("Too new Lua version! modlib requires Lua 5.1 or smaller.") anymore
|
|
|
|
unpack = unpack or table.unpack -- unpack was moved to table.unpack in Lua 5.2
|
|
|
|
loadstring = load
|
|
|
|
function setfenv(fn, env)
|
|
|
|
local i = 1
|
|
|
|
while true do
|
2021-03-30 18:04:45 +02:00
|
|
|
local name = debug.getupvalue(fn, i)
|
2021-03-27 20:10:49 +01:00
|
|
|
if name == "_ENV" then
|
|
|
|
debug.setupvalue(fn, i, env)
|
|
|
|
break
|
|
|
|
elseif not name then
|
|
|
|
break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return fn
|
|
|
|
end
|
|
|
|
function getfenv(fn)
|
|
|
|
local i = 1
|
|
|
|
local name, val
|
|
|
|
repeat
|
|
|
|
name, val = debug.getupvalue(fn, i)
|
|
|
|
if name == "_ENV" then
|
|
|
|
return val
|
|
|
|
end
|
|
|
|
i = i + 1
|
|
|
|
until not name
|
|
|
|
end
|
|
|
|
end
|
2020-02-09 01:39:54 +01:00
|
|
|
end
|
2019-07-13 19:55:49 +02:00
|
|
|
|
2021-03-29 14:37:57 +02:00
|
|
|
local modules = {}
|
|
|
|
for _, file in pairs{
|
|
|
|
"schema",
|
|
|
|
"file",
|
|
|
|
"func",
|
|
|
|
"math",
|
|
|
|
"table",
|
|
|
|
"text",
|
|
|
|
"vector",
|
|
|
|
"quaternion",
|
|
|
|
"trie",
|
|
|
|
"kdtree",
|
|
|
|
"heap",
|
|
|
|
"ranked_set",
|
|
|
|
"binary",
|
|
|
|
"b3d",
|
2021-04-21 21:11:00 +02:00
|
|
|
"bluon",
|
2021-05-04 16:18:46 +02:00
|
|
|
"persistence",
|
|
|
|
"debug"
|
2021-03-29 14:37:57 +02:00
|
|
|
} do
|
|
|
|
modules[file] = file
|
|
|
|
end
|
|
|
|
if minetest then
|
|
|
|
modules.minetest = {
|
|
|
|
"misc",
|
|
|
|
"collisionboxes",
|
|
|
|
"liquid",
|
|
|
|
"raycast",
|
|
|
|
"wielditem_change",
|
2021-05-08 21:17:09 +02:00
|
|
|
"colorspec",
|
|
|
|
"schematic"
|
2021-03-29 14:37:57 +02:00
|
|
|
}
|
|
|
|
for _, file in pairs{
|
|
|
|
"data",
|
|
|
|
"log",
|
|
|
|
"player",
|
|
|
|
-- deprecated
|
|
|
|
"conf"
|
|
|
|
} do
|
|
|
|
modules[file] = file
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local load_module, get_resource, loadfile_exports
|
|
|
|
modlib = setmetatable({
|
2021-03-27 21:01:29 +01:00
|
|
|
-- TODO bump on release
|
2021-05-13 15:15:04 +02:00
|
|
|
version = 69,
|
2021-03-29 14:37:57 +02:00
|
|
|
modname = minetest and minetest.get_current_modname(),
|
2021-03-27 20:10:49 +01:00
|
|
|
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-31 11:23:49 +02:00
|
|
|
assertdump = minetest and function(v, value)
|
2021-03-27 20:10:49 +01:00
|
|
|
if not v then
|
|
|
|
error(dump(value), 2)
|
|
|
|
end
|
|
|
|
end
|
2021-03-29 14:37:57 +02:00
|
|
|
}, {
|
|
|
|
__index = function(self, module_name)
|
|
|
|
local files = modules[module_name]
|
2021-05-12 18:30:16 +02:00
|
|
|
local environment
|
2021-03-29 14:37:57 +02:00
|
|
|
if type(files) == "string" then
|
2021-05-12 18:30:16 +02:00
|
|
|
environment = load_module(files)
|
2021-03-29 14:37:57 +02:00
|
|
|
elseif files then
|
2021-05-12 18:30:16 +02:00
|
|
|
environment = loadfile_exports(get_resource(self.modname, module_name, files[1] .. ".lua"))
|
2021-03-29 14:37:57 +02:00
|
|
|
for index = 2, #files do
|
2021-05-12 18:30:16 +02:00
|
|
|
self.mod.include_env(get_resource(self.modname, module_name, files[index] .. ".lua"), environment)
|
2021-03-29 14:37:57 +02:00
|
|
|
end
|
2021-05-12 18:30:16 +02:00
|
|
|
else
|
|
|
|
return
|
|
|
|
end
|
|
|
|
local module = {}
|
|
|
|
for key, value in pairs(environment) do
|
|
|
|
-- Shallow copy. Doesn't use `modlib.table.shallowcopy` as that is part of a module, too.
|
|
|
|
module[key] = value
|
2021-03-29 14:37:57 +02:00
|
|
|
end
|
|
|
|
self[module_name] = module
|
|
|
|
return module
|
|
|
|
end
|
|
|
|
})
|
2021-02-01 16:22:37 +01:00
|
|
|
|
2021-03-29 14:37:57 +02:00
|
|
|
function get_resource(modname, resource, ...)
|
2021-03-27 20:10:49 +01:00
|
|
|
if not resource then
|
|
|
|
resource = modname
|
|
|
|
modname = minetest.get_current_modname()
|
|
|
|
end
|
|
|
|
return table.concat({minetest.get_modpath(modname), resource, ...}, modlib.dir_delim)
|
2020-02-29 12:55:02 +01:00
|
|
|
end
|
|
|
|
|
2021-03-29 14:37:57 +02:00
|
|
|
function loadfile_exports(filename)
|
2021-03-27 20:10:49 +01:00
|
|
|
local env = setmetatable({}, {__index = _G})
|
|
|
|
local file = assert(loadfile(filename))
|
|
|
|
setfenv(file, env)
|
|
|
|
file()
|
|
|
|
return env
|
2020-02-09 01:39:54 +01:00
|
|
|
end
|
|
|
|
|
2021-04-22 18:13:06 +02:00
|
|
|
local parent_dir
|
|
|
|
if not minetest then
|
|
|
|
local init_path = arg and arg[0]
|
|
|
|
parent_dir = init_path and init_path:match"^.[/\\]" or ""
|
|
|
|
end
|
2021-03-29 14:37:57 +02:00
|
|
|
function load_module(module_name)
|
|
|
|
local file = module_name .. ".lua"
|
|
|
|
return loadfile_exports(minetest and get_resource(modlib.modname, file) or (parent_dir .. file))
|
2020-02-09 01:39:54 +01:00
|
|
|
end
|
2019-05-01 16:53:01 +02:00
|
|
|
|
2021-03-29 14:37:57 +02:00
|
|
|
modlib.mod = minetest and loadfile_exports(get_resource(modlib.modname, "mod.lua"))
|
|
|
|
|
2020-12-22 09:41:59 +01:00
|
|
|
-- Aliases
|
|
|
|
modlib.string = modlib.text
|
|
|
|
modlib.number = modlib.math
|
|
|
|
|
2021-03-04 12:18:26 +01:00
|
|
|
if minetest then
|
2021-03-27 20:10:49 +01:00
|
|
|
modlib.conf.build_setting_tree()
|
2020-06-02 23:07:33 +02:00
|
|
|
|
2021-03-27 20:10:49 +01:00
|
|
|
modlib.mod.get_resource = get_resource
|
|
|
|
modlib.mod.loadfile_exports = loadfile_exports
|
2021-03-04 12:18:26 +01:00
|
|
|
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
|
|
|
--[[
|
2021-03-25 17:46:04 +01:00
|
|
|
--modlib.mod.include"test.lua"
|
2021-03-04 12:18:26 +01:00
|
|
|
]]
|
|
|
|
|
|
|
|
return modlib
|