canary/data/scripts/lib/helper_constructors.lua

53 lines
1.4 KiB
Lua

-- HelperConstructors
local classes = { Action, CreatureEvent, Spell, TalkAction, MoveEvent, GlobalEvent, Weapon }
for _, class in ipairs(classes) do
local MT = getmetatable(class)
local DefaultConstructor = MT.__call
MT.__call = function(self, def, ...)
-- Backwards compatibility for default obj() constructor
if type(def) ~= "table" then
return DefaultConstructor(self, def, ...)
end
local obj = nil
if def.init then
obj = DefaultConstructor(self, unpack(def.init))
else
obj = DefaultConstructor(self)
end
-- Call each method from definition table with the value as params
local hasCallback = false
for methodName, value in pairs(def) do
-- Strictly check if a correct callback is passed
if methodName:sub(1, 2) == "on" and type(value) == "function" and rawget(class, methodName) then
hasCallback = true
end
if methodName ~= "register" then
local method = rawget(self, methodName)
if method then
if type(value) == "table" then
method(obj, unpack(value))
else
method(obj, value)
end
end
end
end
-- Only register if callback has already been defined, otherwise defining afterwards will not work
if def.register then
if not hasCallback then
logger.warn("[HelperConstructors] - Event not registered due to there being no callback")
else
obj:register()
end
end
return obj
end
end