On my list of thiungs to do is a general template for these landings.
In the meantime, I've got it working in a mission I'm betatesting (2 waves of 4 helos come in and dump a platoon in 30 seconds on Xray), and I'd be happy to send you a copy of the source (it's 52.1 kb, so I can't post it here).
The keys:
1. Behaviour Careless and CombatMode Blue
2. Altitude separation. Helos turn to slow down. I know it looks stupid. Keep the helos on different altitude bands, and they won't collide when they slow down. Even if they don't collide, they go into evasive maneuvers, which puts them off line for the final.
3. Limited speed on approach. I know, you want it to be hot. Limited looks pretty good though.
4. Use SetFlyInHeight 2 to "land" the helos.
5. Clear any obstructions (trees, etc) from the LZ. My favorite is a gamelogic with "bomb = "LaserGuidedBomb" camcreate getpos this" in the init field.
6. test, test, test.
This uses gamelogics: "OuterMarker" (1-8), "LZ" (1-4), and "Depart" (1-8)
slicks are 1-8. Odd slicks are in first wave, and even ar ein second.
_counter = _this select 0
_slick= call format ["slick_%1", _Counter]
_slick setbehaviour "CARELESS"
_slick setcombatmode "BLUE"
_origPos = getpos _slick
_outermarker = call format ["outermarker_%1", _Counter]
_mypax = crew _slick - (units group driver _slick)
_depart = call format ["depart_%1", _Counter]
_Zoffset = [0, 1, 3, 0, 2] select (((_counter+1)/2)-(((_counter+1)/2) mod 1))
_LZ = call format ["LZ_%1", (((_counter+1)/2)-(((_counter+1)/2) mod 1)) mod 4]
_slick flyinheight 25 + (10 * _Zoffset)
_landslot = call format ["Landslot_%1", _counter]
~22
?_counter mod 2 == 0: goto "WaitAwhile"
#back
_slick domove [getpos _outermarker select 0, getpos _outermarker select 1]
@!unitready _slick
@_Slick distance _outermarker < 100
_slick setspeedmode "limited"
@unitready _slick
_slick flyinheight 15 + (10 * _Zoffset)
_slick domove [getpos _LZ select 0, getpos _LZ select 1]
@!unitready _slick
@unitready _slick
_slick flyinheight 2
#FireLoop
_Slick fire "SEBMG50"
~.01
?getpos _slick select 2 > 4:goto "FireLoop"
#Wait2
~1.5
?getpos _slick select 2 > 4:goto "Wait2"
"if (!(_x in units group (driver _slick))) then {unassignvehicle _x}" foreach crew _slick
@("alive _x" count (crew _slick))<= "alive _x" count [driver _slick, gunner _slick]
ReadyCounter = ReadyCounter + 1
#FireLoop2
_Slick fire "SEBMG50"
~.01
?ReadyCounter mod 4>0:goto "FireLoop2"
@slicklist select slickcleared == _Counter
_slick domove [getpos _depart select 0, getpos _depart select 1]
_slick setspeedmode "normal"
_slick flyinheight 25 + (10 * _Zoffset)
~1
slickcleared = slickcleared + 1
{if (getdammage _x >= 1) then {_x setdammage 0}} foreach _mypax
?_counter == 1:RadioChatterMode = 31; PublicVariable "RadioChatterMode"
?_counter == 2:RadioChatterMode = 0; PublicVariable "RadioChatterMode"
?getdammage _slick > .9:goto "trashed"
@!unitready _slick
@unitready _slick
...
exit
#WaitAwhile
~15
goto "Back"