mirror of
https://github.com/EpochModTeam/DayZ-Epoch.git
synced 2025-12-13 19:52:38 +03:00
Checking for near zombies and players in the forEach loop is inappropriate and inefficient. Because it was checking for near zombies, the internal zombies were not spawning at all. It appeared that they were because the walking zombies were using the building position plus the radius option on createAgent. fn_selectRandomLocation using the size of the object as the minimum distance prevents the zombies from potentially spawning into objects and dying. The max distance for the crash site zombies is increased a bit so they can spawn farther away from the object since they are in an open field. The position on the internal zombies should not have the z coordinate automatically set to zero. This prevents the zombies from spawning at positions on upper floors of buildings.
45 lines
1.8 KiB
Plaintext
45 lines
1.8 KiB
Plaintext
/*
|
|
Created exclusively for ArmA2:OA - DayZMod.
|
|
Please request permission to use/alter/distribute from project leader (R4Z0R49)
|
|
*/
|
|
private ["_type","_position","_minDist","_maxDist","_isWreck","_nearByPlayer","_iPos","_positions","_zombieChance","_unitTypes","_min","_max","_num","_clean","_obj","_config","_i","_objPos"];
|
|
_obj = _this select 0;
|
|
_objPos = _this select 1;
|
|
_config = _this select 2;
|
|
_isWreck = _this select 3;
|
|
_type = typeOf _obj;
|
|
|
|
if (!([_objPos] call DZE_SafeZonePosCheck)) then {
|
|
|
|
_unitTypes = getArray (_config >> "zombieClass");
|
|
_min = getNumber (_config >> "minRoaming");
|
|
_max = getNumber (_config >> "maxRoaming");
|
|
_zombieChance = getNumber (_config >> "zombieChance");
|
|
_num = round(random(_max - _min) + _min);
|
|
_minDist = (sizeOf _type);
|
|
_maxDist = if (_isWreck) then {(_minDist + 20)} else {(_minDist + 10)}; // zeds at crash sites can spawn further away.
|
|
|
|
// Walking Zombies
|
|
for "_i" from 0 to _num do {
|
|
if ((dayz_spawnZombies < dayz_maxControlledZombies) && {dayz_CurrentNearByZombies < dayz_maxNearByZombies} && {dayz_currentGlobalZombies < dayz_maxGlobalZeds}) then {
|
|
_position = [_objPos,_minDist,_maxDist,1] call fn_selectRandomLocation;
|
|
[_position,true,_unitTypes,_isWreck,false] call zombie_generate;
|
|
};
|
|
};
|
|
|
|
// Internal Zombies
|
|
_nearByPlayer = ({isPlayer _x} count (_objPos nearEntities ["CAManBase",30])) > 0;
|
|
if (!_nearByPlayer) then {
|
|
_positions = getArray (_config >> "zedPos");
|
|
{
|
|
if (random 1 < _zombieChance) then {
|
|
_iPos = _obj modelToWorld _x;
|
|
_iPos set [2, 0 max (_iPos select 2)];
|
|
if ((dayz_spawnZombies < dayz_maxControlledZombies) && {dayz_CurrentNearByZombies < dayz_maxNearByZombies} && {dayz_currentGlobalZombies < dayz_maxGlobalZeds}) then {
|
|
[_iPos,false,_unitTypes,false,true] call zombie_generate;
|
|
};
|
|
};
|
|
} forEach _positions;
|
|
};
|
|
};
|