mirror of
https://github.com/EpochModTeam/DayZ-Epoch.git
synced 2025-12-13 19:52:38 +03:00
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:
@@ -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
|
||||||
@@ -24,7 +27,7 @@ _timeStart = diag_tickTime;
|
|||||||
for "_i" from 1 to 5 do {
|
for "_i" from 1 to 5 do {
|
||||||
diag_log "HIVE: trying to get objects";
|
diag_log "HIVE: trying to get objects";
|
||||||
_key = format["CHILD:302:%1:%2:",dayZ_instance, _legacyStreamingMethod];
|
_key = format["CHILD:302:%1:%2:",dayZ_instance, _legacyStreamingMethod];
|
||||||
_result = _key call server_hiveReadWrite;
|
_result = _key call server_hiveReadWrite;
|
||||||
if (typeName _result == "STRING") then {
|
if (typeName _result == "STRING") then {
|
||||||
_shutdown = format["CHILD:400:%1:",(profileNamespace getVariable "SUPERKEY")];
|
_shutdown = format["CHILD:400:%1:",(profileNamespace getVariable "SUPERKEY")];
|
||||||
_res = _shutdown call server_hiveReadWrite;
|
_res = _shutdown call server_hiveReadWrite;
|
||||||
@@ -37,13 +40,14 @@ for "_i" from 1 to 5 do {
|
|||||||
|
|
||||||
if (typeName _result == "STRING") exitWith {
|
if (typeName _result == "STRING") exitWith {
|
||||||
diag_log "HIVE: Connection error. Server_monitor.sqf is exiting.";
|
diag_log "HIVE: Connection error. Server_monitor.sqf is exiting.";
|
||||||
};
|
};
|
||||||
|
|
||||||
diag_log "HIVE: Request sent";
|
diag_log "HIVE: Request sent";
|
||||||
_myArray = [];
|
_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,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)
|
// 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;
|
_damage = _x select 8;
|
||||||
_hitPoints = _x select 6;
|
|
||||||
_fuel = _x select 7;
|
|
||||||
_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;
|
||||||
_wsCount = count _worldspace;
|
_wsCount = count _worldspace;
|
||||||
|
|
||||||
//Vector building
|
//Vector building
|
||||||
_vector = [[0,0,0],[0,0,0]];
|
_vector = [[0,0,0],[0,0,0]];
|
||||||
_vecExists = false;
|
_vecExists = false;
|
||||||
_ownerPUID = "0";
|
_ownerPUID = "0";
|
||||||
|
|
||||||
if (_wsCount >= 2) then {
|
call {
|
||||||
_dir = _worldspace select 0;
|
if (_wsCount == 4) exitwith {
|
||||||
_posATL = _worldspace select 1;
|
_dir = _worldspace select 0;
|
||||||
if (count _posATL == 3) then {
|
_posATL = _worldspace select 1;
|
||||||
_pos = _posATL;
|
if (count _posATL == 3) then {
|
||||||
_wsDone = true;
|
_pos = _posATL;
|
||||||
};
|
_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 (_ws3TN == "STRING") then {
|
||||||
if (_ws2TN == "STRING") then{
|
_ownerPUID = _worldspace select 3;
|
||||||
|
} else {
|
||||||
|
if (_ws2TN == "STRING") then {
|
||||||
_ownerPUID = _worldspace select 2;
|
_ownerPUID = _worldspace select 2;
|
||||||
} else {
|
|
||||||
if (_ws2TN == "ARRAY") then{
|
|
||||||
_vector = _worldspace select 2;
|
|
||||||
_vecExists = true;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
} else {
|
};
|
||||||
if (_wsCount == 4) then{
|
if (_ws2TN == "ARRAY") then {
|
||||||
if (_ws3TN == "STRING") then{
|
_vector = _worldspace select 2;
|
||||||
_ownerPUID = _worldspace select 3;
|
_vecExists = true;
|
||||||
} else {
|
} else {
|
||||||
if (_ws2TN == "STRING") then{
|
if (_ws3TN == "ARRAY") then {
|
||||||
_ownerPUID = _worldspace select 2;
|
_vector = _worldspace select 3;
|
||||||
};
|
|
||||||
};
|
|
||||||
if (_ws2TN == "ARRAY") then{
|
|
||||||
_vector = _worldspace select 2;
|
|
||||||
_vecExists = true;
|
_vecExists = true;
|
||||||
} else {
|
|
||||||
if (_ws3TN == "ARRAY") then{
|
|
||||||
_vector = _worldspace select 3;
|
|
||||||
_vecExists = true;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
} else {
|
if (_wsCount == 3) exitwith {
|
||||||
_worldspace set [count _worldspace, "0"];
|
_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 (!_wsDone) then {
|
||||||
if ((count _posATL) >= 2) then {
|
if ((count _posATL) >= 2) then {
|
||||||
_pos = [_posATL select 0,_posATL select 1,0];
|
_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];
|
diag_log format["MOVED OBJ: %1 of class %2 with worldspace array = %3 to pos: %4",_idKey,_type,_worldspace,_pos];
|
||||||
} else {
|
} 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["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];
|
_object = _type createVehicle [0,0,0]; //more than 2x faster than createvehicle array
|
||||||
/*
|
|
||||||
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 setDir _dir;
|
_object setDir _dir;
|
||||||
_object setPosATL _pos;
|
_object setPosATL _pos;
|
||||||
_object setDamage _damage;
|
_object setDamage _damage;
|
||||||
@@ -195,7 +194,7 @@ if ((playersNumber west + playersNumber civilian) == 0) exitWith {
|
|||||||
|
|
||||||
_doorLocked = _type in DZE_DoorsLocked;
|
_doorLocked = _type in DZE_DoorsLocked;
|
||||||
_isPlot = _type == "Plastic_Pole_EP1_DZ";
|
_isPlot = _type == "Plastic_Pole_EP1_DZ";
|
||||||
|
|
||||||
// prevent immediate hive write when vehicle parts are set up
|
// prevent immediate hive write when vehicle parts are set up
|
||||||
_object setVariable ["lastUpdate",diag_ticktime];
|
_object setVariable ["lastUpdate",diag_ticktime];
|
||||||
_object setVariable ["ObjectID", _idKey, true];
|
_object setVariable ["ObjectID", _idKey, true];
|
||||||
@@ -205,16 +204,15 @@ if ((playersNumber west + playersNumber civilian) == 0) exitWith {
|
|||||||
};
|
};
|
||||||
|
|
||||||
dayz_serverIDMonitor set [count dayz_serverIDMonitor,_idKey];
|
dayz_serverIDMonitor set [count dayz_serverIDMonitor,_idKey];
|
||||||
|
|
||||||
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;
|
||||||
@@ -228,12 +226,10 @@ if ((playersNumber west + playersNumber civilian) == 0) exitWith {
|
|||||||
_weaponcargo = _inventory select 0 select 0;
|
_weaponcargo = _inventory select 0 select 0;
|
||||||
_magcargo = _inventory select 1 select 0;
|
_magcargo = _inventory select 1 select 0;
|
||||||
_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;
|
||||||
};
|
};
|
||||||
@@ -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;
|
// Fix for leading zero issues on safe codes after restart
|
||||||
if (!_isSafeObject) then {
|
_lockable = getNumber (configFile >> "CfgVehicles" >> _type >> "lockable");
|
||||||
_DZE_VehObjects set [count _DZE_VehObjects,_object];
|
_codeCount = count (toArray _ownerID);
|
||||||
_object call fnc_veh_ResetEH;
|
call {
|
||||||
if (_ownerID != "0" && {!(_object isKindOf "Bicycle")}) then {_object setVehicleLock "locked";};
|
if (_lockable == 4) exitwith {
|
||||||
_serverVehicleCounter set [count _serverVehicleCounter,_type]; // total each vehicle
|
call {
|
||||||
} else {
|
if (_codeCount == 3) exitwith {_ownerID = format["0%1",_ownerID];};
|
||||||
_object enableSimulation true;
|
if (_codeCount == 2) exitwith {_ownerID = format["00%1",_ownerID];};
|
||||||
};
|
if (_codeCount == 1) exitwith {_ownerID = format["000%1",_ownerID];};
|
||||||
} 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];};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
_object setVariable ["CharacterID", _ownerID, true];
|
if (_lockable == 3) exitwith {
|
||||||
if (_isDZ_Buildable || {(_isSafeObject && !_isTrapItem)}) then {
|
call {
|
||||||
_object setVariable["memDir",_dir,true];
|
if (_codeCount == 2) exitwith {_ownerID = format["0%1",_ownerID];};
|
||||||
if (DZE_GodModeBase && {!(_type in DZE_GodModeBaseExclude)}) then {
|
if (_codeCount == 1) exitwith {_ownerID = format["00%1",_ownerID];};
|
||||||
_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 (_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
|
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];
|
||||||
|
|
||||||
@@ -340,7 +394,7 @@ if (dayz_townGenerator) then {
|
|||||||
#else
|
#else
|
||||||
object_debug = true;
|
object_debug = true;
|
||||||
#endif
|
#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
|
[] execVM "\z\addons\dayz_server\system\scheduler\sched_init.sqf"; // launch the new task scheduler
|
||||||
|
|
||||||
createCenter civilian;
|
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 {
|
if ((getMarkerPos format["spawn%1",_i]) distance [0,0,0] > 0) then {
|
||||||
actualSpawnMarkerCount = actualSpawnMarkerCount + 1;
|
actualSpawnMarkerCount = actualSpawnMarkerCount + 1;
|
||||||
} else {
|
} 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];
|
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";
|
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));
|
||||||
@@ -422,7 +481,7 @@ if (_hiveLoaded) then {
|
|||||||
diag_log "HIVE: Vehicle Spawn limit reached!";
|
diag_log "HIVE: Vehicle Spawn limit reached!";
|
||||||
_vehLimit = 0;
|
_vehLimit = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (dayz_townGenerator) then {
|
if (dayz_townGenerator) then {
|
||||||
// Vanilla town generator spawns debris locally on each client
|
// Vanilla town generator spawns debris locally on each client
|
||||||
MaxDynamicDebris = 0;
|
MaxDynamicDebris = 0;
|
||||||
@@ -437,9 +496,9 @@ if (_hiveLoaded) then {
|
|||||||
|
|
||||||
diag_log ("HIVE: Spawning # of Veins: " + str(MaxMineVeins));
|
diag_log ("HIVE: Spawning # of Veins: " + str(MaxMineVeins));
|
||||||
for "_x" from 1 to MaxMineVeins do {call spawn_mineveins;};
|
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];
|
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)
|
//Update gear last after all dynamic vehicles are created to save random loot to database (low priority)
|
||||||
{[_x,"gear"] call server_updateObject} count _vehiclesToUpdate;
|
{[_x,"gear"] call server_updateObject} count _vehiclesToUpdate;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user