220 lines
8.9 KiB
Plaintext
Executable File
220 lines
8.9 KiB
Plaintext
Executable File
/*
|
|
Fuel Station Bombing event by JasonTM
|
|
Credit to juandayz for original "Random Explosions on Gas Stations" event.
|
|
Updated to work with DayZ Epoch 1.0.7
|
|
Last edited 6-1-2021
|
|
***As of now, this event only has gas station positions for Chernarus.
|
|
*/
|
|
|
|
local _timeout = 20; // Time it takes for the event to time out (in minutes). To disable timeout set to -1.
|
|
local _delay = 2; // This is the time in minutes it will take for the explosion to occur after announcement
|
|
local _lowerGrass = true; // remove grass underneath loot so it is easier to find small objects
|
|
local _visitMark = true; // Places a "visited" check mark on the mission if a player gets within range of the vehicle.
|
|
local _distance = 20; // Distance from vehicle before event is considered "visited"
|
|
local _nameMarker = true; // Center marker with the name of the mission.
|
|
local _type = "Hint"; // Type of announcement message. Options "Hint","TitleText". ***Warning: Hint appears in the same screen space as common debug monitors
|
|
#define TITLE_COLOR "#ff9933" // Hint Option: Color of Top Line
|
|
#define TITLE_SIZE "1.75" // Hint Option: Size of top line
|
|
|
|
// You can adjust these loot selections to your liking. Must be magazine/item slot class name, not weapon or tool belt.
|
|
// Nested arrays are number of each item and item class name.
|
|
/*
|
|
local _lootArrays = [
|
|
[[6,"full_cinder_wall_kit"],[1,"cinder_door_kit"],[1,"cinder_garage_kit"],[4,"forest_large_net_kit"]],
|
|
[[6,"metal_floor_kit"],[6,"ItemWoodFloor"],[2,"ItemWoodStairs"],[10,"ItemSandbag"]],
|
|
[[24,"CinderBlocks"],[8,"MortarBucket"]]
|
|
];
|
|
*/
|
|
|
|
// Vehicle Upgrade kits
|
|
local _lootArrays = [
|
|
/*Truck*/ [["ItemTruckORP",1],["ItemTruckAVE",1],["ItemTruckLRK",1],["ItemTruckTNK",1],["PartEngine",2],["PartWheel",6],["ItemScrews",8],["PartGeneric",10],["equip_metal_sheet",5],["ItemWoodCrateKit",2],["PartFueltank",3],["ItemGunRackKit",2],["ItemFuelBarrel",2]],
|
|
/*Vehicle*/ [["ItemORP",1],["ItemAVE",1],["ItemLRK",1],["ItemTNK",1],["PartEngine",2],["PartWheel",4],["ItemScrews",8],["equip_metal_sheet",6],["PartGeneric",8],["ItemWoodCrateKit",2],["ItemGunRackKit",2],["PartFueltank",2],["ItemFuelBarrel",1]],
|
|
/*Helicopter*/ [["ItemHeliAVE",1],["ItemHeliLRK",1],["ItemHeliTNK",1],["equip_metal_sheet",5],["ItemScrews",2],["ItemTinBar",3],["equip_scrapelectronics",5],["equip_floppywire",5],["PartGeneric",4],["ItemWoodCrateKit",1],["ItemGunRackKit",1],["ItemFuelBarrel",1]],
|
|
/*Tank-APC*/ [["ItemTankORP",1],["ItemTankAVE",1],["ItemTankLRK",1],["ItemTankTNK",1],["PartEngine",6],["PartGeneric",6],["ItemScrews",6],["equip_metal_sheet",8],["ItemWoodCrateKit",2],["ItemGunRackKit",2],["PartFueltank",6],["ItemFuelBarrel",4]]
|
|
];
|
|
|
|
// Select random loot array from above
|
|
local _loot = _lootArrays call BIS_fnc_selectRandom;
|
|
|
|
// Initialize locations array
|
|
if (isNil "FuelStationEventArray") then {
|
|
FuelStationEventArray = [
|
|
// Vehicle direction, vehicle position, fuel station name
|
|
[96.8,[3640.58,8979.26,0],"Vybor"],
|
|
[58.3,[6708.22,2986.89,0],"Cherno"],
|
|
[10,[5849.21,10085.1,0],"Grishino"],
|
|
[130,[7243.35,7644.83,0],"Novy Sobor"],
|
|
[29,[10163.4,5304.94,0],"Staroye"],
|
|
[94.6,[9497.25,2016,0],"Elektro"],
|
|
[347,[13394.8,6605.09,0],"Solnechiy"],
|
|
[200,[2034.43,2242.05,0],"Kamenka"],
|
|
[8.5,[2681.41,5604.03,0],"Zelenogorsk"],
|
|
[87,[4734.43,6373.43,0],"Pogorevka"],
|
|
[329.3,[10456.5,8868.75,0],"Gorka"],
|
|
[10.5,[12998.1,10074.4,0],"Berezino"]
|
|
];
|
|
};
|
|
|
|
// Don't spawn the event at a fuel station where a player is refueling/repairing a vehicle
|
|
local _validSpot = false;
|
|
local _random = [];
|
|
local _pos = [0,0,0];
|
|
|
|
while {!_validSpot} do {
|
|
_random = FuelStationEventArray call BIS_fnc_selectRandom;
|
|
_pos = _random select 1;
|
|
{if (isPlayer _x && _x distance _pos >= 100) then {_validSpot = true};} count playableUnits; // players are at least 100 meters away.
|
|
};
|
|
|
|
local _dir = _random select 0;
|
|
local _name = _random select 2;
|
|
|
|
{ // Remove current location from array so there are no repeats
|
|
if (_name == (_x select 2)) exitWith {
|
|
FuelStationEventArray = [FuelStationEventArray,_forEachIndex] call fnc_deleteAt;
|
|
};
|
|
} forEach FuelStationEventArray;
|
|
|
|
// If all locations have been removed, reset to original array by destroying global variable
|
|
if (count FuelStationEventArray == 0) then {FuelStationEventArray = nil;};
|
|
|
|
if (_type == "Hint") then {
|
|
RemoteMessage = ["hintNoImage",["STR_CL_ESE_FUELBOMB_TITLE",["STR_CL_ESE_FUELBOMB_START", _name, _delay]],[TITLE_COLOR,TITLE_SIZE]];
|
|
} else {
|
|
RemoteMessage = ["titleText",["STR_CL_ESE_FUELBOMB_START", _name, _delay]];
|
|
};
|
|
publicVariable "RemoteMessage";
|
|
|
|
// Spawn truck
|
|
local _truck = "Ural_CDF" createVehicle _pos;
|
|
_truck setDir _dir;
|
|
_truck setPos _pos;
|
|
_truck setVehicleLock "locked";
|
|
_truck setVariable ["CharacterID","9999",true];
|
|
|
|
// Disable damage to near fuel pumps so the explosion doesn't destroy them.
|
|
// Otherwise players will complain about not being able to refuel and repair their vehicles.
|
|
{
|
|
_x allowDamage false;
|
|
} count (_pos nearObjects ["Land_A_FuelStation_Feed", 30]);
|
|
|
|
local _time = diag_tickTime;
|
|
local _done = false;
|
|
local _visited = false;
|
|
local _isNear = true;
|
|
local _spawned = false;
|
|
local _lootArray = [];
|
|
local _grassArray = [];
|
|
local _lootRad = 0;
|
|
local _lootPos = [0,0,0];
|
|
local _lootVeh = objNull;
|
|
local _lootArray = [];
|
|
local _grass = objNull;
|
|
local _grassArray = [];
|
|
local _markers = [1,1,1];
|
|
|
|
//[position,createMarker,setMarkerColor,setMarkerType,setMarkerShape,setMarkerBrush,setMarkerSize,setMarkerText,setMarkerAlpha]
|
|
_markers set [0, [_pos, "fuel" + str _time, "ColorRed", "","ELLIPSE", "", [150,150], [], 0.4]];
|
|
if (_nameMarker) then {_markers set [1, [_pos, "explosion" + str _time, "ColorBlack", "mil_dot","ICON", "", [], ["STR_CL_ESE_FUELBOMB_TITLE"], 0]];};
|
|
DZE_ServerMarkerArray set [count DZE_ServerMarkerArray, _markers]; // Markers added to global array for JIP player requests.
|
|
local _markerIndex = count DZE_ServerMarkerArray - 1;
|
|
PVDZ_ServerMarkerSend = ["start",_markers];
|
|
publicVariable "PVDZ_ServerMarkerSend";
|
|
|
|
// Start monitoring loop
|
|
while {!_done} do {
|
|
uiSleep 3;
|
|
if (_visitMark && !_visited) then {
|
|
{
|
|
if (isPlayer _x && {_x distance _pos <= _distance}) exitWith {
|
|
_visited = true;
|
|
_markers set [2, [[(_pos select 0), (_pos select 1) + 25], "fuelVmarker" + str _time, "ColorBlack", "hd_pickup","ICON", "", [], [], 0]];
|
|
PVDZ_ServerMarkerSend = ["createSingle",(_markers select 2)];
|
|
publicVariable "PVDZ_ServerMarkerSend";
|
|
DZE_ServerMarkerArray set [_markerIndex, _markers];
|
|
};
|
|
} count playableUnits;
|
|
};
|
|
|
|
if (!_spawned && {diag_tickTime - _time >= _delay*60}) then {
|
|
if (_type == "Hint") then {
|
|
RemoteMessage = ["hintNoImage",["STR_CL_ESE_FUELBOMB_TITLE",["STR_CL_ESE_FUELBOMB_END",_name]],[TITLE_COLOR,TITLE_SIZE]];
|
|
} else {
|
|
RemoteMessage = ["titleText",["STR_CL_ESE_FUELBOMB_END",_name]];
|
|
};
|
|
publicVariable "RemoteMessage";
|
|
|
|
// Blow the vehicle up
|
|
"Bo_GBU12_LGB" createVehicle _pos;
|
|
|
|
uiSleep 2;
|
|
|
|
/*
|
|
// Spawn loot around the destroyed vehicle
|
|
{
|
|
for "_i" from 1 to (_x select 0) do {
|
|
_lootRad = (random 10) + 4;
|
|
_lootPos = [_pos, _lootRad, random 360] call BIS_fnc_relPos;
|
|
_lootPos set [2, 0];
|
|
_lootVeh = createVehicle ["WeaponHolder", _lootPos, [], 0, "CAN_COLLIDE"];
|
|
_lootVeh setVariable ["permaLoot", true];
|
|
_lootVeh addMagazineCargoGlobal [(_x select 1), 1];
|
|
_lootArray set[count _lootArray, _lootVeh];
|
|
if (_lowerGrass) then {
|
|
_grass = createVehicle ["ClutterCutter_small_2_EP1", _lootPos, [], 0, "CAN_COLLIDE"];
|
|
_grassArray set[count _grassArray, _grass];
|
|
};
|
|
};
|
|
} count _loot;
|
|
*/
|
|
|
|
// Spawn loot around the destroyed vehicle
|
|
{
|
|
for "_i" from 1 to (_x select 1) do {
|
|
_lootRad = (random 10) + 4;
|
|
_lootPos = [_pos, _lootRad, random 360] call BIS_fnc_relPos;
|
|
_lootPos set [2, 0];
|
|
_lootVeh = createVehicle ["WeaponHolder", _lootPos, [], 0, "CAN_COLLIDE"];
|
|
_lootVeh setVariable ["permaLoot", true];
|
|
_lootVeh addMagazineCargoGlobal [(_x select 0), 1];
|
|
_lootArray set[count _lootArray, _lootVeh];
|
|
if (_lowerGrass) then {
|
|
_grass = createVehicle ["ClutterCutter_small_2_EP1", _lootPos, [], 0, "CAN_COLLIDE"];
|
|
_grassArray set[count _grassArray, _grass];
|
|
};
|
|
};
|
|
} count _loot;
|
|
|
|
// Reset the timer once loot is spawned
|
|
_time = diag_tickTime;
|
|
_spawned = true;
|
|
};
|
|
|
|
// Timeout timer starts after loot is spawned
|
|
if (_spawned && {_timeout != -1}) then {
|
|
if (diag_tickTime - _time >= _timeout*60) then {
|
|
_done = true;
|
|
};
|
|
};
|
|
};
|
|
|
|
// If player is near, don't delete the loot piles
|
|
while {_isNear} do {
|
|
{if (isPlayer _x && _x distance _pos >= 30) exitWith {_isNear = false};} count playableUnits;
|
|
};
|
|
|
|
// Tell all clients to remove the markers from the map
|
|
local _remove = [];
|
|
{
|
|
if (typeName _x == "ARRAY") then {
|
|
_remove set [count _remove, (_x select 1)];
|
|
};
|
|
} count _markers;
|
|
PVDZ_ServerMarkerSend = ["end",_remove];
|
|
publicVariable "PVDZ_ServerMarkerSend";
|
|
DZE_ServerMarkerArray set [_markerIndex, -1];
|
|
|
|
// Delete loot piles and grass cutters
|
|
{deleteVehicle _x;} count _lootArray;
|
|
if (count _grassArray > 0) then {{deleteVehicle _x;} count _grassArray;}; |