Advertisement
dapperstache

NUP_fnc_initSafezone

May 10th, 2024 (edited)
869
0
142 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQF 6.97 KB | Gaming | 0 0
  1.     //Title: NUP_fnc_initSafezone
  2.     //File:  NUP\NUP_flagCapture\functions\fn_initSafezone.sqf
  3.     //Author: Dapperstache
  4.     //Purpose: Initializes, creates markers, establishes invulnerability logic and assigns a random side for each safezone
  5.     //Usage: Called in init field of Game Logic Entity (placed in 3DEN Editor). (e.g.: [ this ] spawn NUP_fnc_initSafezone;)
  6.  
  7.     if !(isServer) exitWith {};
  8.  
  9.     // Check if sidesArray already exists and initialize if not
  10.     if (isNil "sidesArray") then
  11.     {
  12.         sidesArray = [East, West, Civilian, Independent];
  13.     };
  14.  
  15.     // Ensure there are sides in the array before proceeding
  16.     if !(count sidesArray > 0) exitWith {};
  17.  
  18.     params
  19.     [
  20.         ["_logic", objNull, [objNull]],
  21.         ["_markerSize", [250, 140], [[]], 2]
  22.     ];
  23.  
  24.     // Randomly select a side
  25.     _side = sidesArray call BIS_fnc_selectRandom;
  26.  
  27.     _flagSide = "Flag_White_F";
  28.     _szMarkerColor = "";
  29.     _spawnName = "HQ";
  30.  
  31.     // Define flag color based on side
  32.     switch (_side) do
  33.     {
  34.         case east:
  35.         {
  36.             _flagSide = "Flag_Red_F";
  37.             _szMarkerColor = "ColorOPFOR";
  38.             _spawnName = "OPFOR HQ";
  39.         };
  40.         case west:
  41.         {
  42.             _flagSide = "Flag_Blue_F";
  43.             _szMarkerColor = "ColorBLUFOR";
  44.             _spawnName = "BLUFOR HQ";
  45.         };
  46.         case civilian:
  47.         {
  48.             _flagSide = "Flag_FD_Purple_F";
  49.             _szMarkerColor = "ColorCivilian";
  50.             _spawnName = "CIVFOR HQ";
  51.         };
  52.         case independent:
  53.         {
  54.             _flagSide = "Flag_Green_F";
  55.             _szMarkerColor = "ColorIndependent";
  56.             _spawnName = "INDFOR HQ";
  57.         };
  58.     };
  59.  
  60.     // Spawn the flag
  61.     _flag = createVehicle [_flagSide, getPosATL _logic, [], 0, "CAN_COLLIDE"];
  62.     _flag allowDamage false;
  63.  
  64.     // Create respawn marker
  65.     _respawnMarker = createMarker [format ["respawn_%1", _side], getPos _logic];
  66.     _respawnMarker setMarkerType "b_hq";
  67.     _respawnMarker setMarkersize [1, 1];
  68.     _respawnMarker setMarkerAlpha 1;
  69.     _respawnMarker setMarkerColor _szMarkerColor;
  70.     _respawnMarker setMarkerText format ["%1",_spawnName];
  71.     _flag setVariable[ "NUP_respawnMarker", _respawnMarker, true ];
  72.  
  73.     // Create safezone marker
  74.     _safezoneMarker = createMarker [format ["safezoneMarker_%1", _side], getPos _logic];
  75.     _safezoneMarker setMarkerShape "ELLIPSE";
  76.     _safezoneMarker setMarkerSize _markerSize;
  77.     _safezoneMarker setMarkerDir (getDir _logic);
  78.     _safezoneMarker setMarkerBrush "Solid";
  79.     _safezoneMarker setMarkerColor _szMarkerColor;
  80.     _safezoneMarker setMarkerAlpha 0.85;
  81.     _flag setVariable[ "NUP_safezoneMarker", _safezoneMarker, true ];
  82.  
  83.     // Function to hide markers for players not on the specified side
  84.     private _hideMarkersForSide =
  85.     {
  86.         params ["_flag", "_side"];
  87.  
  88.         // Get the position of the flag
  89.         private _flagPos = getPosATL _flag;
  90.    
  91.         // Define the radius
  92.         private _radius = 100;
  93.    
  94.         // Collect markers within 70m of the flag
  95.         private _markers = [];
  96.        
  97.         {
  98.             private _markerPos = getMarkerPos _x;
  99.             if ((_markerPos distance2D _flagPos) <= _radius) then
  100.             {
  101.                 _markers pushBack _x;
  102.             };
  103.         } forEach allMapMarkers;
  104.  
  105.    
  106.         // Remote execution block for each client
  107.         {
  108.             private _player = _x;
  109.             private _playerSide = side _player;
  110.  
  111.             if (_playerSide != _side) then
  112.             {
  113.                 {
  114.                     [_x, 0] remoteExec ["setMarkerAlpha", _player];
  115.                 } forEach _markers;
  116.             }
  117.             else
  118.             {
  119.                 {
  120.                     [_x, 1] remoteExec ["setMarkerAlpha", _player];
  121.                 } forEach _markers;
  122.             };
  123.         } forEach allPlayers;
  124.     };
  125.    
  126.     // Call the function to hide markers   
  127.     [_flag, _side] call _hideMarkersForSide;
  128.  
  129.     // Create trigger centered on the safezone marker
  130.     _safezoneTrigger = createTrigger ["EmptyDetector", getPos _logic];
  131.     _triggerSize = [(_markerSize select 1), (_markerSize select 0), 0, false, 200];
  132.     _safezoneTrigger setTriggerArea _triggerSize;
  133.     _safezoneTrigger setTriggerActivation ["ANY", "PRESENT", true]; // Activate only if a player of the specified side is present
  134.  
  135.     [_safezoneTrigger, _side] spawn
  136.     {
  137.         params ["_safezoneTrigger", "_side"];
  138.    
  139.         private _old_safezone = [];
  140.    
  141.         while {true} do
  142.         {
  143.             private _entitiesInSafezone = (allUnits + vehicles) select {(_x inArea _safezoneTrigger)};
  144.             private _new_safezone = _entitiesInSafezone select {!(_x in _old_safezone)};
  145.             private _left_safezone = _old_safezone select {!(_x inArea _safezoneTrigger)};
  146.             _old_safezone = _entitiesInSafezone;
  147.  
  148.             // Handle units/vehicles entering the safezone
  149.             {
  150.                 private _entity = _x;
  151.                 private _vehicle = vehicle _entity;
  152.                 private _entitySide = side _entity;
  153.                
  154.    
  155.                 // If the entity is a vehicle itself, adjust accordingly
  156.                 if (_entity isKindOf "LandVehicle" || _entity isKindOf "Air" || _entity isKindOf "Ship") then
  157.                 {
  158.                     _vehicle = _entity;
  159.                     _entitySide = side _vehicle;
  160.                 };
  161.  
  162.                 if (_entitySide == _side) then
  163.                 {
  164.                     // Apply 10-second delay before protection
  165.                     [_entity, _vehicle] spawn
  166.                     {
  167.                         params ["_entity", "_vehicle"];
  168.                         _delay = _entity getVariable ["NUP_safezoneDelay", true];
  169.                        
  170.                         if (_delay == true) then
  171.                         {
  172.                             if (_entity == player && player getVariable "NUP_disableCommandChat" == false) then
  173.                             {
  174.                                 _entity commandChat "Safezone Protection Initializing in 10 seconds.";
  175.                             };
  176.                        
  177.                             sleep 10;
  178.                    
  179.                             if (_entity == player && player getVariable "NUP_disableCommandChat" == false) then
  180.                             {
  181.                                 _entity commandChat "Safezone Protection: Activated.";
  182.                             };
  183.                             [_entity, false] remoteExec ["allowDamage", _entity];
  184.                             if (!isNull _vehicle) then
  185.                             {
  186.                                 [_vehicle, false] remoteExec ["allowDamage", _vehicle];
  187.                             };  
  188.                         }
  189.                         else
  190.                         {
  191.                             if (_entity == player && player getVariable "NUP_disableCommandChat" == false) then
  192.                             {
  193.                                 _entity commandChat "Safezone Protection: Activated.";
  194.                             };
  195.                             [_entity, false] remoteExec ["allowDamage", _entity];
  196.                             if (!isNull _vehicle) then
  197.                             {
  198.                                 [_vehicle, false] remoteExec ["allowDamage", _vehicle];
  199.                             };  
  200.                         };
  201.                        
  202.                     };
  203.                 }
  204.                 else
  205.                 {  
  206.                     if (_entity == player) then
  207.                     {
  208.                         _entity commandChat "You've entered an enemy safezone.";
  209.                     };
  210.                     if (_entity isKindOf "man") then
  211.                     {
  212.                         _entity call BIS_fnc_neutralizeUnit;
  213.                     };
  214.                     if (count (crew _vehicle) > 0) then
  215.                     {
  216.                         _vehicle call BIS_fnc_neutralizeUnit;
  217.                     };
  218.                 };
  219.             } forEach _new_safezone;
  220.  
  221.             // Handle units/vehicles leaving the safezone
  222.             {
  223.                 private _entity = _x;
  224.                 private _vehicle = vehicle _entity;
  225.  
  226.                 [_entity, true] remoteExec ["allowDamage", _entity];
  227.                 _entity setVariable ["NUP_safezoneDelay", true, true];
  228.                 if (_entity isKindOf "LandVehicle" || _entity isKindOf "helicopter"|| _entity isKindOf "plane" || _entity isKindOf "Ship") then
  229.                 {
  230.                     [_vehicle, true] remoteExec ["allowDamage", _vehicle];
  231.                 };
  232.                
  233.                 if (_entity == player) then
  234.                 {
  235.                     _entity commandChat "Safezone Protection: Deactivated.";
  236.                 };
  237.             } forEach _left_safezone;
  238.  
  239.             sleep 1;
  240.         };
  241.     };
  242.  
  243.     // Remove selected side from the array
  244.     sidesArray = sidesArray - [_side];
  245.  
Tags: arma
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement