Advertisement
Guest User

server_monitor

a guest
Oct 19th, 2014
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.58 KB | None | 0 0
  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","_ownerUID","_oQty","_originsQueue","_isOrigins"];
  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. // Custom Configs
  15. if(isnil "MaxVehicleLimit") then {
  16. MaxVehicleLimit = 50;
  17.  
  18. call compile preProcessFileLineNumbers "\z\addons\dayz_server\buildings\fnc_bridgeA2.sqf";
  19. };
  20.  
  21. if(isnil "MaxDynamicDebris") then {
  22. MaxDynamicDebris = 100;
  23. };
  24. if(isnil "MaxAmmoBoxes") then {
  25. MaxAmmoBoxes = 3;
  26. };
  27. if(isnil "MaxMineVeins") then {
  28. MaxMineVeins = 50;
  29. };
  30. // Custon Configs End
  31.  
  32. if (isServer && isNil "sm_done") then {
  33.  
  34. serverVehicleCounter = [];
  35. _hiveResponse = [];
  36.  
  37. for "_i" from 1 to 5 do {
  38. diag_log "HIVE: trying to get objects";
  39. _key = format["CHILD:302:%1:", dayZ_instance];
  40. _hiveResponse = _key call server_hiveReadWrite;
  41. if ((((isnil "_hiveResponse") || {(typeName _hiveResponse != "ARRAY")}) || {((typeName (_hiveResponse select 1)) != "SCALAR")})) then {
  42. if ((_hiveResponse select 1) == "Instance already initialized") then {
  43. _superkey = profileNamespace getVariable "SUPERKEY";
  44. _shutdown = format["CHILD:400:%1:", _superkey];
  45. _res = _shutdown call server_hiveReadWrite;
  46. diag_log ("HIVE: attempt to kill.. HiveExt response:"+str(_res));
  47. } else {
  48. diag_log ("HIVE: connection problem... HiveExt response:"+str(_hiveResponse));
  49.  
  50. };
  51. _hiveResponse = ["",0];
  52. }
  53. else {
  54. diag_log ("HIVE: found "+str(_hiveResponse select 1)+" objects" );
  55. _i = 99; // break
  56. };
  57. };
  58. if (isNil "_originsQueue") then {
  59. _originsQueue = [];
  60. };
  61. _BuildingQueue = [];
  62. _objectQueue = [];
  63. owner_B1 = [];
  64. owner_B2 = [];
  65. owner_B3 = [];
  66. owner_H1 = [];
  67. owner_H2 = [];
  68. owner_H3 = [];
  69. owner_SG = [];
  70. owner_LG = [];
  71. owner_KING = [];
  72. owner_SH = [];
  73.  
  74. if ((_hiveResponse select 0) == "ObjectStreamStart") then {
  75.  
  76. // save superkey
  77. profileNamespace setVariable ["SUPERKEY",(_hiveResponse select 2)];
  78.  
  79. _hiveLoaded = true;
  80.  
  81. diag_log ("HIVE: Commence Object Streaming...");
  82. _key = format["CHILD:302:%1:", dayZ_instance];
  83. _objectCount = _hiveResponse select 1;
  84. _bQty = 0;
  85. _vQty = 0;
  86. _oQty = 0;
  87.  
  88. for "_i" from 1 to _objectCount do {
  89. _isOrigins = false;
  90. _hiveResponse = _key call server_hiveReadWriteLarge;
  91. //diag_log (format["HIVE dbg %1 %2", typeName _hiveResponse, _hiveResponse]);
  92. {
  93. if((_hiveResponse select 2) isKindOf _x) exitWith {
  94. _originsQueue set [_oQty,_hiveResponse];
  95. _oQty = _oQty + 1;
  96. _isOrigins = true;
  97. };
  98. } forEach DZE_Origins_Buildings;
  99. if(!_isOrigins) then {
  100. if ((_hiveResponse select 2) isKindOf "ModularItems") then {
  101. _BuildingQueue set [_bQty,_hiveResponse];
  102. _bQty = _bQty + 1;
  103. } else {
  104. _objectQueue set [_vQty,_hiveResponse];
  105. _vQty = _vQty + 1;
  106. };
  107. };
  108. };
  109. diag_log ("HIVE: got " + str(_bQty) + " Epoch Objects and " + str(_vQty) + " Vehicles");
  110. };
  111.  
  112. // # NOW SPAWN OBJECTS #
  113. _totalvehicles = 0;
  114. {
  115. _idKey = _x select 1;
  116. _type = _x select 2;
  117. _ownerID = _x select 3;
  118.  
  119. _worldspace = _x select 4;
  120. _intentory = _x select 5;
  121. _hitPoints = _x select 6;
  122. _fuel = _x select 7;
  123. _damage = _x select 8;
  124.  
  125. _dir = 0;
  126. _pos = [0,0,0];
  127. _wsDone = false;
  128. if (count _worldspace >= 2) then
  129. {
  130. _dir = _worldspace select 0;
  131. if (count (_worldspace select 1) == 3) then {
  132. _pos = _worldspace select 1;
  133. _wsDone = true;
  134. }
  135. };
  136.  
  137. if (!_wsDone) then {
  138. if (count _worldspace >= 1) then { _dir = _worldspace select 0; };
  139. _pos = [getMarkerPos "center",0,4000,10,0,2000,0] call BIS_fnc_findSafePos;
  140. if (count _pos < 3) then { _pos = [_pos select 0,_pos select 1,0]; };
  141. diag_log ("MOVED OBJ: " + str(_idKey) + " of class " + _type + " to pos: " + str(_pos));
  142. };
  143.  
  144.  
  145. if (_damage < 1) then {
  146. //diag_log format["OBJ: %1 - %2", _idKey,_type];
  147.  
  148. //Create it
  149. _object = createVehicle [_type, _pos, [], 0, "CAN_COLLIDE"];
  150. _object setVariable ["lastUpdate",time];
  151. _object setVariable ["ObjectID", _idKey, true];
  152.  
  153. _lockable = 0;
  154. if(isNumber (configFile >> "CfgVehicles" >> _type >> "lockable")) then {
  155. _lockable = getNumber(configFile >> "CfgVehicles" >> _type >> "lockable");
  156. };
  157.  
  158. // fix for leading zero issues on safe codes after restart
  159. if (_lockable == 4) then {
  160. _codeCount = (count (toArray _ownerID));
  161. if(_codeCount == 3) then {
  162. _ownerID = format["0%1", _ownerID];
  163. };
  164. if(_codeCount == 2) then {
  165. _ownerID = format["00%1", _ownerID];
  166. };
  167. if(_codeCount == 1) then {
  168. _ownerID = format["000%1", _ownerID];
  169. };
  170. };
  171.  
  172. if (_lockable == 3) then {
  173. _codeCount = (count (toArray _ownerID));
  174. if(_codeCount == 2) then {
  175. _ownerID = format["0%1", _ownerID];
  176. };
  177. if(_codeCount == 1) then {
  178. _ownerID = format["00%1", _ownerID];
  179. };
  180. };
  181.  
  182. _object setVariable ["CharacterID", _ownerID, true];
  183.  
  184. clearWeaponCargoGlobal _object;
  185. clearMagazineCargoGlobal _object;
  186. // _object setVehicleAmmo DZE_vehicleAmmo;
  187.  
  188. _object setdir _dir;
  189. _object setposATL _pos;
  190. _object setDamage _damage;
  191.  
  192. if ((typeOf _object) in dayz_allowedObjects) then {
  193. if (DZE_GodModeBase) then {
  194. _object addEventHandler ["HandleDamage", {false}];
  195. } else {
  196. _object addMPEventHandler ["MPKilled",{_this call object_handleServerKilled;}];
  197. };
  198. // Test disabling simulation server side on buildables only.
  199. _object enableSimulation false;
  200. // used for inplace upgrades && lock/unlock of safe
  201. _object setVariable ["OEMPos", _pos, true];
  202.  
  203. };
  204.  
  205. if (count _intentory > 0) then {
  206. if (_type in DZE_LockedStorage || _type in DZE_Origins_Buildings) then {
  207. // Fill variables with loot
  208. _object setVariable ["WeaponCargo", (_intentory select 0),true];
  209. _object setVariable ["MagazineCargo", (_intentory select 1),true];
  210. _object setVariable ["BackpackCargo", (_intentory select 2),true];
  211. } else {
  212.  
  213. //Add weapons
  214. _objWpnTypes = (_intentory select 0) select 0;
  215. _objWpnQty = (_intentory select 0) select 1;
  216. _countr = 0;
  217. {
  218. if(_x in (DZE_REPLACE_WEAPONS select 0)) then {
  219. _x = (DZE_REPLACE_WEAPONS select 1) select ((DZE_REPLACE_WEAPONS select 0) find _x);
  220. };
  221. _isOK = isClass(configFile >> "CfgWeapons" >> _x);
  222. if (_isOK) then {
  223. _object addWeaponCargoGlobal [_x,(_objWpnQty select _countr)];
  224. };
  225. _countr = _countr + 1;
  226. } count _objWpnTypes;
  227.  
  228. //Add Magazines
  229. _objWpnTypes = (_intentory select 1) select 0;
  230. _objWpnQty = (_intentory select 1) select 1;
  231. _countr = 0;
  232. {
  233. if (_x == "BoltSteel") then { _x = "WoodenArrow" }; // Convert BoltSteel to WoodenArrow
  234. if (_x == "ItemTent") then { _x = "ItemTentOld" };
  235. _isOK = isClass(configFile >> "CfgMagazines" >> _x);
  236. if (_isOK) then {
  237. _object addMagazineCargoGlobal [_x,(_objWpnQty select _countr)];
  238. };
  239. _countr = _countr + 1;
  240. } count _objWpnTypes;
  241.  
  242. //Add Backpacks
  243. _objWpnTypes = (_intentory select 2) select 0;
  244. _objWpnQty = (_intentory select 2) select 1;
  245. _countr = 0;
  246. {
  247. _isOK = isClass(configFile >> "CfgVehicles" >> _x);
  248. if (_isOK) then {
  249. _object addBackpackCargoGlobal [_x,(_objWpnQty select _countr)];
  250. };
  251. _countr = _countr + 1;
  252. } count _objWpnTypes;
  253. };
  254. };
  255.  
  256. if (_object isKindOf "AllVehicles") then {
  257. {
  258. _selection = _x select 0;
  259. _dam = _x select 1;
  260. if (_selection in dayZ_explosiveParts && _dam > 0.8) then {_dam = 0.8};
  261. [_object,_selection,_dam] call object_setFixServer;
  262. } count _hitpoints;
  263.  
  264. _object setFuel _fuel;
  265.  
  266. if (!((typeOf _object) in dayz_allowedObjects)) then {
  267.  
  268. //_object setvelocity [0,0,1];
  269. _object call fnc_veh_ResetEH;
  270.  
  271. if(_ownerID != "0" && !(_object isKindOf "Bicycle")) then {
  272. _object setvehiclelock "locked";
  273. };
  274.  
  275. _totalvehicles = _totalvehicles + 1;
  276.  
  277. // total each vehicle
  278. serverVehicleCounter set [count serverVehicleCounter,_type];
  279. };
  280. };
  281.  
  282. //Monitor the object
  283. if(_type in DZE_Origins_Buildings) then {
  284. //diag_log format["Origins Object: %1 - %2", _type,_ownerID];
  285. _object setVariable ["CanBeUpdated",false, true];
  286.  
  287. {
  288. _object setVariable ["OwnerUID",(_x select 0), true];
  289. _object setVariable ["OwnerName",(_x select 1), true];
  290. } count _hitPoints;
  291. _ownerUID = _object getVariable ["OwnerUID","0"];
  292. switch(_type) do {
  293. case "Uroven1DrevenaBudka" : { owner_B1 set [count owner_B1, _ownerUID];};
  294. case "Uroven2KladaDomek" : { owner_B2 set [count owner_B2, _ownerUID];};
  295. case "Uroven3DrevenyDomek" : { owner_B3 set [count owner_B3, _ownerUID];};
  296. case "Uroven1VelkaBudka" : { owner_H1 set [count owner_H1, _ownerUID];};
  297. case "Uroven2MalyDomek" : { owner_H2 set [count owner_H2, _ownerUID];};
  298. case "Uroven3VelkyDomek" : { owner_H3 set [count owner_H3, _ownerUID];};
  299. case "malaGaraz" : { owner_SG set [count owner_SG, _ownerUID];};
  300. case "velkaGaraz" : { owner_LG set [count owner_LG, _ownerUID];};
  301. case "kingramida" : { owner_KING set [count owner_KING, _ownerUID];};
  302. case "krepost" : { owner_SH set [count owner_SH, _ownerUID];};
  303. };
  304. if((_pos select 2) < 0.25) then {
  305. _object setVectorUp surfaceNormal position _object;
  306. };
  307. _object setVectorUp surfaceNormal position _object;
  308. };
  309. PVDZE_serverObjectMonitor set [count PVDZE_serverObjectMonitor,_object];
  310. };
  311. } count (_BuildingQueue + _originsQueue + _objectQueue);
  312. // # END SPAWN OBJECTS #
  313.  
  314. // preload server traders menu data into cache
  315. if !(DZE_ConfigTrader) then {
  316. {
  317. // get tids
  318. _traderData = call compile format["menu_%1;",_x];
  319. if(!isNil "_traderData") then {
  320. {
  321. _traderid = _x select 1;
  322.  
  323. _retrader = [];
  324.  
  325. _key = format["CHILD:399:%1:",_traderid];
  326. _data = "HiveEXT" callExtension _key;
  327.  
  328. //diag_log "HIVE: Request sent";
  329.  
  330. //Process result
  331. _result = call compile format ["%1",_data];
  332. _status = _result select 0;
  333.  
  334. if (_status == "ObjectStreamStart") then {
  335. _val = _result select 1;
  336. //Stream Objects
  337. //diag_log ("HIVE: Commence Menu Streaming...");
  338. call compile format["ServerTcache_%1 = [];",_traderid];
  339. for "_i" from 1 to _val do {
  340. _data = "HiveEXT" callExtension _key;
  341. _result = call compile format ["%1",_data];
  342. call compile format["ServerTcache_%1 set [count ServerTcache_%1,%2]",_traderid,_result];
  343. _retrader set [count _retrader,_result];
  344. };
  345. //diag_log ("HIVE: Streamed " + str(_val) + " objects");
  346. };
  347.  
  348. } forEach (_traderData select 0);
  349. };
  350. } forEach serverTraders;
  351. };
  352.  
  353. if (_hiveLoaded) then {
  354. // spawn_vehicles
  355. _vehLimit = MaxVehicleLimit - _totalvehicles;
  356. if(_vehLimit > 0) then {
  357. diag_log ("HIVE: Spawning # of Vehicles: " + str(_vehLimit));
  358. for "_x" from 1 to _vehLimit do {
  359. [] spawn spawn_vehicles;
  360. };
  361. } else {
  362. diag_log "HIVE: Vehicle Spawn limit reached!";
  363. };
  364. };
  365.  
  366. // spawn_roadblocks
  367. diag_log ("HIVE: Spawning # of Debris: " + str(MaxDynamicDebris));
  368. for "_x" from 1 to MaxDynamicDebris do {
  369. [] spawn spawn_roadblocks;
  370. };
  371. // spawn_ammosupply at server start 1% of roadblocks
  372. diag_log ("HIVE: Spawning # of Ammo Boxes: " + str(MaxAmmoBoxes));
  373. for "_x" from 1 to MaxAmmoBoxes do {
  374. [] spawn spawn_ammosupply;
  375. };
  376. // call spawning mining veins
  377. diag_log ("HIVE: Spawning # of Veins: " + str(MaxMineVeins));
  378. for "_x" from 1 to MaxMineVeins do {
  379. [] spawn spawn_mineveins;
  380. };
  381.  
  382. if(isnil "dayz_MapArea") then {
  383. dayz_MapArea = 10000;
  384. };
  385. if(isnil "HeliCrashArea") then {
  386. HeliCrashArea = dayz_MapArea / 2;
  387. };
  388. if(isnil "OldHeliCrash") then {
  389. OldHeliCrash = false;
  390. };
  391.  
  392. // [_guaranteedLoot, _randomizedLoot, _frequency, _variance, _spawnChance, _spawnMarker, _spawnRadius, _spawnFire, _fadeFire]
  393. if(OldHeliCrash) then {
  394. _nul = [3, 4, (50 * 60), (15 * 60), 0.75, 'center', HeliCrashArea, true, false] spawn server_spawnCrashSite;
  395. };
  396. if (isDedicated) then {
  397. // Epoch Events
  398. _id = [] spawn server_spawnEvents;
  399. // server cleanup
  400. [] spawn {
  401. private ["_id"];
  402. sleep 200; //Sleep Lootcleanup, don't need directly cleanup on startup + fix some performance issues on serverstart
  403. waitUntil {!isNil "server_spawnCleanAnimals"};
  404. _id = [] execFSM "\z\addons\dayz_server\system\server_cleanup.fsm";
  405. };
  406.  
  407. // spawn debug box
  408. _debugMarkerPosition = getMarkerPos "respawn_west";
  409. _debugMarkerPosition = [(_debugMarkerPosition select 0),(_debugMarkerPosition select 1),1];
  410. _vehicle_0 = createVehicle ["DebugBox_DZ", _debugMarkerPosition, [], 0, "CAN_COLLIDE"];
  411. _vehicle_0 setPos _debugMarkerPosition;
  412. _vehicle_0 setVariable ["ObjectID","1",true];
  413.  
  414. // max number of spawn markers
  415. if(isnil "spawnMarkerCount") then {
  416. spawnMarkerCount = 10;
  417. };
  418. actualSpawnMarkerCount = 0;
  419. // count valid spawn marker positions
  420. for "_i" from 0 to spawnMarkerCount do {
  421. if (!([(getMarkerPos format["spawn%1", _i]), [0,0,0]] call BIS_fnc_areEqual)) then {
  422. actualSpawnMarkerCount = actualSpawnMarkerCount + 1;
  423. } else {
  424. // exit since we did not find any further markers
  425. _i = spawnMarkerCount + 99;
  426. };
  427.  
  428. };
  429. diag_log format["Total Number of spawn locations %1", actualSpawnMarkerCount];
  430.  
  431. endLoadingScreen;
  432. };
  433.  
  434. [] ExecVM "\z\addons\dayz_server\DZMS\DZMSInit.sqf";
  435. [] ExecVM "\z\addons\dayz_server\WAI\init.sqf";
  436. [] ExecVM "\z\addons\dayz_server\origins\variables.sqf";
  437. allowConnection = true;
  438. sm_done = true;
  439. publicVariable "sm_done";
  440. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement