diff --git a/SQF/dayz_server/system/server_monitor.sqf b/SQF/dayz_server/system/server_monitor.sqf index 827bf7d20..348207237 100644 --- a/SQF/dayz_server/system/server_monitor.sqf +++ b/SQF/dayz_server/system/server_monitor.sqf @@ -1,4 +1,9 @@ -private ["_date","_year","_month","_day","_hour","_minute","_date1","_key","_objectCount","_dir","_point","_i","_action","_dam","_selection","_wantExplosiveParts","_entity","_worldspace","_damage","_booleans","_rawData","_ObjectID","_class","_CharacterID","_inventory","_hitpoints","_fuel","_id","_objectArray","_script","_result","_outcome","_shutdown","_res"]; +private ["_legacyStreamingMethod","_hiveLoaded","_timeStart","_i","_key","_result","_shutdown","_res","_myArray","_val","_status","_fileName","_lastFN", + "_VehicleQueue","_vQty","_idKey","_type","_ownerID","_worldspace","_inventory","_damage","_storageMoney","_vector","_vecExists","_ownerPUID", + "_wsCount","_ws2TN","_ws3TN","_dir","_posATL","_wsDone","_object","_doorLocked","_isPlot","_isTrapItem","_isSafeObject", + "_weaponcargo","_magcargo","_backpackcargo","_weaponqty","_magqty","_backpackqty","_lockable","_codeCount","_codeCount","_isTrapItem","_xTypeName","_x1", + "_isAir","_selection","_dam","_hitpoints","_fuel","_pos"]; + #include "\z\addons\dayz_server\compile\server_toggle_debug.hpp" waitUntil {!isNil "BIS_MPF_InitDone" && initialized}; @@ -8,12 +13,10 @@ sm_done = false; _legacyStreamingMethod = false; //use old object streaming method, more secure but will be slower and subject to the callExtension return size limitation. dayz_serverIDMonitor = []; -_DZE_VehObjects = []; dayz_versionNo = getText (configFile >> "CfgMods" >> "DayZ" >> "version"); dayz_hiveVersionNo = getNumber (configFile >> "CfgMods" >> "DayZ" >> "hiveVersion"); _hiveLoaded = false; _serverVehicleCounter = []; -_tempMaint = DayZ_WoodenFence + DayZ_WoodenGates; diag_log "HIVE: Starting"; //Stream in objects @@ -24,7 +27,7 @@ _timeStart = diag_tickTime; for "_i" from 1 to 5 do { diag_log "HIVE: trying to get objects"; _key = format["CHILD:302:%1:%2:",dayZ_instance, _legacyStreamingMethod]; - _result = _key call server_hiveReadWrite; + _result = _key call server_hiveReadWrite; if (typeName _result == "STRING") then { _shutdown = format["CHILD:400:%1:",(profileNamespace getVariable "SUPERKEY")]; _res = _shutdown call server_hiveReadWrite; @@ -37,13 +40,14 @@ for "_i" from 1 to 5 do { if (typeName _result == "STRING") exitWith { diag_log "HIVE: Connection error. Server_monitor.sqf is exiting."; -}; +}; diag_log "HIVE: Request sent"; _myArray = []; _val = 0; _status = _result select 0; //Process result _val = _result select 1; + if (_legacyStreamingMethod) then { if (_status == "ObjectStreamStart") then { profileNamespace setVariable ["SUPERKEY",(_result select 2)]; @@ -77,114 +81,109 @@ if (_legacyStreamingMethod) then { }; }; -diag_log ("HIVE: Streamed " + str(_val) + " objects"); +//Stream objects first then load in the vehicles +_VehicleQueue = []; +_vQty = 0; +diag_log ("HIVE: Streamed " + str(count _myArray) + " Objects."); // Don't spawn objects if no clients are online (createVehicle fails with Ref to nonnetwork object) if ((playersNumber west + playersNumber civilian) == 0) exitWith { diag_log "All clients disconnected. Server_monitor.sqf is exiting."; }; +//spawn objects { - private ["_object","_posATL"]; //Parse Array - _action = _x select 0; - _idKey = _x select 1; - _type = _x select 2; - _ownerID = _x select 3; - _worldspace = _x select 4; - _inventory = _x select 5; - _hitPoints = _x select 6; - _fuel = _x select 7; - _damage = _x select 8; + _idKey = _x select 1; + _type = _x select 2; + _ownerID = _x select 3; + _worldspace = _x select 4; + _inventory = _x select 5; + _damage = _x select 8; _storageMoney = _x select 9; - //set object to be in maintenance mode - _maintenanceMode = false; - _maintenanceModeVars = []; - - _dir = 90; - _pos = [0,0,0]; - _wsDone = false; - _wsCount = count _worldspace; + if ((_type isKindOf "AllVehicles")) then { + _VehicleQueue set [_vQty,_x]; + _vQty = _vQty + 1; + } else { + _dir = 90; + _pos = [0,0,0]; + _wsDone = false; + _wsCount = count _worldspace; - //Vector building - _vector = [[0,0,0],[0,0,0]]; - _vecExists = false; - _ownerPUID = "0"; + //Vector building + _vector = [[0,0,0],[0,0,0]]; + _vecExists = false; + _ownerPUID = "0"; - if (_wsCount >= 2) then { - _dir = _worldspace select 0; - _posATL = _worldspace select 1; - if (count _posATL == 3) then { - _pos = _posATL; - _wsDone = true; - }; - if (_wsCount >= 3) then{ - _ws2TN = typename (_worldspace select 2); - _ws3TN = typename (_worldspace select 3); - if (_wsCount == 3) then{ - if (_ws2TN == "STRING") then{ + call { + if (_wsCount == 4) exitwith { + _dir = _worldspace select 0; + _posATL = _worldspace select 1; + if (count _posATL == 3) then { + _pos = _posATL; + _wsDone = true; + }; + _ws2TN = typename (_worldspace select 2); + _ws3TN = typename (_worldspace select 3); + if (_ws3TN == "STRING") then { + _ownerPUID = _worldspace select 3; + } else { + if (_ws2TN == "STRING") then { _ownerPUID = _worldspace select 2; - } else { - if (_ws2TN == "ARRAY") then{ - _vector = _worldspace select 2; - _vecExists = true; - }; }; - } else { - if (_wsCount == 4) then{ - if (_ws3TN == "STRING") then{ - _ownerPUID = _worldspace select 3; - } else { - if (_ws2TN == "STRING") then{ - _ownerPUID = _worldspace select 2; - }; - }; - if (_ws2TN == "ARRAY") then{ - _vector = _worldspace select 2; + }; + if (_ws2TN == "ARRAY") then { + _vector = _worldspace select 2; + _vecExists = true; + } else { + if (_ws3TN == "ARRAY") then { + _vector = _worldspace select 3; _vecExists = true; - } else { - if (_ws3TN == "ARRAY") then{ - _vector = _worldspace select 3; - _vecExists = true; - }; }; }; }; - } else { - _worldspace set [count _worldspace, "0"]; + if (_wsCount == 3) exitwith { + _dir = _worldspace select 0; + _posATL = _worldspace select 1; + if (count _posATL == 3) then { + _pos = _posATL; + _wsDone = true; + }; + _ws2TN = typename (_worldspace select 2); + _ws3TN = typename (_worldspace select 3); + if (_ws2TN == "STRING") then { + _ownerPUID = _worldspace select 2; + } else { + if (_ws2TN == "ARRAY") then { + _vector = _worldspace select 2; + _vecExists = true; + }; + }; + }; + if (_wsCount == 2) then { + _dir = _worldspace select 0; + _posATL = _worldspace select 1; + if (count _posATL == 3) then { + _pos = _posATL; + _wsDone = true; + }; + }; + if (_wsCount < 2) exitwith { + _worldspace set [count _worldspace, "0"]; + }; }; - }; - if (!_wsDone) then { - if ((count _posATL) >= 2) then { - _pos = [_posATL select 0,_posATL select 1,0]; - diag_log format["MOVED OBJ: %1 of class %2 with worldspace array = %3 to pos: %4",_idKey,_type,_worldspace,_pos]; - } else { - diag_log format["MOVED OBJ: %1 of class %2 with worldspace array = %3 to pos: [0,0,0]",_idKey,_type,_worldspace]; + if (!_wsDone) then { + if ((count _posATL) >= 2) then { + _pos = [_posATL select 0,_posATL select 1,0]; + diag_log format["MOVED OBJ: %1 of class %2 with worldspace array = %3 to pos: %4",_idKey,_type,_worldspace,_pos]; + } else { + diag_log format["MOVED OBJ: %1 of class %2 with worldspace array = %3 to pos: [0,0,0]",_idKey,_type,_worldspace]; + }; }; - }; - //diag_log format["OBJ: %1 - %2,%3,%4,%5,%6,%7,%8", _idKey,_type,_ownerID,_worldspace,_inventory,_hitPoints,_fuel,_damage]; - /* - if (_type in _tempMaint) then { - //Use hitpoints for Maintenance system and other systems later. - //Enable model swap for a damaged model. - if ("Maintenance" in _hitPoints) then { - _maintenanceModeVars = [_type,_pos]; - _type = _type + "_Damaged"; - }; - //TODO add remove object and readd old fence (hideobject would be nice to use here :-( ) - //Pending change to new fence models\Layout - }; - */ - _nonCollide = _type in DayZ_nonCollide; - //Create it - if (_nonCollide) then { - _object = createVehicle [_type, [0,0,0], [], 0, "NONE"]; - } else { - _object = _type createVehicle [0,0,0]; //more than 2x faster than createvehicle array - }; + _object = _type createVehicle [0,0,0]; //more than 2x faster than createvehicle array _object setDir _dir; _object setPosATL _pos; _object setDamage _damage; @@ -195,7 +194,7 @@ if ((playersNumber west + playersNumber civilian) == 0) exitWith { _doorLocked = _type in DZE_DoorsLocked; _isPlot = _type == "Plastic_Pole_EP1_DZ"; - + // prevent immediate hive write when vehicle parts are set up _object setVariable ["lastUpdate",diag_ticktime]; _object setVariable ["ObjectID", _idKey, true]; @@ -205,16 +204,15 @@ if ((playersNumber west + playersNumber civilian) == 0) exitWith { }; dayz_serverIDMonitor set [count dayz_serverIDMonitor,_idKey]; - + if (!_wsDone) then {[_object,"position",true] call server_updateObject;}; if (_type == "Base_Fire_DZ") then {_object spawn base_fireMonitor;}; - - _isDZ_Buildable = _object isKindOf "DZ_buildables"; + _isTrapItem = _object isKindOf "TrapItems"; _isSafeObject = _type in DayZ_SafeObjects; - + //Dont add inventory for traps. - if (!_isDZ_Buildable && !_isTrapItem) then { + if (!_isTrapItem) then { clearWeaponCargoGlobal _object; clearMagazineCargoGlobal _object; clearBackpackCargoGlobal _object; @@ -228,12 +226,10 @@ if ((playersNumber west + playersNumber civilian) == 0) exitWith { _weaponcargo = _inventory select 0 select 0; _magcargo = _inventory select 1 select 0; _backpackcargo = _inventory select 2 select 0; - _weaponqty = _inventory select 0 select 1; + _weaponqty = _inventory select 0 select 1; {_object addWeaponCargoGlobal [_x, _weaponqty select _foreachindex];} foreach _weaponcargo; - _magqty = _inventory select 1 select 1; - {_object addMagazineCargoGlobal [_x, _magqty select _foreachindex];} foreach _magcargo; - + {if (_x != "CSGAS") then {_object addMagazineCargoGlobal [_x, _magqty select _foreachindex];};} foreach _magcargo; _backpackqty = _inventory select 2 select 1; {_object addBackpackCargoGlobal [_x, _backpackqty select _foreachindex];} foreach _backpackcargo; }; @@ -246,88 +242,146 @@ if ((playersNumber west + playersNumber civilian) == 0) exitWith { }; }; }; - - if (_object isKindOf "AllVehicles") then { - _object setVariable ["CharacterID", _ownerID, true]; - _isAir = _object isKindOf "Air"; - { - _selection = _x select 0; - _dam = if (!_isAir && {_selection in dayZ_explosiveParts}) then {(_x select 1) min 0.8;} else {_x select 1;}; - _object setHit [_selection,_dam]; - } foreach _hitpoints; - [_object,"damage"] call server_updateObject; - _object setFuel _fuel; - if (!_isSafeObject) then { - _DZE_VehObjects set [count _DZE_VehObjects,_object]; - _object call fnc_veh_ResetEH; - if (_ownerID != "0" && {!(_object isKindOf "Bicycle")}) then {_object setVehicleLock "locked";}; - _serverVehicleCounter set [count _serverVehicleCounter,_type]; // total each vehicle - } else { - _object enableSimulation true; - }; - } else { - // Fix for leading zero issues on safe codes after restart - _lockable = getNumber (configFile >> "CfgVehicles" >> _type >> "lockable"); - _codeCount = count (toArray _ownerID); - switch (_lockable) do { - case 4: { - switch (_codeCount) do { - case 3: {_ownerID = format["0%1",_ownerID];}; - case 2: {_ownerID = format["00%1",_ownerID];}; - case 1: {_ownerID = format["000%1",_ownerID];}; - }; - }; - case 3: { - switch (_codeCount) do { - case 2: {_ownerID = format["0%1",_ownerID];}; - case 1: {_ownerID = format["00%1",_ownerID];}; - }; + // Fix for leading zero issues on safe codes after restart + _lockable = getNumber (configFile >> "CfgVehicles" >> _type >> "lockable"); + _codeCount = count (toArray _ownerID); + call { + if (_lockable == 4) exitwith { + call { + if (_codeCount == 3) exitwith {_ownerID = format["0%1",_ownerID];}; + if (_codeCount == 2) exitwith {_ownerID = format["00%1",_ownerID];}; + if (_codeCount == 1) exitwith {_ownerID = format["000%1",_ownerID];}; }; }; - _object setVariable ["CharacterID", _ownerID, true]; - if (_isDZ_Buildable || {(_isSafeObject && !_isTrapItem)}) then { - _object setVariable["memDir",_dir,true]; - if (DZE_GodModeBase && {!(_type in DZE_GodModeBaseExclude)}) then { - _object addEventHandler ["HandleDamage",{false}]; - } else { - _object addMPEventHandler ["MPKilled",{_this call vehicle_handleServerKilled;}]; + if (_lockable == 3) exitwith { + call { + if (_codeCount == 2) exitwith {_ownerID = format["0%1",_ownerID];}; + if (_codeCount == 1) exitwith {_ownerID = format["00%1",_ownerID];}; }; - _object setVariable ["OEMPos",_pos,true]; // used for inplace upgrades and lock/unlock of safe - } else { - _object enableSimulation true; - }; - if (_isDZ_Buildable || {_isTrapItem}) then { - //Use inventory for owner/clan info and traps armed state - { - _xTypeName = typeName _x; - switch (_xTypeName) do { - case "ARRAY": { - _x1 = _x select 1; - switch (_x select 0) do { - case "ownerArray" : { _object setVariable ["ownerArray", _x1, true]; }; - case "clanArray" : { _object setVariable ["clanArray", _x1, true]; }; - case "armed" : { _object setVariable ["armed", _x1, true]; }; - case "padlockCombination" : { _object setVariable ["dayz_padlockCombination", _x1, false]; }; - case "BuildLock" : { _object setVariable ["BuildLock", _x1, true]; }; - }; - }; - case "STRING": {_object setVariable ["ownerArray", [_x], true]; }; - case "BOOLEAN": {_object setVariable ["armed", _x, true]}; - }; - } foreach _inventory; - - if (_maintenanceMode) then { _object setVariable ["Maintenance", true, true]; _object setVariable ["MaintenanceVars", _maintenanceModeVars]; }; }; }; + _object setVariable ["CharacterID", _ownerID, true]; + if (_isSafeObject && !_isTrapItem) then { + _object setVariable["memDir",_dir,true]; + if (DZE_GodModeBase && {!(_type in DZE_GodModeBaseExclude)}) then { + _object addEventHandler ["HandleDamage",{false}]; + } else { + _object addMPEventHandler ["MPKilled",{_this call vehicle_handleServerKilled;}]; + }; + _object setVariable ["OEMPos",_pos,true]; // used for inplace upgrades and lock/unlock of safe + } else { + _object enableSimulation true; + }; + if (_isTrapItem) then { + //Use inventory traps armed state + { + _xTypeName = typeName _x; + if (_xTypeName == "ARRAY") then { + _x1 = _x select 1; + _object setVariable ["armed", _x1, true]; + } else { + _object setVariable ["armed", _x, true]; + }; + } count _inventory; + }; dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_object]; //Monitor the object -} forEach _myArray; + }; +} count _myArray; -//enable simulation on vehicles after all buildables are spawned +//spawn vehicles { - _x enableSimulation true; - _x setVelocity [0,0,1]; -} forEach _DZE_VehObjects; + //Parse Array + _idKey = _x select 1; + _type = _x select 2; + _ownerID = _x select 3; + _worldspace = _x select 4; + _inventory = _x select 5; + _hitPoints = _x select 6; + _fuel = _x select 7; + _damage = _x select 8; + _storageMoney = _x select 9; + + _dir = 90; + _pos = [0,0,0]; + _wsDone = false; + _wsCount = count _worldspace; + + call { + if (_wsCount == 2) exitwith { + _dir = _worldspace select 0; + _posATL = _worldspace select 1; + if (count _posATL == 3) then { + _pos = _posATL; + _wsDone = true; + }; + }; + if (_wsCount < 2) exitwith { + _worldspace set [count _worldspace, "0"]; + }; + }; + + if (!_wsDone) then { + if ((count _posATL) >= 2) then { + _pos = [_posATL select 0,_posATL select 1,0]; + diag_log format["MOVED OBJ: %1 of class %2 with worldspace array = %3 to pos: %4",_idKey,_type,_worldspace,_pos]; + } else { + diag_log format["MOVED OBJ: %1 of class %2 with worldspace array = %3 to pos: [0,0,0]",_idKey,_type,_worldspace]; + }; + }; + + _object = _type createVehicle [0,0,0]; //more than 2x faster than createvehicle array + _object setDir _dir; + _object setPosATL _pos; + _object setDamage _damage; + _object enableSimulation false; + + // prevent immediate hive write when vehicle parts are set up + _object setVariable ["lastUpdate",diag_ticktime]; + _object setVariable ["ObjectID", _idKey, true]; + if (Z_SingleCurrency && {_type in DZE_MoneyStorageClasses}) then { + _object setVariable [Z_MoneyVariable, _storageMoney, true]; + }; + + dayz_serverIDMonitor set [count dayz_serverIDMonitor,_idKey]; + + if (!_wsDone) then {[_object,"position",true] call server_updateObject;}; + + clearWeaponCargoGlobal _object; + clearMagazineCargoGlobal _object; + clearBackpackCargoGlobal _object; + if (count _inventory > 0) then { + _weaponcargo = _inventory select 0 select 0; + _magcargo = _inventory select 1 select 0; + _backpackcargo = _inventory select 2 select 0; + _weaponqty = _inventory select 0 select 1; + {_object addWeaponCargoGlobal [_x, _weaponqty select _foreachindex];} foreach _weaponcargo; + _magqty = _inventory select 1 select 1; + {if (_x != "CSGAS") then {_object addMagazineCargoGlobal [_x, _magqty select _foreachindex];};} foreach _magcargo; + _backpackqty = _inventory select 2 select 1; + {_object addBackpackCargoGlobal [_x, _backpackqty select _foreachindex];} foreach _backpackcargo; + }; + + _object setVariable ["CharacterID", _ownerID, true]; + _isAir = _object isKindOf "Air"; + + { + _selection = _x select 0; + _dam = [_x select 1,(_x select 1) min 0.8] select (!_isAir && {_selection in dayZ_explosiveParts}); + _object setHit [_selection,_dam]; + } count _hitpoints; + [_object,"damage"] call server_updateObject; + + _object setFuel _fuel; + _object call fnc_veh_ResetEH; + if (_ownerID != "0" && {!(_object isKindOf "Bicycle")}) then {_object setVehicleLock "locked";}; + _serverVehicleCounter set [count _serverVehicleCounter,_type]; // total each vehicle + _object enableSimulation true; + _object setVelocity [0,0,1]; + dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_object]; //Monitor the object +} count _VehicleQueue; + +diag_log ("HIVE: Streamed " + str((count _myArray) -_vQty) + " Objects and " + str(_vQty) + " Vehicles."); diag_log format["HIVE: BENCHMARK - Server_monitor.sqf finished streaming %1 objects in %2 seconds (unscheduled)",_val,diag_tickTime - _timeStart]; @@ -340,7 +394,7 @@ if (dayz_townGenerator) then { #else object_debug = true; #endif -[] execFSM "\z\addons\dayz_server\system\server_vehicleSync.fsm"; +[] execFSM "\z\addons\dayz_server\system\server_vehicleSync.fsm"; [] execVM "\z\addons\dayz_server\system\scheduler\sched_init.sqf"; // launch the new task scheduler createCenter civilian; @@ -351,7 +405,7 @@ for "_i" from 0 to 10 do { if ((getMarkerPos format["spawn%1",_i]) distance [0,0,0] > 0) then { actualSpawnMarkerCount = actualSpawnMarkerCount + 1; } else { - _i = 11; // exit since we did not find any further markers + _i = 11; // exit since we did not find any further markers }; }; diag_log format["Total Number of spawn locations %1", actualSpawnMarkerCount]; @@ -364,26 +418,30 @@ publicVariable "sm_done"; execVM "\z\addons\dayz_server\system\lit_fireplaces.sqf"; "PVDZ_sec_atp" addPublicVariableEventHandler { - _x = _this select 1; - switch (1==1) do { - case (typeName _x == "STRING") : { // just some logs from the client - diag_log _x; + private ["_y","_unit","_source"]; + + _y = _this select 1; + + call { + if (typeName _y == "STRING") exitwith { // just some logs from the client + diag_log _y; }; - case (count _x == 2) : { // wrong side - diag_log format["P1ayer %1 reports possible 'side' hack. Server may be compromised!",(_x select 1) call fa_plr2Str]; + if (count _y == 2) exitwith { // wrong side + diag_log format["P1ayer %1 reports possible 'side' hack. Server may be compromised!",(_y select 1) call fa_plr2Str]; }; - default { // player hit - _unit = _x select 0; - _source = _x select 1; - if (!isNull _source) then { - diag_log format ["P1ayer %1 hit by %2 %3 from %4 meters in %5 for %6 damage", - _unit call fa_plr2Str, if (!isPlayer _source && alive _source) then {"AI"} else {_source call fa_plr2Str}, _x select 2, _x select 3, _x select 4, _x select 5]; - }; + // player hit + _unit = _y select 0; + _source = _y select 1; + if (!isNull _source) then { + diag_log format ["P1ayer %1 hit by %2 %3 from %4 meters in %5 for %6 damage", + _unit call fa_plr2Str, if (!isPlayer _source && alive _source) then {"AI"} else {_source call fa_plr2Str}, _y select 2, _y select 3, _y select 4, _y select 5]; }; }; }; "PVDZ_objgather_Knockdown" addPublicVariableEventHandler { + private ["_tree", "_player", "_dis", "_name", "_uid", "_treeModel"]; + _tree = (_this select 1) select 0; _player = (_this select 1) select 1; _dis = _player distance _tree; @@ -391,7 +449,7 @@ execVM "\z\addons\dayz_server\system\lit_fireplaces.sqf"; _uid = getPlayerUID _player; _treeModel = _tree call fn_getModelName; - if (_dis < 30 && (_treeModel in dayz_trees or (_treeModel in dayz_plant)) && (_uid != "")) then { + if (_dis < 30 && {_treeModel in dayz_trees or (_treeModel in dayz_plant)} && {_uid != ""}) then { _tree setDamage 1; dayz_choppedTrees set [count dayz_choppedTrees,_tree]; diag_log format["Server setDamage on tree or plant %1 chopped down by %2(%3)",_treeModel,_name,_uid]; @@ -400,6 +458,7 @@ execVM "\z\addons\dayz_server\system\lit_fireplaces.sqf"; if (_hiveLoaded) then { _serverVehicleCounter spawn { + private ["_startTime","_cfgLootFile","_vehLimit"]; // spawn_vehicles // Get all buildings and roads only once. Very taxing, but only on first startup _serverVehicleCounter = _this; @@ -413,7 +472,7 @@ if (_hiveLoaded) then { }; } count (getMarkerPos "center" nearObjects ["building",((getMarkerSize "center") select 1)]); _roadList = getMarkerPos "center" nearRoads ((getMarkerSize "center") select 1); - + //diag_log format ["_serverVehicleCounter: %1",_serverVehicleCounter]; _vehLimit = MaxVehicleLimit - (count _serverVehicleCounter); if (_vehLimit > 0) then { diag_log ("HIVE: Spawning # of Vehicles: " + str(_vehLimit)); @@ -422,7 +481,7 @@ if (_hiveLoaded) then { diag_log "HIVE: Vehicle Spawn limit reached!"; _vehLimit = 0; }; - + if (dayz_townGenerator) then { // Vanilla town generator spawns debris locally on each client MaxDynamicDebris = 0; @@ -437,9 +496,9 @@ if (_hiveLoaded) then { diag_log ("HIVE: Spawning # of Veins: " + str(MaxMineVeins)); for "_x" from 1 to MaxMineVeins do {call spawn_mineveins;}; - + diag_log format["HIVE: BENCHMARK - Server finished spawning %1 DynamicVehicles, %2 Debris, %3 SupplyCrates and %4 MineVeins in %5 seconds (scheduled)",_vehLimit,MaxDynamicDebris,MaxAmmoBoxes,MaxMineVeins,diag_tickTime - _startTime]; - + //Update gear last after all dynamic vehicles are created to save random loot to database (low priority) {[_x,"gear"] call server_updateObject} count _vehiclesToUpdate; };