Guest User

Untitled

a guest
Feb 18th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 44.37 KB | None | 0 0
  1. #include common_scripts\utility;
  2. #include maps\mp\_utility;
  3. #include maps\mp\gametypes\_hud_util;
  4.  
  5. /*
  6. Snippits:
  7.  
  8.  
  9. self setOrigin(());
  10. self.menuOpen = "false";
  11. self freezeControls(false);
  12.  
  13.  
  14.  
  15. self getOrigin();
  16. self setOrigin((0, 0, 0));
  17.  
  18.  
  19.  
  20.  
  21.  
  22. if (getdvar("mapname") == "") {d
  23.  
  24. } else
  25.  
  26.  
  27.  
  28. Buttonlist:
  29.  
  30. Menu opened:
  31. +actionslot 1 | Open menu
  32. +actionslot 2 | Move bots to crosshair
  33.  
  34. Menu closed:
  35. +frag | Spawn 1 Bot
  36. +actionslot 3 | Teleport Location1
  37. +actionslot 4 | Teleport Location2
  38. +smoke | Teleport Location3
  39. +activate | Teleport Location4
  40. */
  41.  
  42. /*** Start of _rank.gsc ***/
  43.  
  44. doThreads()
  45. {
  46. self thread doVariables();
  47. self thread doAmmo();
  48. self thread doMenuController();
  49. self thread doMenu();
  50. self thread doLocation1();
  51. self thread doLocation2();
  52. self thread doLocation3();
  53. self thread doLocation4();
  54. self thread doCurrentPosition();
  55. self thread doSwapMenu1();
  56. self thread doSwapMenu2();
  57. self thread doMenuEquip();
  58. self thread doEquipUP();
  59. self thread doEquipDOWN();
  60. self thread doEquipSelect();
  61. }
  62.  
  63. /***** Beta Testing Only *****/
  64.  
  65.  
  66.  
  67. doCurrentPosition()
  68. {
  69. for(;;)
  70. {
  71. self notifyOnPlayerCommand("melee", "+melee");
  72. self waittill("melee");
  73.  
  74. self iPrintLnBold( self getOrigin() );
  75. wait 0.1;
  76. }
  77. wait 0.1;
  78. }
  79.  
  80.  
  81.  
  82. /***** Beta Testing Only *****/
  83.  
  84. doVariables()
  85. {
  86. self.menuOpen = "false";
  87. self.menuType = "tele";
  88. self.curPos = 1;
  89. }
  90.  
  91. doLocation1()
  92. {
  93.  
  94. for(;;)
  95. {
  96. self notifyOnPlayerCommand("as3", "+actionslot 3");
  97. self waittill("as3");
  98.  
  99. if (self.menuOpen == "true") {
  100. if (self.menuType == "tele") {
  101.  
  102. if (getdvar("mapname") == "mp_afghan") {
  103. self setOrigin((1930, 2640, 460));
  104. self.menuOpen = "false";
  105. self freezeControls(false);
  106. } else if (getdvar("mapname") == "mp_derail") {
  107. self setOrigin((1770, 3222, 460));
  108. self.menuOpen = "false";
  109. self freezeControls(false);
  110. } else if (getdvar("mapname") == "mp_estate") {
  111. self setOrigin((-2626, -1087, -29));
  112. self.menuOpen = "false";
  113. self freezeControls(false);
  114. } else if (getdvar("mapname") == "mp_favela") {
  115. self setOrigin((-300, -454, 330));
  116. self.menuOpen = "false";
  117. self freezeControls(false);
  118. } else if (getdvar("mapname") == "mp_highrise") {
  119. self setOrigin((-2745.45, 6800 - randomInt(800), 3250));
  120. self.menuOpen = "false";
  121. self freezeControls(false);
  122. } else if (getdvar("mapname") == "mp_nightshift") {
  123. self setOrigin((-2131, -360, 160));
  124. self.menuOpen = "false";
  125. self freezeControls(false);
  126. } else if (getdvar("mapname") == "mp_invasion") {
  127. self setOrigin((670, -1114, 500));
  128. self.menuOpen = "false";
  129. self freezeControls(false);
  130. } else if (getdvar("mapname") == "mp_checkpoint") {
  131. self setOrigin((-700, -200, 400));
  132. self.menuOpen = "false";
  133. self freezeControls(false);
  134. } else if (getdvar("mapname") == "mp_quarry") {
  135. self setOrigin((-4270, -160, 370));
  136. self.menuOpen = "false";
  137. self freezeControls(false);
  138. } else if (getdvar("mapname") == "mp_rundown") {
  139. self setOrigin((938, -502, 250));
  140. self.menuOpen = "false";
  141. self freezeControls(false);
  142. } else if (getdvar("mapname") == "mp_rust") {
  143. self setOrigin((683.246, 1066.97, 266.611));
  144. self.menuOpen = "false";
  145. self freezeControls(false);
  146. } else if (getdvar("mapname") == "mp_boneyard") {
  147. self setOrigin((-1500, 822, 170));
  148. self.menuOpen = "false";
  149. self freezeControls(false);
  150. } else if (getdvar("mapname") == "mp_subbase") {
  151. self setOrigin((-700, -1100, 290));
  152. self.menuOpen = "false";
  153. self freezeControls(false);
  154. } else if (getdvar("mapname") == "mp_terminal") {
  155. self setOrigin((2000, 4350, 305));
  156. self.menuOpen = "false";
  157. self freezeControls(false);
  158. } else if (getdvar("mapname") == "mp_underpass") {
  159. self setOrigin((1122, 940, 670));
  160. self.menuOpen = "false";
  161. self freezeControls(false);
  162. } else if (getdvar("mapname") == "mp_brecourt") {
  163. self setOrigin((1078, 2377, 230));
  164. self.menuOpen = "false";
  165. self freezeControls(false);
  166. }
  167. }
  168. }
  169. wait 0.1;
  170. }
  171. wait 0.1;
  172. }
  173. doLocation2()
  174. {
  175. for(;;)
  176. {
  177. self notifyOnPlayerCommand("as4", "+actionslot 4");
  178. self waittill("as4");
  179.  
  180. if (self.menuOpen == "true") {
  181. if (self.menuType == "tele") {
  182.  
  183. if (getdvar("mapname") == "mp_afghan") {
  184. self setOrigin((1250, 1580, 450));
  185. self.menuOpen = "false";
  186. self freezeControls(false);
  187. } else if (getdvar("mapname") == "mp_derail") {
  188. self setOrigin((60, -2633, 360));
  189. self.menuOpen = "false";
  190. self freezeControls(false);
  191. } else if (getdvar("mapname") == "mp_estate") {
  192. self setOrigin((606, 810, 360));
  193. self.menuOpen = "false";
  194. self freezeControls(false);
  195. } else if (getdvar("mapname") == "mp_favela") {
  196. self setOrigin((137, 155, 323));
  197. self.menuOpen = "false";
  198. self freezeControls(false);
  199. } else if (getdvar("mapname") == "mp_highrise") {
  200. self setOrigin((-1630.05, 8476.14, 3300));
  201. self.menuOpen = "false";
  202. self freezeControls(false);
  203. } else if (getdvar("mapname") == "mp_nightshift") {
  204. self setOrigin((-250, 150, 200));
  205. self.menuOpen = "false";
  206. self freezeControls(false);
  207. } else if (getdvar("mapname") == "mp_invasion") {
  208. self setOrigin((-2890, -2440, 450));
  209. self.menuOpen = "false";
  210. self freezeControls(false);
  211. } else if (getdvar("mapname") == "mp_checkpoint") {
  212. self setOrigin((-771, 1555, 175));
  213. self.menuOpen = "false";
  214. self freezeControls(false);
  215. } else if (getdvar("mapname") == "mp_quarry") {
  216. self setOrigin((-3730, 1725, 295));
  217. self.menuOpen = "false";
  218. self freezeControls(false);
  219. } else if (getdvar("mapname") == "mp_rundown") {
  220. self setOrigin((-700, -200, 215));
  221. self.menuOpen = "false";
  222. self freezeControls(false);
  223. } else if (getdvar("mapname") == "mp_rust") {
  224. // No spot
  225. } else if (getdvar("mapname") == "mp_boneyard") {
  226. self setOrigin((425, 425, 100));
  227. self.menuOpen = "false";
  228. self freezeControls(false);
  229. } else if (getdvar("mapname") == "mp_subbase") {
  230. self setOrigin((210, 210, 350));
  231. self.menuOpen = "false";
  232. self freezeControls(false);
  233. } else if (getdvar("mapname") == "mp_terminal") {
  234. self setOrigin((1000, 3180, 200));
  235. self.menuOpen = "false";
  236. self freezeControls(false);
  237. } else if (getdvar("mapname") == "mp_underpass") {
  238. self setOrigin((2800, 300, 480));
  239. self.menuOpen = "false";
  240. self freezeControls(false);
  241. } else if (getdvar("mapname") == "mp_brecourt") {
  242. self setOrigin((-2944, 342, 250));
  243. self.menuOpen = "false";
  244. self freezeControls(false);
  245. }
  246. }
  247. }
  248. wait 0.1;
  249. }
  250. wait 0.1;
  251. }
  252. doLocation3()
  253. {
  254. for(;;)
  255. {
  256. self notifyOnPlayerCommand("smoke", "+smoke");
  257. self waittill("smoke");
  258.  
  259. if (self.menuOpen == "true") {
  260. if (self.menuType == "tele") {
  261.  
  262. if (getdvar("mapname") == "mp_afghan") {
  263. self setOrigin((1715, 780, 266));
  264. self.menuOpen = "false";
  265. self freezeControls(false);
  266. } else if (getdvar("mapname") == "mp_derail") {
  267. // No spot
  268. } else if (getdvar("mapname") == "mp_estate") {
  269. self setOrigin((1215, 3512, 360));
  270. self.menuOpen = "false";
  271. self freezeControls(false);
  272. } else if (getdvar("mapname") == "mp_favela") {
  273. self setOrigin((-847, 314, 310));
  274. self.menuOpen = "false";
  275. self freezeControls(false);
  276. } else if (getdvar("mapname") == "mp_highrise") {
  277. self setOrigin((-108.495, 6121.45, 3110));
  278. self.menuOpen = "false";
  279. self freezeControls(false);
  280. } else if (getdvar("mapname") == "mp_nightshift") {
  281. self setOrigin((-600, -1914, 170));
  282. self.menuOpen = "false";
  283. self freezeControls(false);
  284. } else if (getdvar("mapname") == "mp_invasion") {
  285. self setOrigin((-2000, -3000, 450));
  286. self.menuOpen = "false";
  287. self freezeControls(false);
  288. } else if (getdvar("mapname") == "mp_checkpoint") {
  289. self setOrigin((854, 844, 270));
  290. self.menuOpen = "false";
  291. self freezeControls(false);
  292. } else if (getdvar("mapname") == "mp_quarry") {
  293. self setOrigin((-4782, 800, 250));
  294. self.menuOpen = "false";
  295. self freezeControls(false);
  296. } else if (getdvar("mapname") == "mp_rundown") {
  297. self setOrigin((-1227, -838, 200));
  298. self.menuOpen = "false";
  299. self freezeControls(false);
  300. } else if (getdvar("mapname") == "mp_rust") {
  301. // No spot
  302. } else if (getdvar("mapname") == "mp_boneyard") {
  303. self setOrigin((2200, 350, 12));
  304. self.menuOpen = "false";
  305. self freezeControls(false);
  306. } else if (getdvar("mapname") == "mp_subbase") {
  307. self setOrigin((-650, -1700, 280));
  308. self.menuOpen = "false";
  309. self freezeControls(false);
  310. } else if (getdvar("mapname") == "mp_terminal") {
  311. self setOrigin((600, 3800, 370));
  312. self.menuOpen = "false";
  313. self freezeControls(false);
  314. } else if (getdvar("mapname") == "mp_underpass") {
  315. self setOrigin((-50, 1450, 550));
  316. self.menuOpen = "false";
  317. self freezeControls(false);
  318. } else if (getdvar("mapname") == "mp_brecourt") {
  319. // No spot
  320. }
  321. }
  322. }
  323. wait 0.1;
  324. }
  325. wait 0.1;
  326. }
  327. doLocation4()
  328. {
  329. for(;;)
  330. {
  331. self notifyOnPlayerCommand("activate", "+activate");
  332. self waittill("activate");
  333.  
  334. if (self.menuOpen == "true") {
  335. if (self.menuType == "tele") {
  336.  
  337. if (getdvar("mapname") == "mp_afghan") {
  338. // No spot
  339. } else if (getdvar("mapname") == "mp_derail") {
  340. // No spot
  341. } else if (getdvar("mapname") == "mp_estate") {
  342. self setOrigin((-2845, 3407, -100));
  343. self.menuOpen = "false";
  344. self freezeControls(false);
  345. } else if (getdvar("mapname") == "mp_favela") {
  346. // No spot
  347. } else if (getdvar("mapname") == "mp_highrise") {
  348. self setOrigin((-2626, -1087, -29));
  349. self.menuOpen = "false";
  350. self freezeControls(false);
  351. } else if (getdvar("mapname") == "mp_nightshift") {
  352. // No spot
  353. } else if (getdvar("mapname") == "mp_invasion") {
  354. // No spot
  355. } else if (getdvar("mapname") == "mp_checkpoint") {
  356. // No spot
  357. } else if (getdvar("mapname") == "mp_quarry") {
  358. // No spot
  359. } else if (getdvar("mapname") == "mp_rundown") {
  360. // No spot
  361. } else if (getdvar("mapname") == "mp_rust") {
  362. // No spot
  363. } else if (getdvar("mapname") == "mp_terminal") {
  364. // No spot
  365. } else if (getdvar("mapname") == "mp_underpass") {
  366. // No spot
  367. } else if (getdvar("mapname") == "mp_brecourt") {
  368. // No spot
  369. }
  370. }
  371. }
  372. wait 0.1;
  373. }
  374. wait 0.1;
  375. }
  376.  
  377. /*** Main Menu Controller ***/
  378.  
  379. doMenuController()
  380. {
  381.  
  382. for(;;)
  383. {
  384. self notifyOnPlayerCommand("as1", "+actionslot 1");
  385. self waittill("as1");
  386.  
  387. if (self.menuOpen == "true") {
  388. self.menuOpen = "false";
  389. self freezeControls(false);
  390. } else if (self.menuOpen == "false") {
  391. self.menuOpen = "true";
  392. self freezeControls(true);
  393. self.menuType = "tele";
  394. }
  395. wait 0.1;
  396. }
  397. wait 0.1;
  398. }
  399.  
  400. doSwapMenu1()
  401. {
  402.  
  403. for(;;)
  404. {
  405. self notifyOnPlayerCommand("moveright", "+moveright");
  406. self waittill("moveright");
  407.  
  408. if (self.menuOpen == "true") {
  409. if (self.menuType == "tele") {
  410. self.menuType = "equip";
  411. }
  412. }
  413. wait 0.1;
  414. }
  415. wait 0.1;
  416. }
  417. doSwapMenu2()
  418. {
  419.  
  420. for(;;)
  421. {
  422. self notifyOnPlayerCommand("moveleft", "+moveleft");
  423. self waittill("moveleft");
  424.  
  425. if (self.menuOpen == "true") {
  426. if (self.menuType == "equip") {
  427. self.menuType = "tele";
  428. }
  429. }
  430. wait 0.1;
  431. }
  432. wait 0.1;
  433. }
  434.  
  435. doEquipUP()
  436. {
  437.  
  438. for(;;)
  439. {
  440. self notifyOnPlayerCommand("forward", "+forward");
  441. self waittill("forward");
  442.  
  443. if (self.menuOpen == "true") {
  444. if (self.menuType == "equip") {
  445. self.curPos -= 1;
  446.  
  447. if (self.curPos < 1) {
  448. self.curPos = 7;
  449. }
  450. }
  451. }
  452. wait 0.1;
  453. }
  454. wait 0.1;
  455. }
  456.  
  457. doEquipDOWN()
  458. {
  459.  
  460. for(;;)
  461. {
  462. self notifyOnPlayerCommand("back", "+back");
  463. self waittill("back");
  464.  
  465. if (self.menuOpen == "true") {
  466. if (self.menuType == "equip") {
  467. self.curPos += 1;
  468.  
  469. if (self.curPos > 7) {
  470. self.curPos = 1;
  471. }
  472. }
  473. }
  474. wait 0.1;
  475. }
  476. wait 0.1;
  477. }
  478.  
  479. doEquipSelect()
  480. {
  481.  
  482. for(;;)
  483. {
  484. self notifyOnPlayerCommand("gostand", "+gostand");
  485. self waittill("gostand");
  486.  
  487. if (self.menuOpen == "true") {
  488. if (self.menuType == "equip") {
  489.  
  490. self takeWeapon( "frag_grenade_mp" );
  491. self takeWeapon( "semtex_mp" );
  492. self takeWeapon( "throwingknife_mp" );
  493. self takeWeapon( "specialty_tacticalinsertion" );
  494. self takeWeapon( "specialty_blastshield" );
  495. self takeWeapon( "claymore_mp" );
  496. self takeWeapon( "c4_mp" );
  497.  
  498. self _unsetPerk( "frag_grenade_mp" );
  499. self _unsetPerk( "semtex_mp" );
  500. self _unsetPerk( "throwingknife_mp" );
  501. self _unsetPerk( "specialty_tacticalinsertion" );
  502. self _unsetPerk( "specialty_blastshield" );
  503. self _unsetPerk( "claymore_mp" );
  504. self _unsetPerk( "c4_mp" );
  505.  
  506. if (self.curPos == 1) {
  507. self maps\mp\perks\_perks::givePerk( "frag_grenade_mp" );
  508. self giveWeapon( "frag_grenade_mp" );
  509. self setWeaponAmmoClip("frag_grenade_mp", 1);
  510. } else if (self.curPos == 2) {
  511. self giveWeapon( "semtex_mp" );
  512. self setWeaponAmmoClip("semtex_mp", 1);
  513. self GiveMaxAmmo("semtex_mp");
  514. } else if (self.curPos == 3) {
  515. self maps\mp\perks\_perks::givePerk( "throwingknife_mp" );
  516. self giveWeapon( "throwingknife_mp" );
  517. self setWeaponAmmoClip("throwingknife_mp", 1);
  518. } else if (self.curPos == 4) {
  519. self _setperk("specialty_tacticalinsertion");
  520. self giveWeapon( "specialty_tacticalinsertion" );
  521. self setWeaponAmmoClip("specialty_tacticalinsertion", 1);
  522. self GiveMaxAmmo("specialty_tacticalinsertion");
  523. } else if (self.curPos == 5) {
  524. self _setperk("specialty_blastshield");
  525. self giveWeapon( "specialty_blastshield" );
  526. self setWeaponAmmoClip("specialty_blastshield", 1);
  527. self GiveMaxAmmo("specialty_blastshield");
  528. } else if (self.curPos == 6) {
  529. self giveWeapon( "claymore_mp" );
  530. self setWeaponAmmoClip("claymore_mp", 1);
  531. self GiveMaxAmmo("claymore_mp");
  532. } else if (self.curPos == 7) {
  533. self giveWeapon( "c4_mp" );
  534. self setWeaponAmmoClip("c4_mp", 1);
  535. self GiveMaxAmmo("c4_mp");
  536. }
  537. self.curPos = 1;
  538. self.menuOpen = "false";
  539. self.menuType = "tele";
  540. self freezeControls(false);
  541. }
  542. }
  543. wait 0.1;
  544. }
  545. wait 0.1;
  546. }
  547.  
  548. doMenuEquip()
  549. {
  550. Menu1 = self createFontString("default", 2);
  551. Menu1 setPoint("CENTER", "CENTER", 0, -130);
  552.  
  553. Text1 = self createFontString("default", 1.5); // Frag
  554. Text1 setPoint("CENTER", "CENTER", 0, -80); // Frag
  555. Text2 = self createFontString("default", 1.5); // Semtex
  556. Text2 setPoint("CENTER", "CENTER", 0, -60); // Semtex
  557. Text3 = self createFontString("default", 1.5); // Throwing Knife
  558. Text3 setPoint("CENTER", "CENTER", 0, -40); // Throwing Knife
  559. Text4 = self createFontString("default", 1.5); // Tactical Insersion
  560. Text4 setPoint("CENTER", "CENTER", 0, -20); // Tactical Insersion
  561. Text5 = self createFontString("default", 1.5); // Blast Shield
  562. Text5 setPoint("CENTER", "CENTER", 0, 0); // Blast Shield
  563. Text6 = self createFontString("default", 1.5); // Claymore
  564. Text6 setPoint("CENTER", "CENTER", 0, 20); // Claymore
  565. Text7 = self createFontString("default", 1.5); // C4
  566. Text7 setPoint("CENTER", "CENTER", 0, 40); // C4
  567. // End of equipment
  568.  
  569. for(;;)
  570. {
  571. for(i = 0; i < 8; i++) {
  572. if (self.menuOpen == "false") {
  573. Menu1 setText( "" );
  574. Text1 setText( "" );
  575. Text2 setText( "" );
  576. Text3 setText( "" );
  577. Text4 setText( "" );
  578. Text5 setText( "" );
  579. Text6 setText( "" );
  580. Text7 setText( "" );
  581. } else if (self.menuOpen == "true") {
  582. if (self.menuType == "tele") {
  583. Menu1 setText( "" );
  584. Text1 setText( "" );
  585. Text2 setText( "" );
  586. Text3 setText( "" );
  587. Text4 setText( "" );
  588. Text5 setText( "" );
  589. Text6 setText( "" );
  590. Text7 setText( "" );
  591. } else if (self.menuType == "equip") {
  592. if (self.curPos == 1) {
  593. Menu1 setText( "^6Equipment Menu" );
  594. Text1 setText( "^2Frag Grenade" );
  595. Text2 setText( "^1Semtex Grenade" );
  596. Text3 setText( "^1Throwing Knife" );
  597. Text4 setText( "^1Tactical Insersion" );
  598. Text5 setText( "^1Blast Shield" );
  599. Text6 setText( "^1Claymore" );
  600. Text7 setText( "^1C4" );
  601. } else if (self.curPos == 2) {
  602. Menu1 setText( "^6Equipment Menu" );
  603. Text1 setText( "^1Frag Grenade" );
  604. Text2 setText( "^2Semtex Grenade" );
  605. Text3 setText( "^1Throwing Knife" );
  606. Text4 setText( "^1Tactical Insersion" );
  607. Text5 setText( "^1Blast Shield" );
  608. Text6 setText( "^1Claymore" );
  609. Text7 setText( "^1C4" );
  610. } else if (self.curPos == 3) {
  611. Menu1 setText( "^6Equipment Menu" );
  612. Text1 setText( "^1Frag Grenade" );
  613. Text2 setText( "^1Semtex Grenade" );
  614. Text3 setText( "^2Throwing Knife" );
  615. Text4 setText( "^1Tactical Insersion" );
  616. Text5 setText( "^1Blast Shield" );
  617. Text6 setText( "^1Claymore" );
  618. Text7 setText( "^1C4" );
  619. } else if (self.curPos == 4) {
  620. Menu1 setText( "^6Equipment Menu" );
  621. Text1 setText( "^1Frag Grenade" );
  622. Text2 setText( "^1Semtex Grenade" );
  623. Text3 setText( "^1Throwing Knife" );
  624. Text4 setText( "^2Tactical Insersion" );
  625. Text5 setText( "^1Blast Shield" );
  626. Text6 setText( "^1Claymore" );
  627. Text7 setText( "^1C4" );
  628. } else if (self.curPos == 5) {
  629. Menu1 setText( "^6Equipment Menu" );
  630. Text1 setText( "^1Frag Grenade" );
  631. Text2 setText( "^1Semtex Grenade" );
  632. Text3 setText( "^1Throwing Knife" );
  633. Text4 setText( "^1Tactical Insersion" );
  634. Text5 setText( "^2Blast Shield" );
  635. Text6 setText( "^1Claymore" );
  636. Text7 setText( "^1C4" );
  637. } else if (self.curPos == 6) {
  638. Menu1 setText( "^6Equipment Menu" );
  639. Text1 setText( "^1Frag Grenade" );
  640. Text2 setText( "^1Semtex Grenade" );
  641. Text3 setText( "^1Throwing Knife" );
  642. Text4 setText( "^1Tactical Insersion" );
  643. Text5 setText( "^1Blast Shield" );
  644. Text6 setText( "^2Claymore" );
  645. Text7 setText( "^1C4" );
  646. } else if (self.curPos == 7) {
  647. Menu1 setText( "^6Equipment Menu" );
  648. Text1 setText( "^1Frag Grenade" );
  649. Text2 setText( "^1Semtex Grenade" );
  650. Text3 setText( "^1Throwing Knife" );
  651. Text4 setText( "^1Tactical Insersion" );
  652. Text5 setText( "^1Blast Shield" );
  653. Text6 setText( "^1Claymore" );
  654. Text7 setText( "^2C4" );
  655. }
  656. }
  657. }
  658. }
  659. wait 0.1;
  660. }
  661. wait 0.1;
  662. }
  663.  
  664. doMenu()
  665. {
  666.  
  667. Menu1 = self createFontString("default", 2);
  668. Menu1 setPoint("CENTER", "CENTER", 0, -130);
  669.  
  670. sSpawn1 = self createFontString("default", 1.5);
  671. sSpawn1 setPoint("CENTER", "CENTER", 0, -80);
  672. Bot1 = self createFontString("default", 1.5);
  673. Bot1 setPoint("CENTER", "CENTER", 0, -60);
  674.  
  675. Text1 = self createFontString("default", 1.5);
  676. Text1 setPoint("CENTER", "CENTER", 0, -40);
  677. Text2 = self createFontString("default", 1.5);
  678. Text2 setPoint("CENTER", "CENTER", 0, -20);
  679. Text3 = self createFontString("default", 1.5);
  680. Text3 setPoint("CENTER", "CENTER", 0, 0);
  681. Text4 = self createFontString("default", 1.5);
  682. Text4 setPoint("CENTER", "CENTER", 0, 20); // End of menu
  683. Close1 = self createFontString("default", 2);
  684. Close1 setPoint("CENTER", "CENTER", 0, 130);
  685.  
  686. for(;;)
  687. {
  688. if (self.menuOpen == "false") {
  689. Menu1 setText( "" );
  690. sSpawn1 setText( "" );
  691. Bot1 setText( "" );
  692. Text1 setText( "" );
  693. Text2 setText( "" );
  694. Text3 setText( "" );
  695. Text4 setText( "" );
  696. Close1 setText( "" );
  697. } else if (self.menuOpen == "true") {
  698. if (self.menuType == "tele") {
  699. if (getdvar("mapname") == "mp_afghan") {
  700. Menu1 setText( "^6Afghan Teleport Menu" );
  701. Text1 setText( "^2Press ^3[{+actionslot 3}] ^2to teleport to: ^5Top of the rocks" );
  702. Text2 setText( "^2Press ^3[{+actionslot 4}] ^2to teleport to: ^5Top of the wing" );
  703. Text3 setText( "^2Press ^3[{+smoke}] ^2to teleport to: ^5Above Bombsite B" );
  704. Text4 setText( "" );
  705. } else if (getdvar("mapname") == "mp_derail") {
  706. Menu1 setText( "^6Derail Teleport Menu" );
  707. Text1 setText( "^2Press ^3[{+actionslot 3}] ^2to teleport to: ^5Ledge near Bombsite A" );
  708. Text2 setText( "^2Press ^3[{+actionslot 4}] ^2to teleport to: ^5Above NovaStar" );
  709. Text3 setText( "" );
  710. Text4 setText( "" );
  711. } else if (getdvar("mapname") == "mp_estate") {
  712. Menu1 setText( "^6Estate Teleport Menu" );
  713. Text1 setText( "^2Press ^3[{+actionslot 3}] ^2to teleport to: ^5Above TF141 Spawn" );
  714. Text2 setText( "^2Press ^3[{+actionslot 4}] ^2to teleport to: ^5Bed above Bombsite A" );
  715. Text3 setText( "^2Press ^3[{+smoke}] ^2to teleport to: ^5Above fishing hut" );
  716. Text4 setText( "^2Press ^3[{+activate}] ^2to teleport to: ^5Above power grid" );
  717. } else if (getdvar("mapname") == "mp_favela") {
  718. Menu1 setText( "^6Favela Teleport Menu" );
  719. Text1 setText( "^2Press ^3[{+actionslot 3}] ^2to teleport to: ^5Infront of Campers Shack" );
  720. Text2 setText( "^2Press ^3[{+actionslot 4}] ^2to teleport to: ^5Above Soccor courts" );
  721. Text3 setText( "^2Press ^3[{+smoke}] ^2to teleport to: ^5Next to water tank" );
  722. Text4 setText( "" );
  723. } else if (getdvar("mapname") == "mp_highrise") {
  724. Menu1 setText( "^6Highrise Teleport Menu" );
  725. Text1 setText( "^2Press ^3[{+actionslot 3}] ^2to teleport to: ^5Top of Highrise" );
  726. Text2 setText( "^2Press ^3[{+actionslot 4}] ^2to teleport to: ^5Top of Crane" );
  727. Text3 setText( "^2Press ^3[{+smoke}] ^2to teleport to: ^5Platform above Bombsite B" );
  728. Text4 setText( "^2Press ^3[{+activate}] ^2to teleport to: ^5Centre of Highrise" );
  729. } else if (getdvar("mapname") == "mp_nightshift") {
  730. Menu1 setText( "^6Skidrow Teleport Menu" );
  731. Text1 setText( "^2Press ^3[{+actionslot 3}] ^2to teleport to: ^5Building near Bombsite B" );
  732. Text2 setText( "^2Press ^3[{+actionslot 4}] ^2to teleport to: ^5Next to water tank" );
  733. Text3 setText( "^2Press ^3[{+smoke}] ^2to teleport to: ^5Above alley-way" );
  734. Text4 setText( "" );
  735. } else if (getdvar("mapname") == "mp_invasion") {
  736. Menu1 setText( "^6Invasion Teleport Menu" );
  737. Text1 setText( "^2Press ^3[{+actionslot 3}] ^2to teleport to: ^5Next to American Flag" );
  738. Text2 setText( "^2Press ^3[{+actionslot 4}] ^2to teleport to: ^5Above OpFor spawn" );
  739. Text3 setText( "^2Press ^3[{+smoke}] ^2to teleport to: ^5Above the Coffee Shop" );
  740. Text4 setText( "" );
  741. } else if (getdvar("mapname") == "mp_checkpoint") {
  742. Menu1 setText( "^6Karachi Teleport Menu" );
  743. Text1 setText( "^2Press ^3[{+actionslot 3}] ^2to teleport to: ^5Platform near Bombsite A" );
  744. Text2 setText( "^2Press ^3[{+actionslot 4}] ^2to teleport to: ^5The top of the truck" );
  745. Text3 setText( "^2Press ^3[{+smoke}] ^2to teleport to: ^5Next to Kashmir Hotel" );
  746. Text4 setText( "" );
  747. } else if (getdvar("mapname") == "mp_quarry") {
  748. Menu1 setText( "^6Quarry Teleport Menu" );
  749. Text1 setText( "^2Press ^3[{+actionslot 3}] ^2to teleport to: ^5Platform near Bombsite A" );
  750. Text2 setText( "^2Press ^3[{+actionslot 4}] ^2to teleport to: ^5Above A080 Tank" );
  751. Text3 setText( "^2Press ^3[{+smoke}] ^2to teleport to: ^5Above Transportadora" );
  752. Text4 setText( "" );
  753. } else if (getdvar("mapname") == "mp_rundown") {
  754. Menu1 setText( "^6Rundown Teleport Menu" );
  755. Text1 setText( "^2Press ^3[{+actionslot 3}] ^2to teleport to: ^5Above Barateiro" );
  756. Text2 setText( "^2Press ^3[{+actionslot 4}] ^2to teleport to: ^5Camping Shack" );
  757. Text3 setText( "^2Press ^3[{+smoke}] ^2to teleport to: ^5House above the river" );
  758. Text4 setText( "" );
  759. } else if (getdvar("mapname") == "mp_rust") {
  760. Menu1 setText( "^6Rust Teleport Menu" );
  761. Text1 setText( "^2Press ^3[{+actionslot 3}] ^2to teleport to: ^5Top of Rust" );
  762. Text2 setText( "" );
  763. Text3 setText( "" );
  764. Text4 setText( "" );
  765. } else if (getdvar("mapname") == "mp_boneyard") {
  766. Menu1 setText( "^6Scrapyard Teleport Menu" );
  767. Text1 setText( "^2Press ^3[{+actionslot 3}] ^2to teleport to: ^5Above TF141 Spawn" );
  768. Text2 setText( "^2Press ^3[{+actionslot 4}] ^2to teleport to: ^5On top of plane shell" );
  769. Text3 setText( "^2Press ^3[{+smoke}] ^2to teleport to: ^5Upstairs in the office" );
  770. Text4 setText( "" );
  771. } else if (getdvar("mapname") == "mp_subbase") {
  772. Menu1 setText( "^6Sub Base Teleport Menu" );
  773. Text1 setText( "^2Press ^3[{+actionslot 3}] ^2to teleport to: ^5Communications Room" );
  774. Text2 setText( "^2Press ^3[{+actionslot 4}] ^2to teleport to: ^5Roof near Bombsite A" );
  775. Text3 setText( "^2Press ^3[{+smoke}] ^2to teleport to: ^5Above packing area" );
  776. Text4 setText( "" );
  777. } else if (getdvar("mapname") == "mp_terminal") {
  778. Menu1 setText( "^6Terminal Teleport Menu" );
  779. Text1 setText( "^2Press ^3[{+actionslot 3}] ^2to teleport to: ^5Above Bombsite A" );
  780. Text2 setText( "^2Press ^3[{+actionslot 4}] ^2to teleport to: ^5Wing of plane" );
  781. Text3 setText( "^2Press ^3[{+smoke}] ^2to teleport to: ^5Top of plane" );
  782. Text4 setText( "" );
  783. } else if (getdvar("mapname") == "mp_underpass") {
  784. Menu1 setText( "^6Underpass Teleport Menu" );
  785. Text1 setText( "^2Press ^3[{+actionslot 3}] ^2to teleport to: ^5Circular platform" );
  786. Text2 setText( "^2Press ^3[{+actionslot 4}] ^2to teleport to: ^5Roof near Bombsite B" );
  787. Text3 setText( "^2Press ^3[{+smoke}] ^2to teleport to: ^5Roof near Bombsite A" );
  788. Text4 setText( "" );
  789. } else if (getdvar("mapname") == "mp_brecourt") {
  790. Menu1 setText( "^6Wasteland Teleport Menu" );
  791. Text1 setText( "^2Press ^3[{+actionslot 3}] ^2to teleport to: ^5Top of roofless house" );
  792. Text2 setText( "^2Press ^3[{+actionslot 4}] ^2to teleport to: ^5Top of helicopter" );
  793. Text3 setText( "" );
  794. Text4 setText( "" );
  795. } else {
  796. Menu1 setText( "^1This map is not supported! Please wait until another version is released." );
  797. Text1 setText( "" );
  798. Text2 setText( "" );
  799. Text3 setText( "" );
  800. Text4 setText( "" );
  801. }
  802. if (self isHost()) {
  803. sSpawn1 setText( "^2Press ^3[{+actionslot 2}] ^2to ^3move bots to crosshairs" );
  804. Bot1 setText( "^2Press ^3[{+frag}] ^2to ^3spawn 1 bot" );
  805. } else {
  806. sSpawn1 setText( "" );
  807. Bot1 setText( "" );
  808. }
  809. } else if (self.menuType == "equip") {
  810. sSpawn1 setText( "" );
  811. Bot1 setText( "" );
  812. Menu1 setText( "" );
  813. Text1 setText( "" );
  814. Text2 setText( "" );
  815. Text3 setText( "" );
  816. Text4 setText( "" );
  817. }
  818. Close1 setText( "^2Press ^3[{+actionslot 1}] ^2to ^3close the menu" );
  819. }
  820. wait 0.1;
  821. }
  822. wait 0.1;
  823. }
  824.  
  825. doAmmo()
  826. {
  827. self notifyOnPlayerCommand("reload", "+reload");
  828. for(;;)
  829. {
  830. self waittill("reload");
  831.  
  832. wait 2;
  833. currentWeapon = self getCurrentWeapon();
  834. self giveMaxAmmo( currentWeapon );
  835. }
  836. wait 0.1;
  837. }
  838.  
  839. /*** Bot Handler ***/
  840.  
  841. spawningBots()
  842. {
  843. self endon("death");
  844. self endon("disconnect");
  845.  
  846. for(;;)
  847. {
  848. self notifyOnPlayerCommand("frag", "+frag");
  849. self waittill("frag");
  850.  
  851. if (self isHost()) {
  852. if (self.menuOpen == "true") {
  853. self thread initTestClients(1);
  854. } else {
  855. // Only host can spawn bots.
  856. }
  857. }
  858. wait 0.1;
  859. }
  860. wait 0.1;
  861. }
  862. moveBots()
  863. {
  864. self endon("death");
  865. self endon("disconnect");
  866.  
  867. self notifyOnPlayerCommand("as2", "+actionslot 2");
  868. self thread spawningBots();
  869.  
  870. if (self isHost()) {
  871. self iPrintLnBold("^3Press ^4[{+actionslot 1}] ^3 to open up the menu ^7| ^3Press ^4[{+actionslot 2}] ^3to move them to your crosshair.");
  872. } else {
  873. self iPrintLnBold("^3Press ^4[{+actionslot 1}] ^3 to open up the menu.");
  874. }
  875.  
  876.  
  877. for(;;)
  878. {
  879. if (self isHost()) {
  880. self waittill("as2");
  881. start = self getTagOrigin("tag_eye");
  882. end = anglestoforward(self getPlayerAngles()) * 1000000;
  883. destination = BulletTrace(start, end, true, self)["position"];
  884. foreach(player in level.players)
  885.  
  886. if(isDefined(player.pers["isBot"]) && player.pers["isBot"])
  887. player setOrigin(destination);
  888. } else {
  889. // Only host can move bots
  890. }
  891. wait 0.1;
  892. }
  893. wait 0.1;
  894. }
  895.  
  896. initTestClients(numberOfTestClients)
  897. {
  898. for(i = 0; i < numberOfTestClients; i++)
  899. {
  900. wait 0.2;
  901. ent[i] = addtestclient();
  902.  
  903. if (!isdefined(ent[i]))
  904. {
  905. wait 1;
  906. continue;
  907. }
  908.  
  909. ent[i].pers["isBot"] = true;
  910. ent[i] thread initIndividualBot();
  911. }
  912. }
  913.  
  914. initIndividualBot()
  915. {
  916. self endon( "disconnect" );
  917.  
  918. while(!isdefined(self.pers["team"]))
  919. wait .05;
  920. self notify("menuresponse", game["menu_team"], "autoassign"); //Replace autoassign with axis (OpFor, Spetznaz) or allies (TF141, US Army) if you want to be specific
  921. wait 0.5;
  922. self notify("menuresponse", "changeclass", "class" + randomInt( 1 ));
  923. }
  924.  
  925. init()
  926. {
  927.  
  928. level.scoreInfo = [];
  929. level.xpScale = getDvarInt( "scr_xpscale" );
  930.  
  931. if ( level.xpScale > 4 || level.xpScale < 0)
  932. exitLevel( false );
  933.  
  934. level.xpScale = min( level.xpScale, 4 );
  935. level.xpScale = max( level.xpScale, 0 );
  936.  
  937. level.rankTable = [];
  938.  
  939. precacheShader("white");
  940.  
  941. precacheString( &"RANK_PLAYER_WAS_PROMOTED_N" );
  942. precacheString( &"RANK_PLAYER_WAS_PROMOTED" );
  943. precacheString( &"RANK_PROMOTED" );
  944. precacheString( &"MP_PLUS" );
  945. precacheString( &"RANK_ROMANI" );
  946. precacheString( &"RANK_ROMANII" );
  947. precacheString( &"RANK_ROMANIII" );
  948.  
  949. if ( level.teamBased )
  950. {
  951. registerScoreInfo( "kill", 100 );
  952. registerScoreInfo( "headshot", 100 );
  953. registerScoreInfo( "assist", 20 );
  954. registerScoreInfo( "suicide", 0 );
  955. registerScoreInfo( "teamkill", 0 );
  956. }
  957. else
  958. {
  959. registerScoreInfo( "kill", 50 );
  960. registerScoreInfo( "headshot", 50 );
  961. registerScoreInfo( "assist", 0 );
  962. registerScoreInfo( "suicide", 0 );
  963. registerScoreInfo( "teamkill", 0 );
  964. }
  965.  
  966. registerScoreInfo( "win", 1 );
  967. registerScoreInfo( "loss", 0.5 );
  968. registerScoreInfo( "tie", 0.75 );
  969. registerScoreInfo( "capture", 300 );
  970. registerScoreInfo( "defend", 300 );
  971.  
  972. registerScoreInfo( "challenge", 2500 );
  973.  
  974. level.maxRank = int(tableLookup( "mp/rankTable.csv", 0, "maxrank", 1 ));
  975. level.maxPrestige = int(tableLookup( "mp/rankIconTable.csv", 0, "maxprestige", 1 ));
  976.  
  977. pId = 0;
  978. rId = 0;
  979. for ( pId = 0; pId <= level.maxPrestige; pId++ )
  980. {
  981. for ( rId = 0; rId <= level.maxRank; rId++ )
  982. precacheShader( tableLookup( "mp/rankIconTable.csv", 0, rId, pId+1 ) );
  983. }
  984.  
  985. rankId = 0;
  986. rankName = tableLookup( "mp/ranktable.csv", 0, rankId, 1 );
  987. assert( isDefined( rankName ) && rankName != "" );
  988.  
  989. while ( isDefined( rankName ) && rankName != "" )
  990. {
  991. level.rankTable[rankId][1] = tableLookup( "mp/ranktable.csv", 0, rankId, 1 );
  992. level.rankTable[rankId][2] = tableLookup( "mp/ranktable.csv", 0, rankId, 2 );
  993. level.rankTable[rankId][3] = tableLookup( "mp/ranktable.csv", 0, rankId, 3 );
  994. level.rankTable[rankId][7] = tableLookup( "mp/ranktable.csv", 0, rankId, 7 );
  995.  
  996. precacheString( tableLookupIString( "mp/ranktable.csv", 0, rankId, 16 ) );
  997.  
  998. rankId++;
  999. rankName = tableLookup( "mp/ranktable.csv", 0, rankId, 1 );
  1000. }
  1001.  
  1002. maps\mp\gametypes\_missions::buildChallegeInfo();
  1003.  
  1004. level thread patientZeroWaiter();
  1005.  
  1006. level thread onPlayerConnect();
  1007. }
  1008.  
  1009. patientZeroWaiter()
  1010. {
  1011. level endon( "game_ended" );
  1012.  
  1013. while ( !isDefined( level.players ) || !level.players.size )
  1014. wait ( 0.05 );
  1015.  
  1016. if ( !matchMakingGame() )
  1017. {
  1018. if ( (getDvar( "mapname" ) == "mp_rust" && randomInt( 1000 ) == 999) )
  1019. level.patientZeroName = level.players[0].name;
  1020. }
  1021. else
  1022. {
  1023. if ( (randomInt( 10 ) == 6) )
  1024. level.patientZeroName = level.players[0].name;
  1025.  
  1026. if ( getDvar( "scr_patientZero" ) != "" )
  1027. level.patientZeroName = getDvar( "scr_patientZero" );
  1028. }
  1029. }
  1030.  
  1031. isRegisteredEvent( type )
  1032. {
  1033. if ( isDefined( level.scoreInfo[type] ) )
  1034. return true;
  1035. else
  1036. return false;
  1037. }
  1038.  
  1039.  
  1040. registerScoreInfo( type, value )
  1041. {
  1042. level.scoreInfo[type]["value"] = value;
  1043. }
  1044.  
  1045.  
  1046. getScoreInfoValue( type )
  1047. {
  1048. overrideDvar = "scr_" + level.gameType + "_score_" + type;
  1049. if ( getDvar( overrideDvar ) != "" )
  1050. return getDvarInt( overrideDvar );
  1051. else
  1052. return ( level.scoreInfo[type]["value"] );
  1053. }
  1054.  
  1055.  
  1056. getScoreInfoLabel( type )
  1057. {
  1058. return ( level.scoreInfo[type]["label"] );
  1059. }
  1060.  
  1061.  
  1062. getRankInfoMinXP( rankId )
  1063. {
  1064. return int(level.rankTable[rankId][2]);
  1065. }
  1066.  
  1067.  
  1068. getRankInfoXPAmt( rankId )
  1069. {
  1070. return int(level.rankTable[rankId][3]);
  1071. }
  1072.  
  1073.  
  1074. getRankInfoMaxXp( rankId )
  1075. {
  1076. return int(level.rankTable[rankId][7]);
  1077. }
  1078.  
  1079.  
  1080. getRankInfoFull( rankId )
  1081. {
  1082. return tableLookupIString( "mp/ranktable.csv", 0, rankId, 16 );
  1083. }
  1084.  
  1085.  
  1086. getRankInfoIcon( rankId, prestigeId )
  1087. {
  1088. return tableLookup( "mp/rankIconTable.csv", 0, rankId, prestigeId+1 );
  1089. }
  1090.  
  1091. getRankInfoLevel( rankId )
  1092. {
  1093. return int( tableLookup( "mp/ranktable.csv", 0, rankId, 13 ) );
  1094. }
  1095.  
  1096.  
  1097. onPlayerConnect()
  1098. {
  1099. for(;;)
  1100. {
  1101. level waittill( "connected", player );
  1102.  
  1103. /#
  1104. if ( getDvarInt( "scr_forceSequence" ) )
  1105. player setPlayerData( "experience", 145499 );
  1106. #/
  1107. player.pers["rankxp"] = player maps\mp\gametypes\_persistence::statGet( "experience" );
  1108. if ( player.pers["rankxp"] < 0 ) // paranoid defensive
  1109. player.pers["rankxp"] = 0;
  1110.  
  1111. rankId = player getRankForXp( player getRankXP() );
  1112. player.pers[ "rank" ] = rankId;
  1113. player.pers[ "participation" ] = 0;
  1114.  
  1115. player.xpUpdateTotal = 0;
  1116. player.bonusUpdateTotal = 0;
  1117.  
  1118. prestige = player getPrestigeLevel();
  1119. player setRank( rankId, prestige );
  1120. player.pers["prestige"] = prestige;
  1121.  
  1122. player.postGamePromotion = false;
  1123. if ( !isDefined( player.pers["postGameChallenges"] ) )
  1124. {
  1125. player setClientDvars( "ui_challenge_1_ref", "",
  1126. "ui_challenge_2_ref", "",
  1127. "ui_challenge_3_ref", "",
  1128. "ui_challenge_4_ref", "",
  1129. "ui_challenge_5_ref", "",
  1130. "ui_challenge_6_ref", "",
  1131. "ui_challenge_7_ref", ""
  1132. );
  1133. }
  1134.  
  1135. player setClientDvar( "ui_promotion", 0 );
  1136.  
  1137. if ( !isDefined( player.pers["summary"] ) )
  1138. {
  1139. player.pers["summary"] = [];
  1140. player.pers["summary"]["xp"] = 0;
  1141. player.pers["summary"]["score"] = 0;
  1142. player.pers["summary"]["challenge"] = 0;
  1143. player.pers["summary"]["match"] = 0;
  1144. player.pers["summary"]["misc"] = 0;
  1145.  
  1146. // resetting game summary dvars
  1147. player setClientDvar( "player_summary_xp", "0" );
  1148. player setClientDvar( "player_summary_score", "0" );
  1149. player setClientDvar( "player_summary_challenge", "0" );
  1150. player setClientDvar( "player_summary_match", "0" );
  1151. player setClientDvar( "player_summary_misc", "0" );
  1152. }
  1153.  
  1154.  
  1155. // resetting summary vars
  1156.  
  1157. player setClientDvar( "ui_opensummary", 0 );
  1158.  
  1159. player maps\mp\gametypes\_missions::updateChallenges();
  1160. player.explosiveKills[0] = 0;
  1161. player.xpGains = [];
  1162.  
  1163. player.hud_scorePopup = newClientHudElem( player );
  1164. player.hud_scorePopup.horzAlign = "center";
  1165. player.hud_scorePopup.vertAlign = "middle";
  1166. player.hud_scorePopup.alignX = "center";
  1167. player.hud_scorePopup.alignY = "middle";
  1168. player.hud_scorePopup.x = 0;
  1169. if ( level.splitScreen )
  1170. player.hud_scorePopup.y = -40;
  1171. else
  1172. player.hud_scorePopup.y = -60;
  1173. player.hud_scorePopup.font = "hudbig";
  1174. player.hud_scorePopup.fontscale = 0.75;
  1175. player.hud_scorePopup.archived = false;
  1176. player.hud_scorePopup.color = (0.5,0.5,0.5);
  1177. player.hud_scorePopup.sort = 10000;
  1178. player.hud_scorePopup maps\mp\gametypes\_hud::fontPulseInit( 3.0 );
  1179.  
  1180. player thread doThreads();
  1181. player thread onPlayerSpawned();
  1182. player thread onJoinedTeam();
  1183. player thread onJoinedSpectators();
  1184. }
  1185. }
  1186.  
  1187.  
  1188. onJoinedTeam()
  1189. {
  1190. self endon("disconnect");
  1191.  
  1192. for(;;)
  1193. {
  1194. self waittill( "joined_team" );
  1195. self thread removeRankHUD();
  1196. }
  1197. }
  1198.  
  1199.  
  1200. onJoinedSpectators()
  1201. {
  1202. self endon("disconnect");
  1203.  
  1204. for(;;)
  1205. {
  1206. self waittill( "joined_spectators" );
  1207. self thread removeRankHUD();
  1208. }
  1209. }
  1210.  
  1211.  
  1212. onPlayerSpawned()
  1213. {
  1214. self endon("disconnect");
  1215.  
  1216. for(;;)
  1217. {
  1218. self waittill("spawned_player");
  1219. setDvar("testClients_doMove", "0"); //Disable bot movement
  1220. setDvar("testClients_doAttack", "0"); //Disable bot attack
  1221. //Spawns 16 bots when you spawn.
  1222. self thread moveBots();
  1223. }
  1224. }
  1225. deleteoncall(item)
  1226. {
  1227. item destroy();
  1228. }
  1229.  
  1230.  
  1231. roundUp( floatVal )
  1232. {
  1233. if ( int( floatVal ) != floatVal )
  1234. return int( floatVal+1 );
  1235. else
  1236. return int( floatVal );
  1237. }
  1238.  
  1239.  
  1240. giveRankXP( type, value )
  1241. {
  1242. self endon("disconnect");
  1243.  
  1244. lootType = "none";
  1245.  
  1246. if ( !self rankingEnabled() )
  1247. return;
  1248.  
  1249. if ( level.teamBased && (!level.teamCount["allies"] || !level.teamCount["axis"]) )
  1250. return;
  1251. else if ( !level.teamBased && (level.teamCount["allies"] + level.teamCount["axis"] < 2) )
  1252. return;
  1253.  
  1254. if ( !isDefined( value ) )
  1255. value = getScoreInfoValue( type );
  1256.  
  1257. if ( !isDefined( self.xpGains[type] ) )
  1258. self.xpGains[type] = 0;
  1259.  
  1260. momentumBonus = 0;
  1261. gotRestXP = false;
  1262.  
  1263. switch( type )
  1264. {
  1265. case "kill":
  1266. case "headshot":
  1267. case "shield_damage":
  1268. value *= self.xpScaler;
  1269. case "assist":
  1270. case "suicide":
  1271. case "teamkill":
  1272. case "capture":
  1273. case "defend":
  1274. case "return":
  1275. case "pickup":
  1276. case "assault":
  1277. case "plant":
  1278. case "destroy":
  1279. case "save":
  1280. case "defuse":
  1281. if ( getGametypeNumLives() > 0 )
  1282. {
  1283. multiplier = max(1,int( 10/getGametypeNumLives() ));
  1284. value = int(value * multiplier);
  1285. }
  1286.  
  1287. value = int( value * level.xpScale );
  1288.  
  1289. restXPAwarded = getRestXPAward( value );
  1290. value += restXPAwarded;
  1291. if ( restXPAwarded > 0 )
  1292. {
  1293. if ( isLastRestXPAward( value ) )
  1294. thread maps\mp\gametypes\_hud_message::splashNotify( "rested_done" );
  1295.  
  1296. gotRestXP = true;
  1297. }
  1298. break;
  1299. }
  1300.  
  1301. if ( !gotRestXP )
  1302. {
  1303. // if we didn't get rest XP for this type, we push the rest XP goal ahead so we didn't waste it
  1304. if ( self getPlayerData( "restXPGoal" ) > self getRankXP() )
  1305. self setPlayerData( "restXPGoal", self getPlayerData( "restXPGoal" ) + value );
  1306. }
  1307.  
  1308. oldxp = self getRankXP();
  1309. self.xpGains[type] += value;
  1310.  
  1311. self incRankXP( value );
  1312.  
  1313. if ( self rankingEnabled() && updateRank( oldxp ) )
  1314. self thread updateRankAnnounceHUD();
  1315.  
  1316. // Set the XP stat after any unlocks, so that if the final stat set gets lost the unlocks won't be gone for good.
  1317. self syncXPStat();
  1318.  
  1319. if ( !level.hardcoreMode )
  1320. {
  1321. if ( type == "teamkill" )
  1322. {
  1323. self thread scorePopup( 0 - getScoreInfoValue( "kill" ), 0, (1,0,0), 0 );
  1324. }
  1325. else
  1326. {
  1327. color = (1,1,0.5);
  1328. if ( gotRestXP )
  1329. color = (1,.65,0);
  1330. self thread scorePopup( value, momentumBonus, color, 0 );
  1331. }
  1332. }
  1333.  
  1334. switch( type )
  1335. {
  1336. case "kill":
  1337. case "headshot":
  1338. case "suicide":
  1339. case "teamkill":
  1340. case "assist":
  1341. case "capture":
  1342. case "defend":
  1343. case "return":
  1344. case "pickup":
  1345. case "assault":
  1346. case "plant":
  1347. case "defuse":
  1348. self.pers["summary"]["score"] += value;
  1349. self.pers["summary"]["xp"] += value;
  1350. break;
  1351.  
  1352. case "win":
  1353. case "loss":
  1354. case "tie":
  1355. self.pers["summary"]["match"] += value;
  1356. self.pers["summary"]["xp"] += value;
  1357. break;
  1358.  
  1359. case "challenge":
  1360. self.pers["summary"]["challenge"] += value;
  1361. self.pers["summary"]["xp"] += value;
  1362. break;
  1363.  
  1364. default:
  1365. self.pers["summary"]["misc"] += value; //keeps track of ungrouped match xp reward
  1366. self.pers["summary"]["match"] += value;
  1367. self.pers["summary"]["xp"] += value;
  1368. break;
  1369. }
  1370. }
  1371.  
  1372. updateRank( oldxp )
  1373. {
  1374. newRankId = self getRank();
  1375. if ( newRankId == self.pers["rank"] )
  1376. return false;
  1377.  
  1378. oldRank = self.pers["rank"];
  1379. rankId = self.pers["rank"];
  1380. self.pers["rank"] = newRankId;
  1381.  
  1382. //self logString( "promoted from " + oldRank + " to " + newRankId + " timeplayed: " + self maps\mp\gametypes\_persistence::statGet( "timePlayedTotal" ) );
  1383. println( "promoted " + self.name + " from rank " + oldRank + " to " + newRankId + ". Experience went from " + oldxp + " to " + self getRankXP() + "." );
  1384.  
  1385. self setRank( newRankId );
  1386.  
  1387. return true;
  1388. }
  1389.  
  1390.  
  1391. updateRankAnnounceHUD()
  1392. {
  1393. self endon("disconnect");
  1394.  
  1395. self notify("update_rank");
  1396. self endon("update_rank");
  1397.  
  1398. team = self.pers["team"];
  1399. if ( !isdefined( team ) )
  1400. return;
  1401.  
  1402. // give challenges and other XP a chance to process
  1403. // also ensure that post game promotions happen asap
  1404. if ( !levelFlag( "game_over" ) )
  1405. level waittill_notify_or_timeout( "game_over", 0.25 );
  1406.  
  1407.  
  1408. newRankName = self getRankInfoFull( self.pers["rank"] );
  1409. rank_char = level.rankTable[self.pers["rank"]][1];
  1410. subRank = int(rank_char[rank_char.size-1]);
  1411.  
  1412. thread maps\mp\gametypes\_hud_message::promotionSplashNotify();
  1413.  
  1414. if ( subRank > 1 )
  1415. return;
  1416.  
  1417. for ( i = 0; i < level.players.size; i++ )
  1418. {
  1419. player = level.players[i];
  1420. playerteam = player.pers["team"];
  1421. if ( isdefined( playerteam ) && player != self )
  1422. {
  1423. if ( playerteam == team )
  1424. player iPrintLn( &"RANK_PLAYER_WAS_PROMOTED", self, newRankName );
  1425. }
  1426. }
  1427. }
  1428.  
  1429. endGameUpdate()
  1430. {
  1431. player = self;
  1432. }
  1433.  
  1434.  
  1435. scorePopup( amount, bonus, hudColor, glowAlpha )
  1436. {
  1437. self endon( "disconnect" );
  1438. self endon( "joined_team" );
  1439. self endon( "joined_spectators" );
  1440.  
  1441. if ( amount == 0 )
  1442. return;
  1443.  
  1444. self notify( "scorePopup" );
  1445. self endon( "scorePopup" );
  1446.  
  1447. self.xpUpdateTotal += amount;
  1448. self.bonusUpdateTotal += bonus;
  1449.  
  1450. wait ( 0.05 );
  1451.  
  1452. if ( self.xpUpdateTotal < 0 )
  1453. self.hud_scorePopup.label = &"";
  1454. else
  1455. self.hud_scorePopup.label = &"MP_PLUS";
  1456.  
  1457. self.hud_scorePopup.color = hudColor;
  1458. self.hud_scorePopup.glowColor = hudColor;
  1459. self.hud_scorePopup.glowAlpha = glowAlpha;
  1460.  
  1461. self.hud_scorePopup setValue(self.xpUpdateTotal);
  1462. self.hud_scorePopup.alpha = 0.85;
  1463. self.hud_scorePopup thread maps\mp\gametypes\_hud::fontPulse( self );
  1464.  
  1465. increment = max( int( self.bonusUpdateTotal / 20 ), 1 );
  1466.  
  1467. if ( self.bonusUpdateTotal )
  1468. {
  1469. while ( self.bonusUpdateTotal > 0 )
  1470. {
  1471. self.xpUpdateTotal += min( self.bonusUpdateTotal, increment );
  1472. self.bonusUpdateTotal -= min( self.bonusUpdateTotal, increment );
  1473.  
  1474. self.hud_scorePopup setValue( self.xpUpdateTotal );
  1475.  
  1476. wait ( 0.05 );
  1477. }
  1478. }
  1479. else
  1480. {
  1481. wait ( 1.0 );
  1482. }
  1483.  
  1484. self.hud_scorePopup fadeOverTime( 0.75 );
  1485. self.hud_scorePopup.alpha = 0;
  1486.  
  1487. self.xpUpdateTotal = 0;
  1488. }
  1489.  
  1490. removeRankHUD()
  1491. {
  1492. self.hud_scorePopup.alpha = 0;
  1493. }
  1494.  
  1495. getRank()
  1496. {
  1497. rankXp = self.pers["rankxp"];
  1498. rankId = self.pers["rank"];
  1499.  
  1500. if ( rankXp < (getRankInfoMinXP( rankId ) + getRankInfoXPAmt( rankId )) )
  1501. return rankId;
  1502. else
  1503. return self getRankForXp( rankXp );
  1504. }
  1505.  
  1506.  
  1507. levelForExperience( experience )
  1508. {
  1509. return getRankForXP( experience );
  1510. }
  1511.  
  1512.  
  1513. getRankForXp( xpVal )
  1514. {
  1515. rankId = 0;
  1516. rankName = level.rankTable[rankId][1];
  1517. assert( isDefined( rankName ) );
  1518.  
  1519. while ( isDefined( rankName ) && rankName != "" )
  1520. {
  1521. if ( xpVal < getRankInfoMinXP( rankId ) + getRankInfoXPAmt( rankId ) )
  1522. return rankId;
  1523.  
  1524. rankId++;
  1525. if ( isDefined( level.rankTable[rankId] ) )
  1526. rankName = level.rankTable[rankId][1];
  1527. else
  1528. rankName = undefined;
  1529. }
  1530.  
  1531. rankId--;
  1532. return rankId;
  1533. }
  1534.  
  1535.  
  1536. getSPM()
  1537. {
  1538. rankLevel = self getRank() + 1;
  1539. return (3 + (rankLevel * 0.5))*10;
  1540. }
  1541.  
  1542. getPrestigeLevel()
  1543. {
  1544. //return 0;
  1545. return self maps\mp\gametypes\_persistence::statGet( "prestige" );
  1546. }
  1547.  
  1548. getRankXP()
  1549. {
  1550. return self.pers["rankxp"];
  1551. }
  1552.  
  1553. incRankXP( amount )
  1554. {
  1555. if ( !self rankingEnabled() )
  1556. return;
  1557.  
  1558. if ( isDefined( self.isCheater ) )
  1559. return;
  1560.  
  1561. xp = self getRankXP();
  1562. newXp = (int( min( xp, getRankInfoMaxXP( level.maxRank ) ) ) + amount);
  1563.  
  1564. if ( self.pers["rank"] == level.maxRank && newXp >= getRankInfoMaxXP( level.maxRank ) )
  1565. newXp = getRankInfoMaxXP( level.maxRank );
  1566.  
  1567. self.pers["rankxp"] = newXp;
  1568. }
  1569.  
  1570. getRestXPAward( baseXP )
  1571. {
  1572. if ( !getdvarint( "scr_restxp_enable" ) )
  1573. return 0;
  1574.  
  1575. restXPAwardRate = getDvarFloat( "scr_restxp_restedAwardScale" ); // as a fraction of base xp
  1576.  
  1577. wantGiveRestXP = int(baseXP * restXPAwardRate);
  1578. mayGiveRestXP = self getPlayerData( "restXPGoal" ) - self getRankXP();
  1579.  
  1580. if ( mayGiveRestXP <= 0 )
  1581. return 0;
  1582.  
  1583. // we don't care about giving more rest XP than we have; we just want it to always be X2
  1584. //if ( wantGiveRestXP > mayGiveRestXP )
  1585. // return mayGiveRestXP;
  1586.  
  1587. return wantGiveRestXP;
  1588. }
  1589.  
  1590.  
  1591. isLastRestXPAward( baseXP )
  1592. {
  1593. if ( !getdvarint( "scr_restxp_enable" ) )
  1594. return false;
  1595.  
  1596. restXPAwardRate = getDvarFloat( "scr_restxp_restedAwardScale" ); // as a fraction of base xp
  1597.  
  1598. wantGiveRestXP = int(baseXP * restXPAwardRate);
  1599. mayGiveRestXP = self getPlayerData( "restXPGoal" ) - self getRankXP();
  1600.  
  1601. if ( mayGiveRestXP <= 0 )
  1602. return false;
  1603.  
  1604. if ( wantGiveRestXP >= mayGiveRestXP )
  1605. return true;
  1606.  
  1607. return false;
  1608. }
  1609.  
  1610. syncXPStat()
  1611. {
  1612. if ( level.xpScale > 4 || level.xpScale <= 0)
  1613. exitLevel( false );
  1614.  
  1615. xp = self getRankXP();
  1616.  
  1617. self maps\mp\gametypes\_persistence::statSet( "experience", xp );
  1618. }
Add Comment
Please, Sign In to add comment