arma2-epoch-server/@DayZ_Epoch_Server/addons/dayz_server/modules/fuelstationbomb.sqf
2022-04-21 16:15:41 +03:00

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;};