From cfff2454aa9f7abad664e47442a8fcf6a6f10fa4 Mon Sep 17 00:00:00 2001 From: ebaydayz Date: Sat, 26 Mar 2016 20:46:42 -0400 Subject: [PATCH] Update server_monitor --- CHANGE LOG 1.0.6.txt | 1 + SQF/dayz_code/NOTE.txt | 1 - SQF/dayz_code/init/publicEH.sqf | 1 - SQF/dayz_code/init/variables.sqf | 15 +- .../compile/server_publishObject.sqf | 2 +- .../compile/server_publishVehicle.sqf | 2 +- .../compile/server_publishVehicle2.sqf | 2 +- .../compile/server_publishVehicle3.sqf | 2 +- .../compile/server_spawnCrashSite.sqf | 2 +- SQF/dayz_server/compile/server_swapObject.sqf | 2 +- SQF/dayz_server/compile/spawn_ammosupply.sqf | 2 +- SQF/dayz_server/compile/spawn_roadblocks.sqf | 2 +- SQF/dayz_server/compile/spawn_vehicles.sqf | 5 +- SQF/dayz_server/init/server_functions.sqf | 14 +- SQF/dayz_server/modules/crash_spawner.sqf | 2 +- SQF/dayz_server/modules/supply_drop.sqf | 2 +- SQF/dayz_server/system/lit_fireplaces.sqf | 2 +- SQF/dayz_server/system/s_fps.sqf | 6 +- .../system/scheduler/sched_corpses.sqf | 1 + .../system/scheduler/sched_lootpiles.sqf | 1 + .../system/scheduler/sched_safetyVehicle.sqf | 2 +- SQF/dayz_server/system/server_monitor.sqf | 772 ++++++++---------- 22 files changed, 361 insertions(+), 480 deletions(-) diff --git a/CHANGE LOG 1.0.6.txt b/CHANGE LOG 1.0.6.txt index 0413d970d..7e9faf815 100644 --- a/CHANGE LOG 1.0.6.txt +++ b/CHANGE LOG 1.0.6.txt @@ -17,6 +17,7 @@ - dayz_allowedObjects --> DayZ_SafeObjects - dayz_updateObjects --> DayZ_GearedObjects - freeTarget --> OpenTarget + - PVDZE_serverObjectMonitor --> dayz_serverObjectMonitor - Duplicate public variables have been renamed: - dayzPlayerLogin --> PVCDZ_plr_Login - dayzPlayerLogin2 --> PVCDZ_plr_Login2 diff --git a/SQF/dayz_code/NOTE.txt b/SQF/dayz_code/NOTE.txt index 744b99630..de9ce44bf 100644 --- a/SQF/dayz_code/NOTE.txt +++ b/SQF/dayz_code/NOTE.txt @@ -9,7 +9,6 @@ REMOVE TOOL BREAKING, IT'S STUPID player_craftItem_DZV = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_craftItem.sqf"; -dayz_serverObjectMonitor = []; IS REPLACED WITH PVDZE_serverObjectMonitor = []; trap_monitor.fsm is no more! //////////////////////////////////////// diff --git a/SQF/dayz_code/init/publicEH.sqf b/SQF/dayz_code/init/publicEH.sqf index b5ae05418..bf924f2ad 100644 --- a/SQF/dayz_code/init/publicEH.sqf +++ b/SQF/dayz_code/init/publicEH.sqf @@ -15,7 +15,6 @@ "PVDZE_veh_Lock" addPublicVariableEventHandler {(_this select 1) spawn local_lockUnlock}; "PVDZE_plr_GutBodyZ" addPublicVariableEventHandler {(_this select 1) spawn local_gutObjectZ}; "PVDZE_veh_Init" addPublicVariableEventHandler {(_this select 1) call fnc_veh_ResetEH}; -"PVDZE_serverObjectMonitor" addPublicVariableEventHandler {PVDZE_serverObjectMonitor = dayz_safety}; { private ["_building","_fckingcode"]; diff --git a/SQF/dayz_code/init/variables.sqf b/SQF/dayz_code/init/variables.sqf index fa1ca46ae..65380e6a6 100644 --- a/SQF/dayz_code/init/variables.sqf +++ b/SQF/dayz_code/init/variables.sqf @@ -137,7 +137,6 @@ SleepTemperatur = 90 / 100; //First value = Minutes until player reaches the col //Server Variables allowConnection = false; dayz_serverObjectMonitor = []; -PVDZE_serverObjectMonitor = []; //Streaming Variables (player only) dayz_Locations = []; @@ -564,6 +563,9 @@ if (isServer) then { //dayz_spawnCrashSite_clutterCutter=0; // helicrash spawn... 0: loot hidden in grass, 1: loot lifted, 2: no grass //dayz_spawnInfectedSite_clutterCutter=0; // infected base spawn... 0: loot hidden in grass, 1: loot lifted, 2: no grass //Objects to remove when killed. + DayZ_nonCollide = ["TentStorage","TentStorage0","TentStorage1","TentStorage2","TentStorage3","TentStorage4","StashSmall","StashSmall1","StashSmall2","StashSmall3","StashSmall4","StashMedium","StashMedium1","StashMedium2","StashMedium3", "StashMedium4", "DomeTentStorage", "DomeTentStorage0", "DomeTentStorage1", "DomeTentStorage2", "DomeTentStorag3", "DomeTentStorage4", "CamoNet_DZ"]; + DayZ_WoodenFence = ["WoodenFence_1","WoodenFence_2","WoodenFence_3","WoodenFence_4","WoodenFence_5","WoodenFence_6","WoodenFence_7"]; + DayZ_WoodenGates = ["WoodenGate_1","WoodenGate_2","WoodenGate_3","WoodenGate_4"]; DayZ_removableObjects = ["Wire_cat1","Sandbag1_DZ","Hedgehog_DZ","CamoNet_DZ","Trap_Cans","TrapTripwireFlare","TrapBearTrapSmoke","TrapTripwireGrenade","TrapTripwireSmoke","TrapBearTrapFlare"]; //[10416.695, 4198.4634],[7982.2563, 1419.8256],[10795.93, 1419.8263],[7966.083, 4088.7463],[9259.7266, 2746.1985],[5200.5234, 3915.3274],[6494.1665, 2572.7798],[5216.6968, 1246.407],[2564.7244, 3915.3296],[3858.3674, 2572.782],[2580.8977, 1246.4092],[13398.995, 4400.5874],[12242.025, 2948.3196],[13551.842, 1832.2257],[14870.512, 3009.5117],[-178.19415, 1062.4478],[1099.2754, 2388.8206],[-194.36755, 3731.3679],[10394.215, 8322.1719],[7959.7759, 5543.5342],[10773.449, 5543.5342], dayz_grid =[[7943.6025, 8212.4551],[9237.2461, 6869.9063],[5178.043, 8039.0361],[6471.686, 6696.4883],[5194.2163, 5370.1152],[2542.2439, 8039.0381],[3835.887, 6696.4902],[2558.4172, 5370.1172],[13376.514, 8524.2969],[12219.544, 7072.0273],[13529.361, 5955.9336],[14848.032, 7133.2197],[-200.67474, 5186.1563],[1076.7949, 6512.5283],[-216.84814, 7855.0771],[10293.751, 12197.736],[7859.312, 9419.0996],[10672.988, 9419.0996],[7843.1387, 12088.021],[9136.7822, 10745.474],[5077.5791, 11914.601],[6371.2222, 10572.052],[5093.7524, 9245.6816],[2441.78, 11914.604],[3735.4231, 10572.055],[2457.9534, 9245.6816],[13276.053, 12399.861],[12119.08, 10947.596],[13428.897, 9831.501],[14747.566, 11008.786],[-301.13867, 9061.7207],[976.33112, 10388.096],[-317.31201, 11730.642],[10271.271, 16321.429],[7836.8315, 13542.813],[10650.506, 13542.813],[7820.6582, 16211.718],[9114.3018, 14869.175],[5055.0986, 16038.3],[6348.7417, 14695.758],[5071.272, 13369.392],[2419.2996, 16038.305],[3712.9426, 14695.76],[2435.4729, 13369.392],[13253.568, 16523.553],[12096.6, 15071.295],[13406.416, 13955.209],[14725.089, 15132.486],[-323.61914, 13185.43],[953.85059, 14511.8],[-339.79248, 15854.346]]; @@ -578,6 +580,7 @@ if (isServer) then { currentObjectUIDs = []; keyStartNumber = 100000000000; DZE_safeVehicle = ["ParachuteWest","ParachuteC"]; + serverVehicleCounter = []; if(isNil "EpochEvents") then {EpochEvents = [];}; if(isNil "DZE_vehicleAmmo") then {DZE_vehicleAmmo = 0;}; if(isNil "DZE_BackpackGuard") then {DZE_BackpackGuard = true;}; @@ -592,9 +595,13 @@ if (isServer) then { if(isNil "DynamicVehicleFuelHigh") then {DynamicVehicleFuelHigh = 100;}; if(isNil "HeliCrashArea") then {HeliCrashArea = dayz_MapArea / 2;}; if(isNil "OldHeliCrash") then {OldHeliCrash = false;}; - if(isNil "DZE_DiagFpsSlow") then {DZE_DiagFpsSlow = false;}; - if(isNil "DZE_DiagFpsFast") then {DZE_DiagFpsFast = false;}; - if(isNil "DZE_DiagVerbose") then {DZE_DiagVerbose = false;}; + if(isNil "DZE_DiagFpsSlow") then {DZE_DiagFpsSlow = false;}; // Log server FPS + player count every 5 minutes + if(isNil "DZE_DiagFpsFast") then {DZE_DiagFpsFast = false;}; // Log server FPS + player count every 2 minutes + if(isNil "DZE_DiagVerbose") then {DZE_DiagVerbose = false;}; // Also log allMissionObjects count (very intensive) + if(isNil "MaxAmmoBoxes") then {MaxAmmoBoxes = 3;}; + if(isNil "MaxDynamicDebris") then {MaxDynamicDebris = 100;}; + if(isNil "MaxMineVeins") then {MaxMineVeins = 50;}; + if(isNil "MaxVehicleLimit") then {MaxVehicleLimit = 50;}; }; if (!isDedicated) then { diff --git a/SQF/dayz_server/compile/server_publishObject.sqf b/SQF/dayz_server/compile/server_publishObject.sqf index e9a54ada9..fae465d99 100644 --- a/SQF/dayz_server/compile/server_publishObject.sqf +++ b/SQF/dayz_server/compile/server_publishObject.sqf @@ -30,6 +30,6 @@ if (DZE_GodModeBase) then { // Test disabling simulation server side on buildables only. _object enableSimulation false; -PVDZE_serverObjectMonitor set [count PVDZE_serverObjectMonitor,_object]; +dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_object]; //diag_log ("PUBLISH: Created " + (_class) + " with ID " + _uid); diff --git a/SQF/dayz_server/compile/server_publishVehicle.sqf b/SQF/dayz_server/compile/server_publishVehicle.sqf index 45a2899d8..acda214f9 100644 --- a/SQF/dayz_server/compile/server_publishVehicle.sqf +++ b/SQF/dayz_server/compile/server_publishVehicle.sqf @@ -54,7 +54,7 @@ _key = format["CHILD:308:%1:%2:%3:%4:%5:%6:%7:%8:%9:",dayZ_instance, _class, _da diag_log ("HIVE: WRITE: "+ str(_key)); _key call server_hiveWrite; -PVDZE_serverObjectMonitor set [count PVDZE_serverObjectMonitor,_object]; +dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_object]; // Switched to spawn so we can wait a bit for the ID [_object,_uid,_fuel,_damage,_array,_characterID,_class] spawn { diff --git a/SQF/dayz_server/compile/server_publishVehicle2.sqf b/SQF/dayz_server/compile/server_publishVehicle2.sqf index 76e337abd..f83896f1a 100644 --- a/SQF/dayz_server/compile/server_publishVehicle2.sqf +++ b/SQF/dayz_server/compile/server_publishVehicle2.sqf @@ -105,7 +105,7 @@ _key call server_hiveWrite; deleteVehicle _object_para; }; - PVDZE_serverObjectMonitor set [count PVDZE_serverObjectMonitor,_object]; + dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_object]; _object call fnc_veh_ResetEH; diff --git a/SQF/dayz_server/compile/server_publishVehicle3.sqf b/SQF/dayz_server/compile/server_publishVehicle3.sqf index 211c00902..cc2140440 100644 --- a/SQF/dayz_server/compile/server_publishVehicle3.sqf +++ b/SQF/dayz_server/compile/server_publishVehicle3.sqf @@ -120,7 +120,7 @@ _key call server_hiveWrite; _object setVariable ["CharacterID", _characterID, true]; - PVDZE_serverObjectMonitor set [count PVDZE_serverObjectMonitor,_object]; + dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_object]; _object call fnc_veh_ResetEH; diff --git a/SQF/dayz_server/compile/server_spawnCrashSite.sqf b/SQF/dayz_server/compile/server_spawnCrashSite.sqf index 675be3574..545e83edc 100644 --- a/SQF/dayz_server/compile/server_spawnCrashSite.sqf +++ b/SQF/dayz_server/compile/server_spawnCrashSite.sqf @@ -73,7 +73,7 @@ while {1 == 1} do { _crash setPos _adjustedPos; // I don't think this is needed (you can't get "in" a crash), but it was in the original DayZ Crash logic - PVDZE_serverObjectMonitor set [count PVDZE_serverObjectMonitor,_crash]; + dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_crash]; _crash setVariable ["ObjectID","1",true]; diff --git a/SQF/dayz_server/compile/server_swapObject.sqf b/SQF/dayz_server/compile/server_swapObject.sqf index 3a2f7e320..4e1bb8972 100644 --- a/SQF/dayz_server/compile/server_swapObject.sqf +++ b/SQF/dayz_server/compile/server_swapObject.sqf @@ -71,6 +71,6 @@ if (DZE_GodModeBase) then { // Test disabling simulation server side on buildables only. _object enableSimulation false; -PVDZE_serverObjectMonitor set [count PVDZE_serverObjectMonitor,_object]; +dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_object]; diag_log ("PUBLISH: " + str(_activatingPlayer) + " upgraded " + (_class) + " with ID " + str(_uid)); \ No newline at end of file diff --git a/SQF/dayz_server/compile/spawn_ammosupply.sqf b/SQF/dayz_server/compile/spawn_ammosupply.sqf index 4386106a4..6fe6757cb 100644 --- a/SQF/dayz_server/compile/spawn_ammosupply.sqf +++ b/SQF/dayz_server/compile/spawn_ammosupply.sqf @@ -1,7 +1,7 @@ private ["_position","_veh","_istoomany"]; waitUntil {!isNil "BIS_fnc_selectRandom"}; -_position = RoadList call BIS_fnc_selectRandom; +_position = roadList call BIS_fnc_selectRandom; _position = _position modelToWorld [0,0,0]; waitUntil {!isNil "BIS_fnc_findSafePos"}; diff --git a/SQF/dayz_server/compile/spawn_roadblocks.sqf b/SQF/dayz_server/compile/spawn_roadblocks.sqf index 332f4b6ab..4cb41e772 100644 --- a/SQF/dayz_server/compile/spawn_roadblocks.sqf +++ b/SQF/dayz_server/compile/spawn_roadblocks.sqf @@ -1,7 +1,7 @@ private ["_position","_veh","_istoomany","_spawnveh"]; waitUntil {!isNil "BIS_fnc_selectRandom"}; -_position = RoadList call BIS_fnc_selectRandom; +_position = roadList call BIS_fnc_selectRandom; _position = _position modelToWorld [0,0,0]; waitUntil {!isNil "BIS_fnc_findSafePos"}; diff --git a/SQF/dayz_server/compile/spawn_vehicles.sqf b/SQF/dayz_server/compile/spawn_vehicles.sqf index 2a7dfbd3b..7365130c2 100644 --- a/SQF/dayz_server/compile/spawn_vehicles.sqf +++ b/SQF/dayz_server/compile/spawn_vehicles.sqf @@ -18,14 +18,11 @@ while {count AllowedVehiclesList > 0} do { // BIS_fnc_selectRandom replaced because the index may be needed to remove the element _index = floor random count AllowedVehiclesList; _random = AllowedVehiclesList select _index; - _vehicle = _random select 0; _velimit = _random select 1; _qty = {_x == _vehicle} count serverVehicleCounter; - - // If under limit allow to proceed - if (_qty <= _velimit) exitWith {}; + if (_qty <= _velimit) exitWith {}; // If under limit allow to proceed // vehicle limit reached, remove vehicle from list // since elements cannot be removed from an array, overwrite it with the last element and cut the last element of (as long as order is not important) diff --git a/SQF/dayz_server/init/server_functions.sqf b/SQF/dayz_server/init/server_functions.sqf index c9b5f2a71..cf029e86d 100644 --- a/SQF/dayz_server/init/server_functions.sqf +++ b/SQF/dayz_server/init/server_functions.sqf @@ -132,7 +132,7 @@ server_hiveReadWrite = { //diag_log ("ATTEMPT READ/WRITE: " + _key); _data = "HiveExt" callExtension _key; //diag_log ("READ/WRITE: " +str(_data)); - _resultArray = call compile format ["%1",_data]; + _resultArray = call compile (str _data); _resultArray }; @@ -208,9 +208,9 @@ dayz_reseed = { dze_diag_fps = { if (DZE_DiagVerbose) then { - diag_log format["SERVER FPS : %1 OBJECTS: %2 : PLAYERS: %3",diag_fps,count (allMissionObjects ""),playersNumber west]; + diag_log format["SERVER FPS: %1 PLAYERS: %2 OBJECTS: %3",diag_fps,playersNumber west,count (allMissionObjects "")]; } else { - diag_log format["SERVER FPS : %1",diag_fps]; + diag_log format["SERVER FPS: %1 PLAYERS: %2",diag_fps,playersNumber west]; }; }; @@ -220,12 +220,4 @@ generate_new_damage = { _damage }; -server_hiveReadWriteLarge = { - private ["_key","_resultArray","_data"]; - _key = _this; - _data = "HiveExt" callExtension _key; - _resultArray = call compile _data; - _resultArray -}; - call compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\fa_hiveMaintenance.sqf"; \ No newline at end of file diff --git a/SQF/dayz_server/modules/crash_spawner.sqf b/SQF/dayz_server/modules/crash_spawner.sqf index 5a875b42b..9424169ad 100644 --- a/SQF/dayz_server/modules/crash_spawner.sqf +++ b/SQF/dayz_server/modules/crash_spawner.sqf @@ -54,7 +54,7 @@ _adjustedPos = [(_position select 0), (_position select 1), _newHeight]; _crash setPos _adjustedPos; // I don't think this is needed (you can't get "in" a crash), but it was in the original DayZ Crash logic -PVDZE_serverObjectMonitor set [count PVDZE_serverObjectMonitor,_crash]; +dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_crash]; _crash setVariable ["ObjectID","1",true]; _pos = getPos _crash; diff --git a/SQF/dayz_server/modules/supply_drop.sqf b/SQF/dayz_server/modules/supply_drop.sqf index 95b1b7f1f..98c90eda2 100644 --- a/SQF/dayz_server/modules/supply_drop.sqf +++ b/SQF/dayz_server/modules/supply_drop.sqf @@ -32,7 +32,7 @@ _crash setDir round(random 360); _crash setPos _position; // I don't think this is needed (you can't get "in" a crash), but it was in the original DayZ Crash logic -//PVDZE_serverObjectMonitor set [count PVDZE_serverObjectMonitor,_crash]; +//dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_crash]; //_crash setVariable ["ObjectID","1",true]; _pos = getPos _crash; diff --git a/SQF/dayz_server/system/lit_fireplaces.sqf b/SQF/dayz_server/system/lit_fireplaces.sqf index 04491eaf4..97090575a 100644 --- a/SQF/dayz_server/system/lit_fireplaces.sqf +++ b/SQF/dayz_server/system/lit_fireplaces.sqf @@ -6,7 +6,7 @@ _flame inflame true; _flame setVariable ["permaLoot",true]; // = won't be removed by the cleaner, cf. sched_lootpiles.sqf }; - sleep 0.001; + uiSleep 0.001; } count [ [11580.2,3391.72,-1.20629], [11604.4,3389.41,0.0161071], [11664.6,3415.82,-0.524297], [11678.4,3421.32,-0.526046], [11681.4,3409.25,0.028707], [11700.9,3416.6,-0.433657], [11707.7,3431.61,0.597957], [11817.8,12693.7,-0.131821], [11844.7,12749.8,-0.109467], [11845.2,12747.7,-0.119843], diff --git a/SQF/dayz_server/system/s_fps.sqf b/SQF/dayz_server/system/s_fps.sqf index e03f89d7f..73d7c2837 100644 --- a/SQF/dayz_server/system/s_fps.sqf +++ b/SQF/dayz_server/system/s_fps.sqf @@ -1,4 +1,8 @@ +// replaced with dze_diag_fps + +/* while {isServer} do { diag_log ("DEBUG FPS : " + str(diag_fps) ); sleep 360; -}; \ No newline at end of file +}; +*/ \ No newline at end of file diff --git a/SQF/dayz_server/system/scheduler/sched_corpses.sqf b/SQF/dayz_server/system/scheduler/sched_corpses.sqf index cd303915f..f2df623fb 100644 --- a/SQF/dayz_server/system/scheduler/sched_corpses.sqf +++ b/SQF/dayz_server/system/scheduler/sched_corpses.sqf @@ -27,6 +27,7 @@ sched_co_deleteVehicle = { sched_corpses = { private ["_delQtyZ","_delQtyP","_addFlies","_x","_deathTime","_onoff","_delQtyAnimal", "_sound", "_deathPos", "_cpos"]; // EVERY 2 MINUTE + if (DZE_DiagFpsFast) then {call dze_diag_fps;}; // DELETE UNCONTROLLED ZOMBIES --- PUT FLIES ON FRESH PLAYER CORPSES --- REMOVE OLD FLIES & CORPSES _delQtyZ = 0; _delQtyP = 0; diff --git a/SQF/dayz_server/system/scheduler/sched_lootpiles.sqf b/SQF/dayz_server/system/scheduler/sched_lootpiles.sqf index 2deaefd1b..ad7761950 100644 --- a/SQF/dayz_server/system/scheduler/sched_lootpiles.sqf +++ b/SQF/dayz_server/system/scheduler/sched_lootpiles.sqf @@ -45,6 +45,7 @@ sched_lootpiles_5m = { sched_lootpiles = { private ["_plrBatch","_chunkSize","_imax","_plr","_i","_x", "_changed"]; // EVERY 5 MINUTES, ONE OF THESE TASKS SPACED BY 5 SECONDS: + if (DZE_DiagFpsSlow) then {call dze_diag_fps;}; // LOOK FOR OLD LOOTPILES -OR- IGNORE LOOTPILES NEAR _plrBatch PLAYERS -OR- REMOVE REMAINING _chunkSize LOOTPILES _chunkSize = 50; _plrBatch = 10; diff --git a/SQF/dayz_server/system/scheduler/sched_safetyVehicle.sqf b/SQF/dayz_server/system/scheduler/sched_safetyVehicle.sqf index 144f85837..4455e0955 100644 --- a/SQF/dayz_server/system/scheduler/sched_safetyVehicle.sqf +++ b/SQF/dayz_server/system/scheduler/sched_safetyVehicle.sqf @@ -1,7 +1,7 @@ sched_safetyVehicle = { { - if (vehicle _x != _x && !(vehicle _x in dayz_serverObjectMonitor) && !(vehicle _x in PVDZE_serverObjectMonitor) && !((typeOf vehicle _x) in DZE_safeVehicle)) then { + if (vehicle _x != _x && !(vehicle _x in dayz_serverObjectMonitor) && !((typeOf vehicle _x) in DZE_safeVehicle)) then { diag_log [ __FILE__, "KILLING A HACKER", name _x, " IN ", typeOf vehicle _x ]; (vehicle _x) setDamage 1; _x setDamage 1; diff --git a/SQF/dayz_server/system/server_monitor.sqf b/SQF/dayz_server/system/server_monitor.sqf index 03a0ac6b0..f97f559a1 100644 --- a/SQF/dayz_server/system/server_monitor.sqf +++ b/SQF/dayz_server/system/server_monitor.sqf @@ -1,494 +1,374 @@ private ["_date","_year","_month","_day","_hour","_minute","_date1","_hiveResponse","_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"]; -[]execVM "\z\addons\dayz_server\system\s_fps.sqf"; //server monitor FPS (writes each ~181s diag_fps+181s diag_fpsmin*) +//[]execVM "\z\addons\dayz_server\system\s_fps.sqf"; //server monitor FPS (writes each ~181s diag_fps+181s diag_fpsmin*) #include "\z\addons\dayz_server\compile\server_toggle_debug.hpp" -waitUntil{!isNil "BIS_MPF_InitDone"}; -waitUntil{initialized}; //means all the functions are now defined +waitUntil {!isNil "BIS_MPF_InitDone"}; +waitUntil {initialized}; //means all the functions are now defined if (!isNil "sm_done") exitWith {}; // prevent server_monitor be called twice (bug during login of the first player) sm_done = false; dayz_serverIDMonitor = []; - -dayz_versionNo = getText(configFile >> "CfgMods" >> "DayZ" >> "version"); -dayz_hiveVersionNo = getNumber(configFile >> "CfgMods" >> "DayZ" >> "hiveVersion"); - +dayz_versionNo = getText (configFile >> "CfgMods" >> "DayZ" >> "version"); +dayz_hiveVersionNo = getNumber (configFile >> "CfgMods" >> "DayZ" >> "hiveVersion"); _hiveLoaded = false; - diag_log "HIVE: Starting"; //Set the Time _key = "CHILD:307:"; _result = _key call server_hiveReadWrite; _outcome = _result select 0; -if(_outcome == "PASS") then { +if (_outcome == "PASS") then { _date = _result select 1; - - //date setup _year = _date select 0; _month = _date select 1; _day = _date select 2; _hour = _date select 3; _minute = _date select 4; - if(dayz_ForcefullmoonNights) then { - _date = [2012,8,2,_hour,_minute]; - }; - diag_log [ "TIME SYNC: Local Time set to:", _date, "Fullmoon:",dayz_ForcefullmoonNights, "Date given by HiveExt.dll:", _result select 1]; + if (dayz_ForcefullmoonNights) then {_date = [2012,8,2,_hour,_minute];}; + diag_log ["TIME SYNC: Local Time set to:", _date, "Fullmoon:",dayz_ForcefullmoonNights,"Date given by HiveExt.dll:",_result select 1]; setDate _date; dayzSetDate = _date; publicVariable "dayzSetDate"; }; + +//Stream in objects +/* STREAM OBJECTS */ +//Send the key +_key = format["CHILD:302:%1:",dayZ_instance]; +_result = _key call server_hiveReadWrite; + +diag_log "HIVE: Request sent"; +_myArray = []; +_status = _result select 0; //Process result + +if (_status == "ObjectStreamStart") then { + _hiveLoaded = true; + _val = _result select 1; + //Stream Objects + diag_log ("HIVE: Commence Object Streaming..."); + for "_i" from 1 to _val do { + _result = _key call server_hiveReadWrite; + _status = _result select 0; + _myArray set [count _myArray,_result]; + }; + diag_log ("HIVE: Streamed " + str(_val) + " objects"); +}; + +{ + //Parse Array + _action = _x select 0; + _idKey = _x select 1; + _type = if ((typeName (_x select 2)) == "STRING") then { _x select 2 }; + _ownerID = _x select 3; + _worldspace = if ((typeName (_x select 4)) == "ARRAY") then { _x select 4 } else { [] }; + _inventory = if ((typeName (_x select 5)) == "ARRAY") then { _x select 5 } else { [] }; + _hitPoints = if ((typeName (_x select 6)) == "ARRAY") then { _x select 6 } else { [] }; + _fuel = if ((typeName (_x select 7)) == "SCALAR") then { _x select 7 } else { 0 }; + _damage = if ((typeName (_x select 8)) == "SCALAR") then { _x select 8 } else { 0.9 }; + _worldspace call dayz_objectUID2; // Set objectUIDs in currentObjectUIDs list to prevent duplicates -// Custom Configs -if(isnil "MaxVehicleLimit") then { - MaxVehicleLimit = 50; -}; - -if(isnil "MaxDynamicDebris") then { - MaxDynamicDebris = 100; -}; -if(isnil "MaxAmmoBoxes") then { - MaxAmmoBoxes = 3; -}; -if(isnil "MaxMineVeins") then { - MaxMineVeins = 50; -}; -// Custon Configs End - -if (isServer && isNil "sm_done") then { - - serverVehicleCounter = []; - _hiveResponse = []; - - for "_i" from 1 to 5 do { - diag_log "HIVE: trying to get objects"; - _key = format["CHILD:302:%1:", dayZ_instance]; - _hiveResponse = _key call server_hiveReadWrite; - if ((((isnil "_hiveResponse") || {(typeName _hiveResponse != "ARRAY")}) || {((typeName (_hiveResponse select 1)) != "SCALAR")})) then { - if ((_hiveResponse select 1) == "Instance already initialized") then { - _superkey = profileNamespace getVariable "SUPERKEY"; - _shutdown = format["CHILD:400:%1:", _superkey]; - _res = _shutdown call server_hiveReadWrite; - diag_log ("HIVE: attempt to kill.. HiveExt response:"+str(_res)); - } else { - diag_log ("HIVE: connection problem... HiveExt response:"+str(_hiveResponse)); - - }; - _hiveResponse = ["",0]; - } - else { - diag_log ("HIVE: found "+str(_hiveResponse select 1)+" objects" ); - _i = 99; // break + //set object to be in maintenance mode + _maintenanceMode = false; + _maintenanceModeVars = []; + + _dir = floor(random(360)); + _pos = getMarkerpos "respawn_west"; + _wsDone = false; + + if (count _worldspace >= 1 && {(typeName (_worldspace select 0)) == "SCALAR"}) then { + _dir = _worldspace select 0; + }; + if (count _worldspace == 2 && {(typeName (_worldspace select 1)) == "ARRAY"}) then { + _i = _worldspace select 1; + if (count _i == 3 && + {(typeName (_i select 0)) == "SCALAR"} && + {(typeName (_i select 1)) == "SCALAR"} && + {(typeName (_i select 2)) == "SCALAR"}) then { + _pos = _i; + _wsDone = true; }; }; - - _BuildingQueue = []; - _objectQueue = []; - - if ((_hiveResponse select 0) == "ObjectStreamStart") then { - - // save superkey - profileNamespace setVariable ["SUPERKEY",(_hiveResponse select 2)]; - - _hiveLoaded = true; - - diag_log ("HIVE: Commence Object Streaming..."); - _key = format["CHILD:302:%1:", dayZ_instance]; - _objectCount = _hiveResponse select 1; - _bQty = 0; - _vQty = 0; - for "_i" from 1 to _objectCount do { - _hiveResponse = _key call server_hiveReadWriteLarge; - //diag_log (format["HIVE dbg %1 %2", typeName _hiveResponse, _hiveResponse]); - if ((_hiveResponse select 2) isKindOf "ModularItems") then { - _BuildingQueue set [_bQty,_hiveResponse]; - _bQty = _bQty + 1; - } else { - _objectQueue set [_vQty,_hiveResponse]; - _vQty = _vQty + 1; - }; - }; - diag_log ("HIVE: got " + str(_bQty) + " Epoch Objects and " + str(_vQty) + " Vehicles"); + if (!_wsDone) then { + //_pos = [,0,30,10,0,2000,0] call BIS_fnc_findSafePos; + if (count _pos < 3) then { _pos = [_worldspace select 0,_worldspace select 1,0]; }; + diag_log ("MOVED OBJ: " + str(_idKey) + " of class " + _type + " to pos: " + str(_pos)); }; - - // # NOW SPAWN OBJECTS # - _totalvehicles = 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; - _worldspace call dayz_objectUID2; // Set objectUIDs in currentObjectUIDs list to prevent duplicates + + if (_damage < 1) then { + //diag_log format["OBJ: %1 - %2,%3,%4,%5,%6,%7,%8", _idKey,_type,_ownerID,_worldspace,_inventory,_hitPoints,_fuel,_damage]; - _dir = 0; - _pos = [0,0,0]; - _wsDone = false; - if (count _worldspace >= 2) then - { - _dir = _worldspace select 0; - if (count (_worldspace select 1) == 3) then { - _pos = _worldspace select 1; - _wsDone = true; - } - }; - - if (!_wsDone) then { - if (count _worldspace >= 1) then { _dir = _worldspace select 0; }; - _pos = [dayz_centerMarker,0,4000,10,0,2000,0] call BIS_fnc_findSafePos; - if (count _pos < 3) then { _pos = [_pos select 0,_pos select 1,0]; }; - diag_log ("MOVED OBJ: " + str(_idKey) + " of class " + _type + " to pos: " + str(_pos)); + if (_type in DayZ_WoodenFence or _type in DayZ_WoodenGates) then { + //Use hitpoints for Maintenance system and other systems later. + { + if (_x == "Maintenance") then {_maintenanceMode = true;}; + } forEach _hitPoints; + + //Enable model swap for a damaged model. + if (_maintenanceMode) 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 }; - - if (_damage < 1) then { - //diag_log format["OBJ: %1 - %2", _idKey,_type]; - - //Create it - _object = createVehicle [_type, _pos, [], 0, "CAN_COLLIDE"]; - _object setVariable ["lastUpdate",time]; - _object setVariable ["ObjectID", _idKey, true]; - - _lockable = 0; - if(isNumber (configFile >> "CfgVehicles" >> _type >> "lockable")) then { - _lockable = getNumber(configFile >> "CfgVehicles" >> _type >> "lockable"); - }; - - // fix for leading zero issues on safe codes after restart - if (_lockable == 4) then { - _codeCount = (count (toArray _ownerID)); - if(_codeCount == 3) then { - _ownerID = format["0%1", _ownerID]; - }; - if(_codeCount == 2) then { - _ownerID = format["00%1", _ownerID]; - }; - if(_codeCount == 1) then { - _ownerID = format["000%1", _ownerID]; - }; - }; - - if (_lockable == 3) then { - _codeCount = (count (toArray _ownerID)); - if(_codeCount == 2) then { - _ownerID = format["0%1", _ownerID]; - }; - if(_codeCount == 1) then { - _ownerID = format["00%1", _ownerID]; - }; - }; - - _object setVariable ["CharacterID", _ownerID, true]; - - clearWeaponCargoGlobal _object; - clearMagazineCargoGlobal _object; - // _object setVehicleAmmo DZE_vehicleAmmo; - - _object setdir _dir; - _object setposATL _pos; - _object setDamage _damage; - - if ((typeOf _object) in dayz_allowedObjects) then { - if (DZE_GodModeBase) then { - _object addEventHandler ["HandleDamage", {false}]; - } else { - _object addMPEventHandler ["MPKilled",{_this call vehicle_handleServerKilled;}]; - }; - // Test disabling simulation server side on buildables only. - _object enableSimulation false; - // used for inplace upgrades && lock/unlock of safe - _object setVariable ["OEMPos", _pos, true]; - - }; - + //Create it + _object = createVehicle [_type, _pos, [], 0, if (_type in DayZ_nonCollide) then {"NONE"} else {"CAN_COLLIDE"}]; + + // prevent immediate hive write when vehicle parts are set up + _object setVariable ["lastUpdate",diag_ticktime]; + _object setVariable ["ObjectID", _idKey, true]; + dayz_serverIDMonitor set [count dayz_serverIDMonitor,_idKey]; + // Fix for leading zero issues on safe codes after restart + _lockable = if (isNumber (configFile >> "CfgVehicles" >> _type >> "lockable")) then {getNumber (configFile >> "CfgVehicles" >> _type >> "lockable");} else {0}; + if (_lockable == 4) then { + _codeCount = count (toArray _ownerID); + if (_codeCount == 3) then {_ownerID = format["0%1",_ownerID];}; + if (_codeCount == 2) then {_ownerID = format["00%1",_ownerID];}; + if (_codeCount == 1) then {_ownerID = format["000%1",_ownerID];}; + }; + if (_lockable == 3) then { + _codeCount = count (toArray _ownerID); + if (_codeCount == 2) then {_ownerID = format["0%1",_ownerID];}; + if (_codeCount == 1) then {_ownerID = format["00%1",_ownerID];}; + }; + _object setVariable ["CharacterID", _ownerID, true]; + _object setDir _dir; + _object setDamage _damage; + + if (!_wsDone) then {[_object,"position",true] call server_updateObject;}; + if (_type == "Base_Fire_DZ") then {_object spawn base_fireMonitor;}; + + //Dont add inventory for traps. + if (!(_object isKindOf "TrapItems") && !(_object isKindOf "DZ_buildables")) then { + clearWeaponCargoGlobal _object; + clearMagazineCargoGlobal _object; + clearBackpackCargoGlobal _object; if (count _inventory > 0) then { if (_type in DZE_LockedStorage) then { - // Fill variables with loot - _object setVariable ["WeaponCargo", (_inventory select 0),true]; - _object setVariable ["MagazineCargo", (_inventory select 1),true]; - _object setVariable ["BackpackCargo", (_inventory select 2),true]; + _object setVariable ["WeaponCargo",(_inventory select 0),true]; + _object setVariable ["MagazineCargo",(_inventory select 1),true]; + _object setVariable ["BackpackCargo",(_inventory select 2),true]; } else { - - //Add weapons - _objWpnTypes = (_inventory select 0) select 0; - _objWpnQty = (_inventory select 0) select 1; - _countr = 0; + _cargo = _inventory; + _config = ["CfgWeapons","CfgMagazines","CfgVehicles"]; { - if(_x in (DZE_REPLACE_WEAPONS select 0)) then { - _x = (DZE_REPLACE_WEAPONS select 1) select ((DZE_REPLACE_WEAPONS select 0) find _x); - }; - _isOK = isClass(configFile >> "CfgWeapons" >> _x); - if (_isOK) then { - _object addWeaponCargoGlobal [_x,(_objWpnQty select _countr)]; - }; - _countr = _countr + 1; - } count _objWpnTypes; - - //Add Magazines - _objWpnTypes = (_inventory select 1) select 0; - _objWpnQty = (_inventory select 1) select 1; - _countr = 0; - { - if (_x == "BoltSteel") then { _x = "WoodenArrow" }; // Convert BoltSteel to WoodenArrow - if (_x == "ItemTent") then { _x = "ItemTentOld" }; - _isOK = isClass(configFile >> "CfgMagazines" >> _x); - if (_isOK) then { - _object addMagazineCargoGlobal [_x,(_objWpnQty select _countr)]; - }; - _countr = _countr + 1; - } count _objWpnTypes; - - //Add Backpacks - _objWpnTypes = (_inventory select 2) select 0; - _objWpnQty = (_inventory select 2) select 1; - _countr = 0; - { - _isOK = isClass(configFile >> "CfgVehicles" >> _x); - if (_isOK) then { - _object addBackpackCargoGlobal [_x,(_objWpnQty select _countr)]; - }; - _countr = _countr + 1; - } count _objWpnTypes; - }; - }; - - if (_object isKindOf "AllVehicles") then { - { - _selection = _x select 0; - _dam = _x select 1; - if (_selection in dayZ_explosiveParts && _dam > 0.8) then {_dam = 0.8}; - [_object,_selection,_dam] call fnc_veh_setFixServer; - } count _hitpoints; - - _object setFuel _fuel; - - if (!((typeOf _object) in dayz_allowedObjects)) then { - - //_object setvelocity [0,0,1]; - _object call fnc_veh_ResetEH; - - if(_ownerID != "0" && !(_object isKindOf "Bicycle")) then { - _object setVehicleLock "locked"; - }; - - _totalvehicles = _totalvehicles + 1; - - // total each vehicle - serverVehicleCounter set [count serverVehicleCounter,_type]; + _magItemTypes = _x select 0; + _magItemQtys = _x select 1; + _i = _forEachIndex; + { + if ((isClass (configFile >> (_config select _i) >> _x)) && + {(getNumber (configFile >> (_config select _i) >> _x >> "stopThis") != 1)}) then { + if (_forEachIndex < count _magItemQtys) then { + switch (_i) do { + case 0: {_object addWeaponCargoGlobal [_x,(_magItemQtys select _forEachIndex)];}; + case 1: {_object addMagazineCargoGlobal [_x,(_magItemQtys select _forEachIndex)];}; + case 2: {_object addBackpackCargoGlobal [_x,(_magItemQtys select _forEachIndex)];}; + }; + }; + }; + } forEach _magItemTypes; + } forEach _cargo; }; }; - - //Monitor the object - PVDZE_serverObjectMonitor set [count PVDZE_serverObjectMonitor,_object]; }; - } forEach (_BuildingQueue + _objectQueue); - // # END SPAWN OBJECTS # - - // Draw the pseudo random seeds - call server_plantSpawner; - - // launch the legacy task scheduler - [] execFSM "\z\addons\dayz_server\system\server_cleanup.fsm"; - - // launch the new task scheduler - [] execVM "\z\addons\dayz_server\system\scheduler\sched_init.sqf"; - - createCenter civilian; - if (isDedicated) then { - endLoadingScreen; - }; - allowConnection = true; - sm_done = true; - publicVariable "sm_done"; - - // Trap loop - [] spawn { - private ["_array","_array2","_array3","_script","_armed"]; - _array = str dayz_traps; - _array2 = str dayz_traps_active; - _array3 = str dayz_traps_trigger; - - while {1 == 1} do { - if ((str dayz_traps != _array) || (str dayz_traps_active != _array2) || (str dayz_traps_trigger != _array3)) then { - _array = str dayz_traps; - _array2 = str dayz_traps_active; - _array3 = str dayz_traps_trigger; - - //diag_log "DEBUG: traps"; - //diag_log format["dayz_traps (%2) -> %1", dayz_traps, count dayz_traps]; - //diag_log format["dayz_traps_active (%2) -> %1", dayz_traps_active, count dayz_traps_active]; - //diag_log format["dayz_traps_trigger (%2) -> %1", dayz_traps_trigger, count dayz_traps_trigger]; - //diag_log "DEBUG: end traps"; - }; - + + if (_object isKindOf "AllVehicles") then { { - if (isNull _x) then { - dayz_traps = dayz_traps - [_x]; - }; + _selection = _x select 0; + _dam = _x select 1; + if ((_selection in dayZ_explosiveParts && _dam > 0.8) && !(_object isKindOf "Air")) then {_dam = 0.8}; + [_object,_selection,_dam] call fnc_veh_setFixServer; + } forEach _hitpoints; - _script = call compile getText (configFile >> "CfgVehicles" >> typeOf _x >> "script"); - _armed = _x getVariable ["armed", false]; - - if (_armed) then { - if !(_x in dayz_traps_active) then { - ["arm", _x] call _script; - }; - } else { - if (_x in dayz_traps_active) then { - ["disarm", _x] call _script; - }; - }; - - sleep 0.01; - } forEach dayz_traps; - sleep 1; - }; - }; - - //Points of interest - [] execVM "\z\addons\dayz_server\compile\server_spawnInfectedCamps.sqf"; - [] execVM "\z\addons\dayz_server\compile\server_spawnCarePackages.sqf"; - [] execVM "\z\addons\dayz_server\compile\server_spawnCrashSites.sqf"; - - - [] 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; - }; - case (count _x == 2) : { // wrong side - diag_log Format [ "P1ayer %1 reports possible 'side' hack... Server may be comprised!", (_x select 1) call fa_plr2Str ]; - }; - default { // player hit - _unit = _x select 0; - _source = _x select 1; - if (((!(isNil {_source})) AND {(!(isNull _source))}) AND {((_source isKindOf "CAManBase") AND {(owner _unit != owner _source)})}) then { - diag_log format ["P1ayer %1 hit by %2 %3 from %4 meters", - _unit call fa_plr2Str, _source call fa_plr2Str, _x select 2, _x select 3]; - if (_unit getVariable["processedDeath", 0] == 0) then { - _unit setVariable [ "attacker", name _source ]; - _unit setVariable [ "noatlf4", diag_ticktime ]; // server-side "not in combat" test, if player is not already dead - }; - }; - }; - }; - }; - - // preload server traders menu data into cache - if !(DZE_ConfigTrader) then { - { - // get tids - _traderData = call compile format["menu_%1;",_x]; - if(!isNil "_traderData") then { - { - _traderid = _x select 1; - - _retrader = []; - - _key = format["CHILD:399:%1:",_traderid]; - _data = "HiveEXT" callExtension _key; - - //diag_log "HIVE: Request sent"; - - //Process result - _result = call compile format ["%1",_data]; - _status = _result select 0; - - if (_status == "ObjectStreamStart") then { - _val = _result select 1; - //Stream Objects - //diag_log ("HIVE: Commence Menu Streaming..."); - call compile format["ServerTcache_%1 = [];",_traderid]; - for "_i" from 1 to _val do { - _data = "HiveEXT" callExtension _key; - _result = call compile format ["%1",_data]; - call compile format["ServerTcache_%1 set [count ServerTcache_%1,%2]",_traderid,_result]; - _retrader set [count _retrader,_result]; - }; - //diag_log ("HIVE: Streamed " + str(_val) + " objects"); - }; - - } forEach (_traderData select 0); - }; - } forEach serverTraders; - }; - - if (_hiveLoaded) then { - // spawn_vehicles - _vehLimit = MaxVehicleLimit - _totalvehicles; - if(_vehLimit > 0) then { - diag_log ("HIVE: Spawning # of Vehicles: " + str(_vehLimit)); - for "_x" from 1 to _vehLimit do { - [] spawn spawn_vehicles; + _object setFuel _fuel; + if !(_type in DayZ_SafeObjects) then { + _object setVelocity [0,0,1]; + _object call fnc_veh_ResetEH; + if (_ownerID != "0" && !(_object isKindOf "Bicycle")) then {_object setVehicleLock "locked";}; + serverVehicleCounter set [count serverVehicleCounter,_type]; // total each vehicle }; } else { - diag_log "HIVE: Vehicle Spawn limit reached!"; - }; - }; - - // spawn_roadblocks - diag_log ("HIVE: Spawning # of Debris: " + str(MaxDynamicDebris)); - for "_x" from 1 to MaxDynamicDebris do { - [] spawn spawn_roadblocks; - }; - // spawn_ammosupply at server start 1% of roadblocks - diag_log ("HIVE: Spawning # of Ammo Boxes: " + str(MaxAmmoBoxes)); - for "_x" from 1 to MaxAmmoBoxes do { - [] spawn spawn_ammosupply; - }; - // call spawning mining veins - diag_log ("HIVE: Spawning # of Veins: " + str(MaxMineVeins)); - for "_x" from 1 to MaxMineVeins do { - [] spawn spawn_mineveins; - }; - - // All done spawning stuff, can clear these now - buildingList = []; - roadList = []; - - // [_guaranteedLoot, _randomizedLoot, _frequency, _variance, _spawnChance, _spawnMarker, _spawnRadius, _spawnFire, _fadeFire] - if(OldHeliCrash) then { - _nul = [3, 4, (50 * 60), (15 * 60), 0.75, 'center', HeliCrashArea, true, false] spawn server_spawnCrashSite; - }; - if (isDedicated) then { - // Epoch Events - _id = [] spawn server_spawnEvents; - - // spawn debug box - _debugMarkerPosition = getMarkerPos "respawn_west"; - _debugMarkerPosition = [(_debugMarkerPosition select 0),(_debugMarkerPosition select 1),1]; - _vehicle_0 = createVehicle ["DebugBox_DZ", _debugMarkerPosition, [], 0, "CAN_COLLIDE"]; - _vehicle_0 setPos _debugMarkerPosition; - _vehicle_0 setVariable ["ObjectID","1",true]; - - // max number of spawn markers - if(isnil "spawnMarkerCount") then { - spawnMarkerCount = 10; - }; - actualSpawnMarkerCount = 0; - // count valid spawn marker positions - for "_i" from 0 to spawnMarkerCount do { - if (!([(getMarkerPos format["spawn%1", _i]), [0,0,0]] call BIS_fnc_areEqual)) then { - actualSpawnMarkerCount = actualSpawnMarkerCount + 1; - } else { - // exit since we did not find any further markers - _i = spawnMarkerCount + 99; + if (_type in DayZ_nonCollide) then { + _pos set [2,0]; + }; + if (_pos select 2 == 0 or 0 == getNumber (configFile >> "CfgVehicles" >> _type >> "canbevertical")) then { + _object setVectorUp surfaceNormal _pos; + } else { + _object setVectorUp [0,0,1]; + }; + _object setPosATL _pos; + if ((_object isKindOf "DZ_buildables") or ((_type in DayZ_SafeObjects) && !(_object isKindOf "TrapItems"))) then { + if (DZE_GodModeBase) then {_object addEventHandler ["HandleDamage",{false}];} else {_object addMPEventHandler ["MPKilled",{_this call vehicle_handleServerKilled;}];}; + _object enableSimulation false; // Test disabling simulation server side on buildables only. + _object setVariable ["OEMPos",_pos,true]; // used for inplace upgrades and lock/unlock of safe + }; + if (_object isKindOf "TrapItems" or _object isKindOf "DZ_buildables") then { + //Use inventory for owner/clan info and traps armed state + { + if (typeName _x != "ARRAY") then { + // old method + if (typeName _x == "STRING") then { _object setVariable ["ownerArray", [_x], true]; }; + if (typeName _x == "BOOLEAN") then { _object setVariable ["armed", _x, true]; }; + } else { // new method: array of variables to set + switch (_x select 0) do { + case "ownerArray" : { _object setVariable ["ownerArray", _x select 1, true]; }; + case "clanArray" : { _object setVariable ["clanArray", _x select 1, true]; }; + case "armed" : { _object setVariable ["armed", _x select 1, true]; }; + case "padlockCombination" : { _object setVariable ["dayz_padlockCombination",_x select 1,false]; }; + case "BuildLock" : { _object setVariable ["BuildLock",_x select 1,true]; }; + }; + }; + } forEach _inventory; + + if (_maintenanceMode) then { _object setVariable ["Maintenance", true, true]; _object setVariable ["MaintenanceVars", _maintenanceModeVars]; }; }; - }; - diag_log format["Total Number of spawn locations %1", actualSpawnMarkerCount]; - - endLoadingScreen; + dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_object]; //Monitor the object }; +} forEach _myArray; - allowConnection = true; - sm_done = true; - publicVariable "sm_done"; +// # END OF STREAMING # + +call server_plantSpawner; // Draw the pseudo random seeds +[] execFSM "\z\addons\dayz_server\system\server_cleanup.fsm"; // launch the legacy task scheduler +[] execVM "\z\addons\dayz_server\system\scheduler\sched_init.sqf"; // launch the new task scheduler + +createCenter civilian; +if (isDedicated) then {endLoadingScreen;}; +allowConnection = true; +sm_done = true; +publicVariable "sm_done"; + +// Trap loop +[] spawn { + private ["_array","_array2","_array3","_script","_armed"]; + _array = str dayz_traps; + _array2 = str dayz_traps_active; + _array3 = str dayz_traps_trigger; + + while {1 == 1} do { + if ((str dayz_traps != _array) || (str dayz_traps_active != _array2) || (str dayz_traps_trigger != _array3)) then { + _array = str dayz_traps; + _array2 = str dayz_traps_active; + _array3 = str dayz_traps_trigger; + //diag_log "DEBUG: traps"; + //diag_log format["dayz_traps (%2) -> %1", dayz_traps, count dayz_traps]; + //diag_log format["dayz_traps_active (%2) -> %1", dayz_traps_active, count dayz_traps_active]; + //diag_log format["dayz_traps_trigger (%2) -> %1", dayz_traps_trigger, count dayz_traps_trigger]; + //diag_log "DEBUG: end traps"; + }; + + { + if (isNull _x) then {dayz_traps = dayz_traps - [_x];}; + + _script = call compile getText (configFile >> "CfgVehicles" >> typeOf _x >> "script"); + _armed = _x getVariable ["armed", false]; + + if (_armed) then { + if !(_x in dayz_traps_active) then {["arm", _x] call _script;}; + } else { + if (_x in dayz_traps_active) then {["disarm", _x] call _script;}; + }; + uiSleep 0.01; + } forEach dayz_traps; + uiSleep 1; + }; }; + +//Points of interest +[] execVM "\z\addons\dayz_server\compile\server_spawnInfectedCamps.sqf"; +[] execVM "\z\addons\dayz_server\compile\server_spawnCarePackages.sqf"; +[] execVM "\z\addons\dayz_server\compile\server_spawnCrashSites.sqf"; + +if ((toLower worldName) == "chernarus") then {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; + }; + 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]; + }; + default { // player hit + _unit = _x select 0; + _source = _x select 1; + if (((!(isNil {_source})) && {!(isNull _source)}) && {((_source isKindOf "CAManBase") && {owner _unit != owner _source})}) then { + diag_log format ["P1ayer %1 hit by %2 %3 from %4 meters", + _unit call fa_plr2Str, _source call fa_plr2Str, _x select 2, _x select 3]; + if (_unit getVariable ["processedDeath",0] == 0) then { + _unit setVariable ["attacker", name _source]; + _unit setVariable ["noatlf4", diag_ticktime]; // server-side "not in combat" test, if player is not already dead + }; + }; + }; + }; +}; + +// preload server traders menu data into cache +if !(DZE_ConfigTrader) then { + { + // get tids + _traderData = call compile format["menu_%1;",_x]; + if (!isNil "_traderData") then { + { + _traderid = _x select 1; + _retrader = []; + + _key = format["CHILD:399:%1:",_traderid]; + _data = "HiveEXT" callExtension _key; + _result = call compile format["%1",_data]; + _status = _result select 0; + + if (_status == "ObjectStreamStart") then { + _val = _result select 1; + call compile format["ServerTcache_%1 = [];",_traderid]; + for "_i" from 1 to _val do { + _data = "HiveEXT" callExtension _key; + _result = call compile format ["%1",_data]; + call compile format["ServerTcache_%1 set [count ServerTcache_%1,%2]",_traderid,_result]; + _retrader set [count _retrader,_result]; + }; + }; + } forEach (_traderData select 0); + }; + } forEach serverTraders; +}; + +if (_hiveLoaded) then { + // spawn_vehicles + _vehLimit = MaxVehicleLimit - (count serverVehicleCounter); + if (_vehLimit > 0) then { + diag_log ("HIVE: Spawning # of Vehicles: " + str(_vehLimit)); + for "_x" from 1 to _vehLimit do {[] spawn spawn_vehicles;}; + } else { + diag_log "HIVE: Vehicle Spawn limit reached!"; + }; +}; + +diag_log ("HIVE: Spawning # of Debris: " + str(MaxDynamicDebris)); +for "_x" from 1 to MaxDynamicDebris do {[] spawn spawn_roadblocks;}; + +diag_log ("HIVE: Spawning # of Ammo Boxes: " + str(MaxAmmoBoxes)); +for "_x" from 1 to MaxAmmoBoxes do {[] spawn spawn_ammosupply;}; + +diag_log ("HIVE: Spawning # of Veins: " + str(MaxMineVeins)); +for "_x" from 1 to MaxMineVeins do {[] spawn spawn_mineveins;}; + +// All done spawning stuff, can clear these now +buildingList = []; roadList = []; + +// [_guaranteedLoot,_randomizedLoot,_frequency,_variance,_spawnChance,_spawnMarker,_spawnRadius,_spawnFire,_fadeFire] +if (OldHeliCrash) then { + _nul = [3,4,(50 * 60),(15 * 60),0.75,'center',HeliCrashArea,true,false] spawn server_spawnCrashSite; +}; + +[] spawn server_spawnEvents; +_debugMarkerPosition = getMarkerPos "respawn_west"; +_debugMarkerPosition = [(_debugMarkerPosition select 0),(_debugMarkerPosition select 1),1]; +_vehicle_0 = createVehicle ["DebugBox_DZ", _debugMarkerPosition, [], 0, "CAN_COLLIDE"]; +_vehicle_0 setPos _debugMarkerPosition; +_vehicle_0 setVariable ["ObjectID","1",true]; \ No newline at end of file