diff --git a/aircraft_cmd.c b/aircraft_cmd.c index 713475de89..8f834ea384 100644 --- a/aircraft_cmd.c +++ b/aircraft_cmd.c @@ -363,6 +363,8 @@ int32 CmdSendAircraftToHangar(int x, int y, uint32 flags, uint32 p1, uint32 p2) v = GetVehicle(p1); + if (p2 != 0) v->set_for_replacement = true; //now all clients knows that the vehicle wants to be replaced + if (!CheckOwnership(v->owner)) return CMD_ERROR; @@ -1030,7 +1032,8 @@ static void ProcessAircraftOrder(Vehicle *v) if (v->current_order.type == OT_GOTO_DEPOT && (v->current_order.flags & (OF_UNLOAD | OF_FULL_LOAD)) == (OF_UNLOAD | OF_FULL_LOAD) && - !VehicleNeedsService(v)) { + !VehicleNeedsService(v) && + v->set_for_replacement == false) { v->cur_order_index++; } @@ -1434,8 +1437,8 @@ static void AircraftEventHandler_HeliTakeOff(Vehicle *v, const AirportFTAClass * AircraftNextAirportPos_and_Order(v); // check if the aircraft needs to be replaced or renewed and send it to a hangar if needed - if ((v->owner == _local_player && _autoreplace_array[v->engine_type] != v->engine_type) || - (v->owner == _local_player && _patches.autorenew && v->age - v->max_age > (_patches.autorenew_months * 30))) { + if (v->current_order.type != OT_GOTO_DEPOT && ((v->owner == _local_player && _autoreplace_array[v->engine_type] != v->engine_type) || + (v->owner == _local_player && _patches.autorenew && v->age - v->max_age > (_patches.autorenew_months * 30)))) { _current_player = _local_player; DoCommandP(v->tile, v->index, 1, NULL, CMD_SEND_AIRCRAFT_TO_HANGAR | CMD_SHOW_NO_ERROR); _current_player = OWNER_NONE; diff --git a/vehicle.c b/vehicle.c index 5f1992e514..03103820f6 100644 --- a/vehicle.c +++ b/vehicle.c @@ -194,6 +194,7 @@ static Vehicle *InitializeVehicle(Vehicle *v) v->string_id = 0; v->next_shared = NULL; v->prev_shared = NULL; + v->set_for_replacement = false; /* random_bits is used to pick out a random sprite for vehicles which are technical the same (newgrf stuff). Because RandomRange() results in desyncs, and because it does @@ -1422,6 +1423,7 @@ int32 CmdReplaceVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2) Engine *e; e = DEREF_ENGINE(new_engine_type); + v->set_for_replacement = false; v->reliability = e->reliability; v->reliability_spd_dec = e->reliability_spd_dec; v->age = 0; diff --git a/vehicle.h b/vehicle.h index 1b5c2cee66..2f582630a6 100644 --- a/vehicle.h +++ b/vehicle.h @@ -180,6 +180,8 @@ struct Vehicle { int32 profit_last_year; uint32 value; + bool set_for_replacement; // marks this vehicle to be replaced + union { VehicleRail rail; VehicleAir air;