mirror of
https://github.com/Reuh/ubiquitousse.git
synced 2025-10-27 17:19:31 +00:00
35 lines
875 B
Text
35 lines
875 B
Text
--- Callback system
|
|
-- Allow to call callbacks defined in other systems in entity methods.
|
|
-- Example:
|
|
-- entity.callback:onMove(...) -- call onAdd(system, entitySystemTable, ...) on every system the entity belong to (which has this callback)
|
|
-- Can be also used for onAdd, etc.
|
|
|
|
--- Recursively get a list of systems with a certain method.
|
|
let recGetSystemsWithMethod = (method, systems, l={})
|
|
for _, s in ipairs(systems) do
|
|
if s[method] then
|
|
table.insert(l, s)
|
|
end
|
|
recGetSystemsWithMethod(method, s.systems, l)
|
|
end
|
|
return l
|
|
end
|
|
|
|
return {
|
|
name = "callback",
|
|
filter = true,
|
|
methods = {
|
|
__index = :(c, k)
|
|
let s = recGetSystemsWithMethod(k, {@world})
|
|
@methods[k] = :(c, ...)
|
|
let e = c.entity
|
|
for _, sys in ipairs(s) do
|
|
if sys._previous[e] then
|
|
sys[k](sys, e[sys.name], ...)
|
|
end
|
|
end
|
|
end
|
|
return @_methods_mt[k]
|
|
end
|
|
}
|
|
}
|