diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -877,6 +877,15 @@ CommandCost CmdBuildSingleSignal(TileInd } if (flags & DC_EXEC) { + Vehicle *v = NULL; + /* The new/changed signal could block our path. As this can lead to + * stale reservations, we clear the path reservation here and try + * to redo it later on. */ + if (HasReservedTracks(tile, TrackToTrackBits(track))) { + v = GetTrainForReservation(tile, track); + if (v != NULL) FreeTrainTrackReservation(v); + } + if (!HasSignals(tile)) { /* there are no signals at all on this tile yet */ SetHasSignals(tile, true); @@ -938,6 +947,7 @@ CommandCost CmdBuildSingleSignal(TileInd MarkTileDirtyByTile(tile); AddTrackToSignalBuffer(tile, track, _current_player); YapfNotifyTrackLayoutChange(tile, track); + if (v != NULL) TryPathReserve(v, true); } return cost; @@ -1166,6 +1176,10 @@ CommandCost CmdRemoveSingleSignal(TileIn /* Do it? */ if (flags & DC_EXEC) { + Vehicle *v = NULL; + if (HasReservedTracks(tile, TrackToTrackBits(track))) { + v = GetTrainForReservation(tile, track); + } SetPresentSignals(tile, GetPresentSignals(tile) & ~SignalOnTrack(track)); /* removed last signal from tile? */ @@ -1177,6 +1191,7 @@ CommandCost CmdRemoveSingleSignal(TileIn AddTrackToSignalBuffer(tile, track, GetTileOwner(tile)); YapfNotifyTrackLayoutChange(tile, track); + if (v != NULL) TryPathReserve(v, false); MarkTileDirtyByTile(tile); }