Advertisement
dapperstache

fn_initSafezone.sqf

May 10th, 2024 (edited)
749
0
161 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQF 11.33 KB | Gaming | 0 0
  1. //NUP\NUP_flagCapture\functions\NUP_fnc_initSafezone.sqf
  2.  
  3.  
  4. if !(isServer) exitWith {};
  5.  
  6. // Check if sidesArray already exists and initialize if not
  7. if (isNil "sidesArray") then {
  8.     sidesArray = [East, West, Civilian, Independent];
  9. };
  10.  
  11. // Ensure there are sides in the array before proceeding
  12. if !(count sidesArray > 0) exitWith {};
  13.  
  14. params
  15. [
  16.     ["_logic", objNull, [objNull]],
  17.     ["_markerSize", [250, 140], [[]], 2]
  18. ];
  19.  
  20. // Randomly select a side
  21. _side = sidesArray call BIS_fnc_selectRandom;
  22. diag_log format ["_side: %1", _side];
  23.  
  24. _flagSide = "Flag_White_F";
  25. _szMarkerColor = "";
  26. _spawnName = "HQ";
  27.  
  28. // Define flag color based on side
  29. switch (_side) do
  30. {
  31.     case east:
  32.     {
  33.         _flagSide = "Flag_Red_F";
  34.         _szMarkerColor = "ColorOPFOR";
  35.         _spawnName = "OPFOR HQ";
  36.     };
  37.     case west:
  38.     {
  39.         _flagSide = "Flag_Blue_F";
  40.         _szMarkerColor = "ColorBLUFOR";
  41.         _spawnName = "BLUFOR HQ";
  42.     };
  43.     case civilian:
  44.     {
  45.         _flagSide = "Flag_FD_Purple_F";
  46.         _szMarkerColor = "ColorCivilian";
  47.         _spawnName = "CIVFOR HQ";
  48.     };
  49.     case independent:
  50.     {
  51.         _flagSide = "Flag_Green_F";
  52.         _szMarkerColor = "ColorIndependent";
  53.         _spawnName = "INDFOR HQ";
  54.     };
  55. };
  56.  
  57. // Spawn the flag
  58. _flag = createVehicle [_flagSide, getPosATL _logic, [], 0, "CAN_COLLIDE"];
  59. _flag allowDamage false;
  60.  
  61. // Function to hide markers for players not on the specified side
  62. private _hideMarkersForSide = {
  63.     params ["_flag", "_side"];
  64.  
  65.     // Get the position of the flag
  66.     private _flagPos = getPosATL _flag;
  67.    
  68.     // Define the radius
  69.     private _radius = 100;
  70.    
  71.     // Collect markers within 70m of the flag
  72.     private _markers = [];
  73.     {
  74.         private _markerPos = getMarkerPos _x;
  75.         if ((_markerPos distance2D _flagPos) <= _radius) then {
  76.             _markers pushBack _x;
  77.         };
  78.     } forEach allMapMarkers;
  79.  
  80.     // Log markers in the array for debugging
  81.     diag_log format ["Markers in trigger area: %1", _markers];
  82.    
  83.     // Iterate through all players and hide markers for those not on the specified side
  84.     {
  85.         private _playerSide = side _x;
  86.         if (_playerSide != _side) then {
  87.             {
  88.                 _x setMarkerAlpha 0;
  89.             } forEach _markers;
  90.         } else {
  91.             {
  92.                 _x setMarkerAlpha 1;
  93.             } forEach _markers;
  94.         };
  95.     } forEach allPlayers;
  96. };
  97.  
  98. // Call the function to hide markers
  99. [_flag, _side] call _hideMarkersForSide;
  100.  
  101.  
  102. // Create respawn marker
  103. _respawnMarker = createMarker [format ["respawn_%1", _side], getPos _logic];
  104. _respawnMarker setMarkerType "b_hq";
  105. _respawnMarker setMarkersize [1, 1];
  106. _respawnMarker setMarkerAlpha 1;
  107. _respawnMarker setMarkerColor _szMarkerColor;
  108. _respawnMarker setMarkerText format ["%1",_spawnName];
  109. _flag setVariable[ "NUP_respawnMarker", _respawnMarker, true ];
  110.  
  111. // Create safezone marker
  112. _safezoneMarker = createMarker [format ["safezoneMarker_%1", _side], getPos _logic];
  113. _safezoneMarker setMarkerShape "ELLIPSE";
  114. _safezoneMarker setMarkerSize _markerSize;
  115. _safezoneMarker setMarkerDir (getDir _logic);
  116. _safezoneMarker setMarkerBrush "Solid";
  117. _safezoneMarker setMarkerColor _szMarkerColor;
  118. _safezoneMarker setMarkerAlpha 0.85;
  119. _flag setVariable[ "NUP_safezoneMarker", _safezoneMarker, true ];
  120.  
  121. // Iterate through all players
  122. {
  123.     private _playerSide = side _x; // Get the side of the player
  124.    
  125.     // Check if the player's side matches the desired side
  126.     if (_playerSide != _side) then {
  127.         // Set opacity to zero for players whose side doesn't match
  128.         _safezoneMarker setMarkerAlpha 0;
  129.         _respawnMarker setMarkerAlpha 0;
  130.     };
  131. } forEach allPlayers;
  132.  
  133.  
  134. //Create trigger centered on the safezone marker
  135. _safezoneTrigger = createTrigger ["EmptyDetector", getPos _logic];
  136. _triggerSize = [(_markerSize select 1), (_markerSize select 0),0, false, 20];
  137. _safezoneTrigger setTriggerArea _triggerSize;
  138. _safezoneTrigger setTriggerActivation ["ANY", "PRESENT", true]; // Activate only if a player of the specified side is present
  139. _safezoneDelay = player getVariable ["NUP_safezoneDelay", false];
  140.  
  141. _trigger = _safezoneTrigger;
  142.  
  143. // Function to initiate cruise missile strike on any player or vehicle from an opposing side entering the safezone
  144. _initiateCruiseMissileStrike = {
  145.     params ["_unit", "_side"];
  146.     if (!alive _unit) exitWith {}; // Check if the unit is alive
  147.  
  148.     private _targetPos = getPos _unit; // Get the position of the unit or vehicle
  149.  
  150.     // Parameters for missile strike
  151.     private _numberOfMissiles = 3; // Number of missiles
  152.     private _timeBetweenMissiles = 0.75; // Time between each missile
  153.     private _spawnSpread = 50; // Spread of missile spawn
  154.     private _spawnHeight = 150; // Height of missile spawn
  155.     private _targetSpread = 1; // Spread of missile target
  156.     private _missileType = "M_NLAW_AT_F"; // Type of missile
  157.  
  158.     // Loop to spawn missiles
  159.     for [{_i = 0}, {_i < _numberOfMissiles}, {_i = _i + 1}] do {
  160.         // Calculate spawn position with random spread
  161.         private _spawnPosition = [
  162.             (_targetPos select 0) - _spawnSpread + (random (_spawnSpread * 2)),
  163.             (_targetPos select 1) - _spawnSpread + (random (_spawnSpread * 2)),
  164.             _spawnHeight
  165.         ];
  166.  
  167.         // Calculate target position without random spread
  168.         private _targetPosition = [
  169.         _targetPos select 0,
  170.         _targetPos select 1,
  171.         getTerrainHeightASL _targetPos
  172.         ];
  173.  
  174.         // Spawn missile
  175.         private _missile = _missileType createVehicle _spawnPosition;
  176.  
  177.         // Get missile position
  178.         private _missilePosition = getPosASL _missile;
  179.  
  180.         // Calculate direction to target
  181.         private _direction = [_missilePosition, _targetPosition] call BIS_fnc_vectorFromXToY;
  182.  
  183.         // Set missile direction
  184.         _missile setVectorDirAndUp [_direction, [0, 1, 0]];
  185.  
  186.         // Set missile velocity
  187.         _missile setVelocity ([_direction, 1200] call BIS_fnc_vectorMultiply);
  188.  
  189.         // Wait before spawning next missile
  190.         sleep _timeBetweenMissiles;
  191.     };
  192. };
  193.  
  194. [_trigger, _side, _initiateCruiseMissileStrike] spawn {
  195.     params ["_trigger", "_side", "_initiateCruiseMissileStrike"];
  196.    
  197.     private _old_safezone = [];
  198.    
  199.     while {true} do {
  200.         private _new_safezone = ((allUnits + vehicles) - allDead) select {(_x inArea _trigger) and !(_x in _old_safezone)};
  201.         private _left_safezone = _old_safezone select {!(_x inArea _trigger)};
  202.         _old_safezone = (_old_safezone select {_x inArea _trigger}) + _new_safezone;
  203.  
  204.         // Handle units/vehicles entering the safezone
  205. {
  206.     private _unit = _x;
  207.     private _vehicle = vehicle _unit;
  208.     private _unitSide = side _unit;
  209.     private _vehicleSide = _vehicle getVariable ["NUP_vehicleSide", sideUnknown];
  210.  
  211.     if ((_unitSide == _side) || (_vehicleSide == _side) || (_unitSide == sideUnknown) || (_vehicleSide == sideUnknown)) then {
  212.         // Apply invulnerability only to units in their own safezone
  213.         if (_unitSide == _side) then {
  214.             if (local _unit) then {
  215.                 if (_unit getVariable ["NUP_safezoneDelay", false]) then {
  216.                     systemChat "Safezone Protection Initializing in 10 seconds.";
  217.                     sleep 10;
  218.                     systemChat "Safezone Protection: Activated.";
  219.                     _unit setVariable ["NUP_safezoneDelay", false];
  220.                 } else {
  221.                     systemChat "Safezone Protection: Activated.";
  222.                 };
  223.                 _unit allowDamage false;
  224.                 if (!isNull _vehicle && {_vehicle != _unit}) then {
  225.                     _vehicle allowDamage false;
  226.                 };
  227.             } else {
  228.                 [_unit, false] remoteExec ["allowDamage", _unit];
  229.                 if (!isNull _vehicle && {_vehicle != _unit}) then {
  230.                     [_vehicle, false] remoteExec ["allowDamage", _vehicle];
  231.                 };
  232.             };
  233.         } else {
  234.             //[_unit, _side] call _initiateCruiseMissileStrike;
  235.            
  236.            
  237.         };
  238.     };
  239.    
  240.     };
  241. } forEach _new_safezone;
  242.  
  243.         // Handle units/vehicles leaving the safezone
  244.         {
  245.             private _unit = _x;
  246.             private _vehicle = vehicle _unit;
  247.  
  248.             if (local _unit) then {
  249.                 _unit allowDamage true;
  250.                 systemChat "Safezone Protection: Deactivated.";
  251.                 _unit setVariable ["NUP_safezoneDelay", true];
  252.                 if (!isNull _vehicle && {_vehicle != _unit}) then {
  253.                     _vehicle allowDamage true;
  254.                 };
  255.             } else {
  256.                 [_unit, true] remoteExec ["allowDamage", _unit];
  257.                 if (!isNull _vehicle && {_vehicle != _unit}) then {
  258.                     [_vehicle, true] remoteExec ["allowDamage", _vehicle];
  259.                 };
  260.             };
  261.         } forEach _left_safezone;
  262.  
  263.         sleep 1;
  264.     };
  265. };
  266.    
  267.  
  268.  
  269. // Event handler to set the side of the vehicle to sideUnknown when created
  270. _vehicleInitHandler = {
  271.     params ["_vehicle"];
  272.     _vehicle setVariable ["NUP_vehicleSide", sideUnknown, true];
  273. };
  274.  
  275. // Monitor new vehicle creations to set the initial side
  276. _addVehicleInitHandler = {
  277.     params ["_vehicle"];
  278.     hintSilent format ["Vehicle created: %1", typeOf _vehicle]; // Debug message
  279.  
  280.     // Check if the vehicle is alive
  281.     if (alive _vehicle) then {
  282.         [_vehicle] call _vehicleInitHandler;
  283.     };
  284. };
  285.  
  286. // Apply the initial side setting handler to all vehicles currently present
  287. {
  288.     [_x] call _vehicleInitHandler;
  289. } forEach vehicles;
  290.  
  291. // Monitor new vehicle creations
  292. _addVehicleHandler = addMissionEventHandler ["EntityCreated", {
  293.     params ["_entity"];
  294.     hintSilent format ["Entity created: %1", typeOf _entity]; // Debug message
  295.  
  296.     // Check if the entity is a vehicle
  297.     if (_entity isKindOf "AllVehicles") then {
  298.         [_entity] call _addVehicleInitHandler;
  299.     };
  300. }];
  301.  
  302.  
  303.  
  304.  
  305.  /*   private _triggerPos = getPosWorld _safezoneTrigger;
  306.     private _triggerSize = triggerArea _safezoneTrigger;
  307.     private _height = _triggerPos select 2;
  308.     private _position = getPosWorld _safezoneTrigger;
  309.     private _triggerLength = (_triggerSize) # 0;
  310.     private _triggerWidth = (_triggerSize) # 1;
  311.     private _triggerAngle = (_triggerSize) # 2;
  312.  
  313.     private _pos = [(_position#0 + cos(_triggerAngle) * _triggerLength + sin(_triggerAngle) * _triggerWidth), (_position#1 - sin(_triggerAngle) * _triggerLength + cos(_triggerAngle) * _triggerWidth)];
  314.     private _positionsAndHeights = [];
  315.     _pos pushBack _height;
  316.  
  317.     for "_i" from 0 to (_triggerLength * 8) do {
  318.         private _pos2 = _pos;
  319.  
  320.         for "_j" from 0 to (_triggerWidth * 8) do {
  321.             _positionsAndHeights pushBack _pos2;
  322.             _pos2 = _pos2 vectorAdd [-0.25 * sin(_triggerAngle), -0.25 * cos(_triggerAngle), 0];
  323.         };
  324.  
  325.         _pos = _pos  vectorAdd [-0.25 * cos(_triggerAngle), 0.25 * sin(_triggerAngle), 0];
  326.     };
  327.  
  328.     //{_x hideObjectGlobal true} forEach (allMissionObjects "" inAreaArray _x);
  329.  
  330.     setTerrainHeight[_positionsAndHeights, false];*/
  331.    
  332.     // Event handler to set the side of the vehicle to sideUnknown when created
  333.     _vehicleInitHandler = {
  334.     params ["_vehicle"];
  335.     _vehicle setVariable ["NUP_vehicleSide", sideUnknown, true];
  336.     };
  337.  
  338.  
  339. // Remove selected side from the array
  340. sidesArray = sidesArray - [_side];
  341.  
  342.  
Tags: arma
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement