A side note about sending helicopters at the smoke position. If the helicopters are too far away, they may timeout before resolving the path between their position and the smoke object, and they will not come. Typical case when you try to move an helicopter from one extreme to the other of an island. These timeouts are more frequents with low end computers or when mission itself consumes a lot of CPU.
I use the following script to solve that problem. You provide how far will move the helicopter in each step until reaching the destination (2000m for example is a safe value).
;mandoairpath.sqs by Mandoble
;
;Allows long flying traves avoiding the timeouts while resolving paths
;Arguments
;flyin unit
;final position
;Maximum length in meters of each travel segment
;flying height
;Maximum allowable damage before ejecting
;script to be executed upon arrival (receives flying unit as argument), "" if not needed.
;script to be executed when ejecting (receives flying unit as argument), "" if not needed.
;Camera following air unit true/false
;
;Examples:
;
;[heli1,getMarkerPos "mk_land",2000,40,0.5,"landnow.sqs","ejectnow.sqs",true]exec"mandoairpath.sqs"
_unit = _this select 0
_finpos = _this select 1
_length = _this select 2
_height = _this select 3
_maxdmg = _this select 4
_arrivalscript = _this select 5
_ejectscript = _this select 6
_camera = _this select 7
?_height > 80:_height = 80
?_maxdmg > 0.9:_maxdmg = 0.9
?_camera: _unit switchCamera "EXTERNAL"
_driver = driver _unit
_pos1 = [getPos _unit select 0,getPos _unit select 1,0]
_log1 = "logic" camCreate _pos1
_log2 = "logic" camCreate _finpos
_log3 = "logic" camCreate [0,0,0]
_dist = _log1 distance _log2
_ang = ((_finpos select 0) - (_pos1 select 0)) atan2 ((_finpos select 1) - (_pos1 select 1))
_steps = _dist / _length
_i = 0
_pos = _pos1
#move
_dist = _log1 distance _log2
?_dist > _length:_dist = _length
_pos = [(_pos select 0) + sin(_ang)*_dist,(_pos select 1) + cos(_ang)*_dist]
_log3 setPos _pos
_driver doMove _pos
_unit flyInHeight _height
~1
@((_unit distance _log3) < 1000) || (damage _unit > _maxdmg)
?(damage _unit > _maxdmg): goto "eject"
?(_unit distance _log2) < 1050: goto "goal"
_log1 setPos _pos
_i = _i + 1
?_i < _steps:goto "move"
#goal
_driver doMove _posfin
~1
@((unitReady _driver) || (damage _unit > _maxdmg))
?(damage _unit > _maxdmg): goto "eject"
?_arrivalscript != "":[_unit]exec _arrivalscript
#exit
deleteVehicle _log1
deleteVehicle _log2
deleteVehicle _log3
?_camera: player switchCamera "EXTERNAL"
exit
#eject
?_ejectscript != "":[_unit]exec _ejectscript
goto "exit"