summaryrefslogtreecommitdiff
path: root/src/roadveh_cmd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/roadveh_cmd.cpp')
-rw-r--r--src/roadveh_cmd.cpp18
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)) {