Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
Alexandr116ru

[ГАЙД] Совмещение: Анимированный хеликраш + Пролёт над игроком

Рекомендованные сообщения

По сути, это всего лишь объединение двух скриптов в один. По мере сил и возможностей. Вероятно, тут всё грубо и далеко не идеально (ну не владею я такими навыками).
Но скрипт работает 100% корректно.
 
Установка:
1. Создать файл с раширением ИМЯ_ФАЙЛА.sqf, скопировать в него содержимое кода:

 

private["_textPos","_rand_player","_playerpos","_randomLoot","_maxLootRadius","_playerPresent","_finder","_preWaypointPos","_startTime","_heliStart","_heliModel","_lootPos","_wp1","_wp2","_wp3","_landingzone","_aigroup","_wp","_helipilot","_crashwreck","_vel","_pos","_dir","_position","_num","_itemType","_CBLBase","_weights","_cntWeights","_index1","_index2","_crashName","_objectID","_marker_position","_marker","_mdot","_flyToPlayer","_dropPosition","_chute","_chutePos","_FlyingSupplyBox","_smoke","_var","_posATL","_SupplyBox","_mapLootPos"];
if ((count playableUnits) < 1) exitWith {diag_log("[ХЕЛИКРАШ ОТМЕНА]: Нет игроков на сервере");}; //СКРИПТ НЕ БУДЕТ ВЫПОЛНЯТЬСЯ, ЕСЛИ НА СЕРВЕРЕ НЕТ ИГРОКОВ
_rand_player            = playableUnits call BIS_fnc_selectRandom;
_playerpos                = [_rand_player] call FNC_GetPos;


