From d750f576eda3949f365b2fc97316b4faec7327d7 Mon Sep 17 00:00:00 2001 From: icomrade Date: Wed, 13 Sep 2017 12:45:00 -0400 Subject: [PATCH] Prevent Zed + loot spawn in safezones thanks BaroN for the idea --- CHANGE LOG 1.0.6.2.txt | 1 + SQF/dayz_code/actions/salvage.sqf | 8 +-- SQF/dayz_code/compile/building_spawnLoot.sqf | 69 +++++++++---------- .../compile/building_spawnZombies.sqf | 15 ++-- SQF/dayz_code/compile/dze_buildChecks.sqf | 4 +- SQF/dayz_code/compile/swarm_generate.sqf | 2 +- SQF/dayz_code/compile/zombie_generate.sqf | 4 +- SQF/dayz_code/configVariables.sqf | 2 +- SQF/dayz_code/init/compiles.sqf | 10 +++ .../compile/zombie_Wildgenerate.sqf | 2 +- 10 files changed, 61 insertions(+), 56 deletions(-) diff --git a/CHANGE LOG 1.0.6.2.txt b/CHANGE LOG 1.0.6.2.txt index a72dc4a32..5b0ca1eeb 100644 --- a/CHANGE LOG 1.0.6.2.txt +++ b/CHANGE LOG 1.0.6.2.txt @@ -17,6 +17,7 @@ [UPDATED] Locking and unlocking safes now uses call instead of spawn on the server. This fixes the user input lock and safes appearing to disappear momentarily when server FPS is low. [UPDATED] Added cleanup of destroyed vehicles and CraterLong after 25 minutes in sched_corpses.sqf [UPDATED] Reverted group menu color scheme to A2OA default for consistency with game dialogs +[UPDATED] Positions defined in DZE_SafeZonePosArray no longer spawn loot or zombies in their respective radius, added new compile to check positions against DZE_SafeZonePosArray "_PosInSafeZone = _positionToCheck call DZE_SafeZonePosCheck;" [FIXED] Kamaz refuel trucks no longer allow automatic refueling. #1855 @coresync2k @dreamforceinc [FIXED] Trees at POIs can be chopped down now. Other trees spawned with createVehicle can be added to dayz_treeTypes in variables.sqf to allow chopping them down. diff --git a/SQF/dayz_code/actions/salvage.sqf b/SQF/dayz_code/actions/salvage.sqf index 84a0ab30b..dfce86123 100644 --- a/SQF/dayz_code/actions/salvage.sqf +++ b/SQF/dayz_code/actions/salvage.sqf @@ -1,4 +1,4 @@ -private ["_array","_vehicle","_part","_hitpoint","_type","_isOK","_brokenPart","_cancel","_finished","_hasToolbox","_nameType","_namePart","_damage","_BreakableParts","_selection","_wpn","_classname","_ismelee"]; +private ["_array","_vehicle","_part","_hitpoint","_type","_isOK","_brokenPart","_finished","_hasToolbox","_nameType","_namePart","_damage","_BreakableParts","_selection","_wpn","_classname","_ismelee"]; if (dayz_actionInProgress) exitWith {localize "str_player_actionslimit" call dayz_rollingMessages;}; dayz_actionInProgress = true; @@ -11,7 +11,6 @@ _type = typeOf _vehicle; _isOK = false; _brokenPart = false; _hasToolbox = "ItemToolbox" in items player; -_cancel = false; _nameType = getText(configFile >> "cfgVehicles" >> _type >> "displayName"); _namePart = getText(configFile >> "cfgMagazines" >> _part >> "displayName"); @@ -21,10 +20,7 @@ s_player_repairActions = []; s_player_repair_crtl = 1; if (_hasToolbox) then { - { - if ((_vehicle distance (_x select 0)) < (_x select 1)) exitWith {_cancel = true;}; - } count DZE_SafeZonePosArray; - if (_cancel) exitWith { (localize "str_salvage_safezone") call dayz_rollingMessages;}; + if (_vehicle call DZE_SafeZonePosCheck) exitWith {(localize "str_salvage_safezone") call dayz_rollingMessages;}; [player,"repair",0,false] call dayz_zombieSpeak; [player,50,true,(getPosATL player)] call player_alertZombies; diff --git a/SQF/dayz_code/compile/building_spawnLoot.sqf b/SQF/dayz_code/compile/building_spawnLoot.sqf index 1d5b70ed9..bd3f1607a 100644 --- a/SQF/dayz_code/compile/building_spawnLoot.sqf +++ b/SQF/dayz_code/compile/building_spawnLoot.sqf @@ -39,27 +39,25 @@ if (_lootChance <= 0) exitWith {}; _lootPos = getArray (_config >> "lootPos"); _lootGroup = Loot_GetGroup(getText(_config >> "lootGroup")); -{ - //Get the world position of the spawn position - _worldPos = _this modelToWorld _x; - _worldPos set [2, 0 max (_worldPos select 2)]; - - //Delete existing lootpiles within 1m of spawn location if no player is right next to it +if (!(_this call DZE_SafeZonePosCheck)) then { { - if ({isPlayer _x} count (_x nearEntities ["CAManBase",4]) == 0) then { - deleteVehicle _x; - dayz_currentWeaponHolders = dayz_currentWeaponHolders - 1; + //Get the world position of the spawn position + _worldPos = _this modelToWorld _x; + _worldPos set [2, 0 max (_worldPos select 2)]; + //Delete existing lootpiles within 1m of spawn location if no player is right next to it + { + if ({isPlayer _x} count (_x nearEntities ["CAManBase",4]) == 0) then { + deleteVehicle _x; + dayz_currentWeaponHolders = dayz_currentWeaponHolders - 1; + }; + } foreach (_worldPos nearObjects ["ReammoBox", 1]); + + if (_lootChance > random 1 && {dayz_currentWeaponHolders < dayz_maxMaxWeaponHolders}) then + { + Loot_SpawnGroup(_lootGroup, _worldPos); }; - } - foreach (_worldPos nearObjects ["ReammoBox", 1]); - - if (_lootChance > random 1 && {dayz_currentWeaponHolders < dayz_maxMaxWeaponHolders}) then - { - Loot_SpawnGroup(_lootGroup, _worldPos); - }; -} -foreach _lootPos; - + } foreach _lootPos; +}; // EPOCH ADDITION // lootPosSmall are additional positions in lockers, on shelves, etc. for small objects only. // Example: soda cans, small ammo, pistols, bandage, etc. @@ -68,24 +66,25 @@ if (isArray (_config >> "lootPosSmall")) then { _lootPos = getArray (_config >> "lootPosSmall"); _lootGroup = Loot_GetGroup((getText(_config >> "lootGroup")) + "Small"); if (_lootGroup >= 1) then { - { - //Get the world position of the spawn position - _worldPos = _this modelToWorld _x; - _worldPos set [2, 0 max (_worldPos select 2)]; - - //Delete existing lootpiles within 1m of spawn location + if (!(_this call DZE_SafeZonePosCheck)) then { { - deleteVehicle _x; - dayz_currentWeaponHolders = dayz_currentWeaponHolders - 1; - } - foreach (_worldPos nearObjects ["ReammoBox", 1]); + //Get the world position of the spawn position + _worldPos = _this modelToWorld _x; + _worldPos set [2, 0 max (_worldPos select 2)]; + //Delete existing lootpiles within 1m of spawn location if no player is right next to it + { + if ({isPlayer _x} count (_x nearEntities ["CAManBase",4]) == 0) then { + deleteVehicle _x; + dayz_currentWeaponHolders = dayz_currentWeaponHolders - 1; + }; + } foreach (_worldPos nearObjects ["ReammoBox", 1]); - if (_lootChance > random 1 && {dayz_currentWeaponHolders < dayz_maxMaxWeaponHolders}) then - { - Loot_SpawnGroup(_lootGroup, _worldPos); - }; - } - foreach _lootPos; + if (_lootChance > random 1 && {dayz_currentWeaponHolders < dayz_maxMaxWeaponHolders}) then + { + Loot_SpawnGroup(_lootGroup, _worldPos); + }; + } foreach _lootPos; + }; } else { diag_log format["Loot group small: %1 does not exist", ((getText(_config >> "lootGroup")) + "Small")]; }; diff --git a/SQF/dayz_code/compile/building_spawnZombies.sqf b/SQF/dayz_code/compile/building_spawnZombies.sqf index dd1191b3f..47d6c4082 100644 --- a/SQF/dayz_code/compile/building_spawnZombies.sqf +++ b/SQF/dayz_code/compile/building_spawnZombies.sqf @@ -33,12 +33,13 @@ if (_canLoot ) then { //Walking Zombies _num = (round(random _max)) max _min; // + round(_max / 3); //diag_log ("Class: " + _type + " / Zombies: " + str(_unitTypes) + " / Walking: " + str(_num)); - - for "_i" from 0 to _num do - { - //_iPos = _obj modelToWorld _originalPos; - if ((_maxlocalspawned < _maxControlledZombies) and (dayz_CurrentNearByZombies < dayz_maxNearByZombies) and (dayz_currentGlobalZombies < dayz_maxGlobalZeds)) then { - [_originalPos,true,_unitTypes,_wreck] call zombie_generate; + if(!(_originalPos call DZE_SafeZonePosCheck)) then { + for "_i" from 0 to _num do + { + //_iPos = _obj modelToWorld _originalPos; + if ((_maxlocalspawned < _maxControlledZombies) and (dayz_CurrentNearByZombies < dayz_maxNearByZombies) and (dayz_currentGlobalZombies < dayz_maxGlobalZeds)) then { + [_originalPos,true,_unitTypes,_wreck] call zombie_generate; + }; }; }; @@ -51,7 +52,7 @@ if (_canLoot ) then { { _Pos = [_x select 0, _x select 1, 0]; _rnd = random 1; - if (_rnd < _zombieChance) then { + if (_rnd < _zombieChance && {!(_Pos call DZE_SafeZonePosCheck)}) then { _iPos = _obj modelToWorld _Pos; _nearByZed = {alive _x} count (_iPos nearEntities ["zZombie_Base",(((sizeOf _type) * 2) + 10)]) > 0; _nearByPlayer = ({isPlayer _x} count (_iPos nearEntities ["CAManBase",30])) > 0; diff --git a/SQF/dayz_code/compile/dze_buildChecks.sqf b/SQF/dayz_code/compile/dze_buildChecks.sqf index 60447cc2d..2660b8916 100644 --- a/SQF/dayz_code/compile/dze_buildChecks.sqf +++ b/SQF/dayz_code/compile/dze_buildChecks.sqf @@ -108,9 +108,7 @@ if !(dayz_playerUID in DZE_PlotManagementAdmins) then { _buildCheck = call _checkClass; if (_buildCheck select 0) then { - { - if ((player distance (_x select 0)) < _buildCheck select 1) exitWith {_canBuild = false;}; - } count DZE_safeZonePosArray; + _canBuild = !((getPosATL player) call DZE_SafeZonePosCheck); }; if !(_canBuild) exitWith {dayz_actionInProgress = false; format [localize "STR_EPOCH_PLAYER_166",_text,_buildCheck select 1] call dayz_rollingMessages; [false, _isPole];}; diff --git a/SQF/dayz_code/compile/swarm_generate.sqf b/SQF/dayz_code/compile/swarm_generate.sqf index 03db27803..13534f2c2 100644 --- a/SQF/dayz_code/compile/swarm_generate.sqf +++ b/SQF/dayz_code/compile/swarm_generate.sqf @@ -12,7 +12,7 @@ while {_counter < _amount} do { _type = "swarm_newBase"; //"_unitTypes call BIS_fnc_selectRandom; //_type = "Pastor"; _position = [position _player,50,100,0] call fn_selectRandomLocation; - + if(_position call DZE_SafeZonePosCheck) exitWith {}; _agent = createAgent [_type, _position, [], 0, "NONE"]; _agent setVariable["agentObjectSwarm",_agent,true]; diff --git a/SQF/dayz_code/compile/zombie_generate.sqf b/SQF/dayz_code/compile/zombie_generate.sqf index 3379b5027..fcb739755 100644 --- a/SQF/dayz_code/compile/zombie_generate.sqf +++ b/SQF/dayz_code/compile/zombie_generate.sqf @@ -62,11 +62,11 @@ _cantSee = { _skipFOV = false; if ((_maxlocalspawned < _maxControlledZombies) && (dayz_CurrentNearByZombies < dayz_maxNearByZombies) && (dayz_currentGlobalZombies < dayz_maxGlobalZeds)) then { - if (_bypass) then { + if (_bypass) then { _skipFOV = true; _position = [_position,3,20,1] call fn_selectRandomLocation; }; - + if(_position call DZE_SafeZonePosCheck) exitWith {}; if (surfaceIsWater _position) exitWith { diag_log "Location is in Water Abort"; }; if ((_skipFOV) or {([_position, 15, 10, 70] call _cantSee)}) then { diff --git a/SQF/dayz_code/configVariables.sqf b/SQF/dayz_code/configVariables.sqf index 680ab6135..b6ed4b0bb 100644 --- a/SQF/dayz_code/configVariables.sqf +++ b/SQF/dayz_code/configVariables.sqf @@ -25,7 +25,7 @@ DZE_UI = "vanilla"; //"vanilla","epoch","dark" UI status icons style. Dark acco DZE_VanillaUICombatIcon = true; //Display or hide combat UI icon if using DZE_UI = "vanilla"; otherwise it has no affect. timezoneswitch = 0; // Changes murderMenu times with this offset in hours. DZE_NoVehicleExplosions = false; //Disable vehicle explosions to prevent damage to objects by ramming. Doesn't work with amphibious pook which should not be used due to FPS issues. -DZE_SafeZonePosArray = []; //Prevent players in safeZones from being killed if their vehicle is destroyed. Format is [[[3D POS], RADIUS],[[3D POS], RADIUS]]; Ex. DZE_SafeZonePosArray = [[[6325.6772,7807.7412,0],150],[[4063.4226,11664.19,0],150]]; +DZE_SafeZonePosArray = []; //Prevent players in safeZones from being killed if their vehicle is destroyed. Format is [[[3D POS], RADIUS],[[3D POS], RADIUS]]; Ex. DZE_SafeZonePosArray = [[[6325.6772,7807.7412,0],150],[[4063.4226,11664.19,0],150]]; ALSO excludes positions from loot and zombie spawn, as well as salvage actions DZE_SafeZoneNoBuildItems = []; // Array of object class names not allowed to be built near the safe zones listed above. Can be nested arrays for custom distances. i.e ["VaultStorageLocked","LockboxStorageLocked",["Plastic_Pole_EP1_DZ",1300]] etc. DZE_SafeZoneNoBuildDistance = 150; // Distance from safe zones listed above to disallow building near. DZE_NoBuildNear = []; //Array of object class names that are blacklisted to build near. i.e ["Land_Mil_ControlTower","Land_SS_hangar"] etc. diff --git a/SQF/dayz_code/init/compiles.sqf b/SQF/dayz_code/init/compiles.sqf index a963767d9..6eff2c174 100644 --- a/SQF/dayz_code/init/compiles.sqf +++ b/SQF/dayz_code/init/compiles.sqf @@ -845,3 +845,13 @@ dayz_engineSwitch = { publicVariableServer "PVDZ_send"; }; }; + +DZE_SafeZonePosCheck = { + private ["_position","_skipPos"]; + _position = _this; + _skipPos = false; + { + if ((_position distance (_x select 0)) < (_x select 1)) exitWith {_skipPos = true;}; + } forEach DZE_SafeZonePosArray; + _skipPos; +}; diff --git a/SQF/dayz_server/compile/zombie_Wildgenerate.sqf b/SQF/dayz_server/compile/zombie_Wildgenerate.sqf index e5468af75..8eb6d70d3 100644 --- a/SQF/dayz_server/compile/zombie_Wildgenerate.sqf +++ b/SQF/dayz_server/compile/zombie_Wildgenerate.sqf @@ -17,7 +17,7 @@ while {_counter < _amount} do { _method = "CAN_COLLIDE"; _position = [getMarkerPos "center",1,6500,1] call fn_selectRandomLocation; - + if(_position call DZE_SafeZonePosCheck) exitWith {}; //Create Zed _agent = createAgent [_type, _position, [], 1, _method]; //Set Random Direction