Главная » 2015 » Февраль » 5 » Скрипт LGB (Laser Guided Bomb)
13:58 Скрипт LGB (Laser Guided Bomb) | |
LGB - Laser Guided Bomb - снаряд, который летит на точку от лазерного целеуказателя. Я давно хотел написать скрипт для такой штуки, и вот наконец дошли руки Итак, я сел писать "мозги" для управляемого снаряда. Сначала пришлось сформулировать несколько постулатов 1. Снаряд будет лететь в точку от ЛЦУ 2. Если ЛЦУ отметка пропадёт, мы будем лететь в её последнюю позицию. 3. Вызывать скрипт игрок будет через меню действий и только с включенным ЛЦУ в руках. 4. Снаряд будет прилетать с рандомной стороны Аргументы, которые будет принимать наш скрипт : Код _type = _this select 0; // класс снаряда _count = _this select 1; // кол-во снарядов _distance = _this select 2; // с какого расстояния запускаем _height = _this select 3; // с какой высоты запускаем _type - это то, чем мы будем стрелять. Например, мы можем стрелять ракетами "R_230mm_HE", запускать самолеты-смертники "I_Plane_Fighter_03_AA_F", или обрушивать с неба Замаки "I_Truck_02_covered_F" В своей практике я уже давно использую жутко удобную библиотеку SHK_Pos, позволяющую легко находить некоторые рандомные координаты. Углубляться в описание бибы я не буду, сами нагуглите. Итак, основной цикл, который будет спавнить снаряды и добавлять их в массив _mines : Код _playerPos = getPosATL player; for [{_i = 0}, {_i < _count}, {_i = _i + 1}] do { // Получаем случайную точку на окружности с радиусом _distance // и центром в _playerPos. _pos = [_playerPos, _distance, [0, 360]] call SHK_Pos; _posX = _pos select 0; _posY = _pos select 1; _posZ = _pos select 2; _mine = _type createVehicle [_posX,_posY,_posZ+_height]; _mine setPosATL [_posX,_posY,_posZ+_height]; _mines = _mines + [_mine]; }; Теперь у нас есть _count снарядов, каждый из которых находится в некоторой точке на окружности. Теперь все эти снаряды нам надо направить в точку, указываемую игроком. Чтобы рассчитать примерное время взрыва, напишем такой код Код _mine = _mines select 0; _dist = _mine distance laserTarget player; _mod = 200; // скорость движения снаряда _trg = ObjNull; _time = round(_dist / _mod); // Это чтобы при стрельбе грузовиками было прикольно if (canMove _mine) then { { _x engineOn TRUE } forEach _mines; }; Ну а теперь самая суть - основное тело скрипта : Код if (!isNull laserTarget player) then { _time spawn { for [{_i = _this}, {_i > 0}, {_i = _i - 1}] do { if (!isNull laserTarget player) then { [[player, format ["Splash in %1...", _i]], "FS_GlobalSideChat"] spawn BIS_fnc_MP; sleep 1; }; }; }; while {alive _mine} do { if (!isNull (laserTarget player)) then { _trg = getPosATL (laserTarget player); }; { if (alive _x) then { _pos = getPosATL _x; _dir = _pos vectorFromTo _trg; if (_count > 1) then { _spray = _count / 150; _dir set [0, (_dir select 0) + random(_spray) - _spray / 2]; _dir set [1, (_dir select 1) + random(_spray) - _spray / 2]; _dir set [2, (_dir select 2) + random(_spray) - _spray / 2]; }; _x setVelocity [(_dir select 0) * _mod, (_dir select 1) * _mod, (_dir select 2) * _mod]; }; } forEach _mines; sleep 0.1; }; } else { { deleteVehicle _x } forEach _mines; }; Обратите внимание на переменную _spray . Дело в том, что я решил добавить небольшой разброс, если снарядов будет несколько. Чем больше снарядов, тем больше получится разброс. Потому что при запуске тридцати 230мм ракет класса земля-земля вам хочется уничтожить всё живое в округе а не просто убить себе FPS. Если игрок отключает ЛЦУ до того, как мы заспавнили нужное количество снарядов, мы просто удаляем все заспавненные снаряды и выходим. И как уже говорилось, наш скрипт может стрелять не только боевыми снарядами, но и мусором. Например, мы можем выстрелить 30 грузовиками Замак Активация скрипта : Код ["R_230mm_HE", 10, 1000, 500] execVM "script_name.sqf" | |
Категория: Arma 3 | Просмотров: 2443 | |
Всего комментариев: 1 | |||||
Категории раздела
ПоискНаш опросМини-чат
Статистика
Онлайн всего: 1 Те, кому лень регаться: 1 Пользователей: 0 |