_heliModel                = ["Mi17_TK_EP1","Mi17_CDF","Mi17_Ins","Mi17_UN_CDF_EP1","Mi171Sh_CZ_EP1","AH6J_EP1","UH1H_TK_GUE_EP1","UH1H_TK_EP1","UH1Y","MH60S","UH60M_EP1","AH6X_EP1","MH6J_EP1","Mi17_Civilian","Mi17_medevac_Ins","Mi17_medevac_CDF","Mi17_medevac_RU","UH60M_MEV_EP1","BAF_Merlin_HC3_D","CH_47F_EP1","CH_47F_BAF","MV22","C130J"] call BIS_fnc_selectRandom;
_heliStart                = [[1000.0,2.0],[3500.0,2.0],[5000.0,2.0],[7500.0,2.0],[9712.0,663.067],[12304.0,1175.07]] call BIS_fnc_selectRandom; //КООРДИНАТЫ, ОТКУДА БУДЕТ ВЫЛЕТАТЬ БОРТ. ДЛЯ ЧЕРНО
_crashName                = getText (configFile >> "CfgVehicles" >> _heliModel >> "displayName");
_finder                    = "";
_randomLoot                = ["HeliCrash","Hospital","Military","MilitaryIndustrial","MilitarySpecial"] call BIS_fnc_selectRandom; //СПИСОК, ОТКУДА БУДЕТ БРАТЬСЯ ЛУТ ДЛЯ ПРИЗЕМЛИВШЕЙСЯ КОРОБКИ


    //ЗДЕСЬ МОЖНО РАЗМЕСТИТЬ ОПОВЕЩЕНИЕ ИГРОКАМ О СТАРТЕ ИВЕНТА
    
    _position = [getMarkerPos "center",0,5000,10,0,2000,0] call BIS_fnc_findSafePos;


    diag_log(format["[ХЕЛИКРАШ НАЧАЛО]: %1 вылетел с позиции %2 к позиции %3!", _crashName,  str(_heliStart), str(_position)]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
    
    _startTime = time;
    _crashwreck = createVehicle [_heliModel,_heliStart, [], 0, "FLY"];
    _objectID = str(round(random 999999));
    _crashwreck setVariable ["ObjectID", _objectID, true];
    _crashwreck setVariable ["ObjectUID", _objectID, true];
    PVDZE_serverObjectMonitor set [count PVDZE_serverObjectMonitor,_crashwreck];
    waitUntil {(!isNull _crashwreck)};
    _crashwreck setCombatMode "BLUE";
    _crashwreck engineOn true;
    _crashwreck flyInHeight 200; //ВЫСОТА ПОЛЁТА. ЕСЛИ НОВИЧОК, ЛУЧШЕ НЕ ТРОГАЙ. ИНАЧЕ БУДЕТ СБОИТЬ СБРОС КОРОБКИ. БОРТ БУДЕТ КРУЖИТЬ НАД ИГРОКОМ, ТЕМ САМЫМ, ДЕМОРАЛИЗУЯ И НАРУШАЯ ЕГО ПСИХИКУ
    _crashwreck forceSpeed 150;
    _crashwreck setspeedmode "NORMAL";
    
    _landingzone = createVehicle ["HeliHEmpty", [_position select 0, _position select 1,0], [], 0, "CAN_COLLIDE"];
    _aigroup = creategroup civilian;
    _helipilot = _aigroup createUnit ["SurvivorW2_DZ",getPos _crashwreck,[],0,"FORM"];
    _helipilot setCombatMode "BLUE";
    _helipilot moveindriver _crashwreck;
    _helipilot assignAsDriver _crashwreck;
    uiSleep 0.5;
    
    if ((isPlayer _rand_player) && (alive _rand_player)) then { //ЕСЛИ ВЫБРАННАЯ ЦЕЛЬ - ИГРОК И ЕСЛИ ИГРОК ЖИВ, ТО ПОЛЕТИТ НА ЕГО ПОЗИЦИЮ
        _wp1 = _aigroup addWaypoint [[(_playerpos select 0),(_playerpos select 1),200],0];
        _wp1 setWaypointType "MOVE";
        _wp1 setWaypointBehaviour "CARELESS";
        _flyToPlayer = true;
        for "_x" from 1 to 5 do
        {
            _preWaypointPos = [getMarkerPos "center", 0, 5000, 10, 0, 2000, 0] call BIS_fnc_findSafePos;
            _wp = _aigroup addWaypoint [_preWaypointPos, 0];
            _wp setWaypointType "MOVE";
            _wp setWaypointBehaviour "CARELESS";
        };
        diag_log(format["[ХЕЛИКРАШ]: %1 полетел к игроку %2", _crashName, (name _rand_player)]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
    } else {  //ЕСЛИ ПОЛЕТЕЛ НЕ К ИГРОКУ, БУДЕТ ПРОСТО ЛЕТАТЬ ПО ТОЧКАМ, ПОКА НЕ СОБЬЮТ ИЛИ ПОКА НЕ ДОЛЕТИТ ДО ФИНАЛЬНОЙ
        for "_x" from 1 to 10 do
        {
            _preWaypointPos = [getMarkerPos "center", 0, 5000, 10, 0, 2000, 0] call BIS_fnc_findSafePos;
            _wp = _aigroup addWaypoint [_preWaypointPos, 0];
            _wp setWaypointType "MOVE";
            _wp setWaypointBehaviour "CARELESS";
        };
        diag_log(format["[ХЕЛИКРАШ]: %1 полетел кружить по карте", _crashName]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
    };


    _dropPosition = [(_playerpos select 0),(_playerpos select 1),200];
    if (_flyToPlayer) then {  //ЕСЛИ ИЗНАЧАЛЬНО ЛЕТЕЛ К ИГРОКУ - НИЖЕ ОЖИДАНИЕ, КОГДА ПРИБЛИЗИТСЯ К ЕГО ПОЗИЦИИ. НУ И ДРУГИЕ ЧРЕЗВЫЧАЙНЫЕ СИТУАЦИИ. ЧТОБЫ ПРОДОЛЖИЛОСЬ ВЫПОЛНЕНИЕ СКРИПТА
        waitUntil {(_crashwreck distance _dropPosition < 50) || !alive _crashwreck || (getPosATL _crashwreck select 2) < 5 || (damage _crashwreck) >= 1};
        diag_log(format["[ХЕЛИКРАШ]: %1 долетел до игрока или был сбит", _crashName]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
    };


    if ((_flyToPlayer) && (alive _crashwreck)) then { //ЕСЛИ ИЗНАЧАЛЬНО ЛЕТЕЛ К ИГРОКУ И НЕ СБИЛИ, ТО СБРОСИТ КОРОБКУ ПОЧТИ НА ГОЛОВУ БЕДНОЙ КЕПКИ, В ДРУГОМ СЛУЧАЕ, КУСОК СКРИПТА ПРОПУСКАЕТСЯ И СБРОСА НЕ БУДЕТ
        diag_log(format["[ХЕЛИКРАШ]: %1 сбросил груз. Значит долетел", _crashName]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
        _aircraftpos = [_crashwreck] call FNC_GetPos;
        _chute = createVehicle ["ParachuteMediumEast", _aircraftpos, [], 0, "FLY"];
        _chutePos = getPos _chute;
        _FlyingSupplyBox = createVehicle ["Supply_Crate_DZE", _chutePos, [], 0, "FLY"];
        _FlyingSupplyBox attachTo [_chute, [0,0,0]];
        _FlyingSupplyBox setVariable ["permaLoot",true];
        _FlyingSupplyBox setVariable ["ObjectID", ""];
        _FlyingSupplyBox addEventHandler ["handleDamage", {false}];
        _chute setVariable ["ObjectID", ""];
        _smoke = "SmokeShellGreen" createVehicle (getPos _FlyingSupplyBox);
        _smoke attachTo [_FlyingSupplyBox, [0,0,1]];
        _var = floor((random 2) + 1);
        while {getPos _FlyingSupplyBox select 2 > 4} do
        {
            _chute SetVelocity [0,0,-5];
            uiSleep 0.1;
        };
        detach _FlyingSupplyBox;
        while {getPos _FlyingSupplyBox select 2 > 0} do {
            _FlyingSupplyBox setPos [getPos _FlyingSupplyBox select 0, getPos _FlyingSupplyBox select 1, (getPos _FlyingSupplyBox select 2) - .25]
        };
        deleteVehicle _chute;
        _posATL = getPosATL _FlyingSupplyBox;
        _mapLootPos = mapGridPosition getPos _FlyingSupplyBox;
        deleteVehicle _FlyingSupplyBox;
        _SupplyBox = "Supply_Crate_DZE" createVehicle _posATL;
        _SupplyBox setVariable ["permaLoot",true];
        _SupplyBox enableSimulation false;
        if (DZE_MissionLootTable) then {
            dgx_itemTypes = [] + getArray (missionConfigFile >> "CfgBuildingLoot" >> _randomLoot >> "lootType");
        } else {
            dgx_itemTypes = [] + getArray (configFile >> "CfgBuildingLoot" >> _randomLoot >> "lootType");
        };
        _CBLBase = dayz_CBLBase find (toLower(_randomLoot));
        _weights = dayz_CBLChances select _CBLBase;
        _cntWeights = count _weights;
        _num = (round(random 12)) + 12;
        for "_x" from 1 to _num do {
            _maxLootRadius = (random 4) + 4;
            _lootPos = [_posATL, _maxLootRadius, random 360] call BIS_fnc_relPos;
            _index1 = floor(random _cntWeights);
            _index2 = _weights select _index1;
            _itemType = dgx_itemTypes select _index2;
            [_itemType select 0, _itemType select 1, _lootPos, 5] call spawn_loot;


            diag_log(format["[ХЕЛИКРАШ СБРОС КОРОБКИ]: %1 сбросил груз из %2 на позиции @%3", _crashName, _randomLoot, _mapLootPos]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT


        };
        _nearby = _dropPosition nearObjects ["ReammoBox", sizeOf("Supply_Crate_DZE")];
        {
            _x setVariable ["permaLoot",true];
        } count _nearBy;
        //_textPos = format ["Воздушный транспорт сбросил груз на координтах %1.", _mapLootPos];
        //RemoteMessage = ["radio",_textPos];
        //publicVariable "RemoteMessage";
        //ЗДЕСЬ МОЖНО РАЗМЕСТИТЬ ОПОВЕЩЕНИЕ ИГРОКАМ О СБРОСЕ ГРУЗА, В КАЧЕСТВЕ ПРИМЕРА, ПРИВЕДЕНО СООБЩЕНИЕ, ВЫВОДЯЩЕЕСЯ ПРИ ПОМОЩИ REMOTE MESSAGE ИЗ МОДА WAI 2.2.0
        //_mapLootPos - ПОКАЖЕТ КВАДРАТ, В КОТОРОМ СБРОШЕНА КОРОБКА.
    


    };


    _wp2 = _aigroup addWaypoint [position _landingzone, 0];
    _wp2 setWaypointType "MOVE";
    _wp2 setWaypointBehaviour "CARELESS";
    _wp2 setWaypointStatements ["true", "_crashwreck setdamage 1;"];
    
    _wp3 = _aigroup addWaypoint [[0,16000,0], 0];
    _wp3 setWaypointType "CYCLE";
    _wp3 setWaypointBehaviour "CARELESS";
    
    waitUntil {(_crashwreck distance _position) <= 1000 || !alive _crashwreck || (getPosATL _crashwreck select 2) < 5 || (damage _crashwreck) >= 1};
    
    _crashwreck flyInHeight 100;
    _crashwreck forceSpeed 100;
    _crashwreck setspeedmode "NORMAL";
    
    waitUntil {(_crashwreck distance _position) <= 500 || !alive _crashwreck || (getPosATL _crashwreck select 2) < 5 || (damage _crashwreck) >= 1};
    deletevehicle _helipilot;
    
    _crashwreck setHit ["mala vrtule", 1];
    _ran15 = random 15;
    _crashwreck setVelocity [_ran15,_ran15,-25];
    _crashwreck setdamage .9;
    waitUntil{uiSleep 1; getpos _crashwreck select 2 <= 30};
    _helipilot setdamage 1;
    _crashwreck setVelocity [_ran15,_ran15,-20];
    waitUntil{uiSleep 1; getpos _crashwreck select 2 <= 10};
    _crashwreck setdamage 1;
    
    waitUntil{uiSleep 1; getpos _crashwreck select 2 <= 5};
    
    diag_log(format["[ХЕЛИКРАШ ПАДЕНИЕ]: %1 упал на позиции %2!", _crashName, getpos _crashwreck]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
    
    _pos = [getpos _crashwreck select 0, getpos _crashwreck select 1,0];
    _dir = getdir _crashwreck;
    deletevehicle _landingzone;
    
    _isWater = surfaceIsWater [getpos _crashwreck select 0, getpos _crashwreck select 1];
    if(_isWater) then {
    //ЗДЕСЬ МОЖНО РАЗМЕСТИТЬ ОПОВЕЩЕНИЕ, ЧТО ВОЗДУШНЫЙ ТРАНСПОРТ УПАЛ В ВОДУ. И НА ЭТОМ СКРИПТ ЗАКОНЧИТ СВОЮ РАБОТУ.
    } else { //ЕСЛИ ВСЁ ХОРОШО, ТО НА МЕСТЕ КРУШЕНИЯ СПАВНИТСЯ ЛУТ ИЗ ТАБЛИЦЫ "HeliCrash". ЕСЛИ ХОЧЕТСЯ РАНДОМА, МОЖНО НИЖЕ ВСЕ ТРИ "HeliCrash" ЗАМЕНИТЬ НА _randomLoot
        _num = round(random 12) + 12;
        if (DZE_MissionLootTable) then {
            dgx_itemTypes = [] + getArray(missionConfigFile >> "CfgBuildingLoot" >> "HeliCrash" >> "lootType");
        } else {
            dgx_itemTypes = [] + getArray(configFile >> "CfgBuildingLoot" >> "HeliCrash" >> "lootType");
        };
        _CBLBase = dayz_CBLBase find(toLower("HeliCrash"));
        _weights = dayz_CBLChances select _CBLBase;
        _cntWeights = count _weights;
        for "_x" from 1 to _num do
        {
            _maxLootRadius     = (random 20) + 10;
            _lootPos = [_pos, _maxLootRadius, random 360] call BIS_fnc_relPos;
            _index1 = floor(random _cntWeights);
            _index2 = _weights select _index1;
            _itemType = dgx_itemTypes select _index2;
            [_itemType select 0, _itemType select 1, _lootPos, 5] call spawn_loot;
            
            diag_log(format["[ХЕЛИКРАШ СПАВН ЛУТА]: %1 упал на позиции %2", _crashName, _lootPos]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
            
            _nearby = _pos nearObjects ["ReammoBox", 20];
            {
                _x setVariable ["permaLoot",true];
            } forEach _nearBy;
        };
        
        //ЗДЕСЬ МОЖНО РАЗМЕСТИТЬ ОПОВЕЩЕНИЕ ИГРОКАМ, О ТОМ, ЧТО БОРТ УПАЛ. ДАЛЕЕ ПОЯВИТСЯ МАРКЕР, НО ОСТАТКИ СГОРЕВШЕГО БОРТА, БУДУТ РАСПОЛАГАТЬСЯ НЕ ТОЧНО ПО ЦЕНТРУ МАРКЕРА, ИБО ПУСТЬ ИЩУТ


        _marker_position = [_pos,0,400,0,1,2000,0] call BIS_fnc_findSafePos;
        waitUntil
        {
            _marker = createMarker [ format ["loot_event_marker_%1", _startTime], _marker_position];
            _marker setMarkerColor "ColorRed";
            _marker setMarkerShape "ELLIPSE";
            _marker setMarkerAlpha 0.5;
            _marker setMarkerSize [400,400];
            _marker setMarkerText _crashName;
            _mdot = createMarker [format ["dot_%1", _startTime], _marker_position];
            _mdot setMarkerColor "ColorBlack";
            _mdot setMarkerType "hd_destroy";
            _mdot setMarkerText (format["Место крушения: %1", _crashName]); //ТЕКСТ КОТОРЫЙ БУДЕТ ОТОБРАЖАТЬСЯ НА МАРКЕРЕ, С НАЗВАНИЕМ УПАВШЕГО БОРТА
            uiSleep 10;
            deleteMarker _marker;
            deleteMarker _mdot;
            _playerPresent = false;
            {
                if((isPlayer _x) && (_x distance _pos <= 25)) then {
                    _playerPresent = true;
                    _finder = name _x;
                };
            } foreach playableUnits;
            (_playerPresent)
        };
        deleteMarker _marker; //НЕ УВЕРЕН, НАДО ЛИ ДУБЛИРОВАТЬ УДАЛЕНИЕ МАРКЕРОВ, ИБО НЕ СПЕЦ. НЕ ЗНАЮ. НО НЕ МЕШАЕТ (ЭТА СТРОКА И НИЖЕ).
        deleteMarker _mdot;
        //МАРКЕР БУДЕТ ПЕРЕСОЗДАВАТЬСЯ КАЖДЫЕ 10 СЕКУНД, ЧТОБЫ ВСЕ ИГРОКИ ЕГО ВИДЕЛИ, ДАЖЕ ПОСЛЕ ПЕРЕЗАХОДА. БУДЕТ ОТОБРАЖАТЬСЯ ДО ТЕХ ПОР, ПОКА К СГОРЕВШЕМУ БОРТУ НЕ ПОДОЙДЁТ ИГРОК
        //ЗДЕСЬ МОЖНО РАЗМЕСТИТЬ ОПОВЕЩЕНИЕ ИГРОКАМ, О ТОМ ЧТО ХЕЛИКРАШ НАЙДЕН


        diag_log(format["[ХЕЛИКРАШ КОНЕЦ]: Обнаружен игроком %1. Ивент выполнен!" , _finder]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
    };

 

 

2. Закинуть файл ИМЯ_ФАЙЛА.sqf в папку @DayZ_Epoch_Server\addons\dayz_server\modules\
3. Добавить в init.sqf в EpochEvents, внутри [], код ["any","any","any","any",30,"ИМЯ_ФАЙЛА"], не забыв поставить запятую после предыдущего ивента.
Пример: EpochEvents = [["any","any","any","any",10,"другой_ивент"],["any","any","any","any",30,"ИМЯ_ФАЙЛА"]];
 
Что происходит и как это работает:
- По заданному в init.sqf промежутку времени, вылетает вертолёт/самолёт;
- Если есть игроки и выбранная цель из всех юнитов игрок, то воздушный транспорт направляется к его позиции;
- Долетев до позиции игрока, "сбрасывает" ящик на парашюте и продолжает свой маршрут по точкам;
- После приземления, вокруг ящика спавнится лут. Да и сам ящик можно разобрать;
- Если изначально цель не игрок, то борт сразу полетит кружить по карте;
- Отлетав определённое количество точек, пойдёт на финальную, разобьётся и вокруг него отспавнится лут, с отображением информации на карте маркером;
- Маркер будет отображаться до тех пор, пока кто либо из игроков не подойдёт к крашу;
В принципе, функционал двух скриптов в одном, как оно и было, ничего экстраординарного.
 
Я лишь внёс пару проверок и поправок:
- Если игроков нет на сервере, то работа скрипта прекращается;
- Скрипт отработает всегда (в оригинале, только если выбранная цель - игрок). В моём случае, он стартанёт всегда, но если выбранная цель не игрок, то просто отработает, как анимированный хеликраш, без сброса груза;
- Маркер будет отображаться даже после перезахода игрока на сервер. Пересоздаётся раз в 10 секунд. Увы, более ювелирных способов не нашёл. В миссиях WAI, маркеры вообще раз в секунду пересоздаются. Тут работает по тому же принципу;
- Если борт сбить, на любом этапе, он упадёт и лут отспавнится вокруг него, с отображением маркера;
- Читайте комментарии в скрипте, если хотите добавить оповещения игрокам о старте, сбросе груза, падении борта.
Изменено пользователем Alexandr116ru (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах



 

По сути, это всего лишь объединение двух скриптов в один. По мере сил и возможностей. Вероятно, тут всё грубо и далеко не идеально (ну не владею я такими навыками).
Но скрипт работает 100% корректно.
 
Установка:
1. Создать файл с раширением ИМЯ_ФАЙЛА.sqf, скопировать в него содержимое кода:

 

private["_textPos","_rand_player","_playerpos","_randomLoot","_maxLootRadius","_playerPresent","_finder","_preWaypointPos","_startTime","_heliStart","_heliModel","_lootPos","_wp1","_wp2","_wp3","_landingzone","_aigroup","_wp","_helipilot","_crashwreck","_vel","_pos","_dir","_position","_num","_itemType","_CBLBase","_weights","_cntWeights","_index1","_index2","_crashName","_objectID","_marker_position","_marker","_mdot","_flyToPlayer","_dropPosition","_chute","_chutePos","_FlyingSupplyBox","_smoke","_var","_posATL","_SupplyBox","_mapLootPos"];
if ((count playableUnits) < 1) exitWith {diag_log("[ХЕЛИКРАШ ОТМЕНА]: Нет игроков на сервере");}; //СКРИПТ НЕ БУДЕТ ВЫПОЛНЯТЬСЯ, ЕСЛИ НА СЕРВЕРЕ НЕТ ИГРОКОВ
_rand_player            = playableUnits call BIS_fnc_selectRandom;
_playerpos                = [_rand_player] call FNC_GetPos;


_heliModel                = ["Mi17_TK_EP1","Mi17_CDF","Mi17_Ins","Mi17_UN_CDF_EP1","Mi171Sh_CZ_EP1","AH6J_EP1","UH1H_TK_GUE_EP1","UH1H_TK_EP1","UH1Y","MH60S","UH60M_EP1","AH6X_EP1","MH6J_EP1","Mi17_Civilian","Mi17_medevac_Ins","Mi17_medevac_CDF","Mi17_medevac_RU","UH60M_MEV_EP1","BAF_Merlin_HC3_D","CH_47F_EP1","CH_47F_BAF","MV22","C130J"] call BIS_fnc_selectRandom;
_heliStart                = [[1000.0,2.0],[3500.0,2.0],[5000.0,2.0],[7500.0,2.0],[9712.0,663.067],[12304.0,1175.07]] call BIS_fnc_selectRandom; //КООРДИНАТЫ, ОТКУДА БУДЕТ ВЫЛЕТАТЬ БОРТ. ДЛЯ ЧЕРНО
_crashName                = getText (configFile >> "CfgVehicles" >> _heliModel >> "displayName");
_finder                    = "";
_randomLoot                = ["HeliCrash","Hospital","Military","MilitaryIndustrial","MilitarySpecial"] call BIS_fnc_selectRandom; //СПИСОК, ОТКУДА БУДЕТ БРАТЬСЯ ЛУТ ДЛЯ ПРИЗЕМЛИВШЕЙСЯ КОРОБКИ


    //ЗДЕСЬ МОЖНО РАЗМЕСТИТЬ ОПОВЕЩЕНИЕ ИГРОКАМ О СТАРТЕ ИВЕНТА
    
    _position = [getMarkerPos "center",0,5000,10,0,2000,0] call BIS_fnc_findSafePos;


    diag_log(format["[ХЕЛИКРАШ НАЧАЛО]: %1 вылетел с позиции %2 к позиции %3!", _crashName,  str(_heliStart), str(_position)]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
    
    _startTime = time;
    _crashwreck = createVehicle [_heliModel,_heliStart, [], 0, "FLY"];
    _objectID = str(round(random 999999));
    _crashwreck setVariable ["ObjectID", _objectID, true];
    _crashwreck setVariable ["ObjectUID", _objectID, true];
    PVDZE_serverObjectMonitor set [count PVDZE_serverObjectMonitor,_crashwreck];
    waitUntil {(!isNull _crashwreck)};
    _crashwreck setCombatMode "BLUE";
    _crashwreck engineOn true;
    _crashwreck flyInHeight 200; //ВЫСОТА ПОЛЁТА. ЕСЛИ НОВИЧОК, ЛУЧШЕ НЕ ТРОГАЙ. ИНАЧЕ БУДЕТ СБОИТЬ СБРОС КОРОБКИ. БОРТ БУДЕТ КРУЖИТЬ НАД ИГРОКОМ, ТЕМ САМЫМ, ДЕМОРАЛИЗУЯ И НАРУШАЯ ЕГО ПСИХИКУ
    _crashwreck forceSpeed 150;
    _crashwreck setspeedmode "NORMAL";
    
    _landingzone = createVehicle ["HeliHEmpty", [_position select 0, _position select 1,0], [], 0, "CAN_COLLIDE"];
    _aigroup = creategroup civilian;
    _helipilot = _aigroup createUnit ["SurvivorW2_DZ",getPos _crashwreck,[],0,"FORM"];
    _helipilot setCombatMode "BLUE";
    _helipilot moveindriver _crashwreck;
    _helipilot assignAsDriver _crashwreck;
    uiSleep 0.5;
    
    if ((isPlayer _rand_player) && (alive _rand_player)) then { //ЕСЛИ ВЫБРАННАЯ ЦЕЛЬ - ИГРОК И ЕСЛИ ИГРОК ЖИВ, ТО ПОЛЕТИТ НА ЕГО ПОЗИЦИЮ
        _wp1 = _aigroup addWaypoint [[(_playerpos select 0),(_playerpos select 1),200],0];
        _wp1 setWaypointType "MOVE";
        _wp1 setWaypointBehaviour "CARELESS";
        _flyToPlayer = true;
        for "_x" from 1 to 5 do
        {
            _preWaypointPos = [getMarkerPos "center", 0, 5000, 10, 0, 2000, 0] call BIS_fnc_findSafePos;
            _wp = _aigroup addWaypoint [_preWaypointPos, 0];
            _wp setWaypointType "MOVE";
            _wp setWaypointBehaviour "CARELESS";
        };
        diag_log(format["[ХЕЛИКРАШ]: %1 полетел к игроку %2", _crashName, (name _rand_player)]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
    } else {  //ЕСЛИ ПОЛЕТЕЛ НЕ К ИГРОКУ, БУДЕТ ПРОСТО ЛЕТАТЬ ПО ТОЧКАМ, ПОКА НЕ СОБЬЮТ ИЛИ ПОКА НЕ ДОЛЕТИТ ДО ФИНАЛЬНОЙ
        for "_x" from 1 to 10 do
        {
            _preWaypointPos = [getMarkerPos "center", 0, 5000, 10, 0, 2000, 0] call BIS_fnc_findSafePos;
            _wp = _aigroup addWaypoint [_preWaypointPos, 0];
            _wp setWaypointType "MOVE";
            _wp setWaypointBehaviour "CARELESS";
        };
        diag_log(format["[ХЕЛИКРАШ]: %1 полетел кружить по карте", _crashName]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
    };


    _dropPosition = [(_playerpos select 0),(_playerpos select 1),200];
    if (_flyToPlayer) then {  //ЕСЛИ ИЗНАЧАЛЬНО ЛЕТЕЛ К ИГРОКУ - НИЖЕ ОЖИДАНИЕ, КОГДА ПРИБЛИЗИТСЯ К ЕГО ПОЗИЦИИ. НУ И ДРУГИЕ ЧРЕЗВЫЧАЙНЫЕ СИТУАЦИИ. ЧТОБЫ ПРОДОЛЖИЛОСЬ ВЫПОЛНЕНИЕ СКРИПТА
        waitUntil {(_crashwreck distance _dropPosition < 50) || !alive _crashwreck || (getPosATL _crashwreck select 2) < 5 || (damage _crashwreck) >= 1};
        diag_log(format["[ХЕЛИКРАШ]: %1 долетел до игрока или был сбит", _crashName]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
    };


    if ((_flyToPlayer) && (alive _crashwreck)) then { //ЕСЛИ ИЗНАЧАЛЬНО ЛЕТЕЛ К ИГРОКУ И НЕ СБИЛИ, ТО СБРОСИТ КОРОБКУ ПОЧТИ НА ГОЛОВУ БЕДНОЙ КЕПКИ, В ДРУГОМ СЛУЧАЕ, КУСОК СКРИПТА ПРОПУСКАЕТСЯ И СБРОСА НЕ БУДЕТ
        diag_log(format["[ХЕЛИКРАШ]: %1 сбросил груз. Значит долетел", _crashName]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
        _aircraftpos = [_crashwreck] call FNC_GetPos;
        _chute = createVehicle ["ParachuteMediumEast", _aircraftpos, [], 0, "FLY"];
        _chutePos = getPos _chute;
        _FlyingSupplyBox = createVehicle ["Supply_Crate_DZE", _chutePos, [], 0, "FLY"];
        _FlyingSupplyBox attachTo [_chute, [0,0,0]];
        _FlyingSupplyBox setVariable ["permaLoot",true];
        _FlyingSupplyBox setVariable ["ObjectID", ""];
        _FlyingSupplyBox addEventHandler ["handleDamage", {false}];
        _chute setVariable ["ObjectID", ""];
        _smoke = "SmokeShellGreen" createVehicle (getPos _FlyingSupplyBox);
        _smoke attachTo [_FlyingSupplyBox, [0,0,1]];
        _var = floor((random 2) + 1);
        while {getPos _FlyingSupplyBox select 2 > 4} do
        {
            _chute SetVelocity [0,0,-5];
            uiSleep 0.1;
        };
        detach _FlyingSupplyBox;
        while {getPos _FlyingSupplyBox select 2 > 0} do {
            _FlyingSupplyBox setPos [getPos _FlyingSupplyBox select 0, getPos _FlyingSupplyBox select 1, (getPos _FlyingSupplyBox select 2) - .25]
        };
        deleteVehicle _chute;
        _posATL = getPosATL _FlyingSupplyBox;
        _mapLootPos = mapGridPosition getPos _FlyingSupplyBox;
        deleteVehicle _FlyingSupplyBox;
        _SupplyBox = "Supply_Crate_DZE" createVehicle _posATL;
        _SupplyBox setVariable ["permaLoot",true];
        _SupplyBox enableSimulation false;
        if (DZE_MissionLootTable) then {
            dgx_itemTypes = [] + getArray (missionConfigFile >> "CfgBuildingLoot" >> _randomLoot >> "lootType");
        } else {
            dgx_itemTypes = [] + getArray (configFile >> "CfgBuildingLoot" >> _randomLoot >> "lootType");
        };
        _CBLBase = dayz_CBLBase find (toLower(_randomLoot));
        _weights = dayz_CBLChances select _CBLBase;
        _cntWeights = count _weights;
        _num = (round(random 12)) + 12;
        for "_x" from 1 to _num do {
            _maxLootRadius = (random 4) + 4;
            _lootPos = [_posATL, _maxLootRadius, random 360] call BIS_fnc_relPos;
            _index1 = floor(random _cntWeights);
            _index2 = _weights select _index1;
            _itemType = dgx_itemTypes select _index2;
            [_itemType select 0, _itemType select 1, _lootPos, 5] call spawn_loot;


            diag_log(format["[ХЕЛИКРАШ СБРОС КОРОБКИ]: %1 сбросил груз из %2 на позиции @%3", _crashName, _randomLoot, _mapLootPos]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT


        };
        _nearby = _dropPosition nearObjects ["ReammoBox", sizeOf("Supply_Crate_DZE")];
        {
            _x setVariable ["permaLoot",true];
        } count _nearBy;
        //_textPos = format ["Воздушный транспорт сбросил груз на координтах %1.", _mapLootPos];
        //RemoteMessage = ["radio",_textPos];
        //publicVariable "RemoteMessage";
        //ЗДЕСЬ МОЖНО РАЗМЕСТИТЬ ОПОВЕЩЕНИЕ ИГРОКАМ О СБРОСЕ ГРУЗА, В КАЧЕСТВЕ ПРИМЕРА, ПРИВЕДЕНО СООБЩЕНИЕ, ВЫВОДЯЩЕЕСЯ ПРИ ПОМОЩИ REMOTE MESSAGE ИЗ МОДА WAI 2.2.0
        //_mapLootPos - ПОКАЖЕТ КВАДРАТ, В КОТОРОМ СБРОШЕНА КОРОБКА.
    


    };


    _wp2 = _aigroup addWaypoint [position _landingzone, 0];
    _wp2 setWaypointType "MOVE";
    _wp2 setWaypointBehaviour "CARELESS";
    _wp2 setWaypointStatements ["true", "_crashwreck setdamage 1;"];
    
    _wp3 = _aigroup addWaypoint [[0,16000,0], 0];
    _wp3 setWaypointType "CYCLE";
    _wp3 setWaypointBehaviour "CARELESS";
    
    waitUntil {(_crashwreck distance _position) <= 1000 || !alive _crashwreck || (getPosATL _crashwreck select 2) < 5 || (damage _crashwreck) >= 1};
    
    _crashwreck flyInHeight 100;
    _crashwreck forceSpeed 100;
    _crashwreck setspeedmode "NORMAL";
    
    waitUntil {(_crashwreck distance _position) <= 500 || !alive _crashwreck || (getPosATL _crashwreck select 2) < 5 || (damage _crashwreck) >= 1};
    deletevehicle _helipilot;
    
    _crashwreck setHit ["mala vrtule", 1];
    _ran15 = random 15;
    _crashwreck setVelocity [_ran15,_ran15,-25];
    _crashwreck setdamage .9;
    waitUntil{uiSleep 1; getpos _crashwreck select 2 <= 30};
    _helipilot setdamage 1;
    _crashwreck setVelocity [_ran15,_ran15,-20];
    waitUntil{uiSleep 1; getpos _crashwreck select 2 <= 10};
    _crashwreck setdamage 1;
    
    waitUntil{uiSleep 1; getpos _crashwreck select 2 <= 5};
    
    diag_log(format["[ХЕЛИКРАШ ПАДЕНИЕ]: %1 упал на позиции %2!", _crashName, getpos _crashwreck]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
    
    _pos = [getpos _crashwreck select 0, getpos _crashwreck select 1,0];
    _dir = getdir _crashwreck;
    deletevehicle _landingzone;
    
    _isWater = surfaceIsWater [getpos _crashwreck select 0, getpos _crashwreck select 1];
    if(_isWater) then {
    //ЗДЕСЬ МОЖНО РАЗМЕСТИТЬ ОПОВЕЩЕНИЕ, ЧТО ВОЗДУШНЫЙ ТРАНСПОРТ УПАЛ В ВОДУ. И НА ЭТОМ СКРИПТ ЗАКОНЧИТ СВОЮ РАБОТУ.
    } else { //ЕСЛИ ВСЁ ХОРОШО, ТО НА МЕСТЕ КРУШЕНИЯ СПАВНИТСЯ ЛУТ ИЗ ТАБЛИЦЫ "HeliCrash". ЕСЛИ ХОЧЕТСЯ РАНДОМА, МОЖНО НИЖЕ ВСЕ ТРИ "HeliCrash" ЗАМЕНИТЬ НА _randomLoot
        _num = round(random 12) + 12;
        if (DZE_MissionLootTable) then {
            dgx_itemTypes = [] + getArray(missionConfigFile >> "CfgBuildingLoot" >> "HeliCrash" >> "lootType");
        } else {
            dgx_itemTypes = [] + getArray(configFile >> "CfgBuildingLoot" >> "HeliCrash" >> "lootType");
        };
        _CBLBase = dayz_CBLBase find(toLower("HeliCrash"));
        _weights = dayz_CBLChances select _CBLBase;
        _cntWeights = count _weights;
        for "_x" from 1 to _num do
        {
            _maxLootRadius     = (random 20) + 10;
            _lootPos = [_pos, _maxLootRadius, random 360] call BIS_fnc_relPos;
            _index1 = floor(random _cntWeights);
            _index2 = _weights select _index1;
            _itemType = dgx_itemTypes select _index2;
            [_itemType select 0, _itemType select 1, _lootPos, 5] call spawn_loot;
            
            diag_log(format["[ХЕЛИКРАШ СПАВН ЛУТА]: %1 упал на позиции %2", _crashName, _lootPos]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
            
            _nearby = _pos nearObjects ["ReammoBox", 20];
            {
                _x setVariable ["permaLoot",true];
            } forEach _nearBy;
        };
        
        //ЗДЕСЬ МОЖНО РАЗМЕСТИТЬ ОПОВЕЩЕНИЕ ИГРОКАМ, О ТОМ, ЧТО БОРТ УПАЛ. ДАЛЕЕ ПОЯВИТСЯ МАРКЕР, НО ОСТАТКИ СГОРЕВШЕГО БОРТА, БУДУТ РАСПОЛАГАТЬСЯ НЕ ТОЧНО ПО ЦЕНТРУ МАРКЕРА, ИБО ПУСТЬ ИЩУТ


        _marker_position = [_pos,0,400,0,1,2000,0] call BIS_fnc_findSafePos;
        waitUntil
        {
            _marker = createMarker [ format ["loot_event_marker_%1", _startTime], _marker_position];
            _marker setMarkerColor "ColorRed";
            _marker setMarkerShape "ELLIPSE";
            _marker setMarkerAlpha 0.5;
            _marker setMarkerSize [400,400];
            _marker setMarkerText _crashName;
            _mdot = createMarker [format ["dot_%1", _startTime], _marker_position];
            _mdot setMarkerColor "ColorBlack";
            _mdot setMarkerType "hd_destroy";
            _mdot setMarkerText (format["Место крушения: %1", _crashName]); //ТЕКСТ КОТОРЫЙ БУДЕТ ОТОБРАЖАТЬСЯ НА МАРКЕРЕ, С НАЗВАНИЕМ УПАВШЕГО БОРТА
            uiSleep 10;
            deleteMarker _marker;
            deleteMarker _mdot;
            _playerPresent = false;
            {
                if((isPlayer _x) && (_x distance _pos <= 25)) then {
                    _playerPresent = true;
                    _finder = name _x;
                };
            } foreach playableUnits;
            (_playerPresent)
        };
        deleteMarker _marker; //НЕ УВЕРЕН, НАДО ЛИ ДУБЛИРОВАТЬ УДАЛЕНИЕ МАРКЕРОВ, ИБО НЕ СПЕЦ. НЕ ЗНАЮ. НО НЕ МЕШАЕТ (ЭТА СТРОКА И НИЖЕ).
        deleteMarker _mdot;
        //МАРКЕР БУДЕТ ПЕРЕСОЗДАВАТЬСЯ КАЖДЫЕ 10 СЕКУНД, ЧТОБЫ ВСЕ ИГРОКИ ЕГО ВИДЕЛИ, ДАЖЕ ПОСЛЕ ПЕРЕЗАХОДА. БУДЕТ ОТОБРАЖАТЬСЯ ДО ТЕХ ПОР, ПОКА К СГОРЕВШЕМУ БОРТУ НЕ ПОДОЙДЁТ ИГРОК
        //ЗДЕСЬ МОЖНО РАЗМЕСТИТЬ ОПОВЕЩЕНИЕ ИГРОКАМ, О ТОМ ЧТО ХЕЛИКРАШ НАЙДЕН


        diag_log(format["[ХЕЛИКРАШ КОНЕЦ]: Обнаружен игроком %1. Ивент выполнен!" , _finder]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
    };

 

 

2. Закинуть файл ИМЯ_ФАЙЛА.sqf в папку @DayZ_Epoch_Server\addons\dayz_server\modules\
3. Добавить в init.sqf в EpochEvents, внутри [], код ["any","any","any","any",30,"ИМЯ_ФАЙЛА"], не забыв поставить запятую после предыдущего ивента.
Пример: EpochEvents = [["any","any","any","any",10,"другой_ивент"],["any","any","any","any",30,"ИМЯ_ФАЙЛА"]];
 
Что происходит и как это работает:
- По заданному в init.sqf промежутку времени, вылетает вертолёт/самолёт;
- Если есть игроки и выбранная цель из всех юнитов игрок, то воздушный транспорт направляется к его позиции;
- Долетев до позиции игрока, "сбрасывает" ящик на парашюте и продолжает свой маршрут по точкам;
- После приземления, вокруг ящика спавнится лут. Да и сам ящик можно разобрать;
- Если изначально цель не игрок, то борт сразу полетит кружить по карте;
- Отлетав определённое количество точек, пойдёт на финальную, разобьётся и вокруг него отспавнится лут, с отображением информации на карте маркером;
- Маркер будет отображаться до тех пор, пока кто либо из игроков не подойдёт к крашу;
В принципе, функционал двух скриптов в одном, как оно и было, ничего экстраординарного.
 
Я лишь внёс пару проверок и поправок:
- Если игроков нет на сервере, то работа скрипта прекращается;
- Скрипт отработает всегда (в оригинале, только если выбранная цель - игрок). В моём случае, он стартанёт всегда, но если выбранная цель не игрок, то просто отработает, как анимированный хеликраш, без сброса груза;
- Маркер будет отображаться даже после перезахода игрока на сервер. Пересоздаётся раз в 10 секунд. Увы, более ювелирных способов не нашёл. В миссиях WAI, маркеры вообще раз в секунду пересоздаются. Тут работает по тому же принципу;
- Если борт сбить, на любом этапе, он упадёт и лут отспавнится вокруг него, с отображением маркера;
- Читайте комментарии в скрипте, если хотите добавить оповещения игрокам о старте, сбросе груза, падении борта.

 

Подскажи пожалуйста, после сброса ящика вертолет зависает в последней точке и не разбивается. Я новичок, поэтому не смог найти причину...

Ниже код (с добавлением сообщений о падении и т.п.), который я взял здесь.

private["_textPos","_rand_player","_playerpos","_randomLoot","_maxLootRadius","_playerPresent","_finder","_preWaypointPos","_startTime","_heliStart","_heliModel","_lootPos","_wp1","_wp2","_wp3","_landingzone","_aigroup","_wp","_helipilot","_crashwreck","_vel","_pos","_dir","_position","_num","_itemType","_CBLBase","_weights","_cntWeights","_index1","_index2","_crashName","_objectID","_marker_position","_marker","_mdot","_flyToPlayer","_dropPosition","_chute","_chutePos","_FlyingSupplyBox","_smoke","_var","_posATL","_SupplyBox","_mapLootPos"];
if ((count playableUnits) < 1) exitWith {diag_log("[ХЕЛИКРАШ ОТМЕНА]: Нет игроков на сервере");}; //СКРИПТ НЕ БУДЕТ ВЫПОЛНЯТЬСЯ, ЕСЛИ НА СЕРВЕРЕ НЕТ ИГРОКОВ
_rand_player            = playableUnits call BIS_fnc_selectRandom;
_playerpos                = [_rand_player] call FNC_GetPos;
 
 
_heliModel                = ["Mi17_TK_EP1","Mi17_CDF","Mi17_Ins","Mi17_UN_CDF_EP1","Mi171Sh_CZ_EP1","AH6J_EP1","UH1H_TK_GUE_EP1","UH1H_TK_EP1","UH1Y","MH60S","UH60M_EP1","AH6X_EP1","MH6J_EP1","Mi17_Civilian","Mi17_medevac_Ins","Mi17_medevac_CDF","Mi17_medevac_RU","UH60M_MEV_EP1","BAF_Merlin_HC3_D","CH_47F_EP1","CH_47F_BAF","MV22","C130J"] call BIS_fnc_selectRandom;
_heliStart                = [[3458.7625, 2924.917],[11147.994, 1516.9348],[14464.443, 2533.0981],[18155.545, 1416.5674],[16951.584, 5436.3516],[16140.807, 12714.08],[14576.426, 14440.467],[8341.2383, 15756.525],[2070.4771, 8910.4111],[16316.533, 17309.357]] call BIS_fnc_selectRandom;  //КООРДИНАТЫ, ОТКУДА БУДЕТ ВЫЛЕТАТЬ БОРТ. ДЛЯ NAPF
_crashName                = getText (configFile >> "CfgVehicles" >> _heliModel >> "displayName");
_finder                    = "";
_randomLoot                = ["HeliCrash","Hospital","Military","MilitaryIndustrial","MilitarySpecial"] call BIS_fnc_selectRandom; //СПИСОК, ОТКУДА БУДЕТ БРАТЬСЯ ЛУТ ДЛЯ ПРИЗЕМЛИВШЕЙСЯ КОРОБКИ
 
 
    //ЗДЕСЬ МОЖНО РАЗМЕСТИТЬ ОПОВЕЩЕНИЕ ИГРОКАМ О СТАРТЕ ИВЕНТА
	[nil,nil,rTitleText,format["Мы заметили воздушный транспорт! Следите за ним!"], "PLAIN",10] call RE;
    
    _position = [getMarkerPos "center",0,5000,10,0,2000,0] call BIS_fnc_findSafePos;
 
 
    diag_log(format["[ХЕЛИКРАШ НАЧАЛО]: %1 вылетел с позиции %2 к позиции %3!", _crashName,  str(_heliStart), str(_position)]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
    
    _startTime = time;
    _crashwreck = createVehicle [_heliModel,_heliStart, [], 0, "FLY"];
    _objectID = str(round(random 999999));
    _crashwreck setVariable ["ObjectID", _objectID, true];
    _crashwreck setVariable ["ObjectUID", _objectID, true];
    PVDZE_serverObjectMonitor set [count PVDZE_serverObjectMonitor,_crashwreck];
    waitUntil {(!isNull _crashwreck)};
    _crashwreck setCombatMode "BLUE";
    _crashwreck engineOn true;
    _crashwreck flyInHeight 200; //ВЫСОТА ПОЛЁТА. ЕСЛИ НОВИЧОК, ЛУЧШЕ НЕ ТРОГАЙ. ИНАЧЕ БУДЕТ СБОИТЬ СБРОС КОРОБКИ. БОРТ БУДЕТ КРУЖИТЬ НАД ИГРОКОМ, ТЕМ САМЫМ, ДЕМОРАЛИЗУЯ И НАРУШАЯ ЕГО ПСИХИКУ
    _crashwreck forceSpeed 150;
    _crashwreck setspeedmode "NORMAL";
    
    _landingzone = createVehicle ["HeliHEmpty", [_position select 0, _position select 1,0], [], 0, "CAN_COLLIDE"];
    _aigroup = creategroup civilian;
    _helipilot = _aigroup createUnit ["SurvivorW2_DZ",getPos _crashwreck,[],0,"FORM"];
    _helipilot setCombatMode "BLUE";
    _helipilot moveindriver _crashwreck;
    _helipilot assignAsDriver _crashwreck;
    uiSleep 0.5;
    
    if ((isPlayer _rand_player) && (alive _rand_player)) then { //ЕСЛИ ВЫБРАННАЯ ЦЕЛЬ - ИГРОК И ЕСЛИ ИГРОК ЖИВ, ТО ПОЛЕТИТ НА ЕГО ПОЗИЦИЮ
        _wp1 = _aigroup addWaypoint [[(_playerpos select 0),(_playerpos select 1),200],0];
        _wp1 setWaypointType "MOVE";
        _wp1 setWaypointBehaviour "CARELESS";
        _flyToPlayer = true;
        for "_x" from 1 to 5 do
        {
            _preWaypointPos = [getMarkerPos "center", 0, 5000, 10, 0, 2000, 0] call BIS_fnc_findSafePos;
            _wp = _aigroup addWaypoint [_preWaypointPos, 0];
            _wp setWaypointType "MOVE";
            _wp setWaypointBehaviour "CARELESS";
        };
        //diag_log(format["[ХЕЛИКРАШ]: %1 полетел к игроку %2", _crashName, (name _rand_player)]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
    } else {  //ЕСЛИ ПОЛЕТЕЛ НЕ К ИГРОКУ, БУДЕТ ПРОСТО ЛЕТАТЬ ПО ТОЧКАМ, ПОКА НЕ СОБЬЮТ ИЛИ ПОКА НЕ ДОЛЕТИТ ДО ФИНАЛЬНОЙ
        for "_x" from 1 to 10 do
        {
            _preWaypointPos = [getMarkerPos "center", 0, 5000, 10, 0, 2000, 0] call BIS_fnc_findSafePos;
            _wp = _aigroup addWaypoint [_preWaypointPos, 0];
            _wp setWaypointType "MOVE";
            _wp setWaypointBehaviour "CARELESS";
        };
        //diag_log(format["[ХЕЛИКРАШ]: %1 полетел кружить по карте", _crashName]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
    };
 
 
    _dropPosition = [(_playerpos select 0),(_playerpos select 1),200];
    if (_flyToPlayer) then {  //ЕСЛИ ИЗНАЧАЛЬНО ЛЕТЕЛ К ИГРОКУ - НИЖЕ ОЖИДАНИЕ, КОГДА ПРИБЛИЗИТСЯ К ЕГО ПОЗИЦИИ. НУ И ДРУГИЕ ЧРЕЗВЫЧАЙНЫЕ СИТУАЦИИ. ЧТОБЫ ПРОДОЛЖИЛОСЬ ВЫПОЛНЕНИЕ СКРИПТА
        waitUntil {(_crashwreck distance _dropPosition < 50) || !alive _crashwreck || (getPosATL _crashwreck select 2) < 5 || (damage _crashwreck) >= 1};
        //diag_log(format["[ХЕЛИКРАШ]: %1 долетел до игрока или был сбит", _crashName]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
    };
 
 
    if ((_flyToPlayer) && (alive _crashwreck)) then { //ЕСЛИ ИЗНАЧАЛЬНО ЛЕТЕЛ К ИГРОКУ И НЕ СБИЛИ, ТО СБРОСИТ КОРОБКУ ПОЧТИ НА ГОЛОВУ БЕДНОЙ КЕПКИ, В ДРУГОМ СЛУЧАЕ, КУСОК СКРИПТА ПРОПУСКАЕТСЯ И СБРОСА НЕ БУДЕТ
        //diag_log(format["[ХЕЛИКРАШ]: %1 сбросил груз. Значит долетел", _crashName]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
        _aircraftpos = [_crashwreck] call FNC_GetPos;
        _chute = createVehicle ["ParachuteMediumEast", _aircraftpos, [], 0, "FLY"];
        _chutePos = getPos _chute;
        _FlyingSupplyBox = createVehicle ["Supply_Crate_DZE", _chutePos, [], 0, "FLY"];
        _FlyingSupplyBox attachTo [_chute, [0,0,0]];
        _FlyingSupplyBox setVariable ["permaLoot",true];
        _FlyingSupplyBox setVariable ["ObjectID", ""];
        _FlyingSupplyBox addEventHandler ["handleDamage", {false}];
        _chute setVariable ["ObjectID", ""];
        _smoke = "SmokeShellGreen" createVehicle (getPos _FlyingSupplyBox);
        _smoke attachTo [_FlyingSupplyBox, [0,0,1]];
        _var = floor((random 2) + 1);
        while {getPos _FlyingSupplyBox select 2 > 4} do
        {
            _chute SetVelocity [0,0,-5];
            uiSleep 0.1;
        };
        detach _FlyingSupplyBox;
        while {getPos _FlyingSupplyBox select 2 > 0} do {
            _FlyingSupplyBox setPos [getPos _FlyingSupplyBox select 0, getPos _FlyingSupplyBox select 1, (getPos _FlyingSupplyBox select 2) - .25]
        };
        deleteVehicle _chute;
        _posATL = getPosATL _FlyingSupplyBox;
        _mapLootPos = mapGridPosition getPos _FlyingSupplyBox;
        deleteVehicle _FlyingSupplyBox;
        _SupplyBox = "Supply_Crate_DZE" createVehicle _posATL;
        _SupplyBox setVariable ["permaLoot",true];
        _SupplyBox enableSimulation false;
        if (DZE_MissionLootTable) then {
            dgx_itemTypes = [] + getArray (missionConfigFile >> "CfgBuildingLoot" >> _randomLoot >> "lootType");
        } else {
            dgx_itemTypes = [] + getArray (configFile >> "CfgBuildingLoot" >> _randomLoot >> "lootType");
        };
        _CBLBase = dayz_CBLBase find (toLower(_randomLoot));
        _weights = dayz_CBLChances select _CBLBase;
        _cntWeights = count _weights;
        _num = (round(random 12)) + 12;
        for "_x" from 1 to _num do {
            _maxLootRadius = (random 4) + 4;
            _lootPos = [_posATL, _maxLootRadius, random 360] call BIS_fnc_relPos;
            _index1 = floor(random _cntWeights);
            _index2 = _weights select _index1;
            _itemType = dgx_itemTypes select _index2;
            [_itemType select 0, _itemType select 1, _lootPos, 5] call spawn_loot;
 
 
            //diag_log(format["[ХЕЛИКРАШ СБРОС КОРОБКИ]: %1 сбросил груз из %2 на позиции @%3", _crashName, _randomLoot, _mapLootPos]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
 
 
        };
        _nearby = _dropPosition nearObjects ["ReammoBox", sizeOf("Supply_Crate_DZE")];
        {
            _x setVariable ["permaLoot",true];
        } count _nearBy;
        _textPos = format ["Воздушный транспорт сбросил груз на координтах %1.", _mapLootPos];
        RemoteMessage = ["radio",_textPos];
        publicVariable "RemoteMessage";
        //ЗДЕСЬ МОЖНО РАЗМЕСТИТЬ ОПОВЕЩЕНИЕ ИГРОКАМ О СБРОСЕ ГРУЗА, В КАЧЕСТВЕ ПРИМЕРА, ПРИВЕДЕНО СООБЩЕНИЕ, ВЫВОДЯЩЕЕСЯ ПРИ ПОМОЩИ REMOTE MESSAGE ИЗ МОДА WAI 2.2.0
        //_mapLootPos - ПОКАЖЕТ КВАДРАТ, В КОТОРОМ СБРОШЕНА КОРОБКА.
    
 
 
    };
 
 
    _wp2 = _aigroup addWaypoint [position _landingzone, 0];
    _wp2 setWaypointType "MOVE";
    _wp2 setWaypointBehaviour "CARELESS";
    _wp2 setWaypointStatements ["true", "_crashwreck setdamage 1;"];
    
    _wp3 = _aigroup addWaypoint [[0,16000,0], 0];
    _wp3 setWaypointType "CYCLE";
    _wp3 setWaypointBehaviour "CARELESS";
    
    waitUntil {(_crashwreck distance _position) <= 1000 || !alive _crashwreck || (getPosATL _crashwreck select 2) < 5 || (damage _crashwreck) >= 1};
    
    _crashwreck flyInHeight 100;
    _crashwreck forceSpeed 100;
    _crashwreck setspeedmode "NORMAL";
    
    waitUntil {(_crashwreck distance _position) <= 500 || !alive _crashwreck || (getPosATL _crashwreck select 2) < 5 || (damage _crashwreck) >= 1};
    deletevehicle _helipilot;
    
    _crashwreck setHit ["mala vrtule", 1];
    _ran15 = random 15;
    _crashwreck setVelocity [_ran15,_ran15,-25];
    _crashwreck setdamage .9;
    waitUntil{uiSleep 1; getpos _crashwreck select 2 <= 30};
    _helipilot setdamage 1;
    _crashwreck setVelocity [_ran15,_ran15,-20];
    waitUntil{uiSleep 1; getpos _crashwreck select 2 <= 10};
    _crashwreck setdamage 1;
    
    waitUntil{uiSleep 1; getpos _crashwreck select 2 <= 5};
    
    diag_log(format["[ХЕЛИКРАШ ПАДЕНИЕ]: %1 упал на позиции %2!", _crashName, getpos _crashwreck]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
    
    _pos = [getpos _crashwreck select 0, getpos _crashwreck select 1,0];
    _dir = getdir _crashwreck;
    deletevehicle _landingzone;
    
    _isWater = surfaceIsWater [getpos _crashwreck select 0, getpos _crashwreck select 1];
    if(_isWater) then {
    //ЗДЕСЬ МОЖНО РАЗМЕСТИТЬ ОПОВЕЩЕНИЕ, ЧТО ВОЗДУШНЫЙ ТРАНСПОРТ УПАЛ В ВОДУ. И НА ЭТОМ СКРИПТ ЗАКОНЧИТ СВОЮ РАБОТУ.
	[nil,nil,rTitleText,format["Воздушный транспорт упал в воду, весь груз утерян!"], "PLAIN",10] call RE;
    } else { //ЕСЛИ ВСЁ ХОРОШО, ТО НА МЕСТЕ КРУШЕНИЯ СПАВНИТСЯ ЛУТ ИЗ ТАБЛИЦЫ "HeliCrash". ЕСЛИ ХОЧЕТСЯ РАНДОМА, МОЖНО НИЖЕ ВСЕ ТРИ "HeliCrash" ЗАМЕНИТЬ НА _randomLoot
        _num = round(random 12) + 12;
        if (DZE_MissionLootTable) then {
            dgx_itemTypes = [] + getArray(missionConfigFile >> "CfgBuildingLoot" >> "HeliCrash" >> "lootType");
        } else {
            dgx_itemTypes = [] + getArray(configFile >> "CfgBuildingLoot" >> "HeliCrash" >> "lootType");
        };
        _CBLBase = dayz_CBLBase find(toLower("HeliCrash"));
        _weights = dayz_CBLChances select _CBLBase;
        _cntWeights = count _weights;
        for "_x" from 1 to _num do
        {
            _maxLootRadius     = (random 20) + 10;
            _lootPos = [_pos, _maxLootRadius, random 360] call BIS_fnc_relPos;
            _index1 = floor(random _cntWeights);
            _index2 = _weights select _index1;
            _itemType = dgx_itemTypes select _index2;
            [_itemType select 0, _itemType select 1, _lootPos, 5] call spawn_loot;
            
            diag_log(format["[ХЕЛИКРАШ СПАВН ЛУТА]: %1 упал на позиции %2", _crashName, _lootPos]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
            
            _nearby = _pos nearObjects ["ReammoBox", 20];
            {
                _x setVariable ["permaLoot",true];
            } forEach _nearBy;
        };
        
        //ЗДЕСЬ МОЖНО РАЗМЕСТИТЬ ОПОВЕЩЕНИЕ ИГРОКАМ, О ТОМ, ЧТО БОРТ УПАЛ. ДАЛЕЕ ПОЯВИТСЯ МАРКЕР, НО ОСТАТКИ СГОРЕВШЕГО БОРТА, БУДУТ РАСПОЛАГАТЬСЯ НЕ ТОЧНО ПО ЦЕНТРУ МАРКЕРА, ИБО ПУСТЬ ИЩУТ
        [nil,nil,rTitleText,format["Воздушный транспорт потерпел крушение. Найдите его и заберите груз!"], "PLAIN",10] call RE;
 
        _marker_position = [_pos,0,400,0,1,2000,0] call BIS_fnc_findSafePos;
        waitUntil
        {
            _marker = createMarker [ format ["loot_event_marker_%1", _startTime], _marker_position];
            _marker setMarkerColor "ColorOrange";
            _marker setMarkerShape "ELLIPSE";
            _marker setMarkerAlpha 0.5;
            _marker setMarkerSize [400,400];
            _marker setMarkerText _crashName;
            _mdot = createMarker [format ["dot_%1", _startTime], _marker_position];
            _mdot setMarkerColor "ColorBlack";
            _mdot setMarkerType "hd_destroy";
            _mdot setMarkerText (format["Место крушения: %1", _crashName]); //ТЕКСТ КОТОРЫЙ БУДЕТ ОТОБРАЖАТЬСЯ НА МАРКЕРЕ, С НАЗВАНИЕМ УПАВШЕГО БОРТА
            uiSleep 10;
            deleteMarker _marker;
            deleteMarker _mdot;
            _playerPresent = false;
            {
                if((isPlayer _x) && (_x distance _pos <= 25)) then {
                    _playerPresent = true;
                    _finder = name _x;
                };
            } foreach playableUnits;
            (_playerPresent)
        };
        deleteMarker _marker; //НЕ УВЕРЕН, НАДО ЛИ ДУБЛИРОВАТЬ УДАЛЕНИЕ МАРКЕРОВ, ИБО НЕ СПЕЦ. НЕ ЗНАЮ. НО НЕ МЕШАЕТ (ЭТА СТРОКА И НИЖЕ).
        deleteMarker _mdot;
        //МАРКЕР БУДЕТ ПЕРЕСОЗДАВАТЬСЯ КАЖДЫЕ 10 СЕКУНД, ЧТОБЫ ВСЕ ИГРОКИ ЕГО ВИДЕЛИ, ДАЖЕ ПОСЛЕ ПЕРЕЗАХОДА. БУДЕТ ОТОБРАЖАТЬСЯ ДО ТЕХ ПОР, ПОКА К СГОРЕВШЕМУ БОРТУ НЕ ПОДОЙДЁТ ИГРОК
        //ЗДЕСЬ МОЖНО РАЗМЕСТИТЬ ОПОВЕЩЕНИЕ ИГРОКАМ, О ТОМ ЧТО ХЕЛИКРАШ НАЙДЕН
		[nil,nil,rTitleText,format["Упавший воздушный транспорт был найден выжившими!"], "PLAIN",10] call RE;
 
 
        //diag_log(format["[ХЕЛИКРАШ КОНЕЦ]: Обнаружен игроком %1. Ивент выполнен!" , _finder]); //ЭТУ СТРОКУ МОЖНО УДАЛИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ЛОГГИРОВАНИЕ В СЕРВЕРНЫЙ RPT
    };

Кстати спасибо большое, т.к. это почему-то единственный хеликраш, которой хоть как-то заработал. =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сам не знаю, почему. Видимо из за последнего вейпойнта зацикленного:

 

 

    _wp3 = _aigroup addWaypoint [[0,16000,0], 0];
    _wp3 setWaypointType "CYCLE";
    _wp3 setWaypointBehaviour "CARELESS";
 

Но по идее, он до него не должен долетать, ибо наносится хит смертельный на предыдущем.

 

У меня чуток по другому концовка происходит, улетает на исходную, разбивается и удаляется.

 

С одной стороны, это не так страшно, пусть себе круги наворачивает. Главное, что отрабатывает корректно все предыдущие этапы (надеюсь, это так). А так, если надо, чуть позже скину свой вариант, где всё работает как часы.

Изменено пользователем Alexandr116ru (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сам не знаю, почему. Видимо из за последнего вейпойнта зацикленного:

 

 

    _wp3 = _aigroup addWaypoint [[0,16000,0], 0];
    _wp3 setWaypointType "CYCLE";
    _wp3 setWaypointBehaviour "CARELESS";
 

Но по идее, он до него не должен долетать, ибо наносится хит смертельный на предыдущем.

 

У меня чуток по другому концовка происходит, улетает на исходную, разбивается и удаляется.

 

С одной стороны, это не так страшно, пусть себе круги наворачивает. Главное, что отрабатывает корректно все предыдущие этапы (надеюсь, это так). А так, если надо, чуть позже скину свой вариант, где всё работает как часы.

 

В том-то и дело, что он в одной точке зависает и висит себе деловой. =) А если сбить, то  из него ничего не выпадает, или ничего и не должно выпадать, если он до этого скинул груз? Скинь пожалуйста свой вариант. Буду очень тебе благодарен.  :good:

Изменено пользователем NickPS (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: Suslikonator
      Доброго времени суток, господа, появилась задачка убрать с конкретных координат точку спавна хеликраша, где эти точки вообще настраиваются, в каком файле, ибо искал, но так и не нашел. И возможно ли подобное вообще.
    • Автор: BorizzK
      Функция вернет кол-во игроков рядом с текущей позицией игрока в заданном радиусе
      Использую на своем сервере при рандомном спавне нового игрока, что бы не заспавнился рядом с уже вооруженным и злым
      Если при спавне рядом есть игрок, то выбираются новые координаты для спавна
       
      int CheckNearestObjects(PlayerBase player, int radius) { array<Object> nearest_objects = new array<Object>; array<CargoBase> proxy_cargos = new array<CargoBase>; Object object; string className; int objectcount = 0; GetGame().GetObjectsAtPosition (player.GetPosition(), radius, nearest_objects, proxy_cargos ); Print("::: init_mod.c ::: CheckNearestObjects (int radius) ::: Radius: " + radius.ToString() + ", nearest_objects: " + nearest_objects.Count().ToString()); for ( int i = 0; i < nearest_objects.Count(); i++ ) { object = nearest_objects.Get(i); className = object.GetType(); if ( object ) { if (object.IsMan()) { if (player != object) { Print( "::: Init.c ::: CheckNearestObjects: IsMan(): "+i.ToString()+" => " + object.ToString() + " => Type: " + className + " => Position: " + object.GetPosition().ToString()); objectcount = objectcount + 1; } else { Print( "::: Init.c ::: CheckNearestObjects: isMan(): player and object " + object.ToString() + " the same object!"); } } } } return objectcount; }  
    • Автор: ZizionarD
      Я всегда думал, что это крутое серверное событие, поэтому я обновил его для DayZ Epoch/Overpoch 1.0.6.2, дал ему некоторую оптимизацию кода и добавил некоторые новые функции.
       
      Обновления для DayZ Epoch/Overpoch 1.0.6.2:
      Обновлено под новые лут таблицы 1.0.6.2 Режим отладки включает или отключает журналы диагностики rpt сервера. Регулируемый тайм-аут миссии. Убрана трава вокруг лута Цикл маркеров JIP (заменяет waitUntil, используемый для обнаружения игроков). Автоматически определяет используемую карту и настраивает ее соответствующим образом. Настраиваемый черный список на карте. Этот мод работает с картами: Chernarus, Lingor, Sahrani, Panthera, Namalsk, Taviana, Napf, Sauerland, and Takistan.
       
      Рекомендуемое ПО:
      PBO Manager Notepad++ (x32) (x64) Установка:
      1. Скачать архив
      2. Распаковать dayz_server.pbo и поместить файл animated_crash_spawner.sqf в директорию dayz_server\modules
      3. Поскольку вы устанавливаете анимированный Crash Spawner, я рекомендую вам отключить DayZ Vanilla Crash Spawner. Для этого отредактируйте файл dayz_server\system\server_monitor.sqf в Notepad++
      Найдите эту строку:
      [] execVM "\z\addons\dayz_server\compile\server_spawnCrashSites.sqf"; и закомментируйте ее, чтобы это выглядело так:
      //[] execVM "\z\addons\dayz_server\compile\server_spawnCrashSites.sqf"; 4. Сохраните файл и повторно запакуйте dayz_server.pbo
      5. Переходим в директорию со своей миссией
      6. Откройте init.sqf в Notepad++
      Найти строку:
      EpochUseEvents = false; Измените его на true:
      EpochUseEvents = true; Найдите строку:
      EpochEvents = [["any","any","any","any",30,"crash_spawner"],["any","any","any","any",0,"crash_spawner"],["any","any","any","any",15,"supply_drop"]]; Замените ее на:
      EpochEvents = [["any","any","any","any",5,"animated_crash_spawner"],["any","any","any","any",35,"animated_crash_spawner"]]; Это будет спавнить анимированный HeliCrash каждые 30 минут, пока ваш сервер онлайн. Первый начнется после того, как сервер будет в сети в течение 5 минут. Примечание: старые события crash_spawner и supply_drop больше не используются в DayZ Epoch 1.0.6+, поэтому мы удаляем их из массива EpochEvents.
       
      Опционально:
      Вы можете настроить анимированный HeliCrash со следующим блоком определений и переменных.
      // Configs - You can adjust these #define DEBUG_MODE false // Adds diagnostic entries to the server rpt #define CRASH_TIMEOUT 1200 // The amount of time it takes for the mission to time out if no players show up #define SPAWN_CHANCE 100 // Percent chance of spawning a crash number between 0 - 100 #define GUARANTEED_LOOT 16 // Guaranteed Loot Spawns #define RANDOM_LOOT 8 // Random number of loot piles as well as the guaranteed ones #define SPAWN_FIRE true // Spawn Smoke/Fire at the helicrash #define FADE_FIRE false // Fade the Smoke/Fire overtime #define PREWAYPOINTS 2 // Amount of way points the heli flies to before crashing #define MIN_LOOT_RADIUS 4 // Minimum distance for loot to spawn from the crash site in meters #define MAX_LOOT_RADIUS 10 // Maximum distance for loot to spawn from the crash site in meters #define MARKER_RADIUS 400 // Radius for the marker #define SHOW_MARKER true // Show a marker on the map #define MARKER_NAME true // Add the crash name to the marker, SHOW_MARKER must be true #define LOWER_GRASS true // lowers the grass around the loot _crashDamage = 1; // Amount of damage the heli can take before crashing (between 0.1 and 1) Lower the number and the heli can take less damage before crashing 1 damage is fully destroyed and 0.1 something like a DMR could one shot the heli _exploRange = 200; // How far away from the predefined crash point should the heli start crashing  
      Вы также можете настроить черный список для каждой карты, если вы не хотите, чтобы HeliCrash спавнились в определенных областях карты.
      _blackList = []; Добавить координаты. Инструкция для черного списка находится в BIS_fnc_selectRandom
       
      Если вы используете This Crashsite Loot Table, каждый HeliCrash выбирает одну из групп рандомно. Если вы хотите использовать кастомный лут, то вы можете настроить лут в этом файле.
      Статья взята с сайта: epochmod.com
      Понравилась статья? Поставь +
    • Автор: Sovest2
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

      Подготовка
      Для начала нам понадобится подключить кастомный player_death.sqf в compiles.sqf
      Делается это следующим образом:
      В compiles.sqf заменить строку 
      player_death = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_death.sqf"; на
      player_death = compile preprocessFileLineNumbers "*ВАШ ПУТЬ*\player_death.sqf";  
      Если у вас стоит инфистар,то необходимо заменить строку в AH.sqf
      _death = compile preprocessFileLineNumbers '\z\addons\dayz_code\compile\player_death.sqf'; на
      _death = compile preprocessFileLineNumbers '*ВАШ ПУТЬ*\player_death.sqf';  
      В вашем кастомном player_death.sqf необходимо заменить 
      _array = _this; if (count _array > 0) then { _source = _array select 0; _method = _array select 1; if ((!isNull _source) && (_source != player)) then { _canHitFree = player getVariable ["freeTarget",false]; _isBandit = (player getVariable["humanity",0]) <= -2000; _punishment = _canHitFree || _isBandit; //if u are bandit || start first - player will not recieve humanity drop _humanityHit = 0; if (!_punishment) then { //i'm "not guilty" - kill me && be punished _myKills = ((player getVariable ["humanKills",0]) / 30) * 1000; _humanityHit = -(2000 - _myKills); _kills = _source getVariable ["humanKills",0]; _source setVariable ["humanKills",(_kills + 1),true]; PVDZE_send = [_source,"Humanity",[_source,_humanityHit,300]]; publicVariableServer "PVDZE_send"; } else { //i'm "guilty" - kill me as bandit _killsV = _source getVariable ["banditKills",0]; _source setVariable ["banditKills",(_killsV + 1),true]; }; }; _body setVariable ["deathType",_method,true]; }; на
      _array = _this; if (count _array > 0) then { _source = _array select 0; _method = _array select 1; if ((!isNull _source) && (_source != player)) then { [player,_source]execVM "*ВАШ ПУТЬ*\humanityChange.sqf"; [player,_source]execVM "*ВАШ ПУТЬ*\kill_msg_send.sqf"; }; _body setVariable ["deathType",_method,true]; }; Отображение ника убийцы(Kill message)
       
      Создаем файл и закидываем в миссию файл kill_msg_send.sqf
      С содержанием
      private ["_victim","_killer","_vehicle","_weapon","_pic"]; _victim = _this select 0; _killer = _this select 1; _killerName = name _killer; _victimName = name _victim; _vehicle = typeOf (vehicle _killer); _weapon = currentWeapon _killer; if ((getText (configFile >> "CfgVehicles" >> _vehicle >> "vehicleClass")) in ["CarW","Car","CarD","Armored","Ship","Support","Air","ArmouredW","ArmouredD","SupportWoodland_ACR","AllVehicles"]) then { _pic = gettext(configFile >> 'CfgVehicles' >> _vehicle >> 'picture'); } else { _pic = gettext(configFile >> 'cfgWeapons' >> _weapon >> 'picture'); }; _kill_txt = format ["<t align='left' size='0.5'>%1 </t>",_victimName]; _kill_txt = _kill_txt + format ["<img size='1.0' align='left' image='%1'/>",_pic]; _kill_txt = _kill_txt + format ["<t align='left' size='0.5'> %1 </t>",_killerName]; PVDZE_send = [player,"kill_message",[_kill_txt]]; publicVariableServer "PVDZE_send";  
      Далее,нам необходимо отредактировать файл server_sendToClient.sqf ,которой находится в директории сервера
      И добавить после
      case "tagFriendly": { PVDZE_plr_FriendRQ = _arraytosend; _owner publicVariableClient "PVDZE_plr_FriendRQ"; }; Это
      case "kill_message": { custom_kill_message_show = _arraytosend; publicVariable "custom_kill_message_show"; }; Теперь необходимо создать файл kill_msg_show.sqf в папке с вашей миссией
      с содержимым
      private ["_pos","_i"]; arr_kill = ["","","","","",""]; fnc_kill_message = { private ["_finaltxt"]; _finaltxt = _this select 0; for[{_i = 0},{(_i<6)},{_i = _i +1}] do { if((arr_kill select _i) == "") then { arr_kill set [_i,_finaltxt]; [_i] execVM "*ВАШ ПУТЬ*\kill_msg_delete.sqf"; _i = count(arr_kill); }; }; }; "custom_kill_message_show" addPublicVariableEventHandler {(_this select 1) call fnc_kill_message;}; while {true} do { _pos = 0.01; _layout = 1001; { [_x,[safezoneX + 0.01 * safezoneW,2.0],[safezoneY + _pos * safezoneH,0.3],5,0.5,0,_layout] spawn BIS_fnc_dynamicText; _pos = _pos + 0.021; _layout = _layout + 1; } ForEach arr_kill; sleep 1; }; Создать файл kill_msg_delete.sqf с 
      private["_pos"]; _pos = _this select 0; sleep 10; arr_kill set [_pos,""];  
      И вставить в init.sqf после строки
      _playerMonitor = [] execVM "custom\player_monitor.sqf"; строку
      execVM "*ВАШ ПУТЬ*\kill_msg_show.sqf"; Осталось только добавить
      custom_kill_message_show В первую строку файла publicvariable.txt
       
      Все,отображение ника убийцы готово!
       
       
      Изменение человечности за убийство Бандита\Героя
      создать файл humanityChange.sqf с содержимым
      private ["_victim","_killer","_myKills","_humanity","_killerHumanity","_isKillerBandit","_isBandit","_humanityHit","_kills","_killerGunner"]; _victim = _this select 0; _killer = _this select 1; _humanity = _victim getVariable["humanity",0]; _killerHumanity = _killer getVariable["humanity",0]; _isKillerBandit = (_killerHumanity) < 0 ; _isBandit = (_humanity) < 0; _humanityHit = 0; _myKills = 0; _killerVehicle = vehicle _killer; if(((!_isBandit) && _isKillerBandit) || (_isBandit && (!_isKillerBandit))) then { _myKills = round((_humanity) / 10); }; if(!_isBandit) then { _myKills = (_myKills + 200); _kills = _killer getVariable ["humanKills",0]; _killer setVariable ["humanKills",(_kills + 1),true]; } else { _myKills = (_myKills - 200); _kills = _killer getVariable ["banditKills",0]; _killer setVariable ["banditKills",(_kills + 1),true]; }; _killerGunner = gunner _killerVehicle; if(!isNil"_sourceGunner") then { _killer = _killerGunner; }; _humanityHit = _myKills * (-1); PVDZE_send = [_killer,"Humanity",[_killer,_humanityHit,300]]; publicVariableServer "PVDZE_send"; Изменение Человечности готово!
       
      Плюсы Всего этого:
      Отображение ника убийцы теперь работает всегда и корректно.(Если убивают с техники или с одного выстрела).
  • Наш выбор

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.