Advertisement
Guest User

fn_vgsInitServer.sqf

a guest
Dec 30th, 2016
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.27 KB | None | 0 0
  1. /*
  2. Author: IT07
  3.  
  4. Description:
  5. init for a3_epoch_garage
  6. */
  7.  
  8. diag_log "///////////////////////////////////////////";
  9. diag_log format["[EPOCH VGS] Starting version %1", ([["cfgPatches","a3_epoch_virtualGarage"],["version"]] call VGS_fnc_vgsGetServerSetting) select 0];
  10. diag_log "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\";
  11.  
  12. "EPOCH_vgsPV" addPublicVariableEventHandler
  13. {
  14. _packet = [_this, 1, [], [[]]] call BIS_fnc_param;
  15. if (count _packet > 1) then
  16. {
  17. if (count _packet < 3) then
  18. {
  19. _data = [_packet, 1, [],[[]]] call BIS_fnc_param;
  20. if (count _data > 1) then
  21. {
  22. switch (_this select 1 select 0) do // Mode
  23. {
  24. case "Request":
  25. {
  26. if (count _data isEqualTo 2) then
  27. {
  28. Private ["_player","_exitLog"];
  29. _player = [_data, 0, objNull, [objNull]] call BIS_fnc_param; // Put sent value into var
  30. if not isNull _player then
  31. {
  32. _key = [_data, 1, "", [""]] call BIS_fnc_param;
  33. if ([_player, _key] in (uiNamespace getVariable "EPOCH_vgsKeys")) then
  34. {
  35. // Data is valid let's get the cars from db and send it to client
  36. _playerUID = getPlayerUID _player;
  37. _response = [format["EPOCH_vgsOwnedVehs_%1", _playerUID], _playerUID] call EPOCH_fnc_server_hiveGET;
  38. if isNil"_response" then { _response = [1,[[],[]]] };
  39. _vehData = _response select 1;
  40. if (_vehData isEqualTo []) then
  41. {
  42. _vehData = [[],[]];
  43. };
  44. if ((_response select 0) isEqualTo 1) then
  45. {
  46. if (typeName _vehData isEqualTo "ARRAY") then
  47. {
  48. _vehsFriendly = _vehData select 0;
  49. _vehsRaw = _vehData select 1;
  50. _slots = "maxGarageSlots" call VGS_fnc_vgsGetServerSetting;
  51. if (count _vehsFriendly < _slots) then
  52. {
  53. if (count _vehsRaw < _slots) then
  54. {
  55. for "_s" from 1 to (_slots-(count _vehsFriendly)) do
  56. {
  57. _vehsFriendly pushBack [];
  58. _vehsRaw pushBack [];
  59. };
  60. };
  61. // Save changes to DB
  62. [format["EPOCH_vgsOwnedVehs_%1", _playerUID], _playerUID, [_vehsFriendly, _vehsRaw]] call EPOCH_fnc_server_hiveSET;
  63. };
  64. if (count _vehsFriendly > _slots) then
  65. {
  66. if (count _vehsRaw > _slots) then
  67. {
  68. for "_s" from 1 to ((count _vehsFriendly)-_slots) do
  69. {
  70. _vehsFriendly resize _slots;
  71. _vehsRaw resize _slots;
  72. };
  73. };
  74. // Save changes to DB
  75. [format["EPOCH_vgsOwnedVehs_%1", _playerUID], _playerUID, [_vehsFriendly, _vehsRaw]] call EPOCH_fnc_server_hiveSET;
  76. };
  77. if not(isNull _player) then
  78. {
  79. EPOCH_vgsMyGarage = _vehsFriendly;
  80. (owner _player) publicVariableClient "EPOCH_vgsMyGarage";
  81. diag_log format["[EPOCH VGS] Client %1 requested his/her vehicles. Result: %2", name _player, EPOCH_vgsMyGarage];
  82. EPOCH_vgsMyGarage = nil;
  83. }
  84. }
  85. }
  86. }
  87. }
  88. }
  89. };
  90.  
  91. case "Write":
  92. {
  93. if (count _data isEqualTo 4) then
  94. {
  95. _playerObj = [_data, 2, objNull, [objNull]] call BIS_fnc_param;
  96. if not isNull _playerObj then
  97. {
  98. _key = [_data, 3, "", [""]] call BIS_fnc_param;
  99. if ([_playerObj, _key] in (uiNamespace getVariable "EPOCH_vgsKeys")) then
  100. {
  101. private ["_vehs"];
  102. // Get the given slot selected
  103. _slot = [_data, 0, -1, [0]] call BIS_fnc_param;
  104. if (_slot > -1) then
  105. {
  106. _slots = "maxGarageSlots" call VGS_fnc_vgsGetServerSetting;
  107. if (_slot < _slots) then
  108. {
  109. // Get the vehicle
  110. _vehObj = [_data, 1, objNull, [objNull]] call BIS_fnc_param;
  111. if not isNull _vehObj then
  112. {
  113. if not isPlayer _vehObj then
  114. {
  115. // do additional checks
  116. if ((owner _vehObj) isEqualTo (owner _playerObj)) then
  117. {
  118. _blacklist = "vehBlacklist" call VGS_fnc_vgsGetServerSetting;
  119. if not(typeOf _vehObj in _blacklist) then
  120. {
  121. _maxDist = "range" call SC_fnc_vgsGetClientSetting;
  122. if (((position _playerObj) distance (position _vehObj)) < _maxDist) then
  123. {
  124. // Get the player
  125. diag_log format["[EPOCH VGS] EPOCH_vgsWrite: _data = %1", _data];
  126. // Define player's UID
  127. _playerUID = getPlayerUID _playerObj;
  128. // Define the classname of _veh
  129. _typeOf = typeOf _vehObj;
  130. // Get the storage usage
  131. _gear = [[],[],[],[]]; // 0: Weapons | 1: Mags | 2: Items | 3: Backpacks
  132. {
  133. (_gear select 1) pushBack [_x select 0, _x select 1];
  134. } forEach (magazinesAmmoCargo _vehObj);
  135. _gear set [2, getItemCargo _vehObj];
  136. _itemCount = 0;
  137. {
  138. _itemCount = _itemCount + _x;
  139. } forEach ((_gear select 2) select 1);
  140. {
  141. (_gear select 0) pushBack (_x select 0);
  142. _silencer = _x select 1;
  143. if not(_silencer isEqualTo "") then { (_gear select 2 select 0) pushBack _silencer; (_gear select 2 select 1) pushBack 1 };
  144. _light = _x select 2;
  145. if not(_light isEqualTo "") then { (_gear select 2 select 0) pushBack _light; (_gear select 2 select 1) pushBack 1 };
  146. _scope = _x select 3;
  147. if not(_scope isEqualTo "") then { (_gear select 2 select 0) pushBack _scope; (_gear select 2 select 1) pushBack 1 };
  148. if (count _x > 5) then
  149. {
  150. _mag = _x select 4;
  151. if not(_mag isEqualTo "") then { (_gear select 1) pushBack [_mag select 0, _mag select 1] };
  152. _bipod = _x select 5;
  153. if not(_bipod isEqualTo "") then
  154. {
  155. _found = (_gear select 2 select 0) find _bipod;
  156. switch _found do
  157. {
  158. case -1:
  159. {
  160. (_gear select 2 select 0) pushBack _bipod;
  161. (_gear select 2 select 1) pushBack 1;
  162. };
  163. default
  164. {
  165. _count = (_gear select 2 select 1) select _found;
  166. _count = _count + 1;
  167. (_gear select 2 select 1) set [_found, _count];
  168. }
  169. }
  170. }
  171. };
  172. if (count _x isEqualTo 5) then
  173. {
  174. _bipod = _x select 4;
  175. if not(_bipod isEqualTo "") then
  176. {
  177. _found = (_gear select 2 select 0) find _bipod;
  178. if (_found isEqualTo -1) then
  179. {
  180. (_gear select 2 select 0) pushBack _bipod;
  181. (_gear select 2 select 1) pushBack 1
  182. };
  183. if (_found > -1) then
  184. {
  185. _count = (_gear select 2 select 1) select _found;
  186. _count = _count + 1;
  187. (_gear select 2 select 1) set [_found, _count]
  188. }
  189. }
  190. }
  191. } forEach (weaponsItemsCargo _vehObj);
  192. _gear set [3, getBackpackCargo _vehObj];
  193. _packCount = 0;
  194. {
  195. _packCount = _packCount + _x;
  196. } forEach ((_gear select 3) select 1);
  197. _pos = getPosATL _vehObj;
  198. _dir = getDir _vehObj;
  199. // Get the fuel level of _veh
  200. _fuel = fuel _vehObj;
  201. // Get the hitPoint(s) damage of given vehicle
  202. _hitPoints = [configFile >> "CfgVehicles" >> _typeOf >> "HitPoints",0] call BIS_fnc_returnChildren;
  203. _damagedParts = [];
  204. {
  205. if (_vehObj getHitPointDamage (configName _x) > 0) then
  206. {
  207. _partDamage = _vehObj getHitPointDamage (configName _x);
  208. _overallDamage = _overallDamage + _partDamage;
  209. _damagedParts pushBack [configName _x, _partDamage];
  210. };
  211. } forEach _hitPoints;
  212. // Get existing vehicles
  213. _response = [format["EPOCH_vgsOwnedVehs_%1", _playerUID], _playerUID] call EPOCH_fnc_server_hiveGET;
  214. if ((_response select 0) isEqualTo 1) then
  215. {
  216. if (typeName (_response select 1) isEqualTo "ARRAY") then
  217. {
  218. _vehsFriendly = _response select 1 select 0;
  219. _vehsRaw = _response select 1 select 1;
  220. if not(count _vehsFriendly isEqualTo 0) then
  221. { // If there is already a vehicle, clear it
  222. _vehsFriendly set [_slot, []];
  223. _vehsRaw set [_slot, []];
  224. };
  225. (_vehsFriendly select _slot) pushBack _typeOf;
  226. {
  227. (_vehsRaw select _slot) pushBack _x
  228. // } forEach [_typeOf, _gear, _fuel, _damagedParts, [_pos, _dir]];
  229. } forEach [_typeOf, _gear, _fuel, _damagedParts, [_pos, _dir],magazinesAllTurrets _vehObj]; // Added magazinesAllTurrets by Ignatz - He-Man
  230. [format["EPOCH_vgsOwnedVehs_%1", _playerUID], _playerUID, [_vehsFriendly, _vehsRaw]] call EPOCH_fnc_server_hiveSET;
  231. {
  232. moveOut _x;
  233. } forEach (crew _vehObj);
  234. _vehObj setDamage 1;
  235. deleteVehicle _vehObj;
  236. if not(isNull _playerObj) then
  237. {
  238. EPOCH_vgsMyGarage = _vehsFriendly;
  239. (owner _playerObj) publicVariableClient "EPOCH_vgsMyGarage";
  240. diag_log format["[EPOCH VGS] Client (%1) put his/her %2 in garage", name _playerObj, _typeOf];
  241. EPOCH_vgsMyGarage = nil;
  242. }
  243. }
  244. }
  245. }
  246. }
  247. }
  248. }
  249. }
  250. }
  251. }
  252. }
  253. }
  254. }
  255. };
  256.  
  257. case "Read":
  258. {
  259. if (count _data isEqualto 3) then
  260. {
  261. _playerObj = [_data, 1, objNull, [objNull]] call BIS_fnc_param;
  262. if not isNull _playerObj then
  263. {
  264. _key = [_data, 2, "", [""]] call BIS_fnc_param;
  265. if ([_playerObj, _key] in (uiNamespace getVariable "EPOCH_vgsKeys")) then
  266. {
  267. private ["_vehsFriendly","_vehsRaw"];
  268. _requested = [_data, 0, -1, [0]] call BIS_fnc_param;
  269. if (_requested > -1) then
  270. {
  271. _playerUID = getPlayerUID _playerObj;
  272. _response = [format["EPOCH_vgsOwnedVehs_%1", _playerUID], _playerUID] call EPOCH_fnc_server_hiveGET;
  273. if ((_response select 0) isEqualTo 1) then
  274. {
  275. if (typeName (_response select 1) isEqualTo "ARRAY") then
  276. {
  277. _vehsFriendly = _response select 1 select 0;
  278. _vehsRaw = _response select 1 select 1;
  279. _maxSlots = "maxGarageSlots" call VGS_fnc_vgsGetServerSetting;
  280. if (_requested < _maxSlots) then
  281. {
  282. _toSpawn = _vehsRaw select _requested;
  283. if (count _toSpawn > 0) then
  284. {
  285. _vehsFriendly set [_requested, []]; // Remove the vehicle from garage slot
  286. _vehsRaw set [_requested, []];
  287. [format["EPOCH_vgsOwnedVehs_%1", _playerUID], _playerUID, [_vehsFriendly, _vehsRaw]] call EPOCH_fnc_server_hiveSET;
  288. _pos = _toSpawn select 4 select 0;
  289. _veh = createVehicle [_toSpawn select 0, _pos, [], 0, "CAN_COLLIDE"];
  290. _veh setDir (_toSpawn select 4 select 1);
  291. _veh call EPOCH_server_setVToken;
  292. clearWeaponCargoGlobal _veh;
  293. clearMagazineCargoGlobal _veh;
  294. clearItemCargoGlobal _veh;
  295. clearBackpackCargoGlobal _veh;
  296.  
  297. // remove and add back magazines by Ignatz - He-Man
  298. if ((count _toSpawn) > 5) then {
  299. if ((_toSpawn select 5) isequaltype []) then {
  300. if !((_toSpawn select 5) isequalto []) then {
  301. {
  302. _veh removeMagazinesTurret [_x select 0, _x select 1];
  303. } foreach magazinesAllTurrets _veh;
  304. {
  305. if ((_x select 2) > 0) then {
  306. _veh addMagazineTurret [_x select 0,_x select 1,_x select 2];
  307. };
  308. } foreach (_toSpawn select 5);
  309. };
  310. };
  311. };
  312.  
  313. _hitPoints = _toSpawn select 3;
  314. if (count _hitPoints > 0) then
  315. {
  316. {
  317. _veh setHitPointDamage [_x select 0, _x select 1];
  318. } forEach _hitPoints;
  319. };
  320. _fuel = _toSpawn select 2;
  321. _veh setFuel _fuel;
  322. _veh setVehicleLock "LOCKEDPLAYER";
  323. _gear = _toSpawn select 1;
  324. _weapons = _gear select 0;
  325. {
  326. _veh addWeaponCargoGlobal [_x, 1];
  327. } forEach _weapons;
  328. _mags = _gear select 1;
  329. {
  330. _veh addMagazineAmmoCargo [_x select 0, 1, _x select 1];
  331. } forEach _mags;
  332. _items = _gear select 2;
  333. {
  334. _veh addItemCargoGlobal [_x, _items select 1 select _forEachIndex];
  335. } forEach (_items select 0);
  336. _packs = _gear select 3;
  337. {
  338. _veh addBackpackCargoGlobal [_x, _packs select 1 select _forEachIndex];
  339. } forEach (_packs select 0);
  340. if (_veh isKindOf "Car") then
  341. {
  342. _veh engineOn true;
  343. };
  344. _veh setOwner (owner _playerObj);
  345. // Refetch the vehicles from db and send it to Client
  346. _response = [format["EPOCH_vgsOwnedVehs_%1", _playerUID], _playerUID] call EPOCH_fnc_server_hiveGET;
  347. if ((_response select 0) isEqualTo 1) then
  348. {
  349. if (typeName (_response select 1) isEqualTo "ARRAY") then
  350. {
  351. if not(isNull _playerObj) then
  352. {
  353. EPOCH_vgsMyGarage = _response select 1 select 0;
  354. (owner _playerObj) publicVariableClient "EPOCH_vgsMyGarage";
  355. diag_log format["[EPOCH VGS] Client %1 took his/her %2 from garage", name _playerObj, _toSpawn select 0];
  356. EPOCH_vgsMyGarage = nil;
  357. }
  358. }
  359. }
  360. }
  361. }
  362. }
  363. }
  364. }
  365. }
  366. }
  367. }
  368. };
  369. case "Trash":
  370. {
  371. if (count _data isEqualTo 3) then
  372. {
  373. _player = [_data, 1, objNull, [objNull]] call BIS_fnc_param;
  374. if not isNull _player then
  375. {
  376. _key = [_data, 2, "", [""]] call BIS_fnc_param;
  377. if ([_player, _key] in (uiNamespace getVariable "EPOCH_vgsKeys")) then
  378. {
  379. _slot = [_data, 0, -1, [0]] call BIS_fnc_param;
  380. if (_slot > -1) then
  381. {
  382. _maxSlots = "maxGarageSlots" call VGS_fnc_vgsGetServerSetting;
  383. if (_slot < _maxSlots) then
  384. {
  385. _playerUID = getPlayerUID _player;
  386. _response = [format["EPOCH_vgsOwnedVehs_%1", _playerUID], _playerUID] call EPOCH_fnc_server_hiveGET;
  387. if ((_response select 0) isEqualTo 1) then
  388. {
  389. if (typeName (_response select 1) isEqualTo "ARRAY") then
  390. {
  391. _vehsFriendly = _response select 1 select 0;
  392. _vehsFriendly set [_slot, []];
  393. _vehsRaw = _response select 1 select 1;
  394. _vehsRaw set [_slot, []];
  395. [format["EPOCH_vgsOwnedVehs_%1", _playerUID], _playerUID, [_vehsFriendly, _vehsRaw]] call EPOCH_fnc_server_hiveSET;
  396. if not(isNull _player) then
  397. {
  398. EPOCH_vgsMyGarage = _vehsFriendly;
  399. (owner _player) publicVariableClient "EPOCH_vgsMyGarage";
  400. EPOCH_vgsMyGarage = nil;
  401. }
  402. }
  403. }
  404. }
  405. }
  406. }
  407. }
  408. }
  409. };
  410. default {};
  411. }
  412. }
  413. }
  414. }
  415. };
  416.  
  417. [] spawn
  418. { // My cute little secure and unbreakable key generator/sender :)
  419. _givenTo = [];
  420. uiNamespace setVariable ["EPOCH_vgsKeys", []];
  421. while {true} do
  422. {
  423. if not(count _givenTo isEqualTo 0) then
  424. { // If _givenTo array isn't empty, loop through it to see if there are any non-existent units in it
  425. private ["_rem"];
  426. _rem = [];
  427. {
  428. if isNull _x then
  429. {
  430. _rem pushBack _x;
  431. };
  432. if not isNull _x then
  433. {
  434. if (side _x isEqualTo civilian) then
  435. {
  436. _rem pushBack _x;
  437. };
  438. };
  439. } forEach _givenTo;
  440. if not(count _rem isEqualTo 0) then
  441. {
  442. {
  443. _index = _givenTo find _x;
  444. _givenTo deleteAt _index;
  445. } forEach _rem;
  446. }
  447. };
  448.  
  449. if not(count playableUnits isEqualTo 0) then
  450. {
  451. _keys = uiNamespace getVariable "EPOCH_vgsKeys";
  452. //check the variable
  453. if not isNil"_keys" then
  454. {
  455. if (typeName _keys isEqualTo "ARRAY") then
  456. {
  457. {
  458. if not(_x in _givenTo) then
  459. {
  460. if (isPlayer _x) then
  461. {
  462. if not(side _x isEqualTo civilian) then
  463. {
  464. _key = call VGS_fnc_vgsGenKey;
  465. _keys pushBack [_x, _key];
  466. EPOCH_vgsMyKey = _key;
  467. (owner _x) publicVariableClient "EPOCH_vgsMyKey";
  468. EPOCH_vgsMyKey = nil;
  469. _givenTo pushBack _x;
  470. };
  471. }
  472. }
  473. } forEach playableUnits;
  474. };
  475. if not(typeName _keys isEqualTo "ARRAY") then
  476. {
  477. uiNamespace setVariable ["EPOCH_vgsKeys", []];
  478. };
  479. };
  480. if isNil"_keys" then
  481. {
  482. uiNamespace setVariable ["EPOCH_vgsKeys", []];
  483. }
  484. };
  485. uiSleep 3;
  486. }
  487. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement