Advertisement
Guest User

Untitled

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