Advertisement
Guest User

fn_main.sqf

a guest
Nov 25th, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.06 KB | None | 0 0
  1. // 0 = [this, <other parameters>] spawn jebus_fnc_main;
  2. // 0 = [this, "LIVES=",1] spawn jebus_fnc_main;
  3.  
  4. if (!isServer) exitWith {};
  5.  
  6. private [
  7. "_unit"
  8. ,"_cacheRadius"
  9. ,"_crewList"
  10. ,"_crewInventoryList"
  11. ,"_crewSkillList"
  12. ,"_crewVarNameList"
  13. ,"_debug"
  14. ,"_exitTrigger"
  15. ,"_firstLoop"
  16. ,"_gaiaParameter"
  17. ,"_gaiaZone"
  18. ,"_infantryList"
  19. ,"_infantryInventoryList"
  20. ,"_infantrySkillList"
  21. ,"_infantryVarNameList"
  22. ,"_initString"
  23. ,"_initialDelay"
  24. ,"_lives"
  25. ,"_newGroup"
  26. ,"_newVehicle"
  27. ,"_pauseRadius"
  28. ,"_reduceRadius"
  29. ,"_respawnDelay"
  30. ,"_respawnDir"
  31. ,"_respawnMarkers"
  32. ,"_respawnPos"
  33. ,"_special"
  34. ,"_tmpGroup"
  35. ,"_tmpRespawnPos"
  36. ,"_tmpZone"
  37. ,"_trigger"
  38. ,"_unitGroup"
  39. ,"_unitSide"
  40. ,"_unitsInGroup"
  41. ,"_vehicleHitpointsDamageList"
  42. ,"_vehicleHealthList"
  43. ,"_vehicleFuelList"
  44. ,"_vehicleList"
  45. ,"_vehiclePositionList"
  46. ,"_vehicleItemList"
  47. ,"_vehicleLockedList"
  48. ,"_vehicleMagazineList"
  49. ,"_vehiclePylonList"
  50. ,"_vehicleWeaponList"
  51. ,"_vehicleBackpackList"
  52. ,"_vehicleMaterialsList"
  53. ,"_vehicleTexturesList"
  54. ,"_vehicleAnimationNames"
  55. ,"_vehicleAnimationPhases"
  56. ,"_vehicleVarNameList"
  57. ,"_waypointList"
  58. ,"_synchronizedObjectsList"
  59. ];
  60.  
  61. _unit = _this select 0;
  62.  
  63. // Make sure unit is a unit and not a group (Thanks to S.Crowe)
  64. if (typeName _unit == "GROUP") then { _unit = leader _unit; };
  65.  
  66. _respawnPos = getPos _unit;
  67. _respawnDir = getDir _unit;
  68. _unitSide = side _unit;
  69.  
  70. _unitGroup = (group _unit);
  71. _unitsInGroup = units _unitGroup;
  72.  
  73. _waypointList = [];
  74. _synchronizedObjectsList = [];
  75. _infantryList = [];
  76. _infantryInventoryList = [];
  77. _infantrySkillList = [];
  78. _infantryVarNameList = [];
  79. _vehicleList = [];
  80. _vehicleHitpointsDamageList = [];
  81. _vehicleHealthList = [];
  82. _vehicleFuelList = [];
  83. _vehiclePositionList = [];
  84. _vehicleLockedList = [];
  85. _vehicleItemList = [];
  86. _vehicleMagazineList = [];
  87. _vehiclePylonList = [];
  88. _vehicleWeaponList = [];
  89. _vehicleBackpackList = [];
  90. _vehicleMaterialsList = [];
  91. _vehicleTexturesList = [];
  92. _vehicleAnimationNames = [];
  93. _vehicleAnimationPhases = [];
  94. _vehicleVarNameList = [];
  95. _crewList = [];
  96. _crewInventoryList = [];
  97. _crewSkillList = [];
  98. _crewVarNameList = [];
  99. _respawnPosList = [];
  100. _respawnPosList pushBack _respawnPos;
  101.  
  102. //Set up default parameters
  103. _lives = -1;
  104. _cacheRadius = 0;
  105. _reduceRadius = 0;
  106. _pauseRadius = 0;
  107. _respawnDelay = 30;
  108. _initialDelay = 0;
  109. _gaiaParameter = "";
  110. _gaiaZone = 0;
  111. _special = "NONE";
  112. _respawnMarkers = [];
  113. _initString = "";
  114. _debug = false;
  115.  
  116. //Get parameters
  117. for "_parameterIndex" from 1 to (count _this - 1) do {
  118. switch (_this select _parameterIndex) do {
  119. case "LIVES=" : {_lives = _this select (_parameterIndex + 1)};
  120. case "DELAY=" : {_respawnDelay = _this select (_parameterIndex + 1)};
  121. case "START=" : {_initialDelay = _this select (_parameterIndex + 1)};
  122. case "CACHE=" : {_cacheRadius = _this select (_parameterIndex + 1)};
  123. case "REDUCE=" : {_reduceRadius = _this select (_parameterIndex + 1)};
  124. case "GAIA_MOVE=" : {_gaiaParameter = "MOVE"; _gaiaZone = _this select (_parameterIndex + 1)};
  125. case "GAIA_NOFOLLOW=" : {_gaiaParameter = "NOFOLLOW"; _gaiaZone = _this select (_parameterIndex + 1)};
  126. case "GAIA_FORTIFY=" : {_gaiaParameter = "FORTIFY"; _gaiaZone = _this select (_parameterIndex + 1)};
  127. case "FLYING" : {_special = "FLY"};
  128. case "RESPAWNMARKERS=" : {_respawnMarkers = _this select (_parameterIndex + 1)};
  129. case "PAUSE=" : {_pauseRadius = _this select (_parameterIndex + 1)};
  130. case "EXIT=" : {_exitTrigger = _this select (_parameterIndex + 1)};
  131. case "INIT=" : {_initString = _this select (_parameterIndex + 1)};
  132. case "DEBUG" : {_debug = true};
  133. };
  134. };
  135.  
  136. //Add additional respawn positions where applicable
  137. {
  138. _respawnPosList pushBack (getMarkerPos _x);
  139. } forEach _respawnMarkers;
  140.  
  141. //Determine number of lives if passed an array
  142. if (typeName _lives == "ARRAY") then {
  143. _minLives = _lives select 0;
  144. _maxLives = _lives select 1;
  145. _lives = _minLives + floor random (_maxLives - _minLives);
  146. };
  147.  
  148. _syncs = synchronizedObjects _unit;
  149.  
  150. {
  151. if (_x isKindOf "EmptyDetector") then
  152. {
  153. _trigger = _x;
  154. if (_debug) then {systemChat "Synchronized trigger activation present"};
  155. }
  156. else
  157. {
  158. _synchronizedObjectsList append [_x];
  159. };
  160. } forEach _syncs;
  161.  
  162. //Freeze units
  163. {
  164. _x enableSimulationGlobal false;
  165. } forEach _unitsInGroup;
  166.  
  167. //Save waypoint data
  168. _waypointList = [_unitGroup] call jebus_fnc_saveWaypoints;
  169.  
  170. //Save unit data and delete
  171. {
  172. if ( (vehicle _x) isKindOf "LandVehicle" || (vehicle _x) isKindOf "Air" || (vehicle _x) isKindOf "Ship") then {
  173. _currentVehicle = vehicle _x;
  174. _vehicleList append [typeOf _currentVehicle];
  175. _vehicleHitpointsDamageList append [getAllHitpointsDamage _currentVehicle];
  176. _vehicleHealthList append [damage _currentVehicle];
  177. _vehicleFuelList append [fuel _currentVehicle];
  178. _vehiclePositionList append [getPos _currentVehicle];
  179. _vehicleLockedList append [locked _currentVehicle];
  180. _vehicleItemList append [itemCargo _currentVehicle];
  181. _vehicleMagazineList append [magazineCargo _currentVehicle];
  182. _vehicleWeaponList append [weaponCargo _currentVehicle];
  183. _vehicleBackpackList append [backpackCargo _currentVehicle];
  184. _vehicleMaterialsList append [getObjectMaterials _currentVehicle];
  185. _vehicleTexturesList append [getObjectTextures _currentVehicle];
  186. _vehiclePylonList append [getPylonMagazines _currentVehicle];
  187.  
  188. _thisAnimationNames = animationNames _currentVehicle;
  189. _thisAnimationPhases = [];
  190. {
  191. _thisAnimationPhases append [_currentVehicle animationPhase _x];
  192. } forEach _thisAnimationNames;
  193. _vehicleAnimationNames append [_thisAnimationNames];
  194. _vehicleAnimationPhases append [_thisAnimationPhases];
  195. _vehicleVarNameList append [vehicleVarName _currentVehicle];
  196.  
  197. _tmpCrew = crew _currentVehicle;
  198. sleep 0.1;
  199. deleteVehicle _currentVehicle;
  200. sleep 0.1;
  201. _tmpCrewList = [];
  202. _tmpCrewInventoryList = [];
  203. _tmpCrewSkillList = [];
  204. _tmpCrewVarNameList = [];
  205. {
  206. _tmpCrewList append [typeOf (vehicle _x)];
  207. _tmpCrewInventoryList append [getUnitLoadout _x];
  208. _tmpCrewSkillList append [skill _x];
  209. _tmpCrewVarNameList append [vehicleVarName _x];
  210. deleteVehicle _x;
  211. sleep 0.1
  212. } forEach _tmpCrew;
  213.  
  214. _crewList set [(count _vehicleList - 1), _tmpCrewList];
  215. _crewInventoryList set [(count _vehicleList - 1), _tmpCrewInventoryList];
  216. _crewSkillList set [(count _vehicleList - 1), _tmpCrewSkillList];
  217. _crewVarNameList set [(count _vehicleList - 1), _tmpCrewVarNameList];
  218. } else {
  219. _infantryList append [typeOf (vehicle _x)];
  220. _infantryInventoryList append [getUnitLoadout _x];
  221. _infantrySkillList append [skill _x];
  222. _infantryVarNameList append [vehicleVarName _x];
  223. deleteVehicle (vehicle _x);
  224. sleep 0.1;
  225. };
  226.  
  227. sleep 0.1;
  228.  
  229. } forEach _unitsInGroup;
  230.  
  231. deleteGroup _unitGroup;
  232. sleep 1;
  233.  
  234. _firstLoop = true;
  235.  
  236. //Main loop
  237. while { _lives != 0 } do {
  238. //Wait for trigger activation (Thanks to pritchardgsd)
  239. if (! isNil "_trigger") then {
  240. while {! (triggerActivated _trigger)} do {
  241. sleep 10;
  242. if (_debug) then {systemChat "Waiting for trigger activation"};
  243. };
  244. };
  245.  
  246. if (_firstLoop && _initialDelay > 0) then {
  247. sleep _initialDelay;
  248. _firstLoop = false;
  249. systemChat "First Loop!";
  250. };
  251.  
  252. if (_debug) then {systemChat "Spawning group."};
  253.  
  254. _newGroup = createGroup _unitSide;
  255. _newGroup setVariable ["groupInitialising", true, false];
  256.  
  257. _tmpRespawnPos = selectRandom _respawnPosList;
  258.  
  259. while {[_tmpRespawnPos, _unitSide, _pauseRadius] call jebus_fnc_enemyInRadius} do {
  260. if (_debug) then {systemChat "Enemies in pause radius. Waiting."};
  261. sleep 5;
  262. };
  263.  
  264. //Spawn vehicles - spawn, disable sim, add crew, enable sim......
  265. for "_vehicleIndex" from 0 to (count _vehicleList - 1) do {
  266. private "_newVehiclePosition";
  267.  
  268. _newVehicleType = (_vehicleList select _vehicleIndex);
  269. if (_tmpRespawnPos isEqualTo _respawnPos) then {
  270. _newVehiclePosition = (_vehiclePositionList select _vehicleIndex);
  271. } else {
  272. if (_vehicleIndex == 0) then {
  273. _newVehiclePosition = _tmpRespawnPos;
  274. } else {
  275. _newVehiclePosition = _tmpRespawnPos findEmptyPosition [5, 50, _newVehicleType];
  276. };
  277. };
  278. _newVehicle = createVehicle [_newVehicleType, _newVehiclePosition, [], 0, _special];
  279. _newGroup setFormDir _respawnDir;
  280. _newVehicle setDir _respawnDir;
  281. _newGroup addVehicle _newVehicle;
  282. _newVehicle enableSimulationGlobal false;
  283. _newVehicle lock (_vehicleLockedList select _vehicleIndex);
  284. _newVehicle setDamage (_vehicleHealthList select _vehicleIndex);
  285. _newVehicle setFuel (_vehicleFuelList select _vehicleIndex);
  286. _hitpoint = (_vehicleHitpointsDamageList select _vehicleIndex) select 0;
  287. _hitpointDamage = (_vehicleHitpointsDamageList select _vehicleIndex) select 2;
  288. {
  289. _newVehicle setHitPointDamage [_x, _hitpointDamage select _forEachIndex];
  290. } forEach _hitpoint;
  291. clearItemCargoGlobal _newVehicle;
  292. clearMagazineCargoGlobal _newVehicle;
  293. clearWeaponCargoGlobal _newVehicle;
  294. clearBackpackCargoGlobal _newVehicle;
  295. {
  296. _newVehicle addItemCargoGlobal [_x,1];
  297. } forEach (_vehicleItemList select _vehicleIndex);
  298. {
  299. _newVehicle addMagazineCargoGlobal [_x,1];
  300. } forEach (_vehicleMagazineList select _vehicleIndex);
  301. {
  302. _newVehicle addWeaponCargoGlobal [_x,1];
  303. } forEach (_vehicleWeaponList select _vehicleIndex);
  304. {
  305. _newVehicle addBackpackCargoGlobal [_x,1];
  306. } forEach (_vehicleBackpackList select _vehicleIndex);
  307. {
  308. _newVehicle setPylonLoadOut [(_forEachIndex + 1), _x];
  309. } forEach (_vehiclePylonList select _vehicleIndex);
  310. {
  311. _newVehicle setObjectMaterialGlobal [_forEachIndex, _x];
  312. } forEach (_vehicleMaterialsList select _vehicleIndex);
  313. {
  314. _newVehicle setObjectTextureGlobal [_forEachIndex, _x];
  315. } forEach (_vehicleTexturesList select _vehicleIndex);
  316.  
  317. _thisAnimationNames = _vehicleAnimationNames select _vehicleIndex;
  318. _thisAnimationPhases = _vehicleAnimationPhases select _vehicleIndex;
  319. {
  320. _newVehicle animateSource [_x, _thisAnimationPhases select _forEachIndex];
  321. } forEach _thisAnimationNames;
  322. _newVehicleVarName = (_vehicleVarNameList select _vehicleIndex);
  323. if (!(_newVehicleVarName isEqualTo "")) then {
  324. [_newVehicle, _newVehicleVarName] remoteExec ["setVehicleVarName", 0, _newVehicle];
  325. missionNamespace setVariable [_newVehicleVarName, _newVehicle, true];
  326. };
  327.  
  328. sleep 0.1;
  329.  
  330. _tmpGroup = [_tmpRespawnPos, _unitSide, (_crewList select _vehicleIndex)] call BIS_fnc_spawnGroup;
  331. {
  332. _tmpInventory = _crewInventoryList select _vehicleIndex;
  333. _x setUnitLoadout (_tmpInventory select _forEachIndex);
  334. _tmpSkill = _crewSkillList select _vehicleIndex;
  335. _x setSkill (_tmpSkill select _forEachIndex);
  336. _tmpVarName = (_crewVarNameList select _vehicleIndex) select _forEachIndex;
  337. if (!(_tmpVarName isEqualTo "")) then {
  338. [_x, _tmpVarName] remoteExec ["setVehicleVarName", 0, _x];
  339. missionNamespace setVariable [_tmpVarName, _x, true];
  340. };
  341. sleep 0.1;
  342. _x moveInAny _newVehicle;
  343. } forEach (units _tmpGroup);
  344.  
  345. waituntil {
  346. sleep 1;
  347. count crew _newVehicle == count (units _tmpGroup)
  348. };
  349.  
  350. if (_newVehicle isKindOf "Plane" && _special == "FLY") then {
  351. _newVehicle setVelocity [
  352. 60 * sin _respawnDir,
  353. 60 * cos _respawnDir,
  354. 0
  355. ];
  356. };
  357.  
  358. _newVehicle enableSimulationGlobal true;
  359.  
  360. sleep 0.1;
  361.  
  362. (units _tmpGroup) joinSilent _newGroup;
  363.  
  364. {_x addCuratorEditableObjects [[_newVehicle],true]} forEach allCurators;
  365. sleep 0.1;
  366. };
  367.  
  368. //Spawn infantry
  369. _tmpGroup = [_tmpRespawnPos, _unitSide, _infantryList] call BIS_fnc_spawnGroup;
  370. sleep 0.1;
  371. {
  372. _x setUnitLoadout (_infantryInventoryList select _forEachIndex);
  373. _x setSkill (_infantrySkillList select _forEachIndex);
  374. _tmpVarName = (_infantryVarNameList select _forEachIndex);
  375. if (!(_tmpVarName isEqualTo "")) then {
  376. [_x, _tmpVarName] remoteExec ["setVehicleVarName", 0, _x];
  377. missionNamespace setVariable [_tmpVarName, _x, true];
  378. };
  379. sleep 0.1;
  380. } forEach (units _tmpGroup);
  381.  
  382. (units _tmpGroup) joinSilent _newGroup;
  383.  
  384. sleep 0.1;
  385.  
  386. {_x addCuratorEditableObjects [units _newGroup,false]} forEach allCurators;
  387.  
  388. //Initiate caching
  389. if ("CACHE=" in _this) then {
  390. [_newGroup, _cacheRadius, _debug] spawn jebus_fnc_cache;
  391. };
  392.  
  393. //Initiate reducing
  394. if ("REDUCE=" in _this) then {
  395. [_newGroup, _reduceRadius, _debug] spawn jebus_fnc_reduce;
  396. };
  397.  
  398. _newGroup allowfleeing 0;
  399.  
  400. //Initiate GAIA
  401. if (_gaiaParameter in ["MOVE", "NOFOLLOW", "FORTIFY"]) then {
  402. if (_debug) then {systemChat _gaiaParameter};
  403. switch (typeName _gaiaZone) do {
  404. case "ARRAY" : {
  405. _tmpZone = selectRandom _gaiaZone;
  406. if (typeName _tmpZone == "SCALAR") then {_tmpZone = str (_tmpZone);};
  407. };
  408. case "SCALAR" : {_tmpZone = str (_gaiaZone);};
  409. default {_tmpZone = _gaiaZone};
  410. };
  411.  
  412. _newGroup setVariable ["GAIA_ZONE_INTEND",[_tmpZone, _gaiaParameter], false];
  413. };
  414.  
  415. //Apply waypoints
  416. [_newGroup, _waypointList, _debug] call jebus_fnc_applyWaypoints;
  417.  
  418.  
  419. //Execute init string
  420. _proxyThis = leader _newgroup;
  421.  
  422. {
  423. _proxyThis synchronizeObjectsAdd [_x];
  424. } forEach _synchronizedObjectsList;
  425.  
  426.  
  427. call compile format [_initString];
  428.  
  429. _newGroup setVariable ["groupInitialising", nil];
  430.  
  431. //Check every 5 seconds to see if group is eliminated
  432. waituntil {
  433. sleep 5;
  434. {alive _x} count (units _newGroup) < 1;
  435. };
  436.  
  437. if (_debug) then {systemChat "Group eliminated. Waiting for respawn."};
  438.  
  439. //Respawn delay
  440. if (typeName _respawnDelay == "ARRAY") then {
  441. _minTime = _respawnDelay select 0;
  442. _maxTime = _respawnDelay select 1;
  443. _tempRespawnDelay = _minTime + random (_maxTime - _minTime);
  444. if (_debug) then {systemChat format ["Respawn delay = %1 seconds", _tempRespawnDelay]};
  445. sleep _tempRespawnDelay;
  446. } else {
  447. if (_debug) then {systemChat format ["Respawn delay = %1 seconds", _respawnDelay]};
  448. sleep _respawnDelay;
  449. };
  450.  
  451. //Check if exit trigger has been activated
  452. if (! isNil "_exitTrigger") then {
  453. if (triggerActivated _exitTrigger) then {
  454. if (_debug) then {systemChat "Exit trigger activated"};
  455. _lives = 1;
  456. };
  457. };
  458.  
  459. _lives = _lives - 1;
  460.  
  461. if (_debug) then {
  462. if (_lives < 0) then {systemChat "Infinite lives."} else
  463. {systemChat format["Lives remaining = %1", _lives]};
  464. };
  465.  
  466. //Clean up empty groups
  467. {
  468. if ((count (units _x)) isEqualTo 0) then {
  469. if (isNil {_x getVariable "groupInitialising"}) then {
  470. deleteGroup _x;
  471. };
  472. };
  473. } count allGroups;
  474.  
  475. };
  476.  
  477. if (_debug) then {systemChat "Exiting script."};
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement