From 573d6b06b28c39872c1c036fc191c1c5e4b289a9 Mon Sep 17 00:00:00 2001 From: orwell96 Date: Tue, 28 Apr 2020 17:10:25 +0200 Subject: Always do zero-barrier check and prevent LZB 0 overruns in movement logic --- advtrains/init.lua | 2 +- advtrains/trainlogic.lua | 31 ++++++++++++------------------- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/advtrains/init.lua b/advtrains/init.lua index fead01e..fd56d6d 100644 --- a/advtrains/init.lua +++ b/advtrains/init.lua @@ -563,7 +563,7 @@ minetest.register_globalstep(function(dtime_mt) advtrains.load() end - local dtime + local dtime = dtime_mt if GENERATE_ATRICIFIAL_LAG then dtime = HOW_MANY_LAG if os.clock() new_index_curr_tv then break @@ -498,25 +501,15 @@ function advtrains.train_step_b(id, train, dtime) -- apply to tv_target after the actual calculation happened a_lever = VLEVER_BRAKE if tv_target and tv_target > lzb_target then - if lzb_target < LZB_ZERO_APPROACH_SPEED then - --atdebug("hit zeroappr lzb=",lzb_target, "tv=", tv_target) - --go forward with LZB_ZERO_APPROACH_SPEED if tv_target didn't tell us otherwise - tv_target = LZB_ZERO_APPROACH_SPEED - -- find the zero index we're approaching - local lzb_zeroappr_target_index = math.ceil(train.index) - while train.path_speed[lzb_zeroappr_target_index] and train.path_speed[lzb_zeroappr_target_index] > 0 do - lzb_zeroappr_target_index = lzb_zeroappr_target_index + 1 - --atdebug("zeroappr advancing ",lzb_zeroappr_target_index) - end - -- it should now point to an index with path_speed==0. In case of weird things, points to some far away index, so doesn't matter - lzb_zeroappr_target_index = lzb_zeroappr_target_index - LZB_ZERO_APPROACH_DIST - --atdebug("zeroappr target idx ",lzb_zeroappr_target_index) - -- don't do anything when we are already at this index, and stop - if train.index >= lzb_zeroappr_target_index then + if lzb_target < LZB_ZERO_APPROACH_SPEED and lzb_next_zero_barrier then + if train.index >= lzb_next_zero_barrier then tv_target = 0 a_lever = VLEVER_BRAKE - lzb_zeroappr_target_index = nil --atdebug("zeroappr cancelling train has passed idx=",train.index, "za_idx=",lzb_zeroappr_target_index) + else + -- if we are in front of a zero barrier, make sure we reach it by + -- keeping the velocity at a small value >0 + tv_target = LZB_ZERO_APPROACH_SPEED end else tv_target = lzb_target @@ -560,9 +553,9 @@ function advtrains.train_step_b(id, train, dtime) end -- if the zeroappr mechanism has hit, go no further than zeroappr index - if lzb_zeroappr_target_index and new_index_curr_tv > lzb_zeroappr_target_index then + if lzb_next_zero_barrier and new_index_curr_tv > lzb_next_zero_barrier then --atdebug("zeroappr hitcond newidx_tv=",new_index_curr_tv, "za_idx=",lzb_zeroappr_target_index) - new_index_curr_tv = lzb_zeroappr_target_index + new_index_curr_tv = lzb_next_zero_barrier end train.index = new_index_curr_tv -- cgit v1.2.3