aboutsummaryrefslogtreecommitdiff
path: root/advtrains_interlocking
diff options
context:
space:
mode:
Diffstat (limited to 'advtrains_interlocking')
-rw-r--r--advtrains_interlocking/lzb.lua33
1 files changed, 32 insertions, 1 deletions
diff --git a/advtrains_interlocking/lzb.lua b/advtrains_interlocking/lzb.lua
index 16724c5..1746cc0 100644
--- a/advtrains_interlocking/lzb.lua
+++ b/advtrains_interlocking/lzb.lua
@@ -1,6 +1,18 @@
-- lzb.lua
-- Enforced and/or automatic train override control, obeying signals
+
+local function approach_callback(parpos, train_id, train, index)
+ local pos = advtrains.round_vector_floor_y(parpos)
+
+ local node=pnode or advtrains.ndb.get_node(pos)
+ local ndef=minetest.registered_nodes[node.name]
+ if ndef and ndef.advtrains and ndef.advtrains.on_train_approach then
+ ndef.advtrains.on_train_approach(pos, train_id, train, index)
+ end
+end
+
+
--[[
Documentation of train.lzb table
train.lzb = {
@@ -10,9 +22,13 @@ train.lzb = {
travwspd = warning speed res.
oncoming = table containing oncoming signals, in order of appearance on the path
{
- pos = position of the signal (not the IP!)
+ pos = position of the signal (not the IP!). Can be nil
idx = where this is on the path
spd = speed allowed to pass (determined dynamically)
+ npr = <boolean> "No permanent restriction" If true, this is only a punctual restriction.
+ speed_restriction is not set then, and train can accelerate after passing point
+ This is (as of Nov 2017) used by "lines" to brake the train down to 2 when approaching a stop
+ The actual "stop" command is given when the train passes the rail (on_train_enter callback)
}
}
each step, for every item in "oncoming", we need to determine the location to start braking (+ some safety margin)
@@ -67,6 +83,9 @@ local function look_ahead(id, train)
spd = 0,
})
else
+ -- run callback, if exists
+ approach_callback(pos, id, train, trav)
+
-- check for signal
local asp, spos = il.db.get_ip_signal_asp(pts, cn)
--atdebug("trav: ",pos, cn, asp, spos, "travsht=", lzb.travsht)
@@ -207,6 +226,18 @@ function advtrains.interlocking.lzb_invalidate(train)
invalidate(train)
end
+-- Add an (extra) lzb control point that is not a permanent restriction (see above)
+-- (permanent restrictions are only to be imposed by signal ip's)
+function advtrains.interlocking.lzb_add_oncoming_npr(train, idx, spd)
+ local lzb = train.lzb
+
+ table.insert(lzb.oncoming, {
+ idx = idx,
+ spd = spd,
+ npr = true,
+ })
+end
+
advtrains.te_register_on_new_path(function(id, train)
invalidate(train)