diff options
author | frosch <frosch@openttd.org> | 2008-08-03 14:16:57 +0000 |
---|---|---|
committer | frosch <frosch@openttd.org> | 2008-08-03 14:16:57 +0000 |
commit | 983e297ff0836199d6544a3201ea51c7525bd849 (patch) | |
tree | 91aa49f7db5969ec5f76576c6d2f900a65774dd8 /src/pbs.cpp | |
parent | 9a1958be91096d77294c196fa543d6e45b7c9873 (diff) | |
download | openttd-983e297ff0836199d6544a3201ea51c7525bd849.tar.xz |
(svn r13974) -Fix [YAPP]: A train crash could lead to stale reservations. (michi_cc)
Diffstat (limited to 'src/pbs.cpp')
-rw-r--r-- | src/pbs.cpp | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/src/pbs.cpp b/src/pbs.cpp index 089591e9b..bf3913bc4 100644 --- a/src/pbs.cpp +++ b/src/pbs.cpp @@ -204,13 +204,24 @@ static PBSTileInfo FollowReservation(Owner o, RailTypes rts, TileIndex tile, Tra return PBSTileInfo(tile, trackdir, false); } +/** Callback for VehicleFromPos to find a train on a specific track. */ +static Vehicle *FindTrainOnTrackEnum(Vehicle *v, void *data) +{ + PBSTileInfo info = *(PBSTileInfo *)data; + + if (v->type == VEH_TRAIN && !(v->vehstatus & VS_CRASHED) && HasBit((TrackBits)v->u.rail.track, TrackdirToTrack(info.trackdir))) return v; + + return NULL; +} + /** * Follow a train reservation to the last tile. * * @param v the vehicle + * @param train_on_res Is set to a train we might encounter * @returns The last tile of the reservation or the current train tile if no reservation present. */ -PBSTileInfo FollowTrainReservation(const Vehicle *v) +PBSTileInfo FollowTrainReservation(const Vehicle *v, Vehicle **train_on_res) { assert(v->type == VEH_TRAIN); @@ -221,19 +232,10 @@ PBSTileInfo FollowTrainReservation(const Vehicle *v) PBSTileInfo res = FollowReservation(v->owner, GetRailTypeInfo(v->u.rail.railtype)->compatible_railtypes, tile, trackdir); res.okay = IsSafeWaitingPosition(v, res.tile, res.trackdir, true, _settings_game.pf.forbid_90_deg); + if (train_on_res != NULL) *train_on_res = VehicleFromPos(res.tile, &res, FindTrainOnTrackEnum); return res; } -/** Callback for VehicleFromPos to find a train on a specific track. */ -static Vehicle *FindTrainOnTrackEnum(Vehicle *v, void *data) -{ - PBSTileInfo info = *(PBSTileInfo *)data; - - if (v->type == VEH_TRAIN && !(v->vehstatus & VS_CRASHED) && HasBit((TrackBits)v->u.rail.track, TrackdirToTrack(info.trackdir))) return v; - - return NULL; -} - /** * Find the train which has reserved a specific path. * |