arma2-epoch-server/MPMissions/DayZ_Epoch_24.Napf/scripts/safe_zones.sqf
2022-04-21 16:15:41 +03:00

302 lines
8.9 KiB
Plaintext
Executable File

/*
File: safe_zones.sqf
Creates safe zones in predefined areas (DZE_SafeZonePosArray)
Author: BigEgg
https://github.com/BigEgg17
*/
private ["_bubbles", "_speedLimit", "_preventTheft", "_timer", "_disableWeps", "_badWeps"];
/**************************************************** Config ****************************************************/
_bubbles = false; // Creates a circle of bubbles marking the circumference of the safe zone.
_speedLimit = 0; // Speed limit in safe zones. Set to 0 to disable speed limit.
_preventTheft = true; // Prevent vehicles from being stolen by assigning them an owner (this includes gear).
_timer = 0; // Delay ending safe zone protection for this many seconds upon leaving. Set to 0 to disable timer.
_disableWeps = false; // Drops any weapons in _badWeps array.
_badWeps = [ // Will remove these weapons from the player if they try to select them. Only used if _disableWeps = true.
"Vil_RPG29", "Vil_RPO_A", "Vil_RPG16", "Vil_RPG7V_PGO", "Vil_Panzerfaust3", "M136", "RPG7V", "vil_CG84T", "vilas_rpg22", "vilas_rpg26", "MAAWS", "Vil_RPG7d_PGO",
"RPG18", "MeleeHatchet", "MeleeCrowbar","MeleeMachete", "MeleeFishingPole", "MeleeSledge", "MeleeBaseBallBatNails", "MeleeBaseBallBatBarbed", "MeleeBaseBallBat"
];
/****************************************************************************************************************/
// Needed on both client and server for vehicle protection
fnc_veh_handleDam2 = fnc_veh_handleDam;
fnc_veh_handleDam = {
if ({(_this select 0) distance (_x select 0) <= (_x select 1)} count DZE_SafeZonePosArray > 0 || {(_this select 0) getVariable ["sz_immunity", false]}) exitWith {0};
_this call fnc_veh_handleDam2;
};
if (isServer && {_bubbles}) then {
private "_count";
_count = 0;
{
private ["_pos", "_rad"];
_pos = _x select 0;
_rad = _x select 1;
for "_i" from 0 to 360 step (1440 / _rad) do
{
private ["_loc", "_obj"];
_loc = [(_pos select 0) + ((cos _i) * _rad), (_pos select 1) + ((sin _i) * _rad), 0];
_obj = "Sign_sphere100cm_EP1" createVehicle [0,0,0];
_obj setPosATL _loc;
_count = _count + 1;
};
} count DZE_SafeZonePosArray;
diag_log format["INFO: Created %1 safe zone bubbles", [_count] call BIS_fnc_numberText];
};
if (!isDedicated) then {
private ["_enter", "_exit"];
safezone_enabled = false;
_enter = {
private "_msg";
safezone_enabled = true;
isInTraderCity = true;
canbuild = false;
safezone_time = diag_tickTime;
if (!DZE_BackpackAntiTheft) then {DZE_BackpackAntiTheft = true;};
_msg = localize "STR_CL_SZ_ENTER";
taskHint [_msg, [0,1,0,1], "taskDone"];
_msg call dayz_rollingMessages;
if (_preventTheft) then {
private "_vehicle";
_vehicle = vehicle player;
if (isNil "fn_gearMenuChecks1") then { // Make sure vehicle gear checks aren't already disabled
fn_gearMenuChecks1 = fn_gearMenuChecks;
};
if (_vehicle != player) then { // Reset owner when entering
if (driver _vehicle == player) then {
private "_owner";
_owner = [];
_owner set [count _owner, getPlayerUID player];
{
if !(getPlayerUID _x in _owner) then {
_owner set [count _owner, getPlayerUID _x];
};
} count (crew _vehicle);
_vehicle setVariable ["Owner", _owner, true];
localize "STR_CL_SZ_OWNER" call dayz_rollingMessages;
};
};
fn_gearMenuChecks = { // Prevent player from accessing gear of vehicles that aren't their's
if (vehicle player == player) then {
private ["_cursorTarget", "_dis"];
disableSerialization;
_display = _this select 0;
_cursorTarget = cursorTarget;
_dis = if (_cursorTarget isKindOf "USEC_ch53_E" || {_cursorTarget isKindOf "MV22"}) then {25} else {12};
if ((player distance _cursorTarget <= _dis) && {_cursorTarget isKindOf "Air" || {_cursorTarget isKindOf "LandVehicle"} || {_cursorTarget isKindOf "Ship"}}) then {
private ["_owner", "_deny"];
_owner = _cursorTarget getVariable ["Owner", []];
// Allow group members of the owner to access gear
_deny = true;
{
if (getPlayerUID _x == (_owner select 0)) exitWith {_deny = false;};
} count (units group player);
if (getPlayerUID player in _owner) then {_deny = false};
if (_deny) then {
_display closeDisplay 2;
localize "STR_CL_SZ_GEAR" call dayz_rollingMessages;
};
};
};
// Pass array on to normal gearMenuChecks
_this call fn_gearMenuChecks1;
};
};
if (isNil "fnc_usec_damageHandler1") then {
fnc_usec_damageHandler1 = fnc_usec_damageHandler;
};
fnc_usec_damageHandler = {0}; // God mode
if (isNil "player_zombieCheck1") then {
player_zombieCheck1 = player_zombieCheck;
};
player_zombieCheck = {false}; // No zombie aggro
if (isNil "player_fired1") then {
player_fired1 = player_fired;
};
player_fired = { // Block firing in safe zone
deleteVehicle (_this select 6);
cutText [localize "STR_CL_SZ_FIRE", "WHITE IN"];
};
[_speedLimit, _disableWeps, _badWeps, _preventTheft] spawn {
while {safezone_enabled} do
{
private "_vehicle";
_vehicle = vehicle player;
if (_this select 1) then {
private "_currentWeapon";
_currentWeapon = currentWeapon player;
if (_currentWeapon in (_this select 2)) then {
player action ["dropWeapon", player, _currentWeapon]; // Drops the weapon and the ammo for it
};
};
if (_vehicle != player) then {
// Speed Limit
if ((_this select 0) > 0) then {
if !(_vehicle isKindOf "Air") then {
private "_speed";
_speed = abs(speed _vehicle);
if (_speed > (_this select 0)) then {
private ["_velocity", "_mod"];
_velocity = velocity _vehicle;
_mod = if (_speed > 50) then {0.1} else {0.8};
_vehicle setVelocity [(_velocity select 0) * _mod, (_velocity select 1) * _mod, (_velocity select 2) * _mod];
};
};
};
// Remove player from vehicle if they lack ownership or aren't in owner's group
if (_this select 3) then {
private ["_owner", "_deny"];
_owner = _vehicle getVariable ["Owner", []];
if (driver _vehicle == player && {count _owner == 0}) then { // Set an owner if one doesn't exist
_owner set [count _owner, getPlayerUID player];
_vehicle setVariable ["Owner", _owner, true];
localize "STR_CL_SZ_OWNER" call dayz_rollingMessages;
};
if (count _owner > 0) then {
_deny = true;
{
if (getPlayerUID _x == (_owner select 0)) exitWith {_deny = false;};
} count (units group player);
if (getPlayerUID player in _owner) then {_deny = false;};
if (_deny) then {
player action ["Eject", _vehicle];
};
};
};
// Prevent player from firing vehicle guns in safe zone
if !(_vehicle getVariable ["safezoneEH", false]) then {
_vehicle setVariable ["safezoneEH", true];
_vehicle addEventHandler ["Fired", {_this call player_fired}];
};
};
// Prevent player from being unconscious in safe zone
{
player setVariable [_x, false, false];
} count ["NORRN_unconscious", "USEC_isCardiac"];
r_player_unconscious = false;
r_player_cardiac = false;
uiSleep 0.1;
};
};
};
_exit = {
private ["_msg", "_time", "_vehicle"];
safezone_enabled = false;
isInTraderCity = false;
canbuild = true;
_msg = localize "STR_CL_SZ_EXIT";
taskHint [_msg, [1,0,0,1], "taskFailed"];
_msg call dayz_rollingMessages;
_time = diag_tickTime - safezone_time;
_vehicle = vehicle player;
if (_timer > 0) then {
if (_time >= 60) then {
if (_vehicle != player) then {
[_vehicle, _timer] spawn {
(_this select 0) setVariable ["sz_immunity", true, true];
uiSleep (_this select 1);
(_this select 0) setVariable ["sz_immunity", false, true];
};
};
for "_x" from _timer to 1 step -1 do
{
[format[localize "STR_CL_SZ_ENDING", _x], 1] call dayz_rollingMessages;
uiSleep 1;
if ({_vehicle distance (_x select 0) <= (_x select 1)} count DZE_SafeZonePosArray > 0) exitWith {};
};
} else {
format[localize "STR_CL_SZ_TIME", round _time] call dayz_rollingMessages;
};
};
localize "STR_CL_SZ_DISABLED" call dayz_rollingMessages;
fnc_usec_damageHandler = fnc_usec_damageHandler1;
player_zombieCheck = player_zombieCheck1;
player_fired = player_fired1;
if (_preventTheft) then {
fn_gearMenuChecks = fn_gearMenuChecks1;
};
if (_vehicle != player) then {
_vehicle setVariable ["safezoneEH", false];
_vehicle removeAllEventHandlers "Fired";
};
};
while {69 == 69} do
{
private "_vehicle";
_vehicle = vehicle player;
if (!safezone_enabled) then {
if ({_vehicle distance (_x select 0) <= (_x select 1)} count DZE_SafeZonePosArray > 0) then {
call _enter;
};
} else {
if !({_vehicle distance (_x select 0) <= (_x select 1)} count DZE_SafeZonePosArray > 0) then {
call _exit;
};
};
uiSleep 1;
};
}