diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/roadveh_cmd.cpp | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp index 1d4b9774f..322b33c0b 100644 --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -1313,7 +1313,23 @@ again: v->cur_speed = 0; return false; } - if (IsRoadStop(v->tile)) RoadStop::GetByTile(v->tile, GetRoadStopType(v->tile))->Leave(v); + + /* If we are a drive through road stop and the next tile is of + * the same road stop and the next tile isn't this one (i.e. we + * are not reversing), then keep the reservation and state. + * This way we will not be shortly unregister from the road + * stop. It also makes it possible to load when on the edge of + * two road stops; otherwise you could get vehicles that should + * be loading but are not actually loading. */ + if (IsDriveThroughStopTile(v->tile) && + RoadStop::IsDriveThroughRoadStopContinuation(v->tile, tile) && + v->tile != tile) { + /* So, keep 'our' state */ + dir = (Trackdir)v->state; + } else if (IsRoadStop(v->tile)) { + /* We're not continuing our drive through road stop, so leave. */ + RoadStop::GetByTile(v->tile, GetRoadStopType(v->tile))->Leave(v); + } } if (!HasBit(r, VETS_ENTERED_WORMHOLE)) { |