Jump to content


Photo

Нужна помощь в написании скрипта по артподдержке в заданном тригере.


  • Please log in to reply
1 reply to this topic

#1 OFFLINE   Slavik72

Slavik72

    Рядовой

  • Пользователи
  • 2 posts

Posted 22 December 2020 - 15:06

Нашел на форуме кусочек скрипта, не могу  разобраться, как сделать скрипт, для миссии - смысл (любая вражеская бронетехника и машины вошедшая в тригер засекается, отмечается маркером и атакуется дружественной артиллерией, попадание должно быть идеально точно. имена вражеской бронетехники заранее, в редакторе, не прописываются.

Если можно, то с примером миссии, или объяснением, как запускать.

Заранее благодарен за помощь!

Сам скрипт:
// Активация: _id = this addEventHandler ["fired", {_as = _this execVM "excalibur.sqf"}] 

 

// имя снаряда
_shell = _this select 6;

//начальная позиция снаряда
_pos = getPos _shell;
// скорость снаряда
_speed = (speed _shell)/3.6;
// вектор снаряда
_vector = vectorDir _shell;
// угол возвышения
_a = acos (_vector select 2);

// ОПРЕДЕЛЕНИЕ ЦЕЛИ
// дальность полета снаряда
_L = (_speed^2 / 9.81)* sin (2*_a);
/* начальный угол ориентации снаряда 
в горизонтальной плоскости 
от севера по часовой стрелке */
_DIRo = direction _shell;
// долгота предполагаемого места падения снаряда
_X = (_pos select 0) + (_L*sin _DIRo);
// широта предполагаемого места падения снаряда
_Y = (_pos select 1) + (_L*cos _DIRo);
// высота предполагаемого места падения снаряда
_Z = _pos select 2;
// координаты предполагаемого места падения снаряда
_center = [_X,_Y,_Z];
// список объектов в выбранном радиусе от предполагаемого места падения снаряда
_objects = nearestObjects [_center, ["tank","car", "ship"], 400];

// резервируем массив целей
_targets = [];
//если сторона объекта ЗАПАД, то добавить имя объекта в массив целей
{if (side _x == west) then {_targets set [count _targets, _x]}} forEach _objects;

// ВЫБОР ЦЕЛИ ПО РЕЙТИНГУ
_i = 1;
_j = count _targets;
while {_j > _i} do 
{
  /* если рейтинг одного из элементов массива 
  
больше чем рейтинг первого элемента*/  
  
if ( rating (_targets select _j) > rating (_targets select 0))
  // то:
  then 
  
{
    // присваиваем переменной имя выбранного элемента массива 
    
_candidate = _targets select _j;
    // в массиве целей обнуляем выбранный элемент
    _targets set [_j, objNull];
    /* к массиву целей прибавляем имя выбранного элемента
    (делаем его первым элементом массива целей)
    одновременно удаляя из него обнуленный элемент*/
    _targets = [_candidate] + _targets - [objNull]; 
  
};
_j = _j - 1;
};
// выбранная цель
_target = _targets select 0;

 
// НАВЕДЕНИЕ НА ЦЕЛЬ
// пока снаряд жив, выполнять:
while {alive _shell} do 
{
  // текущий вектор снаряда
  _vectorShell = vectorDir _shell;
  
  
// если снаряд начал снижаться, 
  
if (_vectorShell select 2 < 0) 
  
// то 
  
then {
         // текущая позиция снаряда   
_posShell = getPosASL _shell;
// текущая позиция цели 
_posTarget = getPosASL _target; 
 
         
// ОПРЕДЕЛЕНИЕ УГЛОВ НАПРАВЛЕНИЯ СНАРЯДА НА ЦЕЛЬ
         // фактическое расстояние до цели
         _disF = SQRT(_posShell distanceSqr _posTarget);
  
         
// расстояние до цели в плоскости YZ
         _disYZ = [0, _posShell select 1, _posShell select 2] distance [0, _posTarget select 1, _posTarget select 2];
         // угол между прямой от снаряда до цели и плоскостью YZ  
         
_dirX = acos (_disYZ / _disF);
  
         
// расстояние до цели в плоскости XZ
         _disXZ = [_posShell select 0, 0, _posShell select 2] distance [_posTarget select 0, 0, _posTarget select 2];
         // угол между прямой от снаряда до цели и плоскостью XZ  
         
_dirY = acos (_disXZ / _disF);  
  
         
// расстояние до цели в плоскости XY
         _disXY = [_posShell select 0, _posShell select 1, 0] distance [_posTarget select 0, _posTarget select 1, 0];
         // угол между прямой от снаряда до цели и плоскостью XY  
         
_dirZ = acos (_disXY / _disF);  
 

_anglX = 0;
         _anglY = 0;
         _anglZ = 0 - _dirZ;
// если составляющие вектора скорости имеют знак "-", то заменить знак на "+"
if (_vectorShell select 0 < 0) then {_anglX = 0 - _dirX} else {_anglX = _dirX};
if (_vectorShell select 1 < 0) then {_anglY = 0 - _dirY} else {_anglY = _dirY};
 
// направляем вектор скорости снаряда на цель 
_shell setVelocity [_speed*(sin _anglX), _speed*(sin _anglY), _speed*(sin _anglZ)];
       };
  
  
sleep 0.1;
};

 


  • 0

#2 OFFLINE   Индеец

Индеец

    Рядовой

  • Пользователи
  • 20 posts
  • Откуда:Украина

Posted 06 August 2021 - 06:18

Выбираешь технику (лучше всего САУ, хотя это может быть любой юнит, умеющий стрелять),

в ините техники прописываешь: this addEventHandler ["fired", {_as = _this execVM "excalibur.sqf"}].

Это навешивает активацию скрипта с именем excalibur.sqf при каждом выстреле техники.

Сам скрипт (у тебя выделено синим) обзываешь, соответственно, excalibur.sqf и кидаешь

в корневую папку миссии.

Теперь при каждом выстреле техники будет рассчитываться предполагаемая точка падения снаряда

 и в радиусе 400м от нее определяться юниты стороны west, классов "tank","car", "ship". Из них 

будет выбираться юнит с наибольшим рейтингом, и на него будет направляться снаряд.


  • 0




Яндекс.Метрика