– Это совсем не важно, капитан. Мы дали ему все, что необходимо… В любом случае всегда лучше предложить чуть–чуть меньше, чем чуть–чуть больше. Некоторые автоматически подвергают сомнению чересчур открытую информацию.
Гранд адмирал Траун в разговоре с Пеллаэоном.
Тимоти Зан, Трилогия Трауна





Сколько глобус ни крути, там Fess-Style не найти...
Сайт Fess'a
Главная » 2015 » Февраль » 5 » Скрипт LGB (Laser Guided Bomb)
13:58
Скрипт LGB (Laser Guided Bomb)


LGB - Laser Guided Bomb - снаряд, который летит на точку от лазерного целеуказателя. Я давно хотел написать скрипт для такой штуки, и вот наконец дошли руки smile

Итак, я сел писать "мозги" для управляемого снаряда.
Сначала пришлось сформулировать несколько постулатов

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мм ракет класса земля-земля вам хочется уничтожить всё живое в округе devil а не просто убить себе FPS.

Если игрок отключает ЛЦУ до того, как мы заспавнили нужное количество снарядов, мы просто удаляем все заспавненные снаряды и выходим.

И как уже говорилось, наш скрипт может стрелять не только боевыми снарядами, но и мусором. Например, мы можем выстрелить 30 грузовиками Замак smile




Активация скрипта :

Код
["R_230mm_HE", 10, 1000, 500] execVM "script_name.sqf"
Категория: Arma 3 | Просмотров: 1089 | Добавил: Fess
Всего комментариев: 1
Комментарий № 1 написал: viktoror11
11.03.2015 | Среда | 03:49

smile Молодец! Спасибо за скрипт biggrin

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Форма входа

Категории раздела

Arma 3 [11]
Сайт [2]
Мысли и обзоры [5]
Minecraft [1]

Поиск

Наш опрос

Оставить блок SoundCloud на сайте?

Архив | Результаты

Мини-чат

200

SoundCloud



Статистика


Онлайн всего: 1
Те, кому лень регаться: 1
Пользователей: 0