From a9b6964c74b5882ad01e5b8975e61e40412ef1f4 Mon Sep 17 00:00:00 2001 From: Lars Mueller Date: Sun, 29 Aug 2021 11:31:45 +0200 Subject: [PATCH] Add experimental modlib.minetest.get_mod_load_order --- minetest.lua | 3 ++- minetest/misc.lua | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/minetest.lua b/minetest.lua index 9ffecb9..768fc04 100644 --- a/minetest.lua +++ b/minetest.lua @@ -27,7 +27,8 @@ for filename, comps in pairs{ "playerdata", "connected_players", "register_on_leaveplayer", - "get_mod_info" + "get_mod_info", + "get_mod_load_order" }, liquid = { "liquid_level_max", diff --git a/minetest/misc.lua b/minetest/misc.lua index 003716b..14bf949 100644 --- a/minetest/misc.lua +++ b/minetest/misc.lua @@ -298,3 +298,37 @@ function get_mod_info() return mod_info end +--! experimental +function get_mod_load_order() + local mod_info = get_mod_info() + local mod_load_order = {} + -- If there are circular soft dependencies, it is possible that a mod is loaded, but not in the right order + -- TODO somehow maximize the number of soft dependencies fulfilled in case of circular soft dependencies + local function load(mod) + if mod.status == "loaded" then + return true + end + if mod.status == "loading" then + return false + end + -- TODO soft/vs hard loading status, reset? + mod.status = "loading" + -- Try hard dependencies first. These must be fulfilled. + for depend in pairs(mod.depends) do + if not load(mod_info[depend]) then + return false + end + end + -- Now, try soft dependencies. + for depend in pairs(mod.optional_depends) do + load(mod_info[depend]) + end + mod.status = "loaded" + table.insert(mod_load_order, mod) + return true + end + for _, mod in pairs(mod_info) do + assert(load(mod)) + end + return mod_load_order +end