Guest User

serwer_monitor.sqf

a guest
Dec 1st, 2015
23
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. private ["_nul","_result","_pos","_wsDone","_dir","_isOK","_countr","_objWpnTypes","_objWpnQty","_dam","_selection","_totalvehicles","_object","_idKey","_type","_ownerID","_worldspace","_intentory","_hitPoints","_fuel","_damage","_key","_vehLimit","_hiveResponse","_objectCount","_codeCount","_data","_status","_val","_traderid","_retrader","_traderData","_id","_lockable","_debugMarkerPosition","_vehicle_0","_bQty","_vQty","_BuildingQueue","_objectQueue","_superkey","_shutdown","_res","_hiveLoaded"];
  2.  
  3. dayz_versionNo =        getText(configFile >> "CfgMods" >> "DayZ" >> "version");
  4. dayz_hiveVersionNo =    getNumber(configFile >> "CfgMods" >> "DayZ" >> "hiveVersion");
  5.  
  6. _hiveLoaded = false;
  7.  
  8. waitUntil{initialized}; //means all the functions are now defined
  9.  
  10. diag_log "HIVE: Starting";
  11.  
  12. waituntil{isNil "sm_done"}; // prevent server_monitor be called twice (bug during login of the first player)
  13.  
  14. // Time sync
  15. if (isDedicated) then {
  16.     _result = ["PASS",[2012,6,6,10,10]];
  17.     _res    = preprocessFile "\cache\set_time.sqf";
  18.     if ((_res != "") and !(isNil "_res")) then {
  19.         _result = call compile _res;
  20.     };
  21.     _outcome = _result select 0;
  22.  
  23.     if (_outcome == "PASS") then {
  24.         _date = _result select 1;
  25.         setDate _date;
  26.     PVDZE_plr_SetDate = _date;
  27.     publicVariable "PVDZE_plr_SetDate";
  28.         diag_log ("HIVE: Local Time set to " + str(_date));
  29.     };
  30. };
  31.    
  32. // Custom Configs
  33. if(isnil "MaxVehicleLimit") then {
  34.     MaxVehicleLimit = 50;
  35. };
  36. if(isnil "MaxDynamicDebris") then {
  37.     MaxDynamicDebris = 100;
  38. };
  39. if(isnil "MaxAmmoBoxes") then {
  40.     MaxAmmoBoxes = 3;
  41. };
  42. if(isnil "MaxMineVeins") then {
  43.     MaxMineVeins = 50;
  44. };
  45. // Custon Configs End
  46.  
  47. if (isServer && isNil "sm_done") then {
  48.     serverVehicleCounter = [];
  49.     diag_log ("LOAD OBJECTS");
  50.  
  51.         _objectArray = [];
  52.    
  53.         _res = preprocessFile "\cache\objects.sqf";
  54.         if ((_res == "") or (isNil "_res")) then {
  55.             diag_log ("OBJECTS NOT FOUND!");
  56.         } else {
  57.             _objectArray = call compile _res;
  58.         };
  59.         _res = nil;
  60.         diag_log format["FOUND %1 OBJECTS", str(count _objectArray)];
  61.    
  62.     // # NOW SPAWN OBJECTS #
  63.     _totalvehicles = 0;
  64.     {
  65.         _idKey =        _x select 1;
  66.         _type =         _x select 2;
  67.         _ownerID =      _x select 3;
  68.  
  69.         _worldspace =   _x select 4;
  70.         _intentory =    _x select 5;
  71.         _hitPoints =    _x select 6;
  72.         _fuel =         _x select 7;
  73.         _damage =       _x select 8;
  74.        
  75.         _dir = 0;
  76.         _pos = [0,0,0];
  77.         _wsDone = false;
  78.         if (count _worldspace >= 2) then
  79.         {
  80.             _dir = _worldspace select 0;
  81.             if (count (_worldspace select 1) == 3) then {
  82.                 _pos = _worldspace select 1;
  83.                 _wsDone = true;
  84.             }
  85.         };         
  86.        
  87.         if (!_wsDone) then {
  88.             if (count _worldspace >= 1) then { _dir = _worldspace select 0; };
  89.             _pos = [getMarkerPos "center",0,4000,10,0,2000,0] call BIS_fnc_findSafePos;
  90.             if (count _pos < 3) then { _pos = [_pos select 0,_pos select 1,0]; };
  91.             diag_log ("MOVED OBJ: " + str(_idKey) + " of class " + _type + " to pos: " + str(_pos));
  92.         };
  93.        
  94.         _vector = [[0,0,0],[0,0,0]];
  95.         _vecExists = false;
  96.         _ownerPUID = "0";  
  97.         if (count _worldspace >= 3) then{
  98.             if(count _worldspace == 3) then{
  99.                     if(typename (_worldspace select 2) == "STRING")then{
  100.                         _ownerPUID = _worldspace select 2;
  101.                     }else{
  102.                          if(typename (_worldspace select 2) == "ARRAY")then{
  103.                             _vector = _worldspace select 2;
  104.                             if(count _vector == 2)then{
  105.                                 if(((count (_vector select 0)) == 3) && ((count (_vector select 1)) == 3))then{
  106.                                     _vecExists = true;
  107.                                 };
  108.                             };
  109.                         };                  
  110.                     };
  111.  
  112.             }else{
  113.                 //Was not 3 elements, so check if 4 or more
  114.                 if(count _worldspace == 4) then{
  115.                     if(typename (_worldspace select 3) == "STRING")then{
  116.                         _ownerPUID = _worldspace select 3;
  117.                     }else{
  118.                         if(typename (_worldspace select 2) == "STRING")then{
  119.                             _ownerPUID = _worldspace select 2;
  120.                         };
  121.                     };
  122.  
  123.                     if(typename (_worldspace select 2) == "ARRAY")then{
  124.                         _vector = _worldspace select 2;
  125.                         if(count _vector == 2)then{
  126.                             if(((count (_vector select 0)) == 3) && ((count (_vector select 1)) == 3))then{
  127.                                 _vecExists = true;
  128.                             };
  129.                         };
  130.                     }else{
  131.                         if(typename (_worldspace select 3) == "ARRAY")then{
  132.                             _vector = _worldspace select 3;
  133.                             if(count _vector == 2)then{
  134.                                 if(((count (_vector select 0)) == 3) && ((count (_vector select 1)) == 3))then{
  135.                                     _vecExists = true;
  136.                                 };
  137.                             };
  138.                         };
  139.                     };
  140.  
  141.                 }else{
  142.                     //More than 3 or 4 elements found
  143.                     //Might add a search for the vector, ownerPUID will equal 0
  144.                 };
  145.             };
  146.         };
  147.        
  148.         if (_damage < 1) then {
  149.             //diag_log format["OBJ: %1 - %2", _idKey,_type];
  150.            
  151.             //Create it
  152.             _object = createVehicle [_type, _pos, [], 0, "CAN_COLLIDE"];
  153.             _object setVariable ["lastUpdate",time];
  154.             _object setVariable ["ObjectID", _idKey, true];
  155.             if (typeOf (_object) == "Plastic_Pole_EP1_DZ") then {
  156.             _object setVariable ["plotfriends", _intentory, true];
  157.             };
  158.  
  159.             _lockable = 0;
  160.             if(isNumber (configFile >> "CfgVehicles" >> _type >> "lockable")) then {
  161.                 _lockable = getNumber(configFile >> "CfgVehicles" >> _type >> "lockable");
  162.             };
  163.  
  164.             // fix for leading zero issues on safe codes after restart
  165.             if (_lockable == 4) then {
  166.                 _codeCount = (count (toArray _ownerID));
  167.                 if(_codeCount == 3) then {
  168.                     _ownerID = format["0%1", _ownerID];
  169.                 };
  170.                 if(_codeCount == 2) then {
  171.                     _ownerID = format["00%1", _ownerID];
  172.                 };
  173.                 if(_codeCount == 1) then {
  174.                     _ownerID = format["000%1", _ownerID];
  175.                 };
  176.             };
  177.  
  178.             if (_lockable == 3) then {
  179.                 _codeCount = (count (toArray _ownerID));
  180.                 if(_codeCount == 2) then {
  181.                     _ownerID = format["0%1", _ownerID];
  182.                 };
  183.                 if(_codeCount == 1) then {
  184.                     _ownerID = format["00%1", _ownerID];
  185.                 };
  186.             };
  187.  
  188.             _object setVariable ["CharacterID", _ownerID, true];
  189.            
  190.             clearWeaponCargoGlobal  _object;
  191.             clearMagazineCargoGlobal  _object;
  192.             // _object setVehicleAmmo DZE_vehicleAmmo;
  193.            
  194.             _object setdir _dir;
  195.             if(_vecExists)then{
  196.                 _object setVectorDirAndUp _vector;
  197.             };
  198.             _object setposATL _pos;
  199.             _object setDamage _damage;
  200.            
  201.             if ((typeOf _object) in dayz_allowedObjects) then {
  202.                 _object setVariable["memDir",_dir,true];
  203.                 if (DZE_GodModeBase) then {
  204.                     _object addEventHandler ["HandleDamage", {false}];
  205.                 } else {
  206.                     _object addMPEventHandler ["MPKilled",{_this call object_handleServerKilled;}];
  207.                 };
  208.                 // Test disabling simulation server side on buildables only.
  209.                 _object enableSimulation false;
  210.                 // used for inplace upgrades && lock/unlock of safe
  211.                 _object setVariable ["OEMPos", _pos, true];
  212.                
  213.             };
  214.  
  215.             if ((count _intentory > 0) && !(typeOf( _object) == "Plastic_Pole_EP1_DZ")) then {
  216.                 if (_type in DZE_LockedStorage) then {
  217.                     // Fill variables with loot
  218.                     _object setVariable ["WeaponCargo", (_intentory select 0),true];
  219.                     _object setVariable ["MagazineCargo", (_intentory select 1),true];
  220.                     _object setVariable ["BackpackCargo", (_intentory select 2),true];
  221.                 } else {
  222.  
  223.                     //Add weapons
  224.                     _objWpnTypes = (_intentory select 0) select 0;
  225.                     _objWpnQty = (_intentory select 0) select 1;
  226.                     _countr = 0;                   
  227.                     {
  228.                         if(_x in (DZE_REPLACE_WEAPONS select 0)) then {
  229.                             _x = (DZE_REPLACE_WEAPONS select 1) select ((DZE_REPLACE_WEAPONS select 0) find _x);
  230.                         };
  231.                         _isOK =     isClass(configFile >> "CfgWeapons" >> _x);
  232.                         if (_isOK) then {
  233.                             _object addWeaponCargoGlobal [_x,(_objWpnQty select _countr)];
  234.                         };
  235.                         _countr = _countr + 1;
  236.                     } count _objWpnTypes;
  237.                
  238.                     //Add Magazines
  239.                     _objWpnTypes = (_intentory select 1) select 0;
  240.                     _objWpnQty = (_intentory select 1) select 1;
  241.                     _countr = 0;
  242.                     {
  243.                         if (_x == "BoltSteel") then { _x = "WoodenArrow" }; // Convert BoltSteel to WoodenArrow
  244.                         if (_x == "ItemTent") then { _x = "ItemTentOld" };
  245.                         _isOK =     isClass(configFile >> "CfgMagazines" >> _x);
  246.                         if (_isOK) then {
  247.                             _object addMagazineCargoGlobal [_x,(_objWpnQty select _countr)];
  248.                         };
  249.                         _countr = _countr + 1;
  250.                     } count _objWpnTypes;
  251.  
  252.                     //Add Backpacks
  253.                     _objWpnTypes = (_intentory select 2) select 0;
  254.                     _objWpnQty = (_intentory select 2) select 1;
  255.                     _countr = 0;
  256.                     {
  257.                         _isOK =     isClass(configFile >> "CfgVehicles" >> _x);
  258.                         if (_isOK) then {
  259.                             _object addBackpackCargoGlobal [_x,(_objWpnQty select _countr)];
  260.                         };
  261.                         _countr = _countr + 1;
  262.                     } count _objWpnTypes;
  263.                 };
  264.             }; 
  265.            
  266.             if (_object isKindOf "AllVehicles") then {
  267.                 {
  268.                     _selection = _x select 0;
  269.                     _dam = _x select 1;
  270.                     if (_selection in dayZ_explosiveParts && _dam > 0.8) then {_dam = 0.8};
  271.                     [_object,_selection,_dam] call object_setFixServer;
  272.                 } count _hitpoints;
  273.  
  274.                 _object setFuel _fuel;
  275.  
  276.                 if (!((typeOf _object) in dayz_allowedObjects)) then {
  277.                    
  278.                     //_object setvelocity [0,0,1];
  279.                     _object call fnc_veh_ResetEH;      
  280.                    
  281.                     if(_ownerID != "0" && !(_object isKindOf "Bicycle")) then {
  282.                         _object setvehiclelock "locked";
  283.                     };
  284.                    
  285.                     _totalvehicles = _totalvehicles + 1;
  286.  
  287.                     // total each vehicle
  288.                     serverVehicleCounter set [count serverVehicleCounter,_type];
  289.                 };
  290.             };
  291.  
  292.             //Monitor the object
  293.             PVDZE_serverObjectMonitor set [count PVDZE_serverObjectMonitor,_object];
  294.         };
  295.     } count _objectArray;
  296.     // # END SPAWN OBJECTS #
  297.  
  298.     // preload server traders menu data into cache
  299.     if !(DZE_ConfigTrader) then {
  300.         {
  301.             // get tids
  302.             _traderData = call compile format["menu_%1;",_x];
  303.             if (!isNil "_traderData") then {
  304.                 {
  305.                     _traderid = _x select 1;
  306.                     //_key = format["CHILD:399:%1:",_traderid];
  307.                     _key = format["\cache\traders\%1.sqf", _traderid];
  308.                                         diag_log ("LOAD TRADER: "+_key);
  309.                                         _res = preprocessFile _key;
  310.  
  311.                                         if ((_res == "") or (isNil "_res")) then {
  312.                                             diag_log ("TRADER NOT FOUND");
  313.                                         } else {
  314.                                             call compile format["ServerTcache_%1 = [];", _traderid];
  315.                    
  316.                                             _retrader = call compile _res;
  317.                                             diag_log format["Count: %1", str(count _retrader)];
  318.            
  319.                                             {
  320.                                                 call compile format["ServerTcache_%1 set [count ServerTcache_%1,%2]", _traderid, _x];
  321.                                             } forEach _retrader;
  322.  
  323.                                             _retrader = nil;
  324.                                         };
  325.                                         _res = nil;
  326.  
  327.                 } forEach (_traderData select 0);
  328.             };
  329.         } forEach serverTraders;
  330.     };
  331.  
  332.     //  spawn_vehicles
  333.     _vehLimit = MaxVehicleLimit - _totalvehicles;
  334.     if (_vehLimit > 0) then {
  335.         diag_log ("HIVE: Spawning # of Vehicles: " + str(_vehLimit));
  336.         for "_x" from 1 to _vehLimit do {
  337.             [] spawn spawn_vehicles;
  338.         };
  339.     } else {
  340.         diag_log "HIVE: Vehicle Spawn limit reached!";
  341.     };
  342.    
  343.     //  spawn_roadblocks
  344.     diag_log ("HIVE: Spawning # of Debris: " + str(MaxDynamicDebris));
  345.     for "_x" from 1 to MaxDynamicDebris do {
  346.         [] spawn spawn_roadblocks;
  347.     };
  348.     //  spawn_ammosupply at server start 1% of roadblocks
  349.     diag_log ("HIVE: Spawning # of Ammo Boxes: " + str(MaxAmmoBoxes));
  350.     for "_x" from 1 to MaxAmmoBoxes do {
  351.         [] spawn spawn_ammosupply;
  352.     };
  353.     // call spawning mining veins
  354.     diag_log ("HIVE: Spawning # of Veins: " + str(MaxMineVeins));
  355.     for "_x" from 1 to MaxMineVeins do {
  356.         [] spawn spawn_mineveins;
  357.     };
  358.  
  359.     if(isnil "dayz_MapArea") then {
  360.         dayz_MapArea = 10000;
  361.     };
  362.     if(isnil "HeliCrashArea") then {
  363.         HeliCrashArea = dayz_MapArea / 2;
  364.     };
  365.     if(isnil "OldHeliCrash") then {
  366.         OldHeliCrash = false;
  367.     };
  368.  
  369.     // [_guaranteedLoot, _randomizedLoot, _frequency, _variance, _spawnChance, _spawnMarker, _spawnRadius, _spawnFire, _fadeFire]
  370.     if(OldHeliCrash) then {
  371.         _nul = [3, 4, (50 * 60), (15 * 60), 0.75, 'center', HeliCrashArea, true, false] spawn server_spawnCrashSite;
  372.     };
  373.  
  374.     if (isDedicated) then {
  375.         // Epoch Events
  376.         _id = [] spawn server_spawnEvents;
  377.         // server cleanup
  378.         [] spawn {
  379.             private ["_id"];
  380.             sleep 200; //Sleep Lootcleanup, don't need directly cleanup on startup + fix some performance issues on serverstart
  381.             waitUntil {!isNil "server_spawnCleanAnimals"};
  382.             _id = [] execFSM "\z\addons\dayz_server\system\server_cleanup.fsm";
  383.         };
  384.  
  385.         // spawn debug box
  386.         _debugMarkerPosition = getMarkerPos "respawn_west";
  387.         _debugMarkerPosition = [(_debugMarkerPosition select 0),(_debugMarkerPosition select 1),1];
  388.         _vehicle_0 = createVehicle ["DebugBox_DZ", _debugMarkerPosition, [], 0, "CAN_COLLIDE"];
  389.         _vehicle_0 setPos _debugMarkerPosition;
  390.         _vehicle_0 setVariable ["ObjectID","1",true];
  391.  
  392.         // max number of spawn markers
  393.         if(isnil "spawnMarkerCount") then {
  394.             spawnMarkerCount = 10;
  395.         };
  396.         actualSpawnMarkerCount = 0;
  397.         // count valid spawn marker positions
  398.         for "_i" from 0 to spawnMarkerCount do {
  399.             if (!([(getMarkerPos format["spawn%1", _i]), [0,0,0]] call BIS_fnc_areEqual)) then {
  400.                 actualSpawnMarkerCount = actualSpawnMarkerCount + 1;
  401.             } else {
  402.                 // exit since we did not find any further markers
  403.                 _i = spawnMarkerCount + 99;
  404.             };
  405.            
  406.         };
  407.         diag_log format["Total Number of spawn locations %1", actualSpawnMarkerCount];
  408.        
  409.         endLoadingScreen;
  410.     };
  411.  
  412.         // WAI missions
  413.         [] ExecVM "\z\addons\dayz_server\WAI\init.sqf";
  414.  
  415.     allowConnection = true;
  416.     sm_done = true;
  417.     publicVariable "sm_done";
  418. };
RAW Paste Data