Доставка ботов вертолётом (с посадкой) по указанным координатам.

Знаю, есть много разных скриптов по доставке ботов вертолётом, и всё же вот ещё один, который можно вставить в sqf файл.

Пригодится в любой миссии.

Код в чистом виде:

0 spawn {
private _helipad = "Land_HelipadEmpty_F" createVehicle [4364.91,3818.18,0];
private _supgroup = [[5027.42,5904.4,0], west, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_InfAssault")] call BIS_fnc_spawnGroup;
private _unitsCargo = units _supgroup;
private _heli = createVehicle ["B_Heli_Transport_01_F", [5027.42,5904.4,0]];
createVehicleCrew _heli;
private _group = group driver _heli;
_group addVehicle _heli;
{_x setSkill ["courage", 1]} forEach units _group;
format ["Уровень параметра Courage = %1", leader _group skillFinal "courage"] remoteExec ["hint"];
_heli setDir 270;
{_x moveInCargo _heli} forEach _unitsCargo;
_heli domove [4364.91,3818.18,0];
waitUntil {
sleep 1;
(_heli distance [4364.91,3818.18,0]) < 300
};
_heli land "get out";
_heli flyInHeight 0;
waitUntil {isTouchingGround _heli};
_supgroup leaveVehicle _heli;
waitUntil {
sleep 5;
count (_unitsCargo select {alive _x && (!isNull objectParent _x)}) == 0
};
_heli domove [5027.46,5904.23,0];
_heli flyinheight 50;
waitUntil {
sleep 1;
(_heli distance [5027.46,5904.23,0]) < 300
};
{deleteVehicle _x} forEach ((units group _heli) + [_heli]);
};

Код с расшифровкой:

0 spawn {
// Создаём невидимую вертолётную площадку
private _helipad = "Land_HelipadEmpty_F" createVehicle [4364.91,3818.18,0];
// Создаём группу десанта
private _supgroup = [[5027.42,5904.4,0], west, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_InfAssault")] call BIS_fnc_spawnGroup;
// Определяем группу десанта в другую переменную, для запихивания в грузовое отделение
private _unitsCargo = units _supgroup;
// Создаём вертолёт который будет перевозить ботов
private _heli = createVehicle ["B_Heli_Transport_01_F", [5027.42,5904.4,0]];
// Создаём экипаж вертолёта
createVehicleCrew _heli;
// Выделяем экипаж в отдельную группу
private _group = group driver _heli;
_group addVehicle _heli;
// Задаём параметр Courage
{_x setSkill ["courage", 1]} forEach units _group;
// Проверяем какой уровень Courage у нас получается. Надо => 0.90
// Показывает hint справа вверху с покзателем этого параметра
format ["Уровень параметра Courage = %1", leader _group skillFinal "courage"] remoteExec ["hint"];
// Поворачиваем вертолёт в нужную нам сторону (от 0 до 360, в градусах)
_heli setDir 270;
// Пихаем экипаж в грузуовое отделение вертолёта
{_x moveInCargo _heli} forEach _unitsCargo;
// Приказываем вертолёту двигаться на укзааные координаты
_heli domove [4364.91,3818.18,0];
// Ждём пока дистанция сократится до < 300 метров
waitUntil {
sleep 1;
(_heli distance [4364.91,3818.18,0]) < 300
};
// прикзываем вертолёту сесть
_heli land "get out";
// Высота полёта = 0
_heli flyInHeight 0;
// Ждём пока вертолёт коснётся земли
waitUntil {isTouchingGround _heli};
// Приказываем группе покинуть вертолёт
_supgroup leaveVehicle _heli;
// Ждём пока группа покинет вертолёт
waitUntil {
sleep 5;
count (_unitsCargo select {alive _x && (!isNull objectParent _x)}) == 0
};
// Приказываем вертолёту улетать
_heli domove [5027.46,5904.23,0];
// Высота полёта = 50
_heli flyinheight 50;
// Ждём пока дистанция сократится до < 300 метров
waitUntil {
sleep 1;
(_heli distance [5027.46,5904.23,0]) < 300
};
// Удаляем экипаж вертолёта и сам вертолёт
{deleteVehicle _x} forEach ((units group _heli) + [_heli]);
};

 

Можно ещё откидывать дымы по кругу при посадке, соответственно вставив код ниже в нужное вам место. Но некоторые люди говорят что этот код весьма устарел. Правда он по-прежнему работает:

// Выкидываем дымы по кругу
private _dir = 0;
private _a = 0;
while{_a < 16}do{
_sPos = [((getPos _heli) select 0) + (sin _dir) * 12, ((getPos _heli) select 1) + (cos _dir) * 12, ((getPos _heli) select 2)];
_smoke1 = "SmokeShellBlue" createVehicle _sPos;
_a = _a + 1;
_dir = _dir + (360 / 16);
};

Бонус от товарища Dusin (участник нашего Discord)

private _step = 360 / 6; // Шаг поворота от одного до второго дыма
private _hPos = getPos _heli;
private _hDir = getDir _heli;
private ["_smoke", "_sPos"];

{
    _x params ["_dir", "_endDir"];
    
    _dir = _hDir + _dir;
    _endDir = _hDir + _endDir;
    
    while { _dir <= _endDir } do {
        _sPos = [
            (_hPos # 0) + (sin _dir) * random [8,12,16]
            , (_hPos # 1) + (cos _dir) * random [8,12,16]
            , 0.25
        ];
        _smoke  = "SmokeShellBlue" createVehicle _sPos;
        _dir = _dir + (360 / _step);
    };
} forEach [
    /* Лишнее удалить */
    [0, 360] /* Если хотим по кругу */
    , [45, 135] /* Справа */
    , [225, 315] /* Слева */
];

Наше видео на эту тему (показан старый форум, сейчас тут этот сайт):

Обсудить этот скрипт можно в нашем Discord канале