Index: src/aircraft_cmd.cpp =================================================================== --- src/aircraft_cmd.cpp (revision 12059) +++ src/aircraft_cmd.cpp (working copy) @@ -702,7 +702,8 @@ static void CheckIfAircraftNeedsService(Vehicle *v) { - if (_patches.servint_aircraft == 0 || !VehicleNeedsService(v)) return; + if (!VehicleNeedsService(v)) return; + if (v->IsInDepot()) { VehicleServiceInDepot(v); return; Index: src/roadveh_cmd.cpp =================================================================== --- src/roadveh_cmd.cpp (revision 12059) +++ src/roadveh_cmd.cpp (working copy) @@ -1969,8 +1969,10 @@ static void CheckIfRoadVehNeedsService(Vehicle *v) { + if (!VehicleNeedsService(v)) return; + /* If we already got a slot at a stop, use that FIRST, and go to a depot later */ - if (v->u.road.slot != NULL || _patches.servint_roadveh == 0 || !VehicleNeedsService(v)) return; + if (v->u.road.slot != NULL) return; if (v->IsInDepot()) { VehicleServiceInDepot(v); return; Index: src/ship_cmd.cpp =================================================================== --- src/ship_cmd.cpp (revision 12059) +++ src/ship_cmd.cpp (working copy) @@ -146,7 +146,8 @@ static void CheckIfShipNeedsService(Vehicle *v) { - if (_patches.servint_ships == 0 || !VehicleNeedsService(v)) return; + if (!VehicleNeedsService(v)) return; + if (v->IsInDepot()) { VehicleServiceInDepot(v); return; Index: src/train_cmd.cpp =================================================================== --- src/train_cmd.cpp (revision 12059) +++ src/train_cmd.cpp (working copy) @@ -3596,7 +3596,8 @@ static void CheckIfTrainNeedsService(Vehicle *v) { - if (_patches.servint_trains == 0 || !VehicleNeedsService(v)) return; + if (!VehicleNeedsService(v)) return; + if (v->IsInDepot()) { VehicleServiceInDepot(v); return; Index: src/vehicle.cpp =================================================================== --- src/vehicle.cpp (revision 12059) +++ src/vehicle.cpp (working copy) @@ -110,9 +110,13 @@ if (v->current_order.type == OT_GOTO_DEPOT && v->current_order.flags & OFB_HALT_IN_DEPOT) return false; } - if (_patches.no_servicing_if_no_breakdowns && _opt.diff.vehicle_breakdowns == 0) { - return EngineHasReplacementForPlayer(GetPlayer(v->owner), v->engine_type, v->group_id); /* Vehicles set for autoreplacing needs to go to a depot even if breakdowns are turned off */ - } + if (_patches.no_servicing_if_no_breakdowns && _opt.diff.vehicle_breakdowns == 0) { + if (GetPlayer(v->owner)->engine_renew && v->age - v->max_age > GetPlayer(v->owner)->engine_renew_months * 30) { + return true; /* Vehicules should be renewed when they get old even if servicing is disabled */ + } else { + return EngineHasReplacementForPlayer(GetPlayer(v->owner), v->engine_type, v->group_id); /* Vehicles set for autoreplacing needs to go to a depot even when breakdowns are turned off */ + } + } return _patches.servint_ispercent ? (v->reliability < GetEngine(v->engine_type)->reliability * (100 - v->service_interval) / 100) : @@ -2114,6 +2118,7 @@ /* Send all the vehicles to a depot */ for (i = 0; i < n; i++) { const Vehicle *v = sort_list[i]; + if (v->service_interval == 0 && service && !EngineHasReplacementForPlayer(GetPlayer(owner), v->engine_type, v->group_id)) continue; CommandCost ret = DoCommand(v->tile, v->index, (service ? 1 : 0) | DEPOT_DONT_CANCEL, flags, GetCmdSendToDepot(type)); /* Return 0 if DC_EXEC is not set this is a valid goto depot command)