diff options
author | orwell96 <orwell@bleipb.de> | 2021-03-12 17:56:07 +0100 |
---|---|---|
committer | orwell96 <orwell@bleipb.de> | 2021-03-12 17:56:07 +0100 |
commit | b2d7bbb2c577a2b28cdaf421daf9b143f4376c8a (patch) | |
tree | 49d7ec4e1a3c4b6cf64180978fdc6bd5a8486606 | |
parent | 2dcf60dec6304abc910dea82c6f9a5904bbf365b (diff) | |
download | advtrains-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.lua | 9 | ||||
-rw-r--r-- | advtrains/tracks.lua | 2 | ||||
-rw-r--r-- | advtrains_interlocking/database.lua | 16 | ||||
-rw-r--r-- | advtrains_interlocking/demosignals.lua | 3 | ||||
-rwxr-xr-x | advtrains_signals_ks/init.lua | 3 |
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) |