aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authororwell96 <orwell@bleipb.de>2020-06-12 12:32:46 +0200
committerorwell96 <orwell@bleipb.de>2021-02-10 16:36:24 +0100
commit61329c11a28ca0d68f95f189d3a66c373d7dddc3 (patch)
tree8e57504f17c86efdadf2b8494e3427e4f947a001
parentd3b2f614be059e65869a615fe319118c0a354995 (diff)
downloadadvtrains-61329c11a28ca0d68f95f189d3a66c373d7dddc3.tar.gz
advtrains-61329c11a28ca0d68f95f189d3a66c373d7dddc3.tar.bz2
advtrains-61329c11a28ca0d68f95f189d3a66c373d7dddc3.zip
Start using path_invalidate_ahead()
-rw-r--r--advtrains/lzb.lua8
-rw-r--r--advtrains/nodedb.lua2
-rw-r--r--advtrains/path.lua18
-rw-r--r--advtrains/signals.lua17
-rw-r--r--advtrains/trainlogic.lua12
-rw-r--r--advtrains_interlocking/signal_api.lua16
6 files changed, 55 insertions, 18 deletions
diff --git a/advtrains/lzb.lua b/advtrains/lzb.lua
index c4b3a27..ca92170 100644
--- a/advtrains/lzb.lua
+++ b/advtrains/lzb.lua
@@ -190,15 +190,16 @@ function advtrains.lzb_invalidate_ahead(train, start_idx)
local idx = atfloor(start_idx)
local i = 1
while train.lzb.checkpoints[i] do
- if train.lzb.checkpoints[i].idx >= idx then
+ if train.lzb.checkpoints[i].index >= idx then
table.remove(train.lzb.checkpoints, i)
else
i=i+1
end
end
+ train.lzb.trav_index = idx
-- re-apply all checkpoints to path_speed
train.path_speed = {}
- for _,ckp in train.lzb.checkpoints do
+ for _,ckp in ipairs(train.lzb.checkpoints) do
apply_checkpoint_to_path(train, ckp)
end
end
@@ -236,8 +237,9 @@ advtrains.te_register_on_new_path(function(id, train)
look_ahead(id, train)
end)
-advtrains.te_register_on_invalidate_ahead(function(id, train)
+advtrains.te_register_on_invalidate_ahead(function(id, train, start_idx)
advtrains.lzb_invalidate_ahead(train, start_idx)
+ look_ahead(id, train)
end)
advtrains.te_register_on_update(function(id, train)
diff --git a/advtrains/nodedb.lua b/advtrains/nodedb.lua
index 048d5b4..4539529 100644
--- a/advtrains/nodedb.lua
+++ b/advtrains/nodedb.lua
@@ -246,7 +246,7 @@ function ndb.update(pos, pnode)
local resid = (nid * 4) + (l2b(node.param2 or 0))
ndbset(pos.x, pos.y, pos.z, resid )
--atdebug("nodedb: updating node", pos, "stored nid",nid,"assigned",ndb_nodeids[nid],"resulting cid",resid)
- minetest.after(0, advtrains.invalidate_all_paths, pos)
+ advtrains.invalidate_all_paths_ahead(pos)
else
--at this position there is no longer a node that needs to be tracked.
--atdebug("nodedb: updating node", pos, "cleared")
diff --git a/advtrains/path.lua b/advtrains/path.lua
index cd7d94a..7226a7b 100644
--- a/advtrains/path.lua
+++ b/advtrains/path.lua
@@ -141,22 +141,30 @@ end
-- Keeps the path intact, but invalidates all path nodes from the specified index (inclusive)
-- onwards. This has the advantage that we don't need to recalculate the whole path, and we can do it synchronously.
-function advtrains.path_invalidate_ahead(train, start_idx)
+function advtrains.path_invalidate_ahead(train, start_idx, ignore_when_passed)
local idx = atfloor(start_idx)
+ --atdebug("Invalidate_ahead:",train.id,"start_index",start_idx,"cur_idx",train.index)
- if(idx <= train.index) then
+ if(idx <= train.index - 0.5) then
+ if ignore_when_passed then
+ --atdebug("ignored passed")
+ return
+ end
advtrains.path_print(train, atwarn)
error("Train "+train.id+": Cannot path_invalidate_ahead start_idx="+idx+" as train has already passed!")
end
- local i = idx
+ -- leave current node in path, it won't change. What might change is the path onward from here (e.g. switch)
+ local i = idx + 1
while train.path[i] do
advtrains.occ.clear_item(train.id, advtrains.round_vector_floor_y(train.path[i]))
+ i = i+1
end
- train.path_ext_f=idx - 1
- train.path_trk_f=idx - 1
+ train.path_ext_f=idx
+ train.path_trk_f=math.min(idx, train.path_trk_f)
+ -- callbacks called anyway for current node, because of LZB
advtrains.run_callbacks_invahead(train.id, train, idx)
end
diff --git a/advtrains/signals.lua b/advtrains/signals.lua
index 68cbc70..9df2f99 100644
--- a/advtrains/signals.lua
+++ b/advtrains/signals.lua
@@ -20,6 +20,18 @@ return {
}
end
+local suppasp = {
+ main = {0, false},
+ dst = {false},
+ shunt = nil,
+ proceed_as_main = true,
+ info = {
+ call_on = false,
+ dead_end = false,
+ w_speed = nil,
+ }
+}
+
for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", als="green"}}) do
advtrains.trackplacer.register_tracktype("advtrains:retrosignal", "")
@@ -81,7 +93,8 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red",
end,
get_aspect = function(pos, node)
return aspect(r=="on")
- end
+ end,
+ supported_aspects = suppasp,
},
can_dig = can_dig_func,
})
@@ -141,6 +154,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red",
get_aspect = function(pos, node)
return aspect(r=="on")
end,
+ supported_aspects = suppasp,
getstate = f.ls,
setstate = function(pos, node, newstate)
if newstate == f.als then
@@ -209,6 +223,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red",
get_aspect = function(pos, node)
return aspect(r=="on")
end,
+ supported_aspects = suppasp,
getstate = f.ls,
setstate = function(pos, node, newstate)
if newstate == f.als then
diff --git a/advtrains/trainlogic.lua b/advtrains/trainlogic.lua
index bb1e1b9..3870ef6 100644
--- a/advtrains/trainlogic.lua
+++ b/advtrains/trainlogic.lua
@@ -1277,6 +1277,18 @@ function advtrains.invalidate_all_paths(pos)
advtrains.invalidate_path(id)
end
end
+
+-- Calls invalidate_path_ahead on all trains occupying (having paths over) this node
+-- Can be called during train step.
+function advtrains.invalidate_all_paths_ahead(pos)
+ local tab = advtrains.occ.get_trains_over(pos)
+
+ for id,index in pairs(tab) do
+ local train = advtrains.trains[id]
+ advtrains.path_invalidate_ahead(train, index, true)
+ end
+end
+
function advtrains.invalidate_path(id)
--atdebug("Path invalidate:",id)
local v=advtrains.trains[id]
diff --git a/advtrains_interlocking/signal_api.lua b/advtrains_interlocking/signal_api.lua
index 7e280ad..bf8622a 100644
--- a/advtrains_interlocking/signal_api.lua
+++ b/advtrains_interlocking/signal_api.lua
@@ -224,17 +224,17 @@ function advtrains.interlocking.signal_on_aspect_changed(pos)
if not ipts then return end
local ipos = minetest.string_to_pos(ipts)
- local tns = advtrains.occ.get_trains_over(ipos)
- for id, sidx in pairs(tns) do
--- local train = advtrains.trains[id]
- --if train.index <= sidx then
- minetest.after(0, advtrains.invalidate_path, id)
- --end
- end
+ advtrains.invalidate_all_paths_ahead(ipos)
end
function advtrains.interlocking.signal_rc_handler(pos, node, player, itemstack, pointed_thing)
local pname = player:get_player_name()
+ local control = player:get_player_control()
+ if control.aux1 then
+ advtrains.interlocking.show_ip_form(pos, pname)
+ return
+ end
+
local sigd = advtrains.interlocking.db.get_sigd_for_signal(pos)
if sigd then
advtrains.interlocking.show_signalling_form(sigd, pname)
@@ -243,7 +243,7 @@ function advtrains.interlocking.signal_rc_handler(pos, node, player, itemstack,
if ndef.advtrains and ndef.advtrains.set_aspect then
-- permit to set aspect manually
local function callback(pname, aspect)
- ndef.advtrains.set_aspect(pos, node, aspect)
+ advtrains.interlocking.signal_set_aspect(pos, aspect)
end
local isasp = ndef.advtrains.get_aspect(pos, node)