diff options
Diffstat (limited to 'mesecons_luacontroller/init.lua')
-rw-r--r-- | mesecons_luacontroller/init.lua | 60 |
1 files changed, 43 insertions, 17 deletions
diff --git a/mesecons_luacontroller/init.lua b/mesecons_luacontroller/init.lua index 2166754..c8cb6ca 100644 --- a/mesecons_luacontroller/init.lua +++ b/mesecons_luacontroller/init.lua @@ -100,17 +100,17 @@ local heat = function (meta) -- warm up end end -local cool = function (meta) -- cool down after a while - h = meta:get_int("heat") - if h ~= nil then - meta:set_int("heat", h - 1) - end -end +--local cool = function (meta) -- cool down after a while +-- h = meta:get_int("heat") +-- if h ~= nil then +-- meta:set_int("heat", h - 1) +-- end +--end local overheat = function (meta) -- determine if too hot h = meta:get_int("heat") if h == nil then return true end -- if nil then overheat - if h > 20 then + if h > 40 then return true else return false @@ -127,7 +127,7 @@ end local code_prohibited = function(code) -- Clean code - local prohibited = {"while", "for", "repeat", "until", "function"} + local prohibited = {"while", "for", "repeat", "until", "function", "goto"} for _, p in ipairs(prohibited) do if string.find(code, p) then return "Prohibited command: "..p @@ -135,10 +135,34 @@ local code_prohibited = function(code) end end -local safeprint = function(param) +local safe_print = function(param) print(dump(param)) end +deep_copy = function(original, visited) --deep copy that removes functions + visited = visited or {} + if visited[original] ~= nil then --already visited this node + return visited[original] + end + if type(original) == 'table' then --nested table + local copy = {} + visited[original] = copy + for key, value in next, original, nil do + copy[deep_copy(key, visited)] = deep_copy(value, visited) + end + setmetatable(copy, deep_copy(getmetatable(original), visited)) + return copy + elseif type(original) == 'function' then --ignore functions + return nil + else --by-value type + return original + end +end + +local safe_serialize = function(value) + return minetest.serialize(deep_copy(value)) +end + local interrupt = function(params) lc_update(params.pos, {type="interrupt", iid = params.iid}) end @@ -150,15 +174,16 @@ local getinterrupt = function(pos) local meta = minetest.env:get_meta(pos) local interrupts = minetest.deserialize(meta:get_string("lc_interrupts")) or {} local found = false + local search = safe_serialize(iid) for _, i in ipairs(interrupts) do - if minetest.serialize(i) == minetest.serialize(iid) then + if safe_serialize(i) == search then found = true break end end if not found then table.insert(interrupts, iid) - meta:set_string("lc_interrupts", minetest.serialize(interrupts)) + meta:set_string("lc_interrupts", safe_serialize(interrupts)) end minetest.after(time, interrupt, {pos=pos, iid = iid}) end @@ -181,7 +206,7 @@ local create_environment = function(pos, mem, event) local rports = get_real_portstates(pos) return { - print = safeprint, + print = safe_print, pin = merge_portstates(vports, rports), port = vports, interrupt = getinterrupt(pos), @@ -258,7 +283,7 @@ end local do_overheat = function (pos, meta) -- Overheat protection heat(meta) - minetest.after(0.5, cool, meta) + --minetest.after(0.5, cool, meta) if overheat(meta) then mesecon:swap_node(pos, BASENAME.."_burnt") minetest.env:get_meta(pos):set_string("lc_interrupts", "") @@ -272,15 +297,16 @@ local load_memory = function(meta) end local save_memory = function(meta, mem) - meta:set_string("lc_memory", minetest.serialize(mem)) + meta:set_string("lc_memory", safe_serialize(mem)) end local interrupt_allow = function (meta, event) if event.type ~= "interrupt" then return true end local interrupts = minetest.deserialize(meta:get_string("lc_interrupts")) or {} + local search = safe_serialize(event.iid) for _, i in ipairs(interrupts) do - if minetest.serialize(i) == minetest.serialize(event.iid) then + if safe_serialize(i) == search then return true end end @@ -414,9 +440,9 @@ if d == 1 then end if a + b + c + d ~= 0 then - groups = {dig_immediate=2, not_in_creative_inventory=1} + groups = {dig_immediate=2, not_in_creative_inventory=1, overheat = 1} else - groups = {dig_immediate=2} + groups = {dig_immediate=2, overheat = 1} end output_rules[cid] = {} |