Advertisement
isoju

server_monitor.sqf

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