From fdd6d9533ebc0b924aca0ad0d170469ac48952de Mon Sep 17 00:00:00 2001 From: Filippo Gentile Date: Wed, 3 Jul 2024 14:39:40 +0200 Subject: [PATCH] server: BlockRailTile move path release to TrainTracking - This effectively reverts commit 0b22d1f7 - Logic from commit 0b22d1f7 is now in TrainTracking - This fixes case when short train releases "enter" block before occupying "exit" block. --- server/src/board/tile/rail/blockrailtile.cpp | 17 ----------------- server/src/train/traintracking.cpp | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/server/src/board/tile/rail/blockrailtile.cpp b/server/src/board/tile/rail/blockrailtile.cpp index a400462c..22fdd79b 100644 --- a/server/src/board/tile/rail/blockrailtile.cpp +++ b/server/src/board/tile/rail/blockrailtile.cpp @@ -317,8 +317,6 @@ void BlockRailTile::inputItemValueChanged(BlockInputMapItem& item) { const auto& blockStatus = trains.front(); - const auto blockTrainDirection = blockStatus->direction.value(); - // Train must be in at least two blocks, else we loose it. // Release tailing block of train only. (When using current detection not all wagons might consume power.) if(blockStatus->train && @@ -326,21 +324,6 @@ void BlockRailTile::inputItemValueChanged(BlockInputMapItem& item) blockStatus->train->blocks.back() == blockStatus) { TrainTracking::left(blockStatus); - - const auto pathA = m_reservedPaths[0].lock(); - const bool exitA = pathA && &pathA->fromBlock() == this; - - const auto pathB = m_reservedPaths[1].lock(); - const bool exitB = pathB && &pathB->fromBlock() == this; - - if(blockTrainDirection == BlockTrainDirection::TowardsA && exitA) - { - pathA->delayedRelease(m_world.pathReleaseDelay); - } - else if(blockTrainDirection == BlockTrainDirection::TowardsB && exitB) - { - pathB->delayedRelease(m_world.pathReleaseDelay); - } } } } diff --git a/server/src/train/traintracking.cpp b/server/src/train/traintracking.cpp index 3e2baef9..b3f10693 100644 --- a/server/src/train/traintracking.cpp +++ b/server/src/train/traintracking.cpp @@ -24,7 +24,9 @@ #include "train.hpp" #include "trainblockstatus.hpp" #include "../board/tile/rail/blockrailtile.hpp" +#include "../board/map/blockpath.hpp" #include "../core/objectproperty.tpp" +#include "../world/world.hpp" void TrainTracking::reserve(const std::shared_ptr& train, const std::shared_ptr& block, BlockTrainDirection direction) { @@ -90,6 +92,21 @@ void TrainTracking::left(std::shared_ptr status) train->fireBlockLeft(block, direction); block->fireTrainLeft(train, direction); + const auto pathA = block->getReservedPath(BlockSide::A); + const bool exitA = pathA && &pathA->fromBlock() == block.get(); + + const auto pathB = block->getReservedPath(BlockSide::B); + const bool exitB = pathB && &pathB->fromBlock() == block.get(); + + if(direction == BlockTrainDirection::TowardsA && exitA) + { + pathA->delayedRelease(block->world().pathReleaseDelay); + } + else if(direction == BlockTrainDirection::TowardsB && exitB) + { + pathB->delayedRelease(block->world().pathReleaseDelay); + } + status->destroy(); #ifndef NDEBUG std::weak_ptr statusWeak = status;