Epoch Animated Heli Crashes

Bushwookie420

Well-Known Member
Epoch Animated Heli Crashes
Version 1.0

What it does...
replaces defualt static heli crahses with helis that fly around the map for a bit then spin out and crash

Requirements:
A tool to unpack and repack pbos (I recommend PBO Manager)
A Text Editor (I recommend Notepad or Notepad ++)
  • Easy = Blue <10
Installation Steps -
  1. De PBO your server pbo and open up modules\crash_spawner.sqf
  2. Replace everything inside crash_spawner.sqf with this
    Code:
    /*
    Script Name: crash_spawner.sqf
    Original Author: Grafzahl / Finest
    Modified by BushWookie for Epoch and to break the tail instead of just blowing up in the air
    */
    
    private["_timeAdjust","_timeToSpawn","_spawnRoll","_crash","_hasAdjustment","_newHeight","_adjustedPos","_useStatic","_crashDamage","_lootRadius","_preWaypoints","_preWaypointPos","_endTime","_startTime","_safetyPoint","_heliStart","_deadBody","_exploRange","_heliModel","_lootPos","_list","_craters","_dummy","_wp2","_wp3","_landingzone","_aigroup","_wp","_helipilot","_crash","_crashwreck","_smokerand","_staticcoords","_pos","_dir","_position","_num","_config","_itemType","_itemChance","_weights","_index","_iArray","_crashModel","_lootTable","_guaranteedLoot","_randomizedLoot","_frequency","_variance","_spawnChance","_spawnMarker","_spawnRadius","_spawnFire","_permanentFire","_crashName"];
    //############### //Config Start\\ ###############\\
    _SpawnMax        = 100;                //Maximum percent chance of spawning a crash number between 0 - 100
    _SpawnMin        = 50;                //Minimum percent chance of spawning a crash number between 0 - 100
    _guaranteedLoot = 3;                //Guaranteed Loot Spawns
    _randomizedLoot = 4;                //Random number of loot piles aswell as the guaranteed ones
    _spawnFire      = true;                //Spawn Smoke/Fire at the helicrash
    _fadeFire      = false;            //Fade the Smoke/Fire overtime
    _preWaypoints    = 2;                //Amount of waypoints the heli flys to before crashing
    _crashDamage    = 1;                //Amount of dammage the heli can take before crashing (between 0.1 and 1) Lower the number and the heli can take less damage before crashing 1 dammage is fully destroyed and 0.1 something like a DMR could one shot the heli
    _heliModel        = "UH1Y_DZE";        //The type of heli used
    _crashModel    = "UH1Wreck_DZ";    //The type of Crash model used after the heli crashes
    _exploRange    = 250;                //How far away from the predefined crash point should the heli start crashing
    _minLootRadius    = 4;                //Minimum distance for loot to spawn from the crash site in meters
    _maxLootRadius    = 8;                //Maximum distance for loot to spawn from the crash site in meters
    _lootTable        = "HeliCrash";        //Name of the loot table the heli gets loot from (DO NOT edit unless you know what your doing)
    //############### \\Config End// ###############\\
    
    //DO NOT edit below this unless you know what your doing
    _maxLootRadius = _maxLootRadius - _minLootRadius;
    _spawnRadius = HeliCrashArea;
    _heliStart = [[3461.92,5021.77,0],[8582.35,14077.7,0]] call BIS_fnc_selectRandom;
    _safetyPoint = [8450.08,20240,0];
    _crashName= getText (configFile >> "CfgVehicles" >> _heliModel >> "displayName");
    _spawnMarker    = 'center';
    _spawnChance = _SpawnMax - _SpawnMin;
    _spawnChance = (random _spawnChance) + _SpawnMin;
    _spawnRoll = round(random 100);
    diag_log(format["CRASHSPAWNER: %1%2 chance to start a crashing %3 with loot table '%4'", _spawnChance, '%', _crashName, _lootTable]);
    if (_spawnRoll <= _spawnChance) then
    {
        _position = [getMarkerPos _spawnMarker,0,_spawnRadius,10,0,2000,0] call BIS_fnc_findSafePos;
        diag_log(format["CRASHSPAWNER: %1 started flying from %2 to %3 NOW!(TIME:%4||LT:%5)", _crashName,  str(_heliStart), str(_position), round(time), _lootTable]);
        _startTime = time;
        _crashwreck = createVehicle [_heliModel,_heliStart, [], 0, "FLY"];
        _crashwreck setCombatMode "BLUE";
        _crashwreck engineOn true;
        _crashwreck flyInHeight 150;
        _crashwreck forceSpeed 150;
        _crashwreck setspeedmode "LIMITED";
        _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;
        sleep 0.5;
        if(_preWaypoints > 0) then
        {
            for "_x" from 1 to _preWaypoints do
            {
                _preWaypointPos = [getMarkerPos _spawnMarker,0,_spawnRadius,10,0,2000,0] call BIS_fnc_findSafePos;
                _wp = _aigroup addWaypoint [_preWaypointPos, 0];
                _wp setWaypointType "MOVE";
                _wp setWaypointBehaviour "CARELESS";
            };
        };
    
        _wp2 = _aigroup addWaypoint [position _landingzone, 0];
        _wp2 setWaypointType "MOVE";
        _wp2 setWaypointBehaviour "CARELESS";
        _wp2 setWaypointStatements ["true", "_crashwreck setdamage 1;"];
        _wp3 = _aigroup addWaypoint [_safetyPoint, 0];
        _wp3 setWaypointType "CYCLE";
        _wp3 setWaypointBehaviour "CARELESS";
        waituntil {(_crashwreck distance _position) <= 1000 || not alive _crashwreck || (getPosATL _crashwreck select 2) < 5 || (damage _crashwreck) >= _crashDamage};
        _crashwreck flyInHeight 100;
        _crashwreck forceSpeed 100;
        _crashwreck setspeedmode "NORMAL";
        waituntil {(_crashwreck distance _position) <= _exploRange || not alive _crashwreck || (getPosATL _crashwreck select 2) < 5 || (damage _crashwreck) >= _crashDamage};
        _crashwreck setHit ["mala vrtule", 1];
        _ran15 = random 15;
        _crashwreck setVelocity [_ran15,_ran15,-25];
        _crashwreck setdamage .9;
        waitUntil{sleep 1; getpos _crashwreck select 2 <= 30};
        _helipilot setdamage 1;
        _crashwreck setVelocity [_ran15,_ran15,-20];
        waitUntil{sleep 1; getpos _crashwreck select 2 <= 10};
        _crashwreck setdamage 1;
        waitUntil{sleep 1; getpos _crashwreck select 2 <= 5};
        diag_log(format["CRASHSPAWNER: %1 just exploded at %2!, ", _crashName, str(getPosATL _crashwreck)]);
        _pos = [getpos _crashwreck select 0, getpos _crashwreck select 1,0];
        _dir = getdir _crashwreck;
        heliCrash = _pos;
        publicVariable "heliCrash";
        deletevehicle _crashwreck;
        deletevehicle _helipilot;
        deletevehicle _landingzone;
        _crash = createVehicle [_crashModel, _pos, [], 0, "CAN_COLLIDE"];
        PVDZE_serverObjectMonitor set [count PVDZE_serverObjectMonitor,_crash];
        if (_spawnFire) then
        {
            PVDZE_obj_Fire = [_crash,2,time,false,_fadeFire];
            publicVariable "PVDZE_obj_Fire";
            _crash setVariable ["fadeFire",_fadeFire,true];
        };
        _num = round(random _randomizedLoot) + _guaranteedLoot;
        _config =        configFile >> "CfgBuildingLoot" >> _lootTable;
        _itemTypes =    [] + getArray (_config >> "itemType");
        _index =        dayz_CBLBase find toLower(_lootTable);
        _weights =        dayz_CBLChances select _index;
        _cntWeights = count _weights;
        for "_x" from 1 to _num do
        {
            _maxLootRadius = (random _maxLootRadius) + _minLootRadius;
            _lootPos = [_pos, _maxLootRadius, random 360] call BIS_fnc_relPos;
            _index = floor(random _cntWeights);
            _index = _weights select _index;
            _itemType = _itemTypes select _index;
            [_itemType select 0, _itemType select 1, _lootPos, 5] call spawn_loot;
            diag_log(format["CRASHSPAWNER: Loot spawn at '%1' with loot table '%2'", _lootPos, _lootTable]);
            _nearby = _pos nearObjects ["ReammoBox", sizeOf(_crashModel)];
            {
                _x setVariable ["permaLoot",true];
            } forEach _nearBy;
        };
        _endTime = time - _startTime;
        diag_log(format["CRASHSPAWNER: Crash completed! Wreck at: %2 - Runtime: %1 Seconds || Distance from calculated POC: %3 meters", round(_endTime), str(getPos _crash), round(_position distance _crash)]);
    };
  3. now save it and repack your pbo
 
Epoch Animated Heli Crashes
Version 1.1

Update V1.1 = Added more helis/planes to the array of spawnable animated heli crahses

Replace everything inside crash_spawner.sqf with this
Code:
/*
Script Name: crash_spawner.sqf
Original Author: Grafzahl / Finest
Modified by BushWookie for Epoch
Script Version: 1.1
*/
 
private["_timeAdjust","_timeToSpawn","_spawnRoll","_crash","_hasAdjustment","_newHeight","_adjustedPos","_useStatic","_crashDamage","_lootRadius","_preWaypoints","_preWaypointPos","_endTime","_startTime","_safetyPoint","_heliStart","_deadBody","_exploRange","_heliModel","_lootPos","_list","_craters","_dummy","_wp2","_wp3","_landingzone","_aigroup","_wp","_helipilot","_crash","_crashwreck","_smokerand","_staticcoords","_pos","_dir","_position","_num","_config","_itemType","_itemChance","_weights","_index","_iArray","_crashModel","_lootTable","_guaranteedLoot","_randomizedLoot","_frequency","_variance","_spawnChance","_spawnMarker","_spawnRadius","_spawnFire","_permanentFire","_crashName"];
//############### //Config Start\\ ###############\\
_SpawnMax        = 100;                //Maximum percent chance of spawning a crash number between 0 - 100
_SpawnMin        = 50;                //Minimum percent chance of spawning a crash number between 0 - 100
_guaranteedLoot = 3;                //Guaranteed Loot Spawns
_randomizedLoot = 4;                //Random number of loot piles aswell as the guaranteed ones
_spawnFire      = true;                //Spawn Smoke/Fire at the helicrash
_fadeFire      = false;            //Fade the Smoke/Fire overtime
_preWaypoints    = 2;                //Amount of waypoints the heli flys to before crashing
_crashDamage    = 1;                //Amount of dammage the heli can take before crashing (between 0.1 and 1) Lower the number and the heli can take less damage before crashing 1 dammage is fully destroyed and 0.1 something like a DMR could one shot the heli
_exploRange    = 250;                //How far away from the predefined crash point should the heli start crashing
_minLootRadius    = 4;                //Minimum distance for loot to spawn from the crash site in meters
_maxLootRadius    = 10;                //Maximum distance for loot to spawn from the crash site in meters
_lootTable        = "HeliCrash";        //Name of the loot table the heli gets loot from (DO NOT edit unless you know what your doing)
//############### \\Config End// ###############\\
//DO NOT edit below this unless you know what your doing
 
_heliModel        = ["UH1Y_DZE","UH1H_DZE","MV22","A10","Mi17_DZ"] call BIS_fnc_selectRandom;        //The type of heli used
_crashModel    = "UH1Wreck_DZ";    //The type of Crash model used after the heli crashes
_plane            = false;
 
if(_heliModel == "Mi17_DZ") then {
    _crashModel    = "Mi8Wreck";
};
 
if(_heliModel == "MV22") then {
    _crashModel    = "MV22Wreck";
    _plane            = true;
};
 
if(_heliModel == "A10") then {
    _crashModel    = "A10Wreck";
    _plane            = true;
};
 
_maxLootRadius = _maxLootRadius - _minLootRadius;
_spawnRadius = HeliCrashArea;
_heliStart = [[6986,-630,1000],[10450,-630,1000]] call BIS_fnc_selectRandom;
_safetyPoint = [0,16000,0];
_crashName= getText (configFile >> "CfgVehicles" >> _heliModel >> "displayName");
_spawnMarker    = 'center';
_spawnChance = _SpawnMax - _SpawnMin;
_spawnChance = (random _spawnChance) + _SpawnMin;
_spawnRoll = round(random 100);
diag_log(format["CRASHSPAWNER: %1%2 chance to start a crashing %3 with loot table '%4'", _spawnChance, '%', _crashName, _lootTable]);
if (_spawnRoll <= _spawnChance) then
{
    _position = [getMarkerPos _spawnMarker,0,_spawnRadius,10,0,2000,0] call BIS_fnc_findSafePos;
    diag_log(format["CRASHSPAWNER: %1 started flying from %2 to %3 NOW!(TIME:%4||LT:%5)", _crashName,  str(_heliStart), str(_position), round(time), _lootTable]);
    _startTime = time;
    _crashwreck = createVehicle [_heliModel,_heliStart, [], 0, "FLY"];
    _crashwreck setCombatMode "BLUE";
    _crashwreck engineOn true;
    if (_plane) then
    {
        _crashwreck flyInHeight 300;
        _crashwreck forceSpeed 250;
        _crashwreck setspeedmode "NORMAL";
    }
    else
    {
        _crashwreck flyInHeight 150;
        _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;
    sleep 0.5;
    if(_preWaypoints > 0) then
    {
        for "_x" from 1 to _preWaypoints do
        {
            _preWaypointPos = [getMarkerPos _spawnMarker,0,_spawnRadius,10,0,2000,0] call BIS_fnc_findSafePos;
            _wp = _aigroup addWaypoint [_preWaypointPos, 0];
            _wp setWaypointType "MOVE";
            _wp setWaypointBehaviour "CARELESS";
        };
    };
 
    _wp2 = _aigroup addWaypoint [position _landingzone, 0];
    _wp2 setWaypointType "MOVE";
    _wp2 setWaypointBehaviour "CARELESS";
    _wp2 setWaypointStatements ["true", "_crashwreck setdamage 1;"];
    _wp3 = _aigroup addWaypoint [_safetyPoint, 0];
    _wp3 setWaypointType "CYCLE";
    _wp3 setWaypointBehaviour "CARELESS";
    waituntil {(_crashwreck distance _position) <= 1000 || not alive _crashwreck || (getPosATL _crashwreck select 2) < 5 || (damage _crashwreck) >= _crashDamage};
    if (_plane) then
    {
        _crashwreck flyInHeight 100;
        _crashwreck forceSpeed 150;
        _crashwreck setspeedmode "NORMAL";
        _exploRange = 360;
    }
    else
    {
        _crashwreck flyInHeight 100;
        _crashwreck forceSpeed 100;
        _crashwreck setspeedmode "NORMAL";
    };
    waituntil {(_crashwreck distance _position) <= _exploRange || not alive _crashwreck || (getPosATL _crashwreck select 2) < 5 || (damage _crashwreck) >= _crashDamage};
    if (_plane) then
    {
        _crashwreck setdamage 1;
        _vel = velocity _crashwreck;
        _dir = direction _crashwreck;
        _speed = 100;
        _crashwreck setVelocity [(_vel select 0)-(sin _dir*_speed),(_vel select 1)-(cos _dir*_speed),(_vel select 2) - 30];
    }
    else
    {
        _crashwreck setHit ["mala vrtule", 1];
        _ran15 = random 15;
        _crashwreck setVelocity [_ran15,_ran15,-25];
        _crashwreck setdamage .9;
        waitUntil{sleep 1; getpos _crashwreck select 2 <= 30};
        _helipilot setdamage 1;
        _crashwreck setVelocity [_ran15,_ran15,-20];
        waitUntil{sleep 1; getpos _crashwreck select 2 <= 10};
        _crashwreck setdamage 1;
    };
    waitUntil{sleep 1; getpos _crashwreck select 2 <= 5};
    diag_log(format["CRASHSPAWNER: %1 just exploded at %2!, ", _crashName, str(getPosATL _crashwreck)]);
    _pos = [getpos _crashwreck select 0, getpos _crashwreck select 1,0];
    _dir = getdir _crashwreck;
    heliCrash = _pos;
    publicVariable "heliCrash";
    deletevehicle _crashwreck;
    deletevehicle _helipilot;
    deletevehicle _landingzone;
    _crash = createVehicle [_crashModel, _pos, [], 0, "CAN_COLLIDE"];
    PVDZE_serverObjectMonitor set [count PVDZE_serverObjectMonitor,_crash];
    if (_spawnFire) then
    {
        PVDZE_obj_Fire = [_crash,2,time,false,_fadeFire];
        publicVariable "PVDZE_obj_Fire";
        _crash setVariable ["fadeFire",_fadeFire,true];
    };
    _num = round(random _randomizedLoot) + _guaranteedLoot;
    _config =        configFile >> "CfgBuildingLoot" >> _lootTable;
    _itemTypes =    [] + getArray (_config >> "itemType");
    _index =        dayz_CBLBase find toLower(_lootTable);
    _weights =        dayz_CBLChances select _index;
    _cntWeights = count _weights;
    for "_x" from 1 to _num do
    {
        _maxLootRadius = (random _maxLootRadius) + _minLootRadius;
        _lootPos = [_pos, _maxLootRadius, random 360] call BIS_fnc_relPos;
        _index = floor(random _cntWeights);
        _index = _weights select _index;
        _itemType = _itemTypes select _index;
        [_itemType select 0, _itemType select 1, _lootPos, 5] call spawn_loot;
        diag_log(format["CRASHSPAWNER: Loot spawn at '%1' with loot table '%2'", _lootPos, _lootTable]);
        _nearby = _pos nearObjects ["ReammoBox", sizeOf(_crashModel)];
        {
            _x setVariable ["permaLoot",true];
        } forEach _nearBy;
    };
    _endTime = time - _startTime;
    diag_log(format["CRASHSPAWNER: Crash completed! Wreck at: %2 - Runtime: %1 Seconds || Distance from calculated POC: %3 meters", round(_endTime), str(getPos _crash), round(_position distance _crash)]);
};

 
Back
Top