From 12aced92ccadd9df0211ca0b8778f41576dbe574 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 16 Mar 2025 22:27:08 +0300 Subject: [PATCH] feat: reloading modules --- res/layouts/console.xml.lua | 1 + res/scripts/stdmin.lua | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/res/layouts/console.xml.lua b/res/layouts/console.xml.lua index 5a5a1101..cc9d7147 100644 --- a/res/layouts/console.xml.lua +++ b/res/layouts/console.xml.lua @@ -172,6 +172,7 @@ function run_current_file() world = world.reload_script, hud = hud.reload_script, component = entities.reload_component, + module = reload_module, } func = funcs[script_type] or func local output = core.capture_output(function() func(unit) end) diff --git a/res/scripts/stdmin.lua b/res/scripts/stdmin.lua index d9be5cca..1366966a 100644 --- a/res/scripts/stdmin.lua +++ b/res/scripts/stdmin.lua @@ -475,6 +475,35 @@ function on_deprecated_call(name, alternatives) end end +function reload_module(name) + local prefix, name = parse_path(name) + local path = prefix..":modules/"..name..".lua" + + local previous = package.loaded[path] + if not previous then + debug.log("attempt to reload non-loaded module "..name.." ("..path..")") + return + end + local script, err = load(file.read(path), path) + if script == nil then + error(err) + end + local result = script() + if not result then + return + end + for i, value in ipairs(result) do + previous[i] = value + end + local copy = table.copy(result) + for key, value in pairs(result) do + result[key] = nil + end + for key, value in pairs(copy) do + previous[key] = value + end +end + -- Load script with caching -- -- path - script path `contentpack:filename`.