_frequency = getNumber (missionConfigFile >> "CfgVehiclesSpawner" >> "frequency");
_variance = getNumber (missionConfigFile >> "CfgVehiclesSpawner" >> "variance");
_objectdistanse = getNumber (missionConfigFile >> "CfgVehiclesSpawner" >> "objectdistanse");
if (_objectdistanse == 0) then {_objectdistanse = 700;};
_centerMap = getArray (configFile >> "cfgWorlds" >> worldName >> "safePositionAnchor"); //берем центр карты
_mapSize = (getNumber (configFile>>"CfgWorlds">>worldName>>"mapSize"))/2;
if (_mapSize == 0) then {_mapSize = 8000;};
_spawnquantity = getNumber (missionConfigFile >> "CfgVehiclesSpawner" >> "spawnquantity"); //количество раундов
if (_spawnquantity == 0) then {_spawnquantity = 50;}; //если в конфиге не указанно то ставим в 50
_vtypeground = ["Car","Armored","Autonomous","Support"]; //наземный транспорт
_vtypewater =["Ship","Submarine"]; //водный транспорт
_vtypeground = ["Air"]; // воздушный транспорт
diag_log format["Vehacle Spavn"];
_list = [];
_dzpos = [];
_timeAdjust = round(random(_variance * 2) - _variance);
_timeToSpawn = time + _frequency + _timeAdjust;
while {time < _timeToSpawn} do {
sleep 5;
};
//_fainds = 0; //начальное количество попыток поиска точки для спавана
//while{((count vehicles) < _spawnquantity)} do {
while{({_x isKindOf "AllVehicles"} count dayz_serverObjectMonitor < _spawnquantity)} do {
//if ({_x isKindOf "AllVehicles"} count dayz_serverObjectMonitor < _spawnquantity) then {
_vehicleType = ["Civilian","Military"];
_vehicleTypeModel = _vehicleType call BIS_fnc_selectRandom;
_arrayVehiclesModel = getArray (missionConfigFile >> "CfgVehiclesSpawner" >> _vehicleTypeModel );
_vehicleModel = _arrayVehiclesModel call BIS_fnc_selectRandom;
_vehicleName = getText (configFile >> "CfgVehicles" >> (_vehicleModel select 0) >> "displayName");
_vehicleClass = getText(configFile >> "CfgVehicles" >> (_vehicleModel select 0) >> "vehicleClass");
_vehacle = _vehicleModel select 0;
_mindist = getNumber (configFile >> "CfgVehicles" >> _vehacle >> "mapSize"); // берем размер объекта
if (_mindist == 0) then {_mindist = 7.61;};
Dz_findpos = {
private ["_centerMap","_mindist","_vehacle","_favouritezones","_list","_PosList","_PosSelect","_Pos","_max_distance","_position"];
_centerMap = _this select 0;
_mindist = _this select 1;
_vehacle = _this select 2;
_favouritezones = _this select 3;
_list = [];
_PosList = selectbestplaces [_centerMap,_mapSize,_favouritezones,100,1]; //выбераем места для спавана
_Pos = (_PosList select 0) select 0; //забираем точку из массива
_list = _Pos nearEntities [_vehacle,_objectdistanse]; //проверяем наличие рядом уже установленных объектов
_max_distance = 100; //макс дистанция для поиска точки (может увеличиваться)
_position = []; //нужно для поиска точки
while{(count _position < 1) and (count _list < 1)} do //если нет точки, и нет рядом объекта ищем точку
{
_position = _Pos findEmptyPosition[_mindist, _max_distance, _vehacle]; //ищем свободное место на точке
_max_distance = _max_distance + 5; //если не нашли то прибавляем 10 метров
if (_max_distance > 300) then{
_PosList = selectbestplaces [_centerMap,_mapSize,_favouritezones,100,1];
_Pos = (_PosList select 0) select 0;
_list = _Pos nearEntities [_vehacle, 500];
_max_distance = 100;
};
diag_log format["Vehacle %1. max %2, min %3, list: %4,class: %5, position: %6",_vehacle,_max_distance,_mindist,(count _list < 1),_vehicleClass,(count _position < 1)];
};
_position
};
DZ_createVehicle ={
_vehacle = _this select 0;
_dzpos = _this select 1;
_veh = createVehicle [_vehacle,_dzpos, [], 0, "CAN_COLLIDE"];
// Randomize the direction the vehicle is facing
_veh setDir round(random 360);
dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_veh];
_veh setVariable ["ObjectID",1,true];
clearWeaponCargoGlobal _veh;
clearMagazineCargoGlobal _veh;
clearItemCargoGlobal _veh;
_idKey = ([arrayObjectID,1] call BIS_fnc_findExtreme) + 1;
arrayObjectID set [count arrayObjectID, _idKey];
_veh setVariable ["ObjectID", str(_idKey), true];
_worldspace = [getDir _veh ,getPosATL _veh];
_uid = _worldspace call dayz_objectUID2;
_charID = 0;
_veh setVariable ["CharacterID", str(_charID), true];
_HitPoints = _veh call vehicle_getHitpoints;
_array = [];
{
_selection = getText (configFile >> "CfgVehicles" >> (typeOf _veh) >> "HitPoints" >> _x >> "name");
// _Hit = random 1;
_Hit = [0, 0.5, 1] call BIS_fnc_selectRandom;
if (_hit > 0) then {_array set [count _array,[_selection,_hit]]};
if (_selection != "" and local _veh) then {
_strH = "hit_" + (_selection);
_veh setHit[_selection, _Hit];
_veh setVariable [_strH,_Hit,true];
};
// [_veh,_selection,_Hit] call object_setFixServer;
} forEach _HitPoints;
_Fuel = random 1;
_veh setFuel _Fuel;
//Send request
_key = format["CHILD:308:%1:%2:%3:%4:%5:%6:%7:%8:%9:",dayZ_instance, (typeOf _veh), 0 , _charID, _worldspace, [], _array, _Fuel,_uid];
diag_log ("HIVE: WRITE: "+ str(_key));
_key call server_hiveWrite;
_veh setVariable ["lastUpdate",time];
// needUpdate_objects set [count needUpdate_objects,_veh];
dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_veh];
_veh call fnc_vehicleEventHandler;
};
if ((count (allMissionObjects (_vehicleModel select 0))) < (_vehicleModel select 1)) then {
_fainds = 1;
switch (_vehicleTypeModel) do {
default {
_mark=false;
};
case "Civilian": {
if ((_vehacle isKindOf "Car") or (_vehacle isKindOf "Armored") or (_vehacle isKindOf "Support") or (_vehacle isKindOf "Autonomous")) then {
DZ_mark="car_civ";
};
if (_vehacle isKindOf "Air") then {
DZ_mark="air_civ";
};
if ((_vehacle isKindOf "Ship") or (_vehacle isKindOf "Submarine")) then {
DZ_mark="ship_civ";
};
};
case "Military": {
if ((_vehacle isKindOf "Car") or (_vehacle isKindOf "Armored") or (_vehacle isKindOf "Support") or (_vehacle isKindOf "Autonomous")) then {
DZ_mark="car_mil";
};
if (_vehacle isKindOf "Air") then {
DZ_mark="air_mil";
};
if ((_vehacle isKindOf "Ship") or (_vehacle isKindOf "Submarine")) then {
DZ_mark="ship_mil";
};
};
};
switch (DZ_mark) do {
default {
while{(_fainds > 0)} do {
_favouritezones = "(1 + houses) * (1 + meadow)"; //выставляем приоритет позиции
_dzpos = [_centerMap,_mindist,_vehacle,_favouritezones] call Dz_findpos;
if (count _dzpos > 0) then { //если точка найдена, ставим объект
_veh = [_vehacle,_dzpos] call DZ_createVehicle;
diag_log format["Spawn: %1, %2, %3 Pos: %4,Number: %5, limit: %6, Raund: %7",_vehacle,_vehicleTypeModel,_vehicleClass,_dzpos,(count vehicles),_spawnquantity,_fainds];
diag_log format["Spawn: object distanse: %1, map Size: %2",_objectdistanse,_mapSize];
_fainds = 0;
} else { //если точка не найденна начинаем с начала
_fainds = _fainds + 1;
};
};
};
case "car_civ": {
while{(_fainds > 0)} do {
_favouritezones = "(1 + houses) * (1 + meadow)"; //выставляем приоритет позиции
_dzpos = [_centerMap,_mindist,_vehacle,_favouritezones] call Dz_findpos;
if (count _dzpos > 0) then { //если точка найдена, ставим объект
//_veh = _vehacle createVehicle _dzpos;
[_vehacle,_dzpos] call DZ_createVehicle;
diag_log format["Spawn: %1, %2, %3 Pos: %4,Number: %5, limit: %6, Raund: %7",_vehacle,_vehicleTypeModel,_vehicleClass,_dzpos,(count vehicles),_spawnquantity,_fainds];
_fainds = 0;
} else { //если точка не найденна начинаем с начала
_fainds = _fainds + 1;
};
};
};
case "air_civ": {
while{(_fainds > 0)} do {
_favouritezones = "(1 - hills) * (1 - houses) * (1 + meadow)"; //выставляем приоритет позиции
_dzpos = [_centerMap,_mindist,_vehacle,_favouritezones] call Dz_findpos;
if (count _dzpos > 0) then { //если точка найдена, ставим объект
// _veh = _vehacle createVehicle _dzpos;
[_vehacle,_dzpos] call DZ_createVehicle;
diag_log format["Spawn: %1, %2, %3 Pos: %4,Number: %5, limit: %6, Raund: %7",_vehacle,_vehicleTypeModel,_vehicleClass,_dzpos,(count vehicles),_spawnquantity,_fainds];
_fainds = 0;
} else { //если точка не найденна начинаем с начала
_fainds = _fainds + 1;
};
};
};
case "car_mil": {
while{(_fainds > 0)} do {
_favouritezones = "(1 + hills) * (1 - houses) * (1 + meadow)"; //выставляем приоритет позиции
_dzpos = [_centerMap,_mindist,_vehacle,_favouritezones] call Dz_findpos;
if (count _dzpos > 0) then { //если точка найдена, ставим объект
// _veh = _vehacle createVehicle _dzpos;
[_vehacle,_dzpos] call DZ_createVehicle;
diag_log format["Spawn: %1, %2, %3 Pos: %4,Number: %5, limit: %6, Raund: %7",_vehacle,_vehicleTypeModel,_vehicleClass,_dzpos,(count vehicles),_spawnquantity,_fainds];
_fainds = 0;
} else { //если точка не найденна начинаем с начала
_fainds = _fainds + 1;
};
};
};
case "air_mil": {
while{(_fainds > 0)} do {
_favouritezones = "(1 - hills) * (1 - houses) * (1 + meadow)"; //выставляем приоритет позиции
_dzpos = [_centerMap,_mindist,_vehacle,_favouritezones] call Dz_findpos;
if (count _dzpos > 0) then { //если точка найдена, ставим объект
// _veh = _vehacle createVehicle _dzpos;
[_vehacle,_dzpos] call DZ_createVehicle;
diag_log format["Spawn: %1, %2, %3 Pos: %4,Number: %5, limit: %6, Raund: %7",_vehacle,_vehicleTypeModel,_vehicleClass,_dzpos,(count vehicles),_spawnquantity,_fainds];
_fainds = 0;
} else { //если точка не найденна начинаем с начала
_fainds = _fainds + 1;
};
};
};
case "ship_civ": {
while{(_fainds > 0)} do {
_favouritezones = "(1 + meadow) * (1 - hills) * (1 + sea)"; //выставляем приоритет позиции
_dzpos = [_centerMap,_mindist,_vehacle,_favouritezones] call Dz_findpos;
if (count _dzpos > 0) then { //если точка найдена, ставим объект
_isWater = surfaceIsWater _dzpos; //проверяем в воде или нет
if (_isWater) then {
// _veh = _vehacle createVehicle _dzpos;
[_vehacle,_dzpos] call DZ_createVehicle;
diag_log format["Spawn: %1, %2, %3 Pos: %4,Number: %5, limit: %6, Raund: %7",_vehacle,_vehicleTypeModel,_vehicleClass,_dzpos,(count vehicles),_spawnquantity,_fainds];
_fainds = 0;
} else { //если точка не найденна начинаем с начала
_fainds = _fainds + 1;
};
} else { //если точка не найденна начинаем с начала
_fainds = _fainds + 1;
};
};
};
case "ship_mil": {
while{(_fainds > 0)} do {
_favouritezones = "(1 + meadow) * (1 - hills) * (1 + sea) * (1 - houses)"; //выставляем приоритет позиции
_dzpos = [_centerMap,_mindist,_vehacle,_favouritezones] call Dz_findpos;
if (count _dzpos > 0) then { //если точка найдена, ставим объект
_isWater = surfaceIsWater _dzpos; //проверяем в воде или нет
if (_isWater) then {
// _veh = _vehacle createVehicle _dzpos;
[_vehacle,_dzpos] call DZ_createVehicle;
diag_log format["Spawn: %1, %2, %3 Pos: %4,Number: %5, limit: %6, Raund: %7",_vehacle,_vehicleTypeModel,_vehicleClass,_dzpos,(count vehicles),_spawnquantity,_fainds];
_fainds = 0;
} else { //если точка не найденна начинаем с начала
_fainds = _fainds + 1;
};
} else { //если точка не найденна начинаем с начала
_fainds = _fainds + 1;
};
};
};
};
};
};