Спаун ботов. Указываем им что делать дальше. Группы и группы в технике (подкрепления).

Конечно же, это не единственные варианты, но они работают и работают хорошо.
Кроме того, в некоторых примерах можно заменить вейпоинты на createGuardedPoint.

Сразу обращу внимание, что когда вы впервые объявляете переменную, пишите перед ней private. Как подсказал один опытный человек — это не только нужно, но и делает это всё быстрее. А скорость выполнения команд — это всегда хорошо для любой миссии.
Так же, заметьте что в случае с формацией

_wp setWaypointFormation "WEDGE";

и радиусом завершения вейпоинта

_wp setWaypointCompletionRadius 10;

Это писать необязательно. Так как:

формация по умолчанию = WEDGE
А радиус завершения вейпоинта по умолчанию = 10 метрам.

Например, нам надо сделать двойку, которая будет патрулировать по определённым точкам.
Для начала зайдём в просмотр конфигураций в редакторе, и найдём нужную нам группу.
Например:

configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfSentry"

Это будет гранатомётчик (подствольник) и стрелок в его подчинении.

После этого, пишем следующее в нашем файле sqf для спауна ботов:

Патрульная двойка:

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

private _group1 = [[26841.1,24552,0], east, (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfSentry")] call BIS_fnc_spawnGroup;
private _wp =_group1 addWaypoint [[27160,24915.1,0], 0];
_wp setWaypointType "MOVE";
_wp setWaypointSpeed "LIMITED";
_wp setWaypointBehaviour "SAFE";
_wp setWaypointFormation "WEDGE";
_wp setWaypointCombatMode "RED";
_wp setWaypointCompletionRadius 10;
private _wp1 =_group1 addWaypoint [[26841.1,24552,0], 0];
_wp1 setWaypointType "MOVE";
_wp1 setWaypointSpeed "LIMITED";
_wp1 setWaypointBehaviour "SAFE";
_wp1 setWaypointFormation "WEDGE";
_wp1 setWaypointCombatMode "RED";
_wp1 setWaypointCompletionRadius 10;
private _wp2 =_group1 addWaypoint [[26841.7,24552.5,0], 0];
_wp2 setWaypointType "CYCLE";
_wp2 setWaypointSpeed "LIMITED";
_wp2 setWaypointBehaviour "SAFE";
_wp2 setWaypointFormation "WEDGE";
_wp2 setWaypointCombatMode "RED";
_wp2 setWaypointCompletionRadius 10;

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

// Создаём группу. Указываем координаты где она должна быть создана. Указываем сторону (у нас это east), показываем путь к конфигу группы (вшит в игре), вызываем функцию спауна ботов (вшита в игре).
private _group1 = [[26841.1,24552,0], east, (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfSentry")] call BIS_fnc_spawnGroup;
// Указываем первый вейпоинт, его координаты
private _wp =_group1 addWaypoint [[27160,24915.1,0], 0];
// Тип вейпоинта
_wp setWaypointType "MOVE";
// Скорость для этого вейпоинта
_wp setWaypointSpeed "LIMITED";
// Состояние группы (спокойное)
_wp setWaypointBehaviour "SAFE";
// Указываем формацию. Учтите, что по умолчанию стоит WEDGE, и это можно не писать.
_wp setWaypointFormation "WEDGE";
// Тип реагирования. В данном случае "Огонь по готовности"
_wp setWaypointCombatMode "RED";
// Радиус в котором вейпоинт зачтётся. По умолчанию он и так 10 метров, так что это для примера
_wp setWaypointCompletionRadius 10;
// Аналогично первому
private _wp1 =_group1 addWaypoint [[26841.1,24552,0], 0];
_wp1 setWaypointType "MOVE";
_wp1 setWaypointSpeed "LIMITED";
_wp1 setWaypointBehaviour "SAFE";
_wp1 setWaypointFormation "WEDGE";
_wp1 setWaypointCombatMode "RED";
_wp1 setWaypointCompletionRadius 10;
// Аналогично первому
private _wp2 =_group1 addWaypoint [[26841.7,24552.5,0], 0];
_wp2 setWaypointType "CYCLE";
_wp2 setWaypointSpeed "LIMITED";
_wp2 setWaypointBehaviour "SAFE";
_wp2 setWaypointFormation "WEDGE";
_wp2 setWaypointCombatMode "RED";
_wp2 setWaypointCompletionRadius 10;

 

Наполнение территории патрулями. Спаун на случайных (заданных) точках:

Теперь у нас есть патрульные по периметру, но нам нужно наполнить какую-то территорию патрулями. Делаем вот что:
Код в чистом виде:

0 spawn {
private _patrol_list = [[26771,24621,0], [26771,24621.5,0]];
for "_i" from 1 to 2 do
{
private _position = [26771,24621.5,0];
private _radius = 5 + ceil random 10;
private _groupPatrol = [selectRandom _patrol_list, east, (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "O_InfTeam_AT_Heavy")] call BIS_fnc_spawnGroup;
[_groupPatrol, _position, _radius] call BIS_fnc_taskPatrol;
};
};

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

0 spawn {
// Указываем случайные точки спауна (так интересней)
private _patrol_list = [[26771,24621,0], [26771,24621.5,0]];
// Повторяем процедуру спауна. В данном случае ДВА раза. Сколько напишите - столько и будет.
for "_i" from 1 to 2 do
{
// Указываем точку начала патрулирования. От неё будет идти указанное расстояние зоны патрулирования.
private _position = [26771,24621.5,0];
// Указываем радиус (расстояние от точки начала), в данном случае 5 метров, и (случайно) плюс 10 метров. Ставьте сколько надо.
private _radius = 5 + ceil random 10;
// Создаём группу. Указываем координаты где она должна быть создана (будет случайно выбрано из _patrol_list) . Указываем сторону (у нас это east), показываем путь к конфигу группы (вшит в игре), вызываем функцию спауна ботов (вшита в игре).
private _groupPatrol = [selectRandom _patrol_list, east, (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "O_InfTeam_AT_Heavy")] call BIS_fnc_spawnGroup;
// Вызываем функцию патрулирования. (вшита в игре)
[_groupPatrol, _position, _radius] call BIS_fnc_taskPatrol;
};
};

Патрули. Спаун на одной позиции:

А если вы не хотите что бы точки выбирались случайно, то пишем так:
Код в чистом виде:

0 spawn {
private _position = [27153.5,24232.5,0];
private _radius = 30 + ceil random 25;
private _groupPatrol = [[27153.5,24232.5,0], east, (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OI_reconPatrol")] call BIS_fnc_spawnGroup;
[_groupPatrol, _position, _radius] call BIS_fnc_taskPatrol;
};

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

0 spawn {
// Указываем точку начала патрулирования. От неё будет идти указанное расстояние зоны патрулирования.
private _position = [27153.5,24232.5,0];
// Указываем радиус (расстояние от точки начала), в данном случае 5 метров, и (случайно) плюс 10 метров. Ставьте сколько надо.
private _radius = 30 + ceil random 25;
// Создаём группу. Указываем координаты где она должна быть создана. Указываем сторону (у нас это east), показываем путь к конфигу группы (вшит в игре), вызываем функцию спауна ботов (вшита в игре).
private _groupPatrol = [[27153.5,24232.5,0], east, (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OI_reconPatrol")] call BIS_fnc_spawnGroup;
// Вызываем функцию патрулирования. (вшита в игре)
[_groupPatrol, _position, _radius] call BIS_fnc_taskPatrol;
};

Спаун группы. Стоят:

0 spawn
{
private _groupPatrol = [[26351.5,23716.7,0], east, (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OI_reconSentry")] call BIS_fnc_spawnGroup;
_groupPatrol setBehaviour "SAFE";
};

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

0 spawn
{
// Создаём группу. Указываем координаты где она должна быть создана. Указываем сторону (у нас это east), показываем путь к конфигу группы (вшит в игре), вызываем функцию спауна ботов (вшита в игре).
private _groupPatrol = [[26351.5,23716.7,0], east, (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OI_reconSentry")] call BIS_fnc_spawnGroup;
_groupPatrol setBehaviour "SAFE";
};

И наконец-то нам нужны подкрепления. Наши или что бы врагам приехали новые бойцы.
Вот тут я честно задолбался искать верный вариант. И очень хочется поблагодарить одного чудесного человека (просил не называть его имени) за помощь с этим скриптом.
Как оказалось, всё очень просто. Но искал я не там.
И так, пишем вот это:

Подкрепления прибывающие на транспорте. Выгрузка в заданной точке:

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

0 spawn {
private _truck = "O_Truck_03_transport_F" createVehicle ([26308.8,22054.3,0]);
private _suppGroup = [[26308.8,22054.3,0], east, (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfAssault")] call BIS_fnc_spawnGroup;
private _leader = leader _suppGroup;
private _unitsCargo = units _suppGroup - [_leader];
_leader moveInDriver _truck;
{_x moveInCargo _truck} forEach _unitsCargo;
_suppGroup move [27084.6,23068,0];
waitUntil {
sleep 1;
(_truck distance [27084.6,23068,0]) < 10
};
{
[_x] allowGetIn false;
_x spawn {
_this allowDamage false;
waitUntil {isNull objectParent _this};
_this allowDamage true;
};
_x action ["Eject", vehicle _x];
} forEach units _suppGroup;
private _wp =_suppGroup addWaypoint [[26991.9,23204.3,0], 0];
_wp setWaypointType "SAD";
_wp setWaypointSpeed "FULL";
_wp setWaypointCombatMode "RED";
};

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

0 spawn {
// Создаём нужный нам грузовик. Указываем координаты где это должно произойти.
private _truck = "O_Truck_03_transport_F" createVehicle ([26308.8,22054.3,0]);
// Создаём группу. Указываем координаты где она должна быть создана. Указываем сторону (у нас это east), показываем путь к конфигу группы (вшит в игре), вызываем функцию спауна ботов (вшита в игре).
private _suppGroup = [[26308.8,22054.3,0], east, (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfAssault")] call BIS_fnc_spawnGroup;
// Создаём локальную переменную для лидера группы, так как именно ему понадобиться дать отдельные указания. Но при этом оставляем его в остальной группе.
private _leader = leader _suppGroup;
// Создаём локальную переменную для юнитов в кузове, и убираем оттуда лидера группы _leader
private _unitsCargo = units _suppGroup - [_leader];
// Лидера группы сажаем на место водителя грузовика. Грузовик _truck и лидер _leader
_leader moveInDriver _truck;
// Остальная группа садится на пассажирские места
{_x moveInCargo _truck} forEach _unitsCargo;
// Указываем группе (а лидер в ней тоже, но он за рулём техники) куда им нужно двигаться
_suppGroup move [27084.6,23068,0];
// Ждём выполнения условия. В данном случае, это то что объект _truck окажется на дистанции менее 10 метров от указанной точки
waitUntil {
sleep 1;
(_truck distance [27084.6,23068,0]) < 10
};
{
// Запрещаем садится обратно (нам же, в данном случае надо что бы они воевали пешком)
[_x] allowGetIn false;
_x spawn {
// Выключаем им урон, пока они не вышли из техники. Так как иногда они могут убиться в процессе выгрузки (особенно, если это летящий самолёт). Не надо пугаться. Бессмертие запускается только по прибытию на точку и началу выгрузки, и длится где-то секунду.
_this allowDamage false;
waitUntil {isNull objectParent _this};
_this allowDamage true;
};
_x action ["Eject", vehicle _x];
// Указываем что это должен сделать (высадится) каждый член группы
} forEach units _suppGroup;
// Создаём вейпоинт и задаём координаты
private _wp =_suppGroup addWaypoint [[26991.9,23204.3,0], 0];
// Указываем тип вейпоинта. В данном случае Search and destroy
_wp setWaypointType "SAD";
// Указываем скорость вейпоинта
_wp setWaypointSpeed "FULL";
// Тип реагирования. В данном случае "Огонь по готовности"
_wp setWaypointCombatMode "RED";
};

 

Если надо оставить водителя на месте, или вообще экипаж техники, например БМП. Пишем в начале предыдущего примера так:
С пояснениями по изменениям:

private _truck = "O_Truck_03_transport_F" createVehicle ([26308.8,22054.3,0]);
// Создаём экипаж. В данном случае водителя грузовика, и сажаем его именно за руль этого грузовика.
createVehicleCrew _truck;
// Пихаем водителя грузовика в переменную _driver
private _driver = driver _truck;
// Переменную _driver пихаем в переменную _groupDriver . Сделано на случай, если вы решили дать ему вейпоинт, а даются они только группам.
private _groupDriver = group _driver;
private _men = [[26308.8,22054.3,0], east, (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfAssault")] call BIS_fnc_spawnGroup;
{_x moveInCargo _truck} forEach units _men;
// Вместо вейпоинта задаём координаты, и отправляем командой move
_groupDriver move [27084.6,23068,0];
// Далее как и в предыдущем примере.

Кастомная группа:

Если хотим заспаунить кастомную группу, ибо нам конфиги от BIS`ов могут не понравится для наших целей, пишем вот так:
Код в чистом виде:

private _blockgroup = ["O_Soldier_AT_F", "O_soldier_F", "O_Soldier_GL_F", "O_medic_F"];
private _group1 = [[26297.5,22907.1,0], east, _blockgroup] call BIS_fnc_spawnGroup;

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

// Создаём переменную, которая содержит нужных именно нам бойцов.
private _blockgroup = ["O_Soldier_AT_F", "O_soldier_F", "O_Soldier_GL_F", "O_medic_F"];
// Спауним группу вызывая нужную нам переменную, вписывая её вместо пути к конфигу. Так как свой конфиг мы написали в предыдущей строчке.
private _group1 = [[26297.5,22907.1,0], east, _blockgroup] call BIS_fnc_spawnGroup;

Можно вообще огласить все группы в начале документа, и вызывать их когда и где вам надо.

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

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