Add new server_monitor

Written by @seelenapparat
This splits the streamed array of objects into vehicles and buildings. all buildings get loaded at first. this prevents the old bug that vehicles could explode from falling because a building has loaded too late.
This commit is contained in:
AirwavesMan
2020-06-18 20:30:32 +02:00
parent 9bf7cd3219
commit 99dc7cd71f

View File

@@ -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" #include "\z\addons\dayz_server\compile\server_toggle_debug.hpp"
waitUntil {!isNil "BIS_MPF_InitDone" && initialized}; 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. _legacyStreamingMethod = false; //use old object streaming method, more secure but will be slower and subject to the callExtension return size limitation.
dayz_serverIDMonitor = []; dayz_serverIDMonitor = [];
_DZE_VehObjects = [];
dayz_versionNo = getText (configFile >> "CfgMods" >> "DayZ" >> "version"); dayz_versionNo = getText (configFile >> "CfgMods" >> "DayZ" >> "version");
dayz_hiveVersionNo = getNumber (configFile >> "CfgMods" >> "DayZ" >> "hiveVersion"); dayz_hiveVersionNo = getNumber (configFile >> "CfgMods" >> "DayZ" >> "hiveVersion");
_hiveLoaded = false; _hiveLoaded = false;
_serverVehicleCounter = []; _serverVehicleCounter = [];
_tempMaint = DayZ_WoodenFence + DayZ_WoodenGates;
diag_log "HIVE: Starting"; diag_log "HIVE: Starting";
//Stream in objects //Stream in objects
@@ -44,6 +47,7 @@ _myArray = [];
_val = 0; _val = 0;
_status = _result select 0; //Process result _status = _result select 0; //Process result
_val = _result select 1; _val = _result select 1;
if (_legacyStreamingMethod) then { if (_legacyStreamingMethod) then {
if (_status == "ObjectStreamStart") then { if (_status == "ObjectStreamStart") then {
profileNamespace setVariable ["SUPERKEY",(_result select 2)]; profileNamespace setVariable ["SUPERKEY",(_result select 2)];
@@ -77,31 +81,31 @@ 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) // Don't spawn objects if no clients are online (createVehicle fails with Ref to nonnetwork object)
if ((playersNumber west + playersNumber civilian) == 0) exitWith { if ((playersNumber west + playersNumber civilian) == 0) exitWith {
diag_log "All clients disconnected. Server_monitor.sqf is exiting."; diag_log "All clients disconnected. Server_monitor.sqf is exiting.";
}; };
//spawn objects
{ {
private ["_object","_posATL"];
//Parse Array //Parse Array
_action = _x select 0;
_idKey = _x select 1; _idKey = _x select 1;
_type = _x select 2; _type = _x select 2;
_ownerID = _x select 3; _ownerID = _x select 3;
_worldspace = _x select 4; _worldspace = _x select 4;
_inventory = _x select 5; _inventory = _x select 5;
_hitPoints = _x select 6;
_fuel = _x select 7;
_damage = _x select 8; _damage = _x select 8;
_storageMoney = _x select 9; _storageMoney = _x select 9;
//set object to be in maintenance mode if ((_type isKindOf "AllVehicles")) then {
_maintenanceMode = false; _VehicleQueue set [_vQty,_x];
_maintenanceModeVars = []; _vQty = _vQty + 1;
} else {
_dir = 90; _dir = 90;
_pos = [0,0,0]; _pos = [0,0,0];
_wsDone = false; _wsDone = false;
@@ -112,27 +116,16 @@ if ((playersNumber west + playersNumber civilian) == 0) exitWith {
_vecExists = false; _vecExists = false;
_ownerPUID = "0"; _ownerPUID = "0";
if (_wsCount >= 2) then { call {
if (_wsCount == 4) exitwith {
_dir = _worldspace select 0; _dir = _worldspace select 0;
_posATL = _worldspace select 1; _posATL = _worldspace select 1;
if (count _posATL == 3) then { if (count _posATL == 3) then {
_pos = _posATL; _pos = _posATL;
_wsDone = true; _wsDone = true;
}; };
if (_wsCount >= 3) then{
_ws2TN = typename (_worldspace select 2); _ws2TN = typename (_worldspace select 2);
_ws3TN = typename (_worldspace select 3); _ws3TN = typename (_worldspace select 3);
if (_wsCount == 3) then{
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 { if (_ws3TN == "STRING") then {
_ownerPUID = _worldspace select 3; _ownerPUID = _worldspace select 3;
} else { } else {
@@ -150,8 +143,33 @@ if ((playersNumber west + playersNumber civilian) == 0) exitWith {
}; };
}; };
}; };
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 { } 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"]; _worldspace set [count _worldspace, "0"];
}; };
}; };
@@ -165,26 +183,7 @@ if ((playersNumber west + playersNumber civilian) == 0) exitWith {
}; };
}; };
//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 setDir _dir;
_object setPosATL _pos; _object setPosATL _pos;
_object setDamage _damage; _object setDamage _damage;
@@ -209,12 +208,11 @@ if ((playersNumber west + playersNumber civilian) == 0) exitWith {
if (!_wsDone) then {[_object,"position",true] call server_updateObject;}; if (!_wsDone) then {[_object,"position",true] call server_updateObject;};
if (_type == "Base_Fire_DZ") then {_object spawn base_fireMonitor;}; if (_type == "Base_Fire_DZ") then {_object spawn base_fireMonitor;};
_isDZ_Buildable = _object isKindOf "DZ_buildables";
_isTrapItem = _object isKindOf "TrapItems"; _isTrapItem = _object isKindOf "TrapItems";
_isSafeObject = _type in DayZ_SafeObjects; _isSafeObject = _type in DayZ_SafeObjects;
//Dont add inventory for traps. //Dont add inventory for traps.
if (!_isDZ_Buildable && !_isTrapItem) then { if (!_isTrapItem) then {
clearWeaponCargoGlobal _object; clearWeaponCargoGlobal _object;
clearMagazineCargoGlobal _object; clearMagazineCargoGlobal _object;
clearBackpackCargoGlobal _object; clearBackpackCargoGlobal _object;
@@ -230,10 +228,8 @@ if ((playersNumber west + playersNumber civilian) == 0) exitWith {
_backpackcargo = _inventory select 2 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; {_object addWeaponCargoGlobal [_x, _weaponqty select _foreachindex];} foreach _weaponcargo;
_magqty = _inventory select 1 select 1; _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; _backpackqty = _inventory select 2 select 1;
{_object addBackpackCargoGlobal [_x, _backpackqty select _foreachindex];} foreach _backpackcargo; {_object addBackpackCargoGlobal [_x, _backpackqty select _foreachindex];} foreach _backpackcargo;
}; };
@@ -247,46 +243,26 @@ 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 // Fix for leading zero issues on safe codes after restart
_lockable = getNumber (configFile >> "CfgVehicles" >> _type >> "lockable"); _lockable = getNumber (configFile >> "CfgVehicles" >> _type >> "lockable");
_codeCount = count (toArray _ownerID); _codeCount = count (toArray _ownerID);
switch (_lockable) do { call {
case 4: { if (_lockable == 4) exitwith {
switch (_codeCount) do { call {
case 3: {_ownerID = format["0%1",_ownerID];}; if (_codeCount == 3) exitwith {_ownerID = format["0%1",_ownerID];};
case 2: {_ownerID = format["00%1",_ownerID];}; if (_codeCount == 2) exitwith {_ownerID = format["00%1",_ownerID];};
case 1: {_ownerID = format["000%1",_ownerID];}; if (_codeCount == 1) exitwith {_ownerID = format["000%1",_ownerID];};
}; };
}; };
case 3: { if (_lockable == 3) exitwith {
switch (_codeCount) do { call {
case 2: {_ownerID = format["0%1",_ownerID];}; if (_codeCount == 2) exitwith {_ownerID = format["0%1",_ownerID];};
case 1: {_ownerID = format["00%1",_ownerID];}; if (_codeCount == 1) exitwith {_ownerID = format["00%1",_ownerID];};
}; };
}; };
}; };
_object setVariable ["CharacterID", _ownerID, true]; _object setVariable ["CharacterID", _ownerID, true];
if (_isDZ_Buildable || {(_isSafeObject && !_isTrapItem)}) then { if (_isSafeObject && !_isTrapItem) then {
_object setVariable["memDir",_dir,true]; _object setVariable["memDir",_dir,true];
if (DZE_GodModeBase && {!(_type in DZE_GodModeBaseExclude)}) then { if (DZE_GodModeBase && {!(_type in DZE_GodModeBaseExclude)}) then {
_object addEventHandler ["HandleDamage",{false}]; _object addEventHandler ["HandleDamage",{false}];
@@ -297,37 +273,115 @@ if ((playersNumber west + playersNumber civilian) == 0) exitWith {
} else { } else {
_object enableSimulation true; _object enableSimulation true;
}; };
if (_isDZ_Buildable || {_isTrapItem}) then { if (_isTrapItem) then {
//Use inventory for owner/clan info and traps armed state //Use inventory traps armed state
{ {
_xTypeName = typeName _x; _xTypeName = typeName _x;
switch (_xTypeName) do { if (_xTypeName == "ARRAY") then {
case "ARRAY": {
_x1 = _x select 1; _x1 = _x select 1;
switch (_x select 0) do { _object setVariable ["armed", _x1, true];
case "ownerArray" : { _object setVariable ["ownerArray", _x1, true]; }; } else {
case "clanArray" : { _object setVariable ["clanArray", _x1, true]; }; _object setVariable ["armed", _x, 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]; };
}; };
} count _inventory;
}; };
dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_object]; //Monitor the object 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; //Parse Array
_x setVelocity [0,0,1]; _idKey = _x select 1;
} forEach _DZE_VehObjects; _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]; diag_log format["HIVE: BENCHMARK - Server_monitor.sqf finished streaming %1 objects in %2 seconds (unscheduled)",_val,diag_tickTime - _timeStart];
@@ -364,26 +418,30 @@ publicVariable "sm_done";
execVM "\z\addons\dayz_server\system\lit_fireplaces.sqf"; execVM "\z\addons\dayz_server\system\lit_fireplaces.sqf";
"PVDZ_sec_atp" addPublicVariableEventHandler { "PVDZ_sec_atp" addPublicVariableEventHandler {
_x = _this select 1; private ["_y","_unit","_source"];
switch (1==1) do {
case (typeName _x == "STRING") : { // just some logs from the client _y = _this select 1;
diag_log _x;
call {
if (typeName _y == "STRING") exitwith { // just some logs from the client
diag_log _y;
}; };
case (count _x == 2) : { // wrong side if (count _y == 2) exitwith { // wrong side
diag_log format["P1ayer %1 reports possible 'side' hack. Server may be compromised!",(_x select 1) call fa_plr2Str]; diag_log format["P1ayer %1 reports possible 'side' hack. Server may be compromised!",(_y select 1) call fa_plr2Str];
}; };
default { // player hit // player hit
_unit = _x select 0; _unit = _y select 0;
_source = _x select 1; _source = _y select 1;
if (!isNull _source) then { if (!isNull _source) then {
diag_log format ["P1ayer %1 hit by %2 %3 from %4 meters in %5 for %6 damage", 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]; _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 { "PVDZ_objgather_Knockdown" addPublicVariableEventHandler {
private ["_tree", "_player", "_dis", "_name", "_uid", "_treeModel"];
_tree = (_this select 1) select 0; _tree = (_this select 1) select 0;
_player = (_this select 1) select 1; _player = (_this select 1) select 1;
_dis = _player distance _tree; _dis = _player distance _tree;
@@ -391,7 +449,7 @@ execVM "\z\addons\dayz_server\system\lit_fireplaces.sqf";
_uid = getPlayerUID _player; _uid = getPlayerUID _player;
_treeModel = _tree call fn_getModelName; _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; _tree setDamage 1;
dayz_choppedTrees set [count dayz_choppedTrees,_tree]; 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]; 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 { if (_hiveLoaded) then {
_serverVehicleCounter spawn { _serverVehicleCounter spawn {
private ["_startTime","_cfgLootFile","_vehLimit"];
// spawn_vehicles // spawn_vehicles
// Get all buildings and roads only once. Very taxing, but only on first startup // Get all buildings and roads only once. Very taxing, but only on first startup
_serverVehicleCounter = _this; _serverVehicleCounter = _this;
@@ -413,7 +472,7 @@ if (_hiveLoaded) then {
}; };
} count (getMarkerPos "center" nearObjects ["building",((getMarkerSize "center") select 1)]); } count (getMarkerPos "center" nearObjects ["building",((getMarkerSize "center") select 1)]);
_roadList = getMarkerPos "center" nearRoads ((getMarkerSize "center") select 1); _roadList = getMarkerPos "center" nearRoads ((getMarkerSize "center") select 1);
//diag_log format ["_serverVehicleCounter: %1",_serverVehicleCounter];
_vehLimit = MaxVehicleLimit - (count _serverVehicleCounter); _vehLimit = MaxVehicleLimit - (count _serverVehicleCounter);
if (_vehLimit > 0) then { if (_vehLimit > 0) then {
diag_log ("HIVE: Spawning # of Vehicles: " + str(_vehLimit)); diag_log ("HIVE: Spawning # of Vehicles: " + str(_vehLimit));