diff options
author | bjarni <bjarni@openttd.org> | 2005-11-01 17:20:06 +0000 |
---|---|---|
committer | bjarni <bjarni@openttd.org> | 2005-11-01 17:20:06 +0000 |
commit | 59913ae719b9b4f890712e8e54dd10e19f7176e2 (patch) | |
tree | 799602b7a33dc494b8aa7be27c8a630f31213715 | |
parent | 6390bcc6367291a4f97af3adb252b131605cea91 (diff) | |
download | openttd-59913ae719b9b4f890712e8e54dd10e19f7176e2.tar.xz |
(svn r3116) -Fix: [autoreplace] fixed issue where autorenewing/autoreplacing a plane could lock up an airport
this will not fix already locked up airports
this bug was introduced in rev 3111
-rw-r--r-- | vehicle.c | 24 | ||||
-rw-r--r-- | vehicle.h | 1 |
2 files changed, 20 insertions, 5 deletions
@@ -526,6 +526,18 @@ Vehicle *_first_veh_in_depot_list; */ void VehicleEnteredDepotThisTick(Vehicle *v) { + // we need to set v->leave_depot_instantly as we have no control of it's contents at this time + if (!HASBIT(v->current_order.flags, OFB_HALT_IN_DEPOT)) { + // the vehicle do not plan on stopping in the depot, so we stop it to ensure that it will not reserve the path + // out of the depot before we might autoreplace it to a different engine. The new engine would not own the reserved path + // we store that we stopped the vehicle, so autoreplace can start it again + v->vehstatus |= VS_STOPPED; + v->leave_depot_instantly = true; + } else { + // we keep the vehicle in the depot + v->leave_depot_instantly = false; + } + if (_first_veh_in_depot_list == NULL) { _first_veh_in_depot_list = v; } else { @@ -1610,9 +1622,11 @@ static void MaybeReplaceVehicle(Vehicle *v) _current_player = v->owner; assert(v->type == VEH_Train || v->type == VEH_Road || v->type == VEH_Ship || v->type == VEH_Aircraft); - if (!(v->vehstatus&VS_STOPPED)) { - stopped = true; // we stop the vehicle to do this, so we have to remember to start it again when we are done - DoCommand(0, 0, v->index, 0, DC_EXEC, CMD_STARTSTOP_VEH(v->type)); + + if (v->leave_depot_instantly) { + // we stopped the vehicle to do this, so we have to remember to start it again when we are done + // we need to store this info as the engine might be replaced and lose this info + stopped = true; } while (true) { @@ -1663,7 +1677,7 @@ static void MaybeReplaceVehicle(Vehicle *v) AddNewsItem(message, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), v->index, 0); } if (stopped) - DoCommand(0, 0, v->index, 0, DC_EXEC, CMD_STARTSTOP_VEH(v->type)); //we start the vehicle again + v->vehstatus &= ~VS_STOPPED; //we start the vehicle again return; } @@ -1679,7 +1693,7 @@ static void MaybeReplaceVehicle(Vehicle *v) if (IsLocalPlayer()) ShowCostOrIncomeAnimation(v->x_pos, v->y_pos, v->z_pos, cost); if (stopped) - DoCommand(0, 0, v->index, 0, DC_EXEC, CMD_STARTSTOP_VEH(v->type)); //we start the vehicle again + v->vehstatus &= ~VS_STOPPED; //we start the vehicle again _current_player = OWNER_NONE; } @@ -166,6 +166,7 @@ struct Vehicle { int32 x_pos; // coordinates int32 y_pos; + bool leave_depot_instantly; // NOSAVE: stores if the vehicle needs to leave the depot it just entered. Used by autoreplace byte z_pos; byte direction; // facing |