Показано с 1 по 3 из 3

Тема: Циклический скрипт на респ техники

  1. #1
    Участник
    Регистрация
    07.10.2014
    Сообщений
    82
    Благодарности/Неодобрения
    Получено: 8/2
    Отправлено: 0/0

    Циклический скрипт на респ техники

    Скрипт пришлось разбить на два скрипта, ибо нужно было задействовать бесконечный цикл.

    Основа скрипта на событиях. Для добавления респа нужной техники, надо просто добавить маркер на карту и соответствующие параметры в Лист nameVehicleArray, где 0 название того что респим, 1 маркер респа, 2 высота респа, 3 задержка после уничтожения ГО, 4 объект который отреспили, 5 засечка для таймера, 6 флаг засечки таймера. Ограничений на количество создаваемой техники нет.

    Скрипт 1
    Код:
    /*
    Респ техники игроков
    количество и вид техники которую нажно поставить и возрождать, определяется в листе nameVehicleArray
    Для добавления новых ГО которые необходимо респить, нужно добавить ["B_Heli_Light_01_F", "hspawn_1", 28, 14, objNull, 0, true] в лист nameVehicleArray
    респаун техники происходит по маркеру, поэтому надо поставить соответствующий маркер на карту
    
    
    Скрипт показал стабильную работу, при одновременной смерти 50 ботов от арт удара касетным боеприпасом.
    */
    
    
    //0 название того что респим, 1 маркер респа, 2 высота респа, 3 задержка после уничтожения ГО, 4 объект который отреспили, 5 засечка для таймера, 6 флаг засечки таймера
    nameVehicleArray = [["B_Heli_Light_01_F", "hspawn", 28, 14, objNull, 0, true], ["B_Heli_Light_01_F", "hspawn_1", 28, 14, objNull, 0, true]];
    
    
    numberArray = [];
    
    
    v = [] ExecVM "RespawnPartyPlayers_2.sqf";
    
    
    Creation = 
    {
        for "_i" from 0 to count nameVehicleArray -1 do
        {    
            _nameVehicle = "";
            _nameMarker = "";
            _height = 0;
    
    
            systemChat format ["_i  = %1", _i];
            diag_log format ["_i  = %1", _i];
        
            _nameVehicle = (nameVehicleArray select _i) select 0;
            _nameMarker = (nameVehicleArray select _i) select 1;
            _height = (nameVehicleArray select _i) select 2;
    
    
            //создаем транспорт
            _obj = _nameVehicle createVehicle getMarkerPos _nameMarker;
            //присваиваем ему имя номера ячейки в листе
            _obj setVehicleVarName str _i;
            
            //вешаем на нее событие, которое по исполнении вызывает функцию
            _obj addEventHandler ["killed", { diag_log format ["техника 1 уничтожена _this = %1", _this]; [_this] spawn ArrayRespawn; }];        
            _obj setDir markerDir _nameMarker;
            _obj setPosASL [getMarkerPos _nameMarker select 0,getMarkerPos _nameMarker select 1,(getMarkerPos _nameMarker select 2) + _height];
            
            (nameVehicleArray select _i) set [ 4, _obj ];
            nameVehicleArray = [] + nameVehicleArray;
        };
    };
    
    
    [] spawn Creation;
    
    
    //создаем очередь на респаун
    ArrayRespawn = 
    {
        _vehicleObj = objNull;
        
        //принимаем значения от обработчика события, смотрим кого уиби
        _vehicleObj = (_this select 0) select 0;
        
        //берем его имя, которое номер ячейки в листе
        _venicleName = vehicleVarName _vehicleObj;
        
        //парсим его в цифру
        _number = parseNumber _venicleName;
        
        //зановим значения в лист
        numberArray set [_number, _number]; 
        numberArray  = [] + numberArray;
            
        _boolArray = false;
        
        systemChat format ["добавили в массив значение numberArray = %1", numberArray];
        diag_log format ["добавили в массив значение numberArray = %1", numberArray];
    };
    Скрипт 2

    Код:
    /*
    Респ техники игроков. Скрипт 2
    */
    
    
    While {true} do 
    {        
        _timeWhile = time;
        
        for "_i" from 0 to count numberArray -1 do
        {
            //systemChat format ["работает цикл. _timeWhile = %1", _timeWhile];
            //diag_log format ["добавили в массив значение numberArray = %1", numberArray];
            
            //получаем номер ячейки из массива чисел по названию уничтоженного ГО
            _numberArrayP = numberArray select _i;
            
            if !(isNil { _numberArrayP}) then
            {
                if( _numberArrayP > -1 ) then
                {
                    //устанавляваем задержку респа
                    _delay1 = 0;
                    _delayBool = false;
                    _notch = 0;
                    _timeLast = 0;
                    
                    _delay1 = (nameVehicleArray select _numberArrayP) select 3;
                    _delayBool = (nameVehicleArray select _numberArrayP) select 6;
                                    
                    if(_delayBool) then
                    {            
                        //устанавливаем засечку времени
                        (nameVehicleArray select _numberArrayP) set [ 5, _timeWhile ];
                        //закрываем флаг
                        (nameVehicleArray select _numberArrayP) set [ 6, false ];
                        nameVehicleArray = [] + nameVehicleArray;
                    };
                    
                    //вычисляем сколько времени прошло с засечки        
                    _notch = (nameVehicleArray select _numberArrayP) select 5;
                    _timeLast = _timeWhile - _notch;
                                    
                    if(_delay1 <= _timeLast ) then 
                    {                            
                        _nameMarker = "";
                        _objectTrue = [];
                        _nameMarker = (nameVehicleArray select _numberArrayP) select 1;                    
                        _nameVehicle = "";
                        _height = 0;
                        
                        _obj = objNull;
                        _vehicleObj = objNull;
                        
                        systemChat format ["начали выполнение  ArrayRespawn = %1", 0];
                                
                        _nameVehicle = (nameVehicleArray select _numberArrayP) select 0;
                        _height = (nameVehicleArray select _numberArrayP) select 2;
                        _obj = (nameVehicleArray select _numberArrayP) select 4;
                                        
                        //удаляем событие
                        _obj removeEventHandler ["killed", 0];
                        //удаляем технику
                        deleteVehicle _obj;
    
    
                        //проверяем, есть ли какой то транспорт или юнит на месте респа                                            
                        _objectTrue = nearestObjects [getMarkerPos _nameMarker, ["AllVehicles"], 6];
                        
                        systemChat format ["_objectTrue = %1", _objectTrue];
                        
                        //и если нет ни чего, то респим технику    
                        if( count _objectTrue == 0 ) then
                        {                        
                            sleep 1;
                                
                            _objectTrue = [];
                            
                            //создаем технику
                            _obj = _nameVehicle createVehicle getMarkerPos _nameMarker;
                            //присваиваем ему имя номера ячейки в листе
                            _obj setVehicleVarName str _i;
                            _obj setDir markerDir _nameMarker;
                            _obj setPosASL [getMarkerPos _nameMarker select 0,getMarkerPos _nameMarker select 1,(getMarkerPos _nameMarker select 2) + _height];
                            
                            //systemChat format ["удалили технику  = %1", 0];
                            
                            //вешаем на нее событие которое вызывает эту функцию по уничтожении техники
                            _obj addEventHandler ["killed", { systemChat format ["снова техника 1 уничтожена  = %1", 0]; [_this] spawn ArrayRespawn;}];    
                            
                            (nameVehicleArray select _i) set [ 4, _obj ];
                            //обнуляем засечку
                            (nameVehicleArray select _i) set [ 5, 0 ];
                            //устанавливаем флаг засечки в true
                            (nameVehicleArray select _i) set [ 6, true ];
                            nameVehicleArray = [] + nameVehicleArray;
                            
                            numberArray set [_i, -1]; 
                            numberArray = [] + numberArray;
                            
                            systemChat format ["закончили выполнение  ArrayRespawn. nameVehicleArray = %1", nameVehicleArray];
                        };
                    };
                };
            };
        };
        
        sleep 1;
    };

    0 Вы не можете благодарить! Вы не можете благодарить!

  2. #2
    Участник
    Регистрация
    07.10.2014
    Сообщений
    82
    Благодарности/Неодобрения
    Получено: 8/2
    Отправлено: 0/0
    Версия 1.1

    Для удобства манипуляций с созданной техникой, вынес команды респа техники в отдельную функцию. Например для того, что бы отключать тепловизор у определенной техники () и при этом не захламлять код, и не прописывать его в 10 мест.

    Так же, забыл убрать sleep, что было чревато задержками в 1 секунду на респ каждой техники, что в свою очередь привело бы к поломке таймера и при респе в 60 единиц, последняя единица отреспилась бы только спустя 60 сек.

    К сожалению отредактировать предыдущее сообщение не могу, поэтому новое поле кода -

    Код:
    /*
    Скрипт 1
    
    
    Респ техники игроков
    количество и вид техники которую нажно поставить и возрождать, определяется в листе nameVehicleArray
    Для добавления новых ГО которые необходимо респить, нужно добавить ["B_Heli_Light_01_F", "hspawn_1", 28, 14, objNull, 0, true] в лист nameVehicleArray
    респаун техники происходит по маркеру, поэтому надо поставить соответствующий маркер на карту
    
    
    Скрипт показал стабильную работу, при одновременной смерти 50 ботов от арт удара касетным боеприпасом.
    */
    
    
    //0 название того что респим, 1 маркер респа, 2 высота респа, 3 задержка после уничтожения ГО, 4 объект который отреспили,
     5 засечка для таймера, 6 флаг засечки таймера, 7 включить(false) отключить(true) тепловизор
    nameVehicleArray = [["B_Heli_Attack_01_F", "hspawn", 28, 14, objNull, 0, true, false], ["B_Heli_Light_01_F", "hspawn_1", 28, 14, objNull, 0, true, false]];
    
    
    numberArray = [];
    
    
    v = [] ExecVM "RespawnPartyPlayers_2.sqf";
    
    
    CreationList = 
    {
        for "_i" from 0 to count nameVehicleArray -1 do
        {    
            [_i] call WorkWithObject;
        };
    };
    
    
    [] spawn CreationList;
    
    
    //создаем очередь на респаун
    ArrayRespawn = 
    {
        _vehicleObj = objNull;
        
        //принимаем значения от обработчика события, смотрим кого уиби
        _vehicleObj = (_this select 0) select 0;
        
        //берем его имя, которое номер ячейки в листе
        _venicleName = vehicleVarName _vehicleObj;
        
        //парсим его в цифру
        _number = parseNumber _venicleName;
        
        //зановим значения в лист
        numberArray set [_number, _number]; 
        numberArray  = [] + numberArray;
            
        _boolArray = false;
        
        systemChat format ["добавили в массив значение numberArray = %1", numberArray];
        diag_log format ["добавили в массив значение numberArray = %1", numberArray];
    };
    
    
    WorkWithObject = 
    {
        _i = 0;
        _nameVehicle = "";
        _nameMarker = "";
        _height = 0;
        _TIBool = false;
        
        _i = _this select 0;
        _nameVehicle = (nameVehicleArray select _i) select 0;
        _nameMarker = (nameVehicleArray select _i) select 1;
        _height = (nameVehicleArray select _i) select 2;
        _TIBool = (nameVehicleArray select _i) select 7;
    
    
        //создаем транспорт
        _obj = _nameVehicle createVehicle getMarkerPos _nameMarker;
        //присваиваем ему имя номера ячейки в листе
        _obj setVehicleVarName str _i;
        
        //вешаем на нее событие, которое по исполнении вызывает функцию
        _obj addEventHandler ["killed", { diag_log format ["техника 1 уничтожена _this = %1", _this]; [_this] spawn ArrayRespawn; }];        
        _obj setDir markerDir _nameMarker;
        _obj setPosASL [getMarkerPos _nameMarker select 0,getMarkerPos _nameMarker select 1,(getMarkerPos _nameMarker select 2) + _height];
        _obj disableTIEquipment _TIBool;
        
        (nameVehicleArray select _i) set [ 4, _obj ];
        nameVehicleArray = [] + nameVehicleArray;
    };
    Скрипт 2

    Код:
    /*
    Респ техники игроков. Скрипт 2
    */
    
    
    While {true} do 
    {        
        _timeWhile = time;
        
        for "_i" from 0 to count numberArray -1 do
        {
            //systemChat format ["работает цикл. _timeWhile = %1", _timeWhile];
            //diag_log format ["добавили в массив значение numberArray = %1", numberArray];
            
            //получаем номер ячейки из массива чисел по названию уничтоженного ГО
            _numberArrayP = numberArray select _i;
            
            if !(isNil { _numberArrayP}) then
            {
                if( _numberArrayP > -1 ) then
                {
                    //устанавляваем задержку респа
                    _delay1 = 0;
                    _delayBool = false;
                    _notch = 0;
                    _timeLast = 0;
                    
                    _delay1 = (nameVehicleArray select _numberArrayP) select 3;
                    _delayBool = (nameVehicleArray select _numberArrayP) select 6;
                                    
                    if(_delayBool) then
                    {            
                        //устанавливаем засечку времени
                        (nameVehicleArray select _numberArrayP) set [ 5, _timeWhile ];
                        //закрываем флаг
                        (nameVehicleArray select _numberArrayP) set [ 6, false ];
                        nameVehicleArray = [] + nameVehicleArray;
                    };
                    
                    //вычисляем сколько времени прошло с засечки        
                    _notch = (nameVehicleArray select _numberArrayP) select 5;
                    _timeLast = _timeWhile - _notch;
                                    
                    if(_delay1 <= _timeLast ) then 
                    {                            
                        _objectTrue = [];
                        
                        _obj = objNull;
                        _vehicleObj = objNull;
                        
                        systemChat format ["начали выполнение  ArrayRespawn = %1", 0];
                                
                        _obj = (nameVehicleArray select _numberArrayP) select 4;
                                        
                        //удаляем событие
                        _obj removeEventHandler ["killed", 0];
                        //удаляем технику
                        deleteVehicle _obj;
    
    
                        //проверяем, есть ли какой то транспорт или юнит на месте респа                                            
                        _objectTrue = nearestObjects [getMarkerPos _nameMarker, ["AllVehicles"], 6];
                        
                        systemChat format ["_objectTrue = %1", _objectTrue];
                        
                        //и если нет ни чего, то респим технику    
                        if( count _objectTrue == 0 ) then
                        {                                                
                            [_numberArrayP] call WorkWithObject;
                            
                            //обнуляем засечку
                            (nameVehicleArray select _i) set [ 5, 0 ];
                            //устанавливаем флаг засечки в true
                            (nameVehicleArray select _i) set [ 6, true ];
                            nameVehicleArray = [] + nameVehicleArray;
                            
                            numberArray set [_i, -1]; 
                            numberArray = [] + numberArray;
                            
                            systemChat format ["закончили выполнение  ArrayRespawn. nameVehicleArray = %1", nameVehicleArray];
                        };
                    };
                };
            };
        };
        
        sleep 1;
    };

    0 Вы не можете благодарить! Вы не можете благодарить!

  3. #3
    Участник
    Регистрация
    07.10.2014
    Сообщений
    82
    Благодарности/Неодобрения
    Получено: 8/2
    Отправлено: 0/0
    Что то недоглядел. Для добавления новой техники для скрипта версии 1.1, в отличии от первого скрипта, нужно добавить еще 2 параметра в лист. Пример
    nameVehicleArray = [
    //вертолеты
    ["I_Heli_light_03_F", "CombatHelicopter_1_0", 23, 14, objNull, 0, true, false, 6],
    ["I_Heli_light_03_F", "CombatHelicopter_1_1", 23, 14, objNull, 0, true, false, 6]
    ];

    где 0 название того что респим, 1 маркер респа, 2 высота респа, 3 задержка после уничтожения ГО, 4 объект который отреспили, 5 засечка для таймера, 6 флаг засечки таймера, 7 включить ли тепловизор на технике, 8 радиус в котором будет сканироваться пространство на наличие посторонних транспортов, что бы в нем не реснулась техника.

    Для размещения техники над уровнем земли, для того что бы не надо было выставлять высоты относительно уровня моря, нужно заменить команду
    setPosASL на команду setPosATL. Используйте поиск что бы найти ее.
    Тем не менее, все равно надо задавать отступ над уровнем земли, что бы техника не респилась в земле, например на наклонных поверхностях.

    0 Вы не можете благодарить! Вы не можете благодарить!

Похожие темы

  1. Скрипт на респаун техники
    от Sledo в разделе Скрипты
    Ответов: 0
    Последнее сообщение: 19.08.2015, 04:10
  2. Транспортировка техники вертолетом
    от Оккупант в разделе Редактор
    Ответов: 4
    Последнее сообщение: 19.03.2015, 21:05
  3. Скрипт спавна техники ботов
    от [BB]Norad в разделе Скрипты
    Ответов: 0
    Последнее сообщение: 13.08.2014, 10:17
  4. Спавн техники
    от mexan в разделе Скрипты
    Ответов: 0
    Последнее сообщение: 08.05.2014, 16:52
  5. Скрипт респауна техники
    от mexan в разделе Скрипты
    Ответов: 0
    Последнее сообщение: 09.02.2014, 16:35

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Яндекс.Метрика