diff options
Diffstat (limited to 'mesecons_luacontroller')
| -rw-r--r-- | mesecons_luacontroller/init.lua | 43 | 
1 files changed, 25 insertions, 18 deletions
| diff --git a/mesecons_luacontroller/init.lua b/mesecons_luacontroller/init.lua index d10fd20..bbbd280 100644 --- a/mesecons_luacontroller/init.lua +++ b/mesecons_luacontroller/init.lua @@ -163,19 +163,18 @@ end  -----------------  -- Overheating --  ----------------- - -local function overheat_off(pos) -	mesecon.receptor_off(pos, mesecon.rules.flat) +local function burn_controller(pos) +	local node = minetest.get_node(pos) +	node.name = BASENAME.."_burnt" +	minetest.swap_node(pos, node) +	minetest.get_meta(pos):set_string("lc_memory", ""); +	-- Wait for pending operations +	minetest.after(0.2, mesecon.receptor_off, pos, mesecon.rules.flat)  end -  local function overheat(pos, meta)  	if mesecon.do_overheat(pos) then -- If too hot -		local node = minetest.get_node(pos) -		node.name = BASENAME.."_burnt" -		minetest.swap_node(pos, node) -		-- Wait for pending operations -		minetest.after(0.2, overheat_off, pos) +		burn_controller(pos)  		return true  	end  end @@ -379,12 +378,17 @@ local function load_memory(meta)  end -local function save_memory(meta, mem) -	meta:set_string("lc_memory", -		minetest.serialize( -			remove_functions(mem) -		) -	) +local function save_memory(pos, meta, mem) +	local memstring = minetest.serialize(remove_functions(mem)) +	local memsize_max = mesecon.setting("luacontroller_memsize", 100000) + +	if (#memstring <= memsize_max) then +		meta:set_string("lc_memory", memstring) +	else +		print("Error: Luacontroller memory overflow. "..memsize_max.." bytes available, " +				..#memstring.." required. Controller overheats.") +		burn_controller(pos) +	end  end @@ -412,15 +416,17 @@ local function run(pos, event)  		return "Ports set are invalid."  	end -	save_memory(meta, env.mem) -  	-- Actually set the ports  	set_port_states(pos, env.port) + +	-- Save memory. This may burn the luacontroller if a memory overflow occurs. +	save_memory(pos, meta, env.mem)  end  mesecon.queue:add_function("lc_interrupt", function (pos, luac_id, iid) -	-- There is no luacontroller anymore / it has been reprogrammed / replaced +	-- There is no luacontroller anymore / it has been reprogrammed / replaced / burnt  	if (minetest.get_meta(pos):get_int("luac_id") ~= luac_id) then return end +	if (minetest.registered_nodes[minetest.get_node(pos).name].is_burnt) then return end  	run(pos, {type="interrupt", iid = iid})  end) @@ -595,6 +601,7 @@ minetest.register_node(BASENAME .. "_burnt", {  		"jeija_microcontroller_sides.png"  	},  	inventory_image = "jeija_luacontroller_burnt_top.png", +	is_burnt = true,  	paramtype = "light",  	groups = {dig_immediate=2, not_in_creative_inventory=1},  	drop = BASENAME.."0000", | 
