Advertisement
dapperstache

fn_initSafezone.sqf

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