mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-04 18:41:51 +00:00
70 lines
1.4 KiB
Lua
70 lines
1.4 KiB
Lua
local rules = {nextid = 1, rules = {}}
|
|
|
|
function rules.get_rule(name)
|
|
local rule = rules.rules[name]
|
|
if rule == nil then
|
|
rule = {listeners={}}
|
|
rules.rules[name] = rule
|
|
end
|
|
return rule
|
|
end
|
|
|
|
function rules.get(name)
|
|
local rule = rules.rules[name]
|
|
if rule == nil then
|
|
return nil
|
|
end
|
|
return rule.value
|
|
end
|
|
|
|
function rules.set(name, value)
|
|
local rule = rules.get_rule(name)
|
|
rule.value = value
|
|
for _, handler in pairs(rule.listeners) do
|
|
handler(value)
|
|
end
|
|
end
|
|
|
|
function rules.reset(name)
|
|
local rule = rules.get_rule(name)
|
|
rules.set(name, rule.default)
|
|
end
|
|
|
|
function rules.listen(name, handler)
|
|
local rule = rules.get_rule(name)
|
|
local id = rules.nextid
|
|
rules.nextid = rules.nextid + 1
|
|
rule.listeners[utf8.encode(id)] = handler
|
|
return id
|
|
end
|
|
|
|
function rules.create(name, value, handler)
|
|
local rule = rules.get_rule(name)
|
|
rule.default = value
|
|
|
|
local handlerid
|
|
if handler ~= nil then
|
|
handlerid = rules.listen(name, handler)
|
|
end
|
|
if rules.get(name) == nil then
|
|
rules.set(name, value)
|
|
elseif handler then
|
|
handler(rules.get(name))
|
|
end
|
|
return handlerid
|
|
end
|
|
|
|
function rules.unlisten(name, id)
|
|
local rule = rules.rules[name]
|
|
if rule == nil then
|
|
return
|
|
end
|
|
rule.listeners[utf8.encode(id)] = nil
|
|
end
|
|
|
|
function rules.clear()
|
|
rules.rules = {}
|
|
rules.nextid = 1
|
|
end
|
|
|
|
return rules
|