mirror of
https://github.com/Dadido3/noita-mapcap.git
synced 2024-11-22 21:17:33 +00:00
53 lines
1.9 KiB
Lua
53 lines
1.9 KiB
Lua
-- Copyright (c) 2022 David Vogel
|
|
--
|
|
-- This software is released under the MIT License.
|
|
-- https://opensource.org/licenses/MIT
|
|
|
|
-- Allows Noita mods to reload themselves every now and then.
|
|
-- This helps dramatically with development, as we don't have to restart Noita for every change.
|
|
-- To accomplish this, we need to override the default behavior of dofile and some other things.
|
|
|
|
local LiveReload = {}
|
|
|
|
local oldDofile = dofile
|
|
---Overwritten dofile to execute a lua script from disk and cirumvent any caching.
|
|
---Noita for some reason caches script files (Or loads them into its virtual filesystem)(Or caches compiled bytecode), so reloading script files from disk does not work without this.
|
|
---
|
|
---This is not fully conform the the standard lua implementation, but so isn't Noita's implementation.
|
|
---@param path string
|
|
---@return any result
|
|
---@return string|nil err
|
|
function dofile(path) ---TODO: Consider moving dofile into compatibility.lua
|
|
local func, err = loadfile(path)
|
|
if not func then return nil, err end
|
|
|
|
local status, res = pcall(func)
|
|
if not status then return nil, res end
|
|
|
|
return res, nil
|
|
end
|
|
|
|
---Reloads the mod's init file in the given interval in frames.
|
|
---For reloading to work correctly, the mod has to be structured in a special way.
|
|
---Like the usage of require and namespaces.
|
|
---
|
|
---Just put this into your `OnWorldPreUpdate` or `OnWorldPostUpdate` callback:
|
|
---
|
|
--- LiveReload:Reload("mods/your-mod/", 60) -- The trailing path separator is needed!
|
|
---@param modPath string
|
|
---@param interval integer
|
|
function LiveReload:Reload(modPath, interval)
|
|
interval = interval or 60
|
|
self.Counter = (self.Counter or 0) + 1
|
|
if self.Counter < interval then return end
|
|
self.Counter = nil
|
|
|
|
local res, err = dofile(modPath .. "init.lua")
|
|
if err then
|
|
print(string.format("Error reloading mod: %s", err))
|
|
error(string.format("Error reloading mod: %s", err))
|
|
end
|
|
end
|
|
|
|
return LiveReload
|