169 lines
4.8 KiB
Lua
169 lines
4.8 KiB
Lua
local f = string.format
|
|
|
|
local get_current_modname = minetest.get_current_modname
|
|
local get_modpath = minetest.get_modpath
|
|
|
|
local our_modname = get_current_modname()
|
|
local our_modpath = get_modpath(our_modname)
|
|
|
|
local build_has = dofile(our_modpath .. DIR_DELIM .. "build_has.lua")
|
|
local get_settings = dofile(our_modpath .. DIR_DELIM .. "get_settings.lua")
|
|
local parse_version = dofile(our_modpath .. DIR_DELIM .. "parse_version.lua")
|
|
|
|
local function create(fork, extra_private_state)
|
|
local modname = get_current_modname()
|
|
local modpath = get_modpath(modname)
|
|
local S = minetest.get_translator(modname)
|
|
local F = minetest.formspec_escape
|
|
|
|
local mod_conf = Settings(modpath .. DIR_DELIM .. "mod.conf")
|
|
assert(modname == mod_conf:get("name"), "mod name mismatch")
|
|
|
|
local version = parse_version(mod_conf:get("version"))
|
|
|
|
local private_state = {
|
|
-- minetest.request_insecure_environment() can't be used here
|
|
-- minetest.request_http_api() can't be used here
|
|
mod_storage = INIT == "game" and minetest.get_mod_storage(),
|
|
}
|
|
|
|
if extra_private_state then
|
|
for k, v in pairs(extra_private_state) do
|
|
private_state[k] = v
|
|
end
|
|
end
|
|
|
|
return {
|
|
modname = modname,
|
|
modpath = modpath,
|
|
|
|
title = mod_conf:get("title") or modname,
|
|
description = mod_conf:get("description"),
|
|
author = mod_conf:get("author"),
|
|
license = mod_conf:get("license"),
|
|
media_license = mod_conf:get("media_license"),
|
|
website = mod_conf:get("website") or mod_conf:get("url"),
|
|
version = version,
|
|
fork = fork or "flux",
|
|
|
|
S = S,
|
|
FS = function(...)
|
|
return F(S(...))
|
|
end,
|
|
|
|
has = build_has(mod_conf),
|
|
settings = get_settings(modname),
|
|
|
|
check_version = function(required, reason)
|
|
if type(required) == "table" then
|
|
required = os.time(required)
|
|
end
|
|
local calling_modname = minetest.get_current_modname() or "UNKNOWN"
|
|
if reason then
|
|
assert(
|
|
version >= required,
|
|
f(
|
|
"%s requires a newer version of %s because %q; please update it.\n"
|
|
.. "go to the main game menu, click the content tab, browse online content, and update all.\n"
|
|
.. "(have %s, require %s)",
|
|
calling_modname,
|
|
modname,
|
|
reason,
|
|
version,
|
|
required
|
|
)
|
|
)
|
|
else
|
|
assert(
|
|
version >= required,
|
|
f(
|
|
"%s requires a newer version of %s; please update it.\n"
|
|
.. "go to the main game menu, click the content tab, browse online content, and update all.\n"
|
|
.. "(have %s, require %s)",
|
|
calling_modname,
|
|
modname,
|
|
version,
|
|
required
|
|
)
|
|
)
|
|
end
|
|
end,
|
|
|
|
check_minetest_version = function(major, minor, patch, other, reason)
|
|
local mt_version = minetest.get_version()
|
|
-- TODO: figure out how to allow various "projects" (e.g. Minetest, Multicraft) properly
|
|
-- TODO: we perhaps want to allow depending on multiple projects, so this is complicated.
|
|
local mt_major, mt_minor, mt_patch = mt_version.string:match("^(%d+)%.(%d+)%.(%d+)")
|
|
if not (mt_major and mt_minor and mt_patch) then
|
|
error(
|
|
f(
|
|
"%s is not compatible w/ minetest %s because we don't understand the version",
|
|
modname,
|
|
mt_version.string
|
|
)
|
|
)
|
|
end
|
|
mt_major = tonumber(mt_major)
|
|
mt_minor = tonumber(mt_minor)
|
|
mt_patch = tonumber(mt_patch)
|
|
local check = true
|
|
if mt_major < major then
|
|
check = false
|
|
elseif mt_major == major then
|
|
if mt_minor < minor then
|
|
check = false
|
|
elseif mt_minor == minor then
|
|
if mt_patch < patch then
|
|
check = false
|
|
end
|
|
end
|
|
end
|
|
if not check then
|
|
if reason then
|
|
error(
|
|
f("%s requires at least minetest %i.%i.%i because it %q", modname, major, minor, patch, reason)
|
|
)
|
|
else
|
|
error(f("%s requires at least minetest %i.%i.%i", modname, major, minor, patch))
|
|
end
|
|
end
|
|
end,
|
|
|
|
log = function(level, messagefmt, ...)
|
|
return minetest.log(level, f("[%s] %s", modname, f(messagefmt, ...)))
|
|
end,
|
|
|
|
chat_send_player = INIT == "game" and function(player, messagefmt, ...)
|
|
if player.get_player_name then
|
|
player = player:get_player_name()
|
|
end
|
|
|
|
minetest.chat_send_player(player, f("[%s] %s", modname, S(messagefmt, ...)))
|
|
end,
|
|
|
|
chat_send_all = INIT == "game" and function(message, ...)
|
|
minetest.chat_send_all(f("[%s] %s", modname, S(message, ...)))
|
|
end,
|
|
|
|
dofile = function(...)
|
|
assert(modname == get_current_modname(), "attempt to call dofile from external mod")
|
|
local filename = table.concat({ modpath, ... }, DIR_DELIM) .. ".lua"
|
|
local loader = assert(loadfile(filename))
|
|
return loader(private_state)
|
|
end,
|
|
|
|
async_dofile = function(...)
|
|
assert(modname == get_current_modname(), "attempt to call async_dofile from external mod")
|
|
local filename = table.concat({ modpath, ... }, DIR_DELIM) .. ".lua"
|
|
return minetest.register_async_dofile(filename)
|
|
end,
|
|
},
|
|
private_state
|
|
end
|
|
|
|
fmod = create()
|
|
fmod.create = create
|
|
|
|
if INIT == "game" then
|
|
fmod.async_dofile("init")
|
|
end
|