Advertisement
dreamforce

safe_zones.sqf

Apr 30th, 2021 (edited)
588
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.99 KB | None | 0 0
  1. /*
  2. File: safe_zones.sqf
  3. Creates safe zones in predefined areas (DZE_SafeZonePosArray)
  4.  
  5. Author: BigEgg
  6. https://github.com/BigEgg17
  7. */
  8.  
  9. private ["_bubbles", "_removeZ", "_removeAI", "_speedLimit", "_preventTheft", "_timer", "_disableWeps", "_badWeps"];
  10.  
  11. /**************************************************** Config ****************************************************/
  12. _bubbles = false; // Creates a circle of bubbles marking the circumference of the safe zone.
  13. _removeZ = true; // Remove zombies in safe zone.
  14. _removeAI = false; // Remove AI in safe zone.
  15. _speedLimit = 30; // Speed limit in safe zones. Set to 0 to disable speed limit.
  16. _preventTheft = true; // Prevent vehicles from being stolen by assigning them an owner (this includes gear).
  17. _timer = 0; // Delay ending safe zone protection for this many seconds upon leaving. Set to 0 to disable timer.
  18.  
  19. _disableWeps = false; // Drops any weapons in _badWeps array.
  20. _badWeps = [ // Will remove these weapons from the player if they try to select them. Only used if _disableWeps = true.
  21. "Vil_RPG29", "Vil_RPO_A", "Vil_RPG16", "Vil_RPG7V_PGO", "Vil_Panzerfaust3", "M136", "RPG7V", "vil_CG84T", "vilas_rpg22", "vilas_rpg26", "MAAWS", "Vil_RPG7d_PGO",
  22. "RPG18", "MeleeHatchet", "MeleeCrowbar","MeleeMachete", "MeleeFishingPole", "MeleeSledge", "MeleeBaseBallBatNails", "MeleeBaseBallBatBarbed", "MeleeBaseBallBat"
  23. ];
  24. /****************************************************************************************************************/
  25.  
  26. // Needed on both client and server for vehicle protection
  27. fnc_veh_handleDam2 = fnc_veh_handleDam;
  28. fnc_veh_handleDam = {
  29. if ({(_this select 0) distance (_x select 0) <= (_x select 1)} count DZE_SafeZonePosArray > 0 || {(_this select 0) getVariable ["sz_immunity", false]}) exitWith {0};
  30. _this call fnc_veh_handleDam2;
  31. };
  32.  
  33. if (isServer && {_bubbles}) then {
  34. private "_count";
  35.  
  36. _count = 0;
  37. {
  38. private ["_pos", "_rad"];
  39.  
  40. _pos = _x select 0;
  41. _rad = _x select 1;
  42.  
  43. for "_i" from 0 to 360 step (360 / _rad) do
  44. {
  45. private ["_loc", "_obj"];
  46.  
  47. _loc = [(_pos select 0) + ((cos _i) * _rad), (_pos select 1) + ((sin _i) * _rad), 0];
  48.  
  49. _obj = "Sign_sphere100cm_EP1" createVehicle [0,0,0];
  50. _obj setPosATL _loc;
  51.  
  52. _count = _count + 1;
  53. };
  54. } count DZE_SafeZonePosArray;
  55.  
  56. diag_log format["INFO: Created %1 safe zone bubbles", [_count] call BIS_fnc_numberText];
  57. };
  58.  
  59. if (!isDedicated) then {
  60. private ["_enter", "_exit"];
  61.  
  62. safezone_enabled = false;
  63.  
  64. _enter = {
  65. private ["_msg"];
  66.  
  67. safezone_enabled = true;
  68. isInTraderCity = true;
  69. canbuild = false;
  70. safezone_time = diag_tickTime;
  71.  
  72. vehicle player setCaptive true;
  73.  
  74. if (!DZE_BackpackAntiTheft) then {DZE_BackpackAntiTheft = true;};
  75.  
  76. _msg = localize "STR_CL_SZ_ENTER";
  77. taskHint [_msg, [0,1,0,1], "taskDone"];
  78. // _msg call dayz_rollingMessages;
  79.  
  80. {
  81. if ((vehicle player distance (_x select 0)) < (_x select 1)) then {
  82. szpos = _x select 0; // Get the position of the safe zone in which the player is currently in
  83. szrad = _x select 1; // Get the radius of this safe zone
  84. };
  85. } count DZE_SafeZonePosArray;
  86.  
  87. if (_preventTheft) then {
  88. private "_vehicle";
  89.  
  90. _vehicle = vehicle player;
  91.  
  92. if (isNil "fn_gearMenuChecks1") then { // Make sure vehicle gear checks aren't already disabled
  93. fn_gearMenuChecks1 = fn_gearMenuChecks;
  94. };
  95.  
  96. if (_vehicle != player) then { // Reset owner when entering
  97. if (driver _vehicle == player) then {
  98. private "_owner";
  99.  
  100. _owner = [];
  101. _owner set [count _owner, getPlayerUID player];
  102.  
  103. {
  104. if !(getPlayerUID _x in _owner) then {
  105. _owner set [count _owner, getPlayerUID _x];
  106. };
  107. } count (crew _vehicle);
  108.  
  109. _vehicle setVariable ["Owner", _owner, true];
  110. // localize "STR_CL_SZ_OWNER" call dayz_rollingMessages;
  111. };
  112. };
  113.  
  114. fn_gearMenuChecks = { // Prevent player from accessing gear of vehicles that aren't their's
  115. if (vehicle player == player) then {
  116. private ["_cursorTarget", "_dis"];
  117. disableSerialization;
  118.  
  119. _display = _this select 0;
  120. _cursorTarget = cursorTarget;
  121. _dis = if (_cursorTarget isKindOf "USEC_ch53_E" || {_cursorTarget isKindOf "MV22"}) then {25} else {12};
  122.  
  123. if ((player distance _cursorTarget <= _dis) && {_cursorTarget isKindOf "Air" || {_cursorTarget isKindOf "LandVehicle"} || {_cursorTarget isKindOf "Ship"}}) then {
  124. private ["_owner", "_deny"];
  125.  
  126. _owner = _cursorTarget getVariable ["Owner", []];
  127.  
  128. // Allow group members of the owner to access gear
  129. _deny = true;
  130. {
  131. if (getPlayerUID _x == (_owner select 0)) exitWith {_deny = false;};
  132. } count (units group player);
  133.  
  134. if (getPlayerUID player in _owner) then {_deny = false};
  135.  
  136. if (_deny) then {
  137. _display closeDisplay 2;
  138. localize "STR_CL_SZ_GEAR" call dayz_rollingMessages;
  139. };
  140. };
  141. };
  142.  
  143. // Pass array on to normal gearMenuChecks
  144. _this call fn_gearMenuChecks1;
  145. };
  146. };
  147.  
  148. if (isNil "fnc_usec_damageHandler1") then {
  149. fnc_usec_damageHandler1 = fnc_usec_damageHandler;
  150. };
  151. fnc_usec_damageHandler = {0}; // God mode
  152.  
  153. if (isNil "player_zombieCheck1") then {
  154. player_zombieCheck1 = player_zombieCheck;
  155. };
  156. player_zombieCheck = {false}; // No zombie aggro
  157.  
  158. if (isNil "player_fired1") then {
  159. player_fired1 = player_fired;
  160. };
  161. player_fired = { // Block firing in safe zone
  162. deleteVehicle (_this select 6);
  163. cutText [localize "STR_CL_SZ_FIRE", "WHITE IN"];
  164. };
  165.  
  166. [_speedLimit, _disableWeps, _badWeps, _preventTheft, _removeZ, _removeAI] spawn {
  167. while {safezone_enabled} do
  168. {
  169. private "_vehicle";
  170.  
  171. _vehicle = vehicle player;
  172.  
  173. if (_this select 1) then {
  174. private "_currentWeapon";
  175.  
  176. _currentWeapon = currentWeapon player;
  177.  
  178. if (_currentWeapon in (_this select 2)) then {
  179. player action ["dropWeapon", player, _currentWeapon]; // Drops the weapon and the ammo for it
  180. };
  181. };
  182.  
  183. if (_vehicle != player) then {
  184. // Speed Limit
  185. if ((_this select 0) > 0) then {
  186. if !(_vehicle isKindOf "Air") then {
  187. private "_speed";
  188.  
  189. _speed = abs(speed _vehicle);
  190.  
  191. if (_speed > (_this select 0)) then {
  192. private ["_velocity", "_mod"];
  193.  
  194. _velocity = velocity _vehicle;
  195. _mod = if (_speed > 50) then {0.1} else {0.8};
  196.  
  197. _vehicle setVelocity [(_velocity select 0) * _mod, (_velocity select 1) * _mod, (_velocity select 2) * _mod];
  198. };
  199. };
  200. };
  201. // Remove player from vehicle if they lack ownership or aren't in owner's group
  202. if (_this select 3) then {
  203. private ["_owner", "_deny"];
  204.  
  205. _owner = _vehicle getVariable ["Owner", []];
  206.  
  207. if (driver _vehicle == player && {count _owner == 0}) then { // Set an owner if one doesn't exist
  208. _owner set [count _owner, getPlayerUID player];
  209. _vehicle setVariable ["Owner", _owner, true];
  210. // localize "STR_CL_SZ_OWNER" call dayz_rollingMessages;
  211. };
  212.  
  213. if (count _owner > 0) then {
  214. _deny = true;
  215. {
  216. if (getPlayerUID _x == (_owner select 0)) exitWith {_deny = false;};
  217. } count (units group player);
  218.  
  219. if (getPlayerUID player in _owner) then {_deny = false;};
  220.  
  221. if (_deny) then {
  222. player action ["Eject", _vehicle];
  223. };
  224. };
  225. };
  226. // Prevent player from firing vehicle guns in safe zone
  227. if !(_vehicle getVariable ["safezoneEH", false]) then {
  228. _vehicle setVariable ["safezoneEH", true];
  229. _vehicle addEventHandler ["Fired", {_this call player_fired}];
  230. };
  231. };
  232.  
  233. // Remove zombies from safe zone
  234. if (_this select 4) then {{deleteVehicle _x;} count (szpos nearEntities ["zZombie_Base", szrad]);};
  235.  
  236. // Remove AI from safe zone
  237. if (_this select 5) then {
  238. {
  239. if ((!isNull group _x) && (getPlayerUID _x == '')) then {deleteVehicle _x;};
  240. } count (szpos nearEntities ["Man", szrad]);
  241. };
  242.  
  243. // Prevent player from being unconscious in safe zone
  244. {
  245. player setVariable [_x, false, false];
  246. } count ["NORRN_unconscious", "USEC_isCardiac"];
  247.  
  248. r_player_unconscious = false;
  249. r_player_cardiac = false;
  250.  
  251. uiSleep 0.1;
  252. };
  253. };
  254. };
  255.  
  256. _exit = {
  257. private ["_msg", "_time", "_vehicle"];
  258.  
  259. safezone_enabled = false;
  260. isInTraderCity = false;
  261. canbuild = true;
  262.  
  263. _msg = localize "STR_CL_SZ_EXIT";
  264. taskHint [_msg, [1,0,0,1], "taskFailed"];
  265. // _msg call dayz_rollingMessages;
  266.  
  267. _time = diag_tickTime - safezone_time;
  268. _vehicle = vehicle player;
  269.  
  270. if (_timer > 0) then {
  271. if (_time >= 60) then {
  272. if (_vehicle != player) then {
  273. [_vehicle, _timer] spawn {
  274. (_this select 0) setVariable ["sz_immunity", true, true];
  275. uiSleep (_this select 1);
  276. (_this select 0) setVariable ["sz_immunity", false, true];
  277. };
  278. };
  279. for "_x" from _timer to 1 step -1 do
  280. {
  281. [format[localize "STR_CL_SZ_ENDING", _x], 1] call dayz_rollingMessages;
  282. uiSleep 1;
  283. if ({_vehicle distance (_x select 0) <= (_x select 1)} count DZE_SafeZonePosArray > 0) exitWith {};
  284. };
  285. } else {
  286. format[localize "STR_CL_SZ_TIME", round _time] call dayz_rollingMessages;
  287. };
  288. };
  289.  
  290. // localize "STR_CL_SZ_DISABLED" call dayz_rollingMessages;
  291.  
  292. fnc_usec_damageHandler = fnc_usec_damageHandler1;
  293. player_zombieCheck = player_zombieCheck1;
  294. player_fired = player_fired1;
  295.  
  296. vehicle player setCaptive false;
  297.  
  298. if (_preventTheft) then {
  299. fn_gearMenuChecks = fn_gearMenuChecks1;
  300. };
  301.  
  302. if (_vehicle != player) then {
  303. _vehicle setVariable ["safezoneEH", false];
  304. _vehicle removeAllEventHandlers "Fired";
  305. };
  306. };
  307.  
  308. while {69 == 69} do
  309. {
  310. private ["_vehicle"];
  311.  
  312. _vehicle = vehicle player;
  313.  
  314. if (!safezone_enabled) then {
  315. if ({_vehicle distance (_x select 0) <= (_x select 1)} count DZE_SafeZonePosArray > 0) then {
  316. call _enter;
  317. };
  318. } else {
  319. if !({_vehicle distance (_x select 0) <= (_x select 1)} count DZE_SafeZonePosArray > 0) then {
  320. call _exit;
  321. };
  322. };
  323.  
  324. uiSleep 1;
  325. };
  326. };
  327.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement