From b19033b224f4f8ec33f10ba40327f1d811c04fbb Mon Sep 17 00:00:00 2001 From: orwell96 Date: Thu, 2 Feb 2017 16:40:51 +0100 Subject: LuaAutomation - Basic component implementation Implements the base code for LuaAutomation, an ATC rail and a punch-operated 'operation panel' as well as interface for passive components. Changes in advtrains code where neccessary. Supported passive components are light signals, switches and mesecon switches --- .../advtrains_luaautomation/active_common.lua | 118 +++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 advtrains/advtrains_luaautomation/active_common.lua (limited to 'advtrains/advtrains_luaautomation/active_common.lua') diff --git a/advtrains/advtrains_luaautomation/active_common.lua b/advtrains/advtrains_luaautomation/active_common.lua new file mode 100644 index 0000000..b94a260 --- /dev/null +++ b/advtrains/advtrains_luaautomation/active_common.lua @@ -0,0 +1,118 @@ + + +local ac = {nodes={}} + +function ac.load(data) + ac.nodes=data and data.nodes or {} +end +function ac.save() + return {nodes = ac.nodes} +end + +function ac.after_place_node(pos, player) + advtrains.ndb.update(pos) + local meta=minetest.get_meta(pos) + meta:set_string("formspec", ac.getform(pos, meta)) + meta:set_string("infotext", "LuaAutomation component, unconfigured.") + local ph=minetest.hash_node_position(pos) + --just get first available key! + for en,_ in pairs(atlatc.envs) do + ac.nodes[ph]={env=en} + return + end +end +function ac.getform(pos, meta_p) + local meta = meta_p or minetest.get_meta(pos) + local envs_asvalues={} + + local ph=minetest.hash_node_position(pos) + local nodetbl = ac.nodes[ph] + local env, code, err = nil, "", "" + if nodetbl then + code=nodetbl.code or "" + err=nodetbl.err or "" + env=nodetbl.env or "" + end + local sel = 1 + for n,_ in pairs(atlatc.envs) do + envs_asvalues[#envs_asvalues+1]=n + if n==env then + sel=#envs_asvalues + end + end + local form = "size[10,10]dropdown[0,0;3;env;"..table.concat(envs_asvalues, ",")..";"..sel.."]" + .."button[4,0;2,1;save;Save]button[7,0;2,1;cle;Clear local env] textarea[0.2,1;10,10;code;Code;"..minetest.formspec_escape(code).."]" + .."label[0,9.8;"..err.."]" + return form +end + +function ac.after_dig_node(pos, node, player) + advtrains.invalidate_all_paths() + advtrains.ndb.clear(pos) + local ph=minetest.hash_node_position(pos) + ac.nodes[ph]=nil +end + +function ac.on_receive_fields(pos, formname, fields, player) + if not minetest.check_player_privs(player:get_player_name(), {atlatc=true}) then + minetest.chat_send_player(player:get_player_name(), "Missing privilege: atlatc - Operation cancelled!") + end + + local meta=minetest.get_meta(pos) + local ph=minetest.hash_node_position(pos) + local nodetbl = ac.nodes[ph] or {} + --if fields.quit then return end + if fields.env then + nodetbl.env=fields.env + end + if fields.code then + nodetbl.code=fields.code + end + if fields.save then + nodetbl.err=nil + end + if fields.cle then + nodetbl.data={} + end + meta:set_string("formspec", ac.getform(pos, meta)) + + ac.nodes[ph]=nodetbl + if nodetbl.env then + meta:set_string("infotext", "LuaAutomation component, assigned to environment '"..nodetbl.env.."'") + else + meta:set_string("infotext", "LuaAutomation component, invalid enviroment set!") + end +end + +function ac.run_in_env(pos, evtdata, customfct) + local ph=minetest.hash_node_position(pos) + local nodetbl = ac.nodes[ph] or {} + + local meta + if minetest.get_node(pos) then + meta=minetest.get_meta(pos) + end + + if not nodetbl.env or not atlatc.envs[nodetbl.env] then + return false, "Not an existing environment: "..(nodetbl.env or "") + end + if not nodetbl.code or nodetbl.code=="" then + return false, "No code to run!" + end + + local datain=nodetbl.data or {} + local succ, dataout = atlatc.envs[nodetbl.env]:execute_code(datain, nodetbl.code, evtdata, customfct) + if succ then + atlatc.active.nodes[ph].data=atlatc.remove_invalid_data(dataout) + else + atlatc.active.nodes[ph].err=dataout + if meta then + meta:set_string("infotext", "LuaAutomation ATC interface rail, ERROR:"..dataout) + end + end + if meta then + meta:set_string("formspec", ac.getform(pos, meta)) + end +end + +atlatc.active=ac -- cgit v1.2.3