mirror of
https://github.com/EpochModTeam/DayZ-Epoch.git
synced 2025-12-13 19:52:38 +03:00
Move zombie and loot related operations from player_spawn_2. They should be in this file. They are used here for accurate counts before spawning zombies and loot. Make better use of global variables for zombie and loot checks. Add lazy eval where appropriate.
192 lines
7.0 KiB
Plaintext
192 lines
7.0 KiB
Plaintext
private ["_zeds","_isWreck","_looted","_zombied","_doNothing","_spawnZedRadius","_serverTime","_age","_position","_speed","_radius","_maxtoCreate","_inVehicle","_isAir","_isLand","_isSea","_Controlledzeddivided","_totalcrew","_nearby","_type","_config","_canSpawn","_dis","_checkLoot","_islocal","_bPos","_zombiesNum"];
|
|
_age = -1;
|
|
_position = [player] call fnc_getPos;
|
|
_speed = speed (vehicle player);
|
|
_radius = 200; //150*0.707; Pointless Processing (106.5)
|
|
_spawnZedRadius = 20;
|
|
|
|
/*
|
|
//Tick Time
|
|
PVDZ_getTickTime = player;
|
|
publicVariableServer "PVDZ_getTickTime";
|
|
*/
|
|
|
|
// Current zombies
|
|
_zeds = entities "zZombie_Base";
|
|
dayz_currentGlobalZombies = count _zeds;
|
|
dayz_spawnZombies = 0;
|
|
dayz_CurrentNearByZombies = 0;
|
|
dayz_maxControlledZombies = dayz_maxLocalZombies; // This variable is also used in building_spawnZombies
|
|
{
|
|
if ((_x distance _position) < 200 && {alive _x}) then {
|
|
if (local _x) then {
|
|
dayz_spawnZombies = dayz_spawnZombies + 1;
|
|
};
|
|
dayz_CurrentNearByZombies = dayz_CurrentNearByZombies + 1;
|
|
};
|
|
} count _zeds;
|
|
|
|
// Current loot spawns
|
|
dayz_currentWeaponHolders = count (_position nearObjects ["ReammoBox",200]);
|
|
|
|
//Limits (Land,Sea,Air)
|
|
_inVehicle = (vehicle player != player);
|
|
/*
|
|
_isAir = vehicle player iskindof "Air";
|
|
_isLand = vehicle player iskindof "Land";
|
|
_isSea = vehicle player iskindof "Sea";
|
|
if (_isLand) then { } else { };
|
|
if (_isAir) then { } else { };
|
|
if (_isSea) then { } else { };
|
|
*/
|
|
|
|
_doNothing = false;
|
|
if (_inVehicle) then {
|
|
_Controlledzeddivided = 0;
|
|
//exit if too fast
|
|
if (_speed > 25) exitwith {_doNothing = true;};
|
|
|
|
//Crew can spawn zeds.
|
|
_totalcrew = count (crew (vehicle player));
|
|
if (_totalcrew > 1) then {
|
|
_Controlledzeddivided = 2;
|
|
|
|
//Dont allow driver to spawn if we have other crew members.
|
|
if (player == driver (vehicle player)) exitwith {_doNothing = true;};
|
|
} else {
|
|
_Controlledzeddivided = 4;
|
|
};
|
|
|
|
if (_Controlledzeddivided > 0) then {
|
|
dayz_maxControlledZombies = round(dayz_maxControlledZombies / _Controlledzeddivided);
|
|
};
|
|
};
|
|
|
|
if (_doNothing) exitwith {};
|
|
|
|
/*if ("ItemMap_Debug" in items player) then {
|
|
deleteMarkerLocal "MaxZeds";
|
|
deleteMarkerLocal "Counter";
|
|
deleteMarkerLocal "Loot30";
|
|
deleteMarkerLocal "Loot120";
|
|
deleteMarkerLocal "Agro80";
|
|
|
|
_markerstr = createMarkerLocal ["MaxZeds", _position];
|
|
_markerstr setMarkerColorLocal "ColorYellow";
|
|
_markerstr setMarkerShapeLocal "ELLIPSE";
|
|
_markerstr setMarkerBrushLocal "Border";
|
|
_markerstr setMarkerSizeLocal [_radius, _radius];
|
|
|
|
_markerstr1 = createMarkerLocal ["Counter", _position];
|
|
_markerstr1 setMarkerColorLocal "ColorRed";
|
|
_markerstr1 setMarkerShapeLocal "ELLIPSE";
|
|
_markerstr1 setMarkerBrushLocal "Border";
|
|
_markerstr1 setMarkerSizeLocal [_radius+100, _radius+100];
|
|
|
|
_markerstr2 = createMarkerLocal ["Agro80", _position];
|
|
_markerstr2 setMarkerColorLocal "ColorRed";
|
|
_markerstr2 setMarkerShapeLocal "ELLIPSE";
|
|
_markerstr2 setMarkerBrushLocal "Border";
|
|
_markerstr2 setMarkerSizeLocal [80, 80];
|
|
|
|
_markerstr2 = createMarkerLocal ["Loot30", _position];
|
|
_markerstr2 setMarkerColorLocal "ColorRed";
|
|
_markerstr2 setMarkerShapeLocal "ELLIPSE";
|
|
_markerstr2 setMarkerBrushLocal "Border";
|
|
_markerstr2 setMarkerSizeLocal [30, 30];
|
|
|
|
_markerstr3 = createMarkerLocal ["Loot120", _position];
|
|
_markerstr3 setMarkerColorLocal "ColorBlue";
|
|
_markerstr3 setMarkerShapeLocal "ELLIPSE";
|
|
_markerstr3 setMarkerBrushLocal "Border";
|
|
_markerstr3 setMarkerSizeLocal [120, 120];
|
|
|
|
diag_log ("LocalZombies: " +str(dayz_spawnZombies) + "/" +str(dayz_maxLocalZombies));
|
|
|
|
//Logging
|
|
diag_log (format["%1 Local.Agents: %2/%3, NearBy.Agents: %8/%9, Global.Agents: %6/%7, W.holders: %10/%11, (radius:%4m %5fps).","SpawnCheck",
|
|
dayz_spawnZombies, dayz_maxControlledZombies, _radius, round diag_fpsmin,dayz_currentGlobalZombies,
|
|
dayz_maxGlobalZeds, dayz_CurrentNearByZombies, dayz_maxNearByZombies, dayz_currentWeaponHolders,dayz_maxMaxWeaponHolders]);
|
|
};*/
|
|
|
|
// nearObjects is faster than nearestObjects when sorting by distance isn't needed
|
|
// "Building" includes House and all of its child classes (Crashsite, IC_Fireplace1, IC_Tent, etc.)
|
|
_nearby = _position nearObjects ["Building",_radius];
|
|
dayz_spawnZombies = dayz_spawnZombies max floor(dayz_maxControlledZombies*.8);
|
|
if (dayz_spawnZombies > 0) then { _spawnZedRadius = _spawnZedRadius * 3; };
|
|
|
|
//Spawn Zeds & loot in buildings
|
|
{
|
|
_type = typeOf _x;
|
|
_config = missionConfigFile >> "CfgLoot" >> "Buildings" >> _type;
|
|
_canSpawn = isClass (_config);
|
|
|
|
if (_canSpawn) then {
|
|
_dis = _x distance player;
|
|
_checkLoot = (count (getArray (_config >> "lootPos"))) > 0;
|
|
_islocal = _x getVariable ["", false]; // object created locally via TownGenerator.
|
|
|
|
//Make sure wrecks always spawn Zeds
|
|
_isWreck = _x isKindOf "CrashSite";
|
|
|
|
//Loot
|
|
if (getNumber(_config >> "lootChance") > 0) then {
|
|
if (dayz_currentWeaponHolders < dayz_maxMaxWeaponHolders) then {
|
|
//Basic loot check
|
|
if ((_dis < 125) and (_dis > 30) and !_inVehicle and _checkLoot) then {
|
|
_serverTime = serverTime;
|
|
_looted = (_x getVariable ["looted",_serverTime]);
|
|
_age = _serverTime - _looted;
|
|
//Building refresh rate
|
|
if (_age == 0 or (_age > getNumber(_config >> "lootRefreshTimer"))) then {
|
|
_x setVariable ["looted",_serverTime,!_islocal];
|
|
[_x,_type,_config] call building_spawnLoot;
|
|
if (!(_x in dayz_buildingBubbleMonitor)) then {
|
|
dayz_buildingBubbleMonitor set [count dayz_buildingBubbleMonitor, _x];
|
|
};
|
|
//diag_log [ diag_tickTime, "new loot at",_x,"age:", _age, "serverTime:", _serverTime];
|
|
}/*
|
|
else {
|
|
diag_log [ diag_tickTime, "won't spawn loot at",_x,"age:", _age, "serverTime:", _serverTime];
|
|
}*/;
|
|
};
|
|
};
|
|
};
|
|
|
|
//Zeds
|
|
if (getNumber(_config >> "zombieChance") > 0) then {
|
|
if (_dis > _spawnZedRadius) then {
|
|
_serverTime = serverTime;
|
|
_zombied = (_x getVariable ["zombieSpawn",_serverTime]);
|
|
_age = _serverTime - _zombied;
|
|
if ((_age == 0) or (_age > 300)) then {
|
|
if (!_isWreck) then {
|
|
if ((dayz_spawnZombies < dayz_maxControlledZombies) && {dayz_CurrentNearByZombies < dayz_maxNearByZombies} && {dayz_currentGlobalZombies < dayz_maxGlobalZeds}) then {
|
|
_bPos = getPosATL _x;
|
|
_zombiesNum = count (_bPos nearEntities ["zZombie_Base",(((sizeOf _type) * 2) + 10)]);
|
|
|
|
if (_zombiesNum == 0) then {
|
|
_x setVariable ["zombieSpawn",_serverTime,!_islocal];
|
|
|
|
if (!(_x in dayz_buildingBubbleMonitor)) then {
|
|
//add active zed to var
|
|
dayz_buildingBubbleMonitor set [count dayz_buildingBubbleMonitor, _x];
|
|
};
|
|
|
|
//start spawn
|
|
[_x,_type,_config] call building_spawnZombies;
|
|
};
|
|
//diag_log (format["%1 building. %2", __FILE__, _x]);
|
|
};
|
|
} else {
|
|
_bPos = getPosATL _x;
|
|
_zombiesNum = count (_bPos nearEntities ["zZombie_Base",(((sizeOf _type) * 2) + 30)]);
|
|
//Should be a wreck
|
|
if (_zombiesNum == 0) then { [_x,_type,_config,_isWreck] call building_spawnZombies; };
|
|
};
|
|
};
|
|
};
|
|
};
|
|
};
|
|
} forEach _nearby;
|