feat: Move class and require hooks into early loading
This commit is contained in:
parent
33756cd6d5
commit
2d15647fb5
4 changed files with 9 additions and 79 deletions
|
@ -1,26 +0,0 @@
|
|||
local original_class = Mods.original_class or class
|
||||
Mods.original_class = original_class
|
||||
|
||||
local _G = _G
|
||||
local rawget = rawget
|
||||
local rawset = rawset
|
||||
|
||||
-- The `__index` metamethod maps a proper identifier `CLASS.MyClassName` to the
|
||||
-- stringified version of the key: `"MyClassName"`.
|
||||
-- This allows using LuaCheck for the stringified class names in hook parameters.
|
||||
_G.CLASS = _G.CLASS or setmetatable({}, {
|
||||
__index = function(_, key)
|
||||
return key
|
||||
end
|
||||
})
|
||||
|
||||
class = function(class_name, super_name, ...)
|
||||
local result = original_class(class_name, super_name, ...)
|
||||
if not rawget(_G, class_name) then
|
||||
rawset(_G, class_name, result)
|
||||
end
|
||||
if not rawget(_G.CLASS, class_name) then
|
||||
rawset(_G.CLASS, class_name, result)
|
||||
end
|
||||
return result
|
||||
end
|
|
@ -1,3 +1,6 @@
|
|||
dofile("scripts/mods/dml/message")
|
||||
dofile("scripts/mods/dml/hook")
|
||||
|
||||
local StateGame = require("scripts/game_states/state_game")
|
||||
local StateSplash = require("scripts/game_states/game/state_splash")
|
||||
local GameStateMachine = require("scripts/foundation/utilities/game_state_machine")
|
||||
|
@ -6,20 +9,9 @@ local GameStateMachine = require("scripts/foundation/utilities/game_state_machin
|
|||
-- to initialize the modding environment.
|
||||
local loader = {}
|
||||
|
||||
Mods = {}
|
||||
|
||||
function loader:init(mod_data, libs, boot_gui)
|
||||
-- The metatable prevents overwriting these
|
||||
self._libs = setmetatable({}, { __index = libs })
|
||||
Mods.lua = self._libs
|
||||
|
||||
dofile("scripts/mods/dml/message")
|
||||
dofile("scripts/mods/dml/require")
|
||||
dofile("scripts/mods/dml/class")
|
||||
dofile("scripts/mods/dml/hook")
|
||||
|
||||
function loader:init(mod_data, boot_gui)
|
||||
local ModLoader = dofile("scripts/mods/dml/mod_loader")
|
||||
local mod_loader = ModLoader:new(mod_data, libs, boot_gui)
|
||||
local mod_loader = ModLoader:new(mod_data, boot_gui)
|
||||
self._mod_loader = mod_loader
|
||||
Managers.mod = mod_loader
|
||||
|
||||
|
|
|
@ -26,10 +26,10 @@ local BUTTON_INDEX_R = Keyboard.button_index("r")
|
|||
local BUTTON_INDEX_LEFT_SHIFT = Keyboard.button_index("left shift")
|
||||
local BUTTON_INDEX_LEFT_CTRL = Keyboard.button_index("left ctrl")
|
||||
|
||||
ModLoader.init = function(self, mod_data, libs, boot_gui)
|
||||
ModLoader.init = function(self, mod_data, boot_gui)
|
||||
table.dump(mod_data, nil, 5, function(...) Log.info("ModLoader", ...) end)
|
||||
|
||||
self._mod_data = mod_data
|
||||
self._libs = libs
|
||||
self._gui = boot_gui
|
||||
|
||||
self._settings = Application.user_setting("mod_settings") or DEFAULT_SETTINGS
|
||||
|
@ -142,7 +142,7 @@ ModLoader.update = function(self, dt)
|
|||
|
||||
if next_index > #mod_data.packages then
|
||||
mod.state = "running"
|
||||
local ok, object = xpcall(mod_data.run, self._libs.debug.traceback)
|
||||
local ok, object = xpcall(mod_data.run, Script.callstack)
|
||||
|
||||
if not ok then
|
||||
Log.error("ModLoader", "Failed 'run' for %q: %s", mod.name, object)
|
||||
|
@ -198,7 +198,7 @@ ModLoader._run_callback = function (self, mod, callback_name, ...)
|
|||
|
||||
local args = table_pack(...)
|
||||
|
||||
local success, val = xpcall(function() return cb(object, table_unpack(args)) end, self._libs.debug.traceback)
|
||||
local success, val = xpcall(function() return cb(object, table_unpack(args)) end, Script.callstack)
|
||||
|
||||
if success then
|
||||
return val
|
||||
|
|
|
@ -1,36 +0,0 @@
|
|||
local require_store = Mods.require_store or {}
|
||||
Mods.require_store = require_store
|
||||
|
||||
local original_require = Mods.original_require or require
|
||||
Mods.original_require = original_require
|
||||
|
||||
local can_insert = function(filepath, new_result)
|
||||
local store = require_store[filepath]
|
||||
if not store or #store then
|
||||
return true
|
||||
end
|
||||
|
||||
if store[#store] ~= new_result then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
require = function(filepath, ...)
|
||||
local result = original_require(filepath, ...)
|
||||
if result and type(result) == "table" then
|
||||
if can_insert(filepath, result) then
|
||||
require_store[filepath] = require_store[filepath] or {}
|
||||
local store = require_store[filepath]
|
||||
|
||||
table.insert(store, result)
|
||||
|
||||
--print("[Require] #" .. tostring(#store) .. " of " .. filepath)
|
||||
local Mods = Mods
|
||||
if Mods.hook then
|
||||
Mods.hook.enable_by_file(filepath, #store)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return result
|
||||
end
|
Loading…
Add table
Reference in a new issue