From 61e48fff280075ec52bfaa31644c22b08814d680 Mon Sep 17 00:00:00 2001 From: orwell96 Date: Sat, 4 Feb 2017 18:35:34 +0100 Subject: [PATCH] Commit 1.6.2 - Add some more stuff to API for LuaATC rails - Warn on strange events even if debug info is disabled - save atlatc on shutdown too - fix detector rails in unloaded chunks - do not fail silently in simple ATC rails --- advtrains.zip | Bin 5121059 -> 5121594 bytes advtrains/advtrains/atc.lua | 18 +++++- advtrains/advtrains/init.lua | 5 ++ advtrains/advtrains/tracks.lua | 4 +- advtrains/advtrains_luaautomation/README.txt | 12 ++-- .../advtrains_luaautomation/active_common.lua | 16 +++-- .../advtrains_luaautomation/atc_rail.lua | 56 ++++++++++-------- advtrains/advtrains_luaautomation/init.lua | 2 + 8 files changed, 75 insertions(+), 38 deletions(-) diff --git a/advtrains.zip b/advtrains.zip index 72022fcc9116a9d015deb3942b798c883726cc96..ef1a4e2ea20a883919bcaefd9015ff0c9ffbc7f1 100644 GIT binary patch delta 16666 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 diff --git a/advtrains/advtrains/atc.lua b/advtrains/advtrains/atc.lua index 609857b..bf94ba5 100644 --- a/advtrains/advtrains/atc.lua +++ b/advtrains/advtrains/atc.lua @@ -41,10 +41,22 @@ function atc.send_command(pos) ) advtrains.trains[train_id].atc_command=atc.controllers[pts].command atprint("Sending ATC Command: "..atc.controllers[pts].command) + return true end end + atwarn("ATC rail at", pos, ": Rail not on train's path! Can't determine arrow direction. Assuming +!") + advtrains.trains[train_id].atc_arrow=true + advtrains.trains[train_id].atc_command=atc.controllers[pts].command + atprint("Sending ATC Command: "..atc.controllers[pts].command) + else + atwarn("ATC rail at", pos, ": Sending command failed: The train",train_id,"does not exist. This seems to be a bug.") end + else + atwarn("ATC rail at", pos, ": Sending command failed: There's no train at this position. This seems to be a bug.") end + else + atwarn("ATC rail at", pos, ": Sending command failed: Entry for controller not found.") + atwarn("ATC rail at", pos, ": Please visit controller and click 'Save'") end return false end @@ -182,7 +194,7 @@ local matchptn={ train.movedir=train.movedir*-1 train.atc_arrow = not train.atc_arrow else - minetest.chat_send_all(attrans("ATC Reverse command warning: didn't reverse train, train moving!")) + atwarn(sid(id), attrans("ATC Reverse command warning: didn't reverse train, train moving!")) end return 1 end, @@ -241,7 +253,7 @@ function atc.execute_atc_command(id, train) local nest, pos, elsepos=0, 1 while nest>=0 do if pos>#rest then - minetest.chat_send_all(attrans("ATC command syntax error: I statement not closed: @1",command)) + atwarn(sid(id), attrans("ATC command syntax error: I statement not closed: @1",command)) atc.train_reset_command(id) return end @@ -284,7 +296,7 @@ function atc.execute_atc_command(id, train) end end end - minetest.chat_send_all(attrans("ATC command parse error: Unknown command: @1", command)) + atwarn(sid(id), attrans("ATC command parse error: Unknown command: @1", command)) atc.train_reset_command(id) end diff --git a/advtrains/advtrains/init.lua b/advtrains/advtrains/init.lua index 5ae5e80..c60b2f1 100644 --- a/advtrains/advtrains/init.lua +++ b/advtrains/advtrains/init.lua @@ -49,6 +49,11 @@ if minetest.setting_getbool("advtrains_debug") then minetest.chat_send_all("[advtrains]"..text) end end +atwarn=function(t, ...) + local text=advtrains.print_concat_table({t, ...}) + minetest.log("warning", "[advtrains]"..text) + minetest.chat_send_all("[advtrains] -!- "..text) +end sid=function(id) return string.sub(id, -4) end dofile(advtrains.modpath.."/helpers.lua"); diff --git a/advtrains/advtrains/tracks.lua b/advtrains/advtrains/tracks.lua index c5ab436..63c4f16 100644 --- a/advtrains/advtrains/tracks.lua +++ b/advtrains/advtrains/tracks.lua @@ -615,7 +615,7 @@ if mesecon then }, advtrains = { on_train_enter=function(pos, train_id) - minetest.swap_node(pos, {name="advtrains:dtrack_detector_on".."_"..suffix..rotation, param2=minetest.get_node(pos).param2}) + advtrains.ndb.swap_node(pos, {name="advtrains:dtrack_detector_on".."_"..suffix..rotation, param2=minetest.get_node(pos).param2}) mesecon.receptor_on(pos, advtrains.meseconrules) end } @@ -640,7 +640,7 @@ if mesecon then }, advtrains = { on_train_leave=function(pos, train_id) - minetest.swap_node(pos, {name="advtrains:dtrack_detector_off".."_"..suffix..rotation, param2=minetest.get_node(pos).param2}) + advtrains.ndb.swap_node(pos, {name="advtrains:dtrack_detector_off".."_"..suffix..rotation, param2=minetest.get_node(pos).param2}) mesecon.receptor_off(pos, advtrains.meseconrules) end } diff --git a/advtrains/advtrains_luaautomation/README.txt b/advtrains/advtrains_luaautomation/README.txt index 41ffdb0..6a2114b 100644 --- a/advtrains/advtrains_luaautomation/README.txt +++ b/advtrains/advtrains_luaautomation/README.txt @@ -117,13 +117,15 @@ Fired when another node called 'interrupt_pos' on this position. 'message' is th In addition to the default environment functions, the following functions are available: atc_send() -Sends the specified ATC command to the train and returns true. If there is no train, returns false and does nothing. - + Sends the specified ATC command to the train and returns true. If there is no train, returns false and does nothing. atc_reset() -Resets the train's current ATC command - + Resets the train's current ATC command. If there is no train, returns false and does nothing. atc_arrow -Boolean, true when the train is driving in the direction of the arrows of the ATC rail + Boolean, true when the train is driving in the direction of the arrows of the ATC rail. Nil if there is no train. +atc_id + Train ID of the train currently passing the controller. Nil if there's no train. +atc_speed + Speed of the train, or nil if there is no train. # Operator panel This simple node executes its actions when punched. It can be used to change a switch and update the corresponding signals or similar applications. diff --git a/advtrains/advtrains_luaautomation/active_common.lua b/advtrains/advtrains_luaautomation/active_common.lua index 50a5051..0351c85 100644 --- a/advtrains/advtrains_luaautomation/active_common.lua +++ b/advtrains/advtrains_luaautomation/active_common.lua @@ -76,9 +76,10 @@ function ac.on_receive_fields(pos, formname, fields, player) if fields.cle then nodetbl.data={} end - meta:set_string("formspec", ac.getform(pos, meta)) ac.nodes[ph]=nodetbl + + meta:set_string("formspec", ac.getform(pos, meta)) if nodetbl.env then meta:set_string("infotext", "LuaAutomation component, assigned to environment '"..nodetbl.env.."'") else @@ -88,7 +89,11 @@ end function ac.run_in_env(pos, evtdata, customfct_p) local ph=minetest.pos_to_string(pos) - local nodetbl = ac.nodes[ph] or {} + local nodetbl = ac.nodes[ph] + if not nodetbl then + atwarn("LuaAutomation component at",ph,": Data not in memory! Please visit component and click 'Save'!") + return + end local meta if minetest.get_node(pos) then @@ -96,10 +101,12 @@ function ac.run_in_env(pos, evtdata, customfct_p) end if not nodetbl.env or not atlatc.envs[nodetbl.env] then - return false, "Not an existing environment: "..(nodetbl.env or "") + atwarn("LuaAutomation component at",ph,": Not an existing environment: "..(nodetbl.env or "")) + return false end if not nodetbl.code or nodetbl.code=="" then - return false, "No code to run!" + atwarn("LuaAutomation component at",ph,": No code to run! (insert -- to suppress warning)") + return false end local customfct=customfct_p or {} @@ -113,6 +120,7 @@ function ac.run_in_env(pos, evtdata, customfct_p) atlatc.active.nodes[ph].data=atlatc.remove_invalid_data(dataout) else atlatc.active.nodes[ph].err=dataout + atwarn("LuaAutomation ATC interface rail at",ph,": LUA Error:",dataout) if meta then meta:set_string("infotext", "LuaAutomation ATC interface rail, ERROR:"..dataout) end diff --git a/advtrains/advtrains_luaautomation/atc_rail.lua b/advtrains/advtrains_luaautomation/atc_rail.lua index f52252c..c2c8d6f 100644 --- a/advtrains/advtrains_luaautomation/atc_rail.lua +++ b/advtrains/advtrains_luaautomation/atc_rail.lua @@ -11,7 +11,7 @@ function r.fire_event(pos, evtdata) local railtbl = atlatc.active.nodes[ph] if not railtbl then - atprint("missing rail table entry!") + atwarn("LuaAutomation ATC interface rail at",ph,": Data not in memory! Please visit position and click 'Save'!") return end @@ -19,40 +19,48 @@ function r.fire_event(pos, evtdata) local arrowconn = railtbl.arrowconn --prepare ingame API for ATC. Regenerate each time since pos needs to be known - local atc_valid, atc_arrow + --If no train, then return false. local train_id=advtrains.detector.on_node[ph] - local train=advtrains.trains[train_id] - if not train then return false end - if not train.path then - --we happened to get in between an invalidation step - --delay - atlatc.interrupt.add(0,pos,evtdata) - return - end - for index, ppos in pairs(train.path) do - if vector.equals(advtrains.round_vector_floor_y(ppos), pos) then - atc_arrow = - vector.equals( - advtrains.dirCoordSet(pos, arrowconn), - advtrains.round_vector_floor_y(train.path[index+train.movedir]) - ) - atc_valid = true + local train, atc_arrow, tvel + if train_id then train=advtrains.trains[train_id] end + if train then + if not train.path then + --we happened to get in between an invalidation step + --delay + atlatc.interrupt.add(0,pos,evtdata) + return + end + for index, ppos in pairs(train.path) do + if vector.equals(advtrains.round_vector_floor_y(ppos), pos) then + atc_arrow = + vector.equals( + advtrains.dirCoordSet(pos, arrowconn), + advtrains.round_vector_floor_y(train.path[index+train.movedir]) + ) + end + end + if atc_arrow==nil then + atwarn("LuaAutomation ATC rail at", pos, ": Rail not on train's path! Can't determine arrow direction. Assuming +!") + atc_arrow=true + tvel=train.velocity end end local customfct={ atc_send = function(cmd) + if not train_id then return false end advtrains.atc.train_reset_command(train_id) - if atc_valid then - train.atc_command=cmd - train.atc_arrow=atc_arrow - return atc_valid - end + train.atc_command=cmd + train.atc_arrow=atc_arrow + return true end, atc_reset = function(cmd) + if not train_id then return false end advtrains.atc.train_reset_command(train_id) return true end, - atc_arrow = atc_arrow + atc_arrow = atc_arrow, + atc_id = train_id, + atc_speed = tvel, } atlatc.active.run_in_env(pos, evtdata, customfct) diff --git a/advtrains/advtrains_luaautomation/init.lua b/advtrains/advtrains_luaautomation/init.lua index d88944f..feea372 100644 --- a/advtrains/advtrains_luaautomation/init.lua +++ b/advtrains/advtrains_luaautomation/init.lua @@ -85,6 +85,8 @@ atlatc.save = function() file:close() end +minetest.register_on_shutdown(atlatc.save) + -- globalstep for step code local timer, step_int=0, 2 local stimer, sstep_int=0, 10