Advertisement
Guest User

server_monitor.sqf

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