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
This commit is contained in:
orwell96 2017-02-04 18:35:34 +01:00
parent 1e3bd3a5fd
commit 61e48fff28
8 changed files with 75 additions and 38 deletions

Binary file not shown.

View File

@ -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

View File

@ -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");

View File

@ -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
}

View File

@ -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(<atc_command>)
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.

View File

@ -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 "<nil>")
atwarn("LuaAutomation component at",ph,": Not an existing environment: "..(nodetbl.env or "<nil>"))
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

View File

@ -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)

View File

@ -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