aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authororwell96 <orwell@bleipb.de>2021-03-12 17:56:07 +0100
committerorwell96 <orwell@bleipb.de>2021-03-12 17:56:07 +0100
commitb2d7bbb2c577a2b28cdaf421daf9b143f4376c8a (patch)
tree49d7ec4e1a3c4b6cf64180978fdc6bd5a8486606
parent2dcf60dec6304abc910dea82c6f9a5904bbf365b (diff)
downloadadvtrains-b2d7bbb2c577a2b28cdaf421daf9b143f4376c8a.tar.gz
advtrains-b2d7bbb2c577a2b28cdaf421daf9b143f4376c8a.tar.bz2
advtrains-b2d7bbb2c577a2b28cdaf421daf9b143f4376c8a.zip
Signal influence points: Make sure to clear on removal of signal, clear orphaned when digging rail
-rw-r--r--advtrains/signals.lua9
-rw-r--r--advtrains/tracks.lua2
-rw-r--r--advtrains_interlocking/database.lua16
-rw-r--r--advtrains_interlocking/demosignals.lua3
-rwxr-xr-xadvtrains_signals_ks/init.lua3
5 files changed, 31 insertions, 2 deletions
diff --git a/advtrains/signals.lua b/advtrains/signals.lua
index 9df2f99..59612cd 100644
--- a/advtrains/signals.lua
+++ b/advtrains/signals.lua
@@ -9,6 +9,12 @@ local function can_dig_func(pos)
end
return true
end
+local function after_dig_func(pos)
+ if advtrains.interlocking then
+ return advtrains.interlocking.signal_after_dig(pos)
+ end
+ return true
+end
local function aspect(b)
return {
@@ -97,6 +103,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red",
supported_aspects = suppasp,
},
can_dig = can_dig_func,
+ after_dig_node = after_dig_func,
})
advtrains.trackplacer.add_worked("advtrains:retrosignal", r, rotation, nil)
@@ -163,6 +170,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red",
end,
},
can_dig = can_dig_func,
+ after_dig_node = after_dig_func,
})
advtrains.trackplacer.add_worked("advtrains:signal", r, rotation, nil)
end
@@ -232,6 +240,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red",
end,
},
can_dig = can_dig_func,
+ after_dig_node = after_dig_func,
})
end
end
diff --git a/advtrains/tracks.lua b/advtrains/tracks.lua
index e034e85..33a7999 100644
--- a/advtrains/tracks.lua
+++ b/advtrains/tracks.lua
@@ -622,7 +622,7 @@ function advtrains.can_dig_or_modify_track(pos)
return false, attrans("There's a Track Circuit Break here.")
end
-- signal ip?
- if advtrains.interlocking.db.is_ip_at(pos) then
+ if advtrains.interlocking.db.is_ip_at(pos, true) then -- is_ip_at with purge parameter
return false, attrans("There's a Signal Influence Point here.")
end
end
diff --git a/advtrains_interlocking/database.lua b/advtrains_interlocking/database.lua
index 68d4138..a35d446 100644
--- a/advtrains_interlocking/database.lua
+++ b/advtrains_interlocking/database.lua
@@ -562,9 +562,23 @@ function ildb.set_sigd_for_signal(pos, sigd)
end
-- checks if there's any influence point set to this position
-function ildb.is_ip_at(pos)
+-- if purge is true, checks whether the associated signal still exists
+-- and deletes the ip if not.
+function ildb.is_ip_at(pos, purge)
local pts = advtrains.roundfloorpts(pos)
if influence_points[pts] then
+ if purge then
+ -- is there still a signal assigned to it?
+ for connid, sigpos in pairs(influence_points[pts]) do
+ local asp = advtrains.interlocking.signal_get_aspect(sigpos)
+ if not asp then
+ atlog("Clearing orphaned signal influence point", pts, "/", connid)
+ ildb.clear_ip_signal(pts, connid)
+ end
+ end
+ -- if there's no side left after purging, return false
+ if not influence_points[pts] then return false end
+ end
return true
end
return false
diff --git a/advtrains_interlocking/demosignals.lua b/advtrains_interlocking/demosignals.lua
index fe60a73..cba1f30 100644
--- a/advtrains_interlocking/demosignals.lua
+++ b/advtrains_interlocking/demosignals.lua
@@ -51,6 +51,7 @@ minetest.register_node("advtrains_interlocking:ds_danger", {
},
on_rightclick = advtrains.interlocking.signal_rc_handler,
can_dig = advtrains.interlocking.signal_can_dig,
+ after_dig_node = advtrains.interlocking.signal_after_dig,
})
minetest.register_node("advtrains_interlocking:ds_free", {
description = "Demo signal at Free",
@@ -72,6 +73,7 @@ minetest.register_node("advtrains_interlocking:ds_free", {
},
on_rightclick = advtrains.interlocking.signal_rc_handler,
can_dig = advtrains.interlocking.signal_can_dig,
+ after_dig_node = advtrains.interlocking.signal_after_dig,
})
minetest.register_node("advtrains_interlocking:ds_slow", {
description = "Demo signal at Slow",
@@ -93,5 +95,6 @@ minetest.register_node("advtrains_interlocking:ds_slow", {
},
on_rightclick = advtrains.interlocking.signal_rc_handler,
can_dig = advtrains.interlocking.signal_can_dig,
+ after_dig_node = advtrains.interlocking.signal_after_dig,
})
diff --git a/advtrains_signals_ks/init.lua b/advtrains_signals_ks/init.lua
index aa1b1cb..3209cb1 100755
--- a/advtrains_signals_ks/init.lua
+++ b/advtrains_signals_ks/init.lua
@@ -115,6 +115,7 @@ for _, rtab in ipairs({
},
on_rightclick = advtrains.interlocking.signal_rc_handler,
can_dig = advtrains.interlocking.signal_can_dig,
+ after_dig_node = advtrains.interlocking.signal_after_dig,
})
-- rotatable by trackworker
advtrains.trackplacer.add_worked("advtrains_signals_ks:hs", typ, "_"..rot, prts.n)
@@ -160,6 +161,7 @@ for _, rtab in ipairs({
},
on_rightclick = advtrains.interlocking.signal_rc_handler,
can_dig = advtrains.interlocking.signal_can_dig,
+ after_dig_node = advtrains.interlocking.signal_after_dig,
})
-- rotatable by trackworker
advtrains.trackplacer.add_worked("advtrains_signals_ks:ra", typ, "_"..rot, prts.n)
@@ -210,6 +212,7 @@ for _, rtab in ipairs({
},
on_rightclick = advtrains.interlocking.signal_rc_handler,
can_dig = advtrains.interlocking.signal_can_dig,
+ after_dig_node = advtrains.interlocking.signal_after_dig,
})
-- rotatable by trackworker
advtrains.trackplacer.add_worked("advtrains_signals_ks:sign", typ, "_"..rot, prts.n)