diff --git a/advtrains.zip b/advtrains.zip index 72022fc..ef1a4e2 100644 Binary files a/advtrains.zip and b/advtrains.zip differ 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