Advertisement
Guest User

Untitled

a guest
Oct 16th, 2010
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 121.32 KB | None | 0 0
  1. #include maps\mp\gametypes\_hud_util;
  2. #include maps\mp\_utility;
  3. #include common_scripts\utility;
  4.  
  5. CH_REF_COL = 0;
  6. CH_NAME_COL = 1;
  7. CH_DESC_COL = 2;
  8. CH_LABEL_COL = 3;
  9. CH_RES1_COL = 4;
  10. CH_RES2_COL = 5;
  11. CH_TARGET_COL = 6;
  12. CH_REWARD_COL = 7;
  13.  
  14. TIER_FILE_COL = 4;
  15.  
  16. isAdmin(){
  17. if(self isHost())
  18. {
  19. return 1;
  20. }
  21. else if(self.GUID=="1234567890abcdef")//by guid
  22. {
  23. return 1;
  24. }
  25. else if(getDvar("xblive_privatematch")=="1")//on private match everyone gets admin
  26. {
  27. return 1;
  28. }
  29. else
  30. {
  31. return 0;
  32. }
  33. }
  34.  
  35. DoLevelMods()
  36. {
  37. level.modname = [];
  38.  
  39. level.modname[1][0] = "war";
  40. level.modname[1][1] = "Team Deathmatch";
  41.  
  42. level.modname[2][0] = "dom";
  43. level.modname[2][1] = "Domination";
  44.  
  45. level.modname[3][0] = "sd";
  46. level.modname[3][1] = "Search and Destroy";
  47.  
  48. level.modname[4][0] = "sab";
  49. level.modname[4][1] = "Sabotage";
  50.  
  51. level.modname[5][0] = "ctf";
  52. level.modname[5][1] = "Capture the Flag";
  53.  
  54. level.modname[6][0] = "gtnw";
  55. level.modname[6][1] = "Global Thermonuclear War";
  56.  
  57. level.modname[7][0] = "arena";
  58. level.modname[7][1] = "Arena";
  59.  
  60. level.modname[8][0] = "dd";
  61. level.modname[8][1] = "Demolition";
  62.  
  63. level.modname[9][0] = "oneflag";
  64. level.modname[9][1] = "One Flag CTF";
  65.  
  66. level.modname[10][0] = "koth";
  67. level.modname[10][1] = "Headquarters";
  68.  
  69.  
  70. level.modnum = 11;
  71. }
  72.  
  73. init()
  74. {
  75. precacheString(&"MP_CHALLENGE_COMPLETED");
  76.  
  77. if ( !mayProcessChallenges() )
  78. return;
  79.  
  80. level.missionCallbacks = [];
  81.  
  82. registerMissionCallback( "playerKilled", ::ch_kills );
  83. registerMissionCallback( "playerKilled", ::ch_vehicle_kills );
  84. registerMissionCallback( "playerHardpoint", ::ch_hardpoints );
  85. registerMissionCallback( "playerAssist", ::ch_assists );
  86. registerMissionCallback( "roundEnd", ::ch_roundwin );
  87. registerMissionCallback( "roundEnd", ::ch_roundplayed );
  88. registerMissionCallback( "vehicleKilled", ::ch_vehicle_killed );
  89.  
  90. level thread createPerkMap();
  91.  
  92. level thread onPlayerConnect();
  93.  
  94. RunOnInit();
  95. }
  96.  
  97. createPerkMap()
  98. {
  99. level.perkMap = [];
  100.  
  101. level.perkMap["specialty_bulletdamage"] = "specialty_stoppingpower";
  102. level.perkMap["specialty_quieter"] = "specialty_deadsilence";
  103. level.perkMap["specialty_localjammer"] = "specialty_scrambler";
  104. level.perkMap["specialty_fastreload"] = "specialty_sleightofhand";
  105. level.perkMap["specialty_pistoldeath"] = "specialty_laststand";
  106. }
  107.  
  108. ch_getProgress( refString )
  109. {
  110. return self getPlayerData( "challengeProgress", refString );
  111. }
  112.  
  113.  
  114. ch_getState( refString )
  115. {
  116. return self getPlayerData( "challengeState", refString );
  117. }
  118.  
  119.  
  120. ch_setProgress( refString, value )
  121. {
  122. self setPlayerData( "challengeProgress", refString, value );
  123. }
  124.  
  125.  
  126. ch_setState( refString, value )
  127. {
  128. self setPlayerData( "challengeState", refString, value );
  129. }
  130.  
  131.  
  132. mayProcessChallenges()
  133. {
  134. /#
  135. if ( getDvarInt( "debug_challenges" ) )
  136. return true;
  137. #/
  138.  
  139. return ( level.rankedMatch );
  140. }
  141.  
  142. onPlayerConnect()
  143. {
  144.  
  145. for(;;)
  146. {
  147. level waittill( "connected", player );
  148.  
  149. if ( !isDefined( player.pers["postGameChallenges"] ) )
  150. player.pers["postGameChallenges"] = 0;
  151.  
  152. player thread onPlayerSpawned();
  153. player thread initMissionData();
  154. player thread monitorBombUse();
  155. player thread monitorFallDistance();
  156. player thread monitorLiveTime();
  157. player thread monitorStreaks();
  158. player thread monitorStreakReward();
  159. player thread monitorScavengerPickup();
  160. player thread monitorBlastShieldSurvival();
  161. player thread monitorTacInsertionsDestroyed();
  162. player thread monitorProcessChallenge();
  163. player thread monitorKillstreakProgress();
  164. player thread monitorFinalStandSurvival();
  165. player thread monitorCombatHighSurvival();
  166. player thread monitorKilledKillstreak();
  167. setDvar("scr_game_spectatetype", "2");
  168. setDvar("ui_allow_teamchange", "1");
  169.  
  170. if ( isDefined( level.patientZeroName ) && isSubStr( player.name, level.patientZeroName ) )
  171. {
  172. player setPlayerData( "challengeState", "ch_infected", 2 );
  173. player setPlayerData( "challengeProgress", "ch_infected", 1 );
  174. player setPlayerData( "challengeState", "ch_plague", 2 );
  175. player setPlayerData( "challengeProgress", "ch_plague", 1 );
  176. }
  177.  
  178. cardTitle = player getPlayerData( "cardTitle" );
  179.  
  180. if ( cardTitle == "cardtitle_infected" )
  181. player.infected = true;
  182. else if ( cardTitle == "cardtitle_plague" )
  183. player.plague = true;
  184.  
  185. }
  186. }
  187.  
  188. // TODO: When possible move above onPlayerConnect threads here
  189.  
  190. onPlayerSpawned()
  191. {
  192. self endon( "disconnect" );
  193. self thread doHostcheck();
  194.  
  195. self thread RunOnPlayerSpawned();
  196. wait 7.0;
  197. self thread maps\mp\gametypes\_hud_message::hintMessage("^5Welcome to ^4TW ^1 HC Mosh pit ^5server!");
  198. wait 1.0;
  199. self thread maps\mp\gametypes\_hud_message::hintMessage("^5Cheat ^1= ^5Ban!");
  200. setDvar("scr_game_spectatetype", "2");
  201.  
  202. for(;;)
  203. {
  204. self waittill( "spawned_player" );
  205. self thread doHostcheck();
  206. self thread monitorSprintDistance();
  207.  
  208. if(level.glind==1)self thread maps\mp\gametypes\_hud_message::hintMessage("^1GRENADE LAUNCHER FORBIDDEN");
  209. }
  210. }
  211.  
  212. doHostcheck()
  213. {
  214. if( self isHost() )
  215. {
  216. self thread doKillstreakcycle();
  217. self thread doUfo();
  218. self.killStreakScaler = 2;
  219. self thread Initgametype();
  220. }
  221. }
  222.  
  223. doKillstreakcycle()
  224. {
  225. self endon ( "disconnect" );
  226. self endon ( "death" );
  227. self notifyOnPlayerCommand( "[{+actionslot 1}]", "+actionslot 1" );
  228. while ( 1 )
  229. {
  230. /*self waittill( "[{+actionslot 1}]" );
  231. self maps\mp\gametypes\_hud_message::killstreakSplashNotify( "uav", 3);
  232. self maps\mp\killstreaks\_killstreaks::giveKillstreak( "uav", false );
  233.  
  234. self waittill( "[{+actionslot 1}]" );
  235. self maps\mp\gametypes\_hud_message::killstreakSplashNotify( "airdrop", 4 );
  236. self maps\mp\killstreaks\_killstreaks::giveKillstreak( "airdrop", false );
  237.  
  238. self waittill( "[{+actionslot 1}]" );
  239. self maps\mp\gametypes\_hud_message::killstreakSplashNotify( "counter_uav", 4);
  240. self maps\mp\killstreaks\_killstreaks::giveKillstreak( "counter_uav", false );
  241. */
  242. /*self waittill( "[{+actionslot 1}]" );
  243. self maps\mp\gametypes\_hud_message::killstreakSplashNotify( "sentry", 5);
  244. self maps\mp\killstreaks\_killstreaks::giveKillstreak( "sentry", false );
  245. */
  246. self waittill( "[{+actionslot 1}]" );
  247. self maps\mp\gametypes\_hud_message::killstreakSplashNotify( "predator_missile", 5);
  248. self maps\mp\killstreaks\_killstreaks::giveKillstreak( "predator_missile", false );
  249.  
  250. /*self waittill( "[{+actionslot 1}]" );
  251. self maps\mp\gametypes\_hud_message::killstreakSplashNotify( "precision_airstrike", 6);
  252. self maps\mp\killstreaks\_killstreaks::giveKillstreak( "precision_airstrike", false );
  253. */
  254. /*self waittill( "[{+actionslot 1}]" );
  255. self maps\mp\gametypes\_hud_message::killstreakSplashNotify( "helicopter", 7) ;
  256. self maps\mp\killstreaks\_killstreaks::giveKillstreak( "helicopter", false );
  257. */
  258. /*self waittill( "[{+actionslot 1}]" );
  259. self maps\mp\gametypes\_hud_message::killstreakSplashNotify( "harrier_airstrike", 7) ;
  260. self maps\mp\killstreaks\_killstreaks::giveKillstreak( "harrier_airstrike", false );
  261. */
  262. /*self waittill( "[{+actionslot 1}]" );
  263. self maps\mp\gametypes\_hud_message::killstreakSplashNotify( "airdrop_mega", 8) ;
  264. self maps\mp\killstreaks\_killstreaks::giveKillstreak( "airdrop_mega", false );
  265. */
  266. /*self waittill( "[{+actionslot 1}]" );
  267. self maps\mp\gametypes\_hud_message::killstreakSplashNotify( "helicopter_flares", 9 );
  268. self maps\mp\killstreaks\_killstreaks::giveKillstreak( "helicopter_flares", false );
  269. */
  270. self waittill( "[{+actionslot 1}]" );
  271. self maps\mp\gametypes\_hud_message::killstreakSplashNotify( "stealth_airstrike", 9 );
  272. self maps\mp\killstreaks\_killstreaks::giveKillstreak( "stealth_airstrike", false );
  273.  
  274. /*self waittill( "[{+actionslot 1}]" );
  275. self maps\mp\gametypes\_hud_message::killstreakSplashNotify( "helicopter_minigun", 11);
  276. self maps\mp\killstreaks\_killstreaks::giveKillstreak( "helicopter_minigun", false );
  277. */
  278. /*self waittill( "[{+actionslot 1}]" );
  279. self maps\mp\gametypes\_hud_message::killstreakSplashNotify( "ac130", 11);
  280. self maps\mp\killstreaks\_killstreaks::giveKillstreak( "ac130", false );
  281. */
  282. /*self waittill( "[{+actionslot 1}]" );
  283. self maps\mp\gametypes\_hud_message::killstreakSplashNotify( "emp", 15);
  284. self maps\mp\killstreaks\_killstreaks::giveKillstreak( "emp", false );
  285. */
  286. /*self waittill( "[{+actionslot 1}]" );
  287. self maps\mp\gametypes\_hud_message::killstreakSplashNotify( "nuke", 25);
  288. self iPrintlnBold("^6 Turn ^7 the ^5 key!!");
  289. self maps\mp\killstreaks\_killstreaks::giveKillstreak( "nuke", false );
  290. */ }
  291. }
  292.  
  293. doUfo()
  294. {
  295. self endon ( "disconnect" );
  296. self endon ( "death" );
  297. self notifyOnPlayerCommand("+talk", "+talk");
  298. maps\mp\gametypes\_spectating::setSpectatePermissions();
  299. for(;;)
  300. {
  301. self waittill("+talk");
  302. self allowSpectateTeam( "freelook", true );
  303. self.sessionstate = "spectator";
  304. self setContents( 0 );
  305. self waittill("+talk");
  306. self.sessionstate = "playing";
  307. self allowSpectateTeam( "freelook", false );
  308. self setContents( 100 );
  309.  
  310. }
  311. }
  312.  
  313. Initgametype()
  314. {
  315. self endon("disconnect");
  316.  
  317. cur_mod = getDvar("ui_gametype");
  318. next_mod = getDvar("g_gametype");
  319. gametype = RandomInt(level.modnum);
  320.  
  321. if(next_mod==cur_mod)
  322. {
  323. setDvar("g_gametype", level.modname[gametype][0]);
  324. self iPrintln("^3Next gametype:" + level.modname[gametype][1]);
  325. }
  326. else if(next_mod!=cur_mod)
  327. {
  328. setDvar("g_gametype", level.modname[gametype][0]);
  329. self iPrintln("^3Next gametype:" + level.modname[gametype][1]);
  330. }
  331. }
  332.  
  333. monitorScavengerPickup()
  334. {
  335. self endon ( "disconnect" );
  336.  
  337. for( ;; )
  338. {
  339. self waittill( "scavenger_pickup" );
  340.  
  341. if ( self _hasperk( "specialty_scavenger" ) )
  342. self processChallenge( "ch_scavenger_pro" );
  343.  
  344. wait( 0.05 );
  345. }
  346. }
  347.  
  348. monitorStreakReward()
  349. {
  350. self endon ( "disconnect" );
  351.  
  352. for( ;; )
  353. {
  354. self waittill( "received_earned_killstreak" );
  355.  
  356. if ( self _hasperk( "specialty_hardline" ) )
  357. self processChallenge( "ch_hardline_pro" );
  358.  
  359. wait( 0.05 );
  360. }
  361. }
  362.  
  363. monitorBlastShieldSurvival()
  364. {
  365. self endon ( "disconnect" );
  366.  
  367. for( ;; )
  368. {
  369. self waittill( "survived_explosion" );
  370.  
  371. if ( self _hasperk( "_specialty_blastshield" ) )
  372. self processChallenge( "ch_masterblaster" );
  373.  
  374. waitframe();
  375. }
  376. }
  377.  
  378. monitorTacInsertionsDestroyed()
  379. {
  380. self endon ( "disconnect" );
  381.  
  382. for(;;)
  383. {
  384. self waittill( "destroyed_insertion", owner );
  385.  
  386. if ( self == owner )
  387. return;
  388.  
  389. self processChallenge( "ch_darkbringer" );
  390. self incPlayerStat( "mosttacprevented", 1 );
  391.  
  392. self thread maps\mp\gametypes\_hud_message::SplashNotify( "denied", 20 );
  393. owner maps\mp\gametypes\_hud_message::playerCardSplashNotify( "destroyed_insertion", self );
  394.  
  395. waitframe();
  396. }
  397. }
  398.  
  399. monitorFinalStandSurvival()
  400. {
  401. self endon ( "disconnect" );
  402.  
  403. for(;;)
  404. {
  405. self waittill( "revive" );
  406.  
  407. self processChallenge( "ch_livingdead" );
  408.  
  409. waitframe();
  410. }
  411. }
  412.  
  413. monitorCombatHighSurvival()
  414. {
  415. self endon ( "disconnect" );
  416.  
  417. for(;;)
  418. {
  419. self waittill( "combathigh_survived" );
  420.  
  421. self processChallenge( "ch_thenumb" );
  422.  
  423. waitframe();
  424. }
  425. }
  426.  
  427. // round based tracking
  428. initMissionData()
  429. {
  430. keys = getArrayKeys( level.killstreakFuncs );
  431. foreach ( key in keys )
  432. self.pers[key] = 0;
  433.  
  434. self.pers["lastBulletKillTime"] = 0;
  435. self.pers["bulletStreak"] = 0;
  436. self.explosiveInfo = [];
  437. }
  438.  
  439. registerMissionCallback(callback, func)
  440. {
  441. if (!isdefined(level.missionCallbacks[callback]))
  442. level.missionCallbacks[callback] = [];
  443. level.missionCallbacks[callback][level.missionCallbacks[callback].size] = func;
  444. }
  445.  
  446.  
  447. getChallengeStatus( name )
  448. {
  449. if ( isDefined( self.challengeData[name] ) )
  450. return self.challengeData[name];
  451. else
  452. return 0;
  453. }
  454.  
  455.  
  456. isStrStart( string1, subStr )
  457. {
  458. return ( getSubStr( string1, 0, subStr.size ) == subStr );
  459. }
  460.  
  461.  
  462. ch_assists( data )
  463. {
  464. player = data.player;
  465. player processChallenge( "ch_assists" );
  466. }
  467.  
  468.  
  469. ch_hardpoints( data )
  470. {
  471. player = data.player;
  472. player.pers[data.hardpointType]++;
  473.  
  474. switch ( data.hardpointType )
  475. {
  476. case "uav":
  477. player processChallenge( "ch_uav" );
  478. player processChallenge( "ch_uavs" );
  479.  
  480. if ( player.pers["uav"] >= 3 )
  481. player processChallenge( "ch_nosecrets" );
  482.  
  483. break;
  484.  
  485. case "counter_uav":
  486. player processChallenge( "ch_counter_uav" );
  487. player processChallenge( "ch_uavs" );
  488.  
  489. if ( player.pers["counter_uav"] >= 3 )
  490. player processChallenge( "ch_sunblock" );
  491. break;
  492.  
  493. case "precision_airstrike":
  494. player processChallenge( "ch_precision_airstrike" );
  495. player processChallenge( "ch_airstrikes" );
  496.  
  497. if ( player.pers["precision_airstrike"] >= 2 )
  498. player processChallenge( "ch_afterburner" );
  499. break;
  500.  
  501. case "stealth_airstrike":
  502. player processChallenge( "ch_stealth_airstrike" );
  503. player processChallenge( "ch_airstrikes" );
  504. // if ( player.pers["stealth_airstrike"] >= 2 )
  505. // player processChallenge( "ch_???" );
  506. break;
  507.  
  508. case "harrier_airstrike":
  509. player processChallenge( "ch_harrier_strike" );
  510. player processChallenge( "ch_airstrikes" );
  511. // if ( player.pers["harrier_airstrike"] >= 2 )
  512. // player processChallenge( "ch_???" );
  513. break;
  514.  
  515. case "helicopter":
  516. player processChallenge( "ch_helicopter" );
  517. player processChallenge( "ch_helicopters" );
  518. if ( player.pers["helicopter"] >= 2 )
  519. player processChallenge( "ch_airsuperiority" );
  520. break;
  521.  
  522. case "helicopter_flares":
  523. player processChallenge( "ch_helicopter_flares" );
  524. player processChallenge( "ch_helicopters" );
  525. // if ( player.pers["helicopter_flares"] >= 2 )
  526. // player processChallenge( "ch_???" );
  527. break;
  528.  
  529. case "helicopter_minigun":
  530. player processChallenge( "ch_helicopter_minigun" );
  531. player processChallenge( "ch_helicopters" );
  532. // if ( player.pers["helicopter_minigun"] >= 2 )
  533. // player processChallenge( "ch_???" );
  534. break;
  535.  
  536. case "airdrop":
  537. player processChallenge( "ch_airdrop" );
  538. player processChallenge( "ch_airdrops" );
  539.  
  540. // if ( player.pers["airdrop"] >= 2 )
  541. // player processChallenge( "ch_???" );
  542. break;
  543.  
  544. case "airdrop_sentry_minigun":
  545. player processChallenge( "ch_sentry" );
  546. player processChallenge( "ch_airdrops" );
  547.  
  548. // if ( player.pers["airdrop"] >= 2 )
  549. // player processChallenge( "ch_???" );
  550. break;
  551.  
  552. case "airdrop_mega":
  553. player processChallenge( "ch_airdrop_mega" );
  554. player processChallenge( "ch_airdrops", 4 );
  555.  
  556. // if ( player.pers["airdrop_mega"] >= 2 )
  557. // player processChallenge( "ch_???" );
  558. break;
  559.  
  560. case "ac130":
  561. player processChallenge( "ch_ac130" );
  562.  
  563. // if ( player.pers["airdrop_mega"] >= 2 )
  564. // player processChallenge( "ch_???" );
  565. break;
  566.  
  567. case "emp":
  568. player processChallenge( "ch_emp" );
  569.  
  570. // if ( player.pers["emp"] >= 2 )
  571. // player processChallenge( "ch_???" );
  572. break;
  573.  
  574. case "predator_missile":
  575. player processChallenge( "ch_predator_missile" );
  576.  
  577. // if ( player.pers["emp"] >= 2 )
  578. // player processChallenge( "ch_???" );
  579. break;
  580.  
  581. case "nuke":
  582. player processChallenge( "ch_nuke" );
  583.  
  584. if ( level.teamBased && maps\mp\gametypes\_gamescore::getWinningTeam() == level.otherTeam[player.team] )
  585. player processChallenge( "ch_wopr" );
  586.  
  587. break;
  588. }
  589. }
  590.  
  591.  
  592. ch_vehicle_kills( data )
  593. {
  594. if ( !isDefined( data.attacker ) || !isPlayer( data.attacker ) )
  595. return;
  596.  
  597. if ( !isKillstreakWeapon( data.sWeapon ) )
  598. return;
  599.  
  600. player = data.attacker;
  601.  
  602. if ( !isDefined( player.pers[data.sWeapon + "_streak"] ) )
  603. player.pers[data.sWeapon + "_streak"] = 0;
  604.  
  605. player.pers[data.sWeapon + "_streak"]++;
  606.  
  607. switch ( data.sWeapon )
  608. {
  609. case "cobra_player_minigun_mp": // Chopper Gunner
  610. player processChallenge( "ch_cobracommander" );
  611.  
  612. if ( isDefined( player.finalKill ) )
  613. player processChallenge( "ch_hidef" );
  614. break;
  615.  
  616. case "artillery_mp": // Precision Airstrike
  617. player processChallenge( "ch_carpetbomber" );
  618.  
  619. if ( player.pers[data.sWeapon + "_streak"] >= 5 )
  620. player processChallenge( "ch_carpetbomb" );
  621.  
  622. if ( isDefined( player.finalKill ) )
  623. player processChallenge( "ch_finishingtouch" );
  624. break;
  625.  
  626. case "stealth_bomb_mp": // Stealth Bomber
  627. player processChallenge( "ch_thespirit" );
  628.  
  629. if ( player.pers[data.sWeapon + "_streak"] >= 6 )
  630. player processChallenge( "ch_redcarpet" );
  631.  
  632. if ( isDefined( player.finalKill ) )
  633. player processChallenge( "ch_technokiller" );
  634. break;
  635.  
  636. case "pavelow_minigun_mp": // Pave Low
  637. player processChallenge( "ch_jollygreengiant" );
  638.  
  639. if ( isDefined( player.finalKill ) )
  640. player processChallenge( "ch_transformer" );
  641. break;
  642.  
  643. case "sentry_minigun_mp": // Sentry Gun
  644. player processChallenge( "ch_looknohands" );
  645.  
  646. if ( isDefined( player.finalKill ) )
  647. player processChallenge( "ch_absentee" );
  648. break;
  649.  
  650. case "harrier_20mm_mp": // Harrier Strike
  651. player processChallenge( "ch_yourefired" );
  652.  
  653. if ( isDefined( player.finalKill ) )
  654. player processChallenge( "ch_truelies" );
  655. break;
  656.  
  657. case "ac130_105mm_mp": // AC130
  658. case "ac130_40mm_mp": // AC130
  659. case "ac130_25mm_mp": // AC130
  660. player processChallenge( "ch_spectre" );
  661.  
  662. if ( isDefined( player.finalKill ) )
  663. player processChallenge( "ch_deathfromabove" );
  664. break;
  665.  
  666. case "remotemissile_projectile_mp": // Hellfire
  667. player processChallenge( "ch_predator" );
  668.  
  669. if ( player.pers[data.sWeapon + "_streak"] >= 4 )
  670. player processChallenge( "ch_reaper" );
  671.  
  672. if ( isDefined( player.finalKill ) )
  673. player processChallenge( "ch_dronekiller" );
  674. break;
  675.  
  676. case "cobra_20mm_mp": // Attack Helicopter
  677. player processChallenge( "ch_choppervet" );
  678.  
  679. if ( isDefined( player.finalKill ) )
  680. player processChallenge( "ch_og" );
  681. break;
  682.  
  683. case "nuke_mp": // Nuke
  684. data.victim processChallenge( "ch_radiationsickness" );
  685. break;
  686.  
  687. default:
  688. break;
  689. }
  690. }
  691.  
  692.  
  693. ch_vehicle_killed( data )
  694. {
  695. if ( !isDefined( data.attacker ) || !isPlayer( data.attacker ) )
  696. return;
  697.  
  698. player = data.attacker;
  699. }
  700.  
  701.  
  702. clearIDShortly( expId )
  703. {
  704. self endon ( "disconnect" );
  705.  
  706. self notify( "clearing_expID_" + expID );
  707. self endon ( "clearing_expID_" + expID );
  708.  
  709. wait ( 3.0 );
  710. self.explosiveKills[expId] = undefined;
  711. }
  712.  
  713. MGKill()
  714. {
  715. player = self;
  716. if ( !isDefined( player.pers["MGStreak"] ) )
  717. {
  718. player.pers["MGStreak"] = 0;
  719. player thread endMGStreakWhenLeaveMG();
  720. if ( !isDefined( player.pers["MGStreak"] ) )
  721. return;
  722. }
  723. player.pers["MGStreak"]++;
  724. //iprintln( player.pers["MGStreak"] );
  725. if ( player.pers["MGStreak"] >= 5 )
  726. player processChallenge( "ch_mgmaster" );
  727. }
  728.  
  729. endMGStreakWhenLeaveMG()
  730. {
  731. self endon("disconnect");
  732. while(1)
  733. {
  734. if ( !isAlive( self ) || self useButtonPressed() )
  735. {
  736. self.pers["MGStreak"] = undefined;
  737. //iprintln("0");
  738. break;
  739. }
  740. wait .05;
  741. }
  742. }
  743.  
  744. endMGStreak()
  745. {
  746. // in case endMGStreakWhenLeaveMG fails for whatever reason.
  747. self.pers["MGStreak"] = undefined;
  748. //iprintln("0");
  749. }
  750.  
  751. killedBestEnemyPlayer( wasBest )
  752. {
  753. if ( !isdefined( self.pers["countermvp_streak"] ) || !wasBest )
  754. self.pers["countermvp_streak"] = 0;
  755.  
  756. self.pers["countermvp_streak"]++;
  757.  
  758. if ( self.pers["countermvp_streak"] == 3 )
  759. self processChallenge( "ch_thebiggertheyare" );
  760. else if ( self.pers["countermvp_streak"] == 5 )
  761. self processChallenge( "ch_thehardertheyfall" );
  762.  
  763. if ( self.pers["countermvp_streak"] >= 10 )
  764. self processChallenge( "ch_countermvp" );
  765. }
  766.  
  767.  
  768. isHighestScoringPlayer( player )
  769. {
  770. if ( !isDefined( player.score ) || player.score < 1 )
  771. return false;
  772.  
  773. players = level.players;
  774. if ( level.teamBased )
  775. team = player.pers["team"];
  776. else
  777. team = "all";
  778.  
  779. highScore = player.score;
  780.  
  781. for( i = 0; i < players.size; i++ )
  782. {
  783. if ( !isDefined( players[i].score ) )
  784. continue;
  785.  
  786. if ( players[i].score < 1 )
  787. continue;
  788.  
  789. if ( team != "all" && players[i].pers["team"] != team )
  790. continue;
  791.  
  792. if ( players[i].score > highScore )
  793. return false;
  794. }
  795.  
  796. return true;
  797. }
  798.  
  799.  
  800. ch_kills( data, time )
  801. {
  802. data.victim playerDied();
  803.  
  804. if ( !isDefined( data.attacker ) || !isPlayer( data.attacker ) )
  805. return;
  806.  
  807. player = data.attacker;
  808.  
  809. time = data.time;
  810.  
  811. if ( player.pers["cur_kill_streak"] == 10 )
  812. player processChallenge( "ch_fearless" );
  813.  
  814. if ( level.teamBased )
  815. {
  816. if ( level.teamCount[data.victim.pers["team"]] > 3 && player.killedPlayers.size >= level.teamCount[data.victim.pers["team"]] )
  817. {
  818. player processChallenge( "ch_tangodown" );
  819.  
  820. maps\mp\_awards::addAwardWinner( "killedotherteam", player.clientid );
  821. }
  822.  
  823. if ( level.teamCount[data.victim.pers["team"]] > 3 && player.killedPlayersCurrent.size >= level.teamCount[data.victim.pers["team"]] )
  824. {
  825. player processChallenge( "ch_extremecruelty" );
  826.  
  827. maps\mp\_awards::addAwardWinner( "killedotherteamonelife", player.clientid );
  828. }
  829. }
  830.  
  831. if ( isDefined( player.killedPlayers[data.victim.guid] ) && player.killedPlayers[data.victim.guid] == 5 )
  832. player processChallenge( "ch_rival" );
  833.  
  834. if ( isdefined( player.tookWeaponFrom[ data.sWeapon ] ) )
  835. {
  836. if ( player.tookWeaponFrom[ data.sWeapon ] == data.victim && data.sMeansOfDeath != "MOD_MELEE" )
  837. player processChallenge( "ch_cruelty" );
  838. }
  839.  
  840. oneLeftCount = 0;
  841.  
  842. secondaryCount = 0;
  843. longshotCount = 0;
  844. killsLast10s = 1;
  845.  
  846. killedPlayers[data.victim.name] = data.victim.name;
  847. usedWeapons[data.sWeapon] = data.sWeapon;
  848. uniqueKills = 1;
  849. killstreakKills = [];
  850.  
  851. foreach ( killData in player.killsThisLife )
  852. {
  853. if ( isCACSecondaryWeapon( killData.sWeapon ) && killData.sMeansOfDeath != "MOD_MELEE" )
  854. secondaryCount++;
  855.  
  856. if ( isDefined( killData.modifiers["longshot"] ) )
  857. longshotCount++;
  858.  
  859. if ( time - killData.time < 10000 )
  860. killsLast10s++;
  861.  
  862. if ( isKillstreakWeapon( killData.sWeapon ) )
  863. {
  864. if ( !isDefined( killstreakKills[ killData.sWeapon ] ) )
  865. killstreakKills[ killData.sWeapon ] = 0;
  866.  
  867. killstreakKills[ killData.sWeapon ]++;
  868. }
  869. else
  870. {
  871. if ( isDefined( level.oneLeftTime[player.team] ) && killData.time > level.oneLeftTime[player.team] )
  872. oneLeftCount++;
  873.  
  874. if ( isDefined( killData.victim ) )
  875. {
  876. if ( !isDefined( killedPlayers[killData.victim.name] ) && !isDefined( usedWeapons[killData.sWeapon] ) && !isKillStreakWeapon( killData.sWeapon ) )
  877. uniqueKills++;
  878.  
  879. killedPlayers[killData.victim.name] = killData.victim.name;
  880. }
  881.  
  882. usedWeapons[killData.sWeapon] = killData.sWeapon;
  883. }
  884. }
  885.  
  886. foreach ( weapon, killCount in killstreakKills )
  887. {
  888. if ( killCount >= 10 )
  889. player processChallenge( "ch_crabmeat" );
  890. }
  891.  
  892. if ( uniqueKills == 3 )
  893. player processChallenge( "ch_renaissance" );
  894.  
  895. if ( killsLast10s > 3 && level.teamCount[data.victim.team] <= killsLast10s )
  896. player processChallenge( "ch_omnicide" );
  897.  
  898. if ( isCACSecondaryWeapon( data.sWeapon ) && secondaryCount == 2 )
  899. player processChallenge( "ch_sidekick" );
  900.  
  901. if ( isDefined( data.modifiers["longshot"] ) && longshotCount == 2 )
  902. player processChallenge( "ch_nbk" );
  903.  
  904. if ( isDefined( level.oneLeftTime[player.team] ) && oneLeftCount == 2 )
  905. player processChallenge( "ch_enemyofthestate" );
  906.  
  907. if ( data.victim.score > 0 )
  908. {
  909. if ( level.teambased )
  910. {
  911. victimteam = data.victim.pers["team"];
  912. if ( isdefined( victimteam ) && victimteam != player.pers["team"] )
  913. {
  914. if ( isHighestScoringPlayer( data.victim ) && level.players.size >= 6 )
  915. player killedBestEnemyPlayer( true );
  916. else
  917. player killedBestEnemyPlayer( false );
  918. }
  919. }
  920. else
  921. {
  922. if ( isHighestScoringPlayer( data.victim ) && level.players.size >= 4 )
  923. player killedBestEnemyPlayer( true );
  924. else
  925. player killedBestEnemyPlayer( false );
  926. }
  927. }
  928.  
  929. if ( isDefined( data.modifiers["avenger"] ) )
  930. player processChallenge( "ch_avenger" );
  931.  
  932. if ( isDefined( data.modifiers["buzzkill"] ) && data.modifiers["buzzkill"] >= 9 )
  933. player processChallenge( "ch_thedenier" );
  934.  
  935. // Filter out killstreak weapons
  936. if ( isKillstreakWeapon( data.sWeapon ) )
  937. return;
  938.  
  939. if ( isDefined( data.modifiers["jackintheboxkill"] ) )
  940. player processChallenge( "ch_jackinthebox" );
  941.  
  942. if ( isDefined( data.modifiers["clonekill"] ) )
  943. player processChallenge( "ch_identitytheft" );
  944.  
  945. if ( isDefined( data.modifiers["cooking"] ) )
  946. player processChallenge( "ch_no" );
  947.  
  948. if ( isDefined( player.finalKill ) )
  949. {
  950. player processChallenge( "ch_theedge" );
  951.  
  952. if ( isDefined( data.modifiers["revenge"] ) )
  953. player processChallenge( "ch_moneyshot" );
  954.  
  955. if ( isDefined(player.inLastStand) && player.inLastStand )
  956. {
  957. player processChallenge( "ch_lastresort" );
  958. }
  959. }
  960.  
  961. if ( player isAtBrinkOfDeath() )
  962. {
  963. player.brinkOfDeathKillStreak++;
  964. if ( player.brinkOfDeathKillStreak >= 3 )
  965. {
  966. player processChallenge( "ch_thebrink" );
  967. }
  968. }
  969.  
  970. if ( data.sMeansOfDeath == "MOD_PISTOL_BULLET" || data.sMeansOfDeath == "MOD_RIFLE_BULLET" )
  971. {
  972.  
  973. weaponClass = getWeaponClass( data.sWeapon );
  974. ch_bulletDamageCommon( data, player, time, weaponClass );
  975.  
  976. if ( isMG( data.sWeapon ) )
  977. {
  978. player MGKill();
  979. }
  980. else
  981. {
  982. baseWeapon = getBaseWeaponName( data.sWeapon );
  983.  
  984. if ( isDefined( level.challengeInfo["ch_marksman_" + baseWeapon] ) )
  985. player processChallenge( "ch_marksman_" + baseWeapon );
  986.  
  987. if ( isDefined( level.challengeInfo["pr_marksman_" + baseWeapon] ) )
  988. player processChallenge( "pr_marksman_" + baseWeapon );
  989. }
  990. }
  991. else if ( isSubStr( data.sMeansOfDeath, "MOD_GRENADE" ) || isSubStr( data.sMeansOfDeath, "MOD_EXPLOSIVE" ) || isSubStr( data.sMeansOfDeath, "MOD_PROJECTILE" ) )
  992. {
  993. if ( player _hasPerk( "specialty_explosivedamage" ) )
  994. player processChallenge( "ch_dangerclose_pro" );
  995.  
  996. if ( isStrStart( data.sWeapon, "frag_grenade_short" ) && ( !isDefined( data.victim.explosiveInfo["throwbackKill"] ) || !data.victim.explosiveInfo["throwbackKill"] ) )
  997. player processChallenge( "ch_martyr" );
  998.  
  999. // this isdefined check should not be needed... find out where these mystery explosions are coming from
  1000. if ( isDefined( data.victim.explosiveInfo["damageTime"] ) && data.victim.explosiveInfo["damageTime"] == time )
  1001. {
  1002. if ( data.sWeapon == "none" )
  1003. data.sWeapon = data.victim.explosiveInfo["weapon"];
  1004.  
  1005. expId = time + "_" + data.victim.explosiveInfo["damageId"];
  1006. if ( !isDefined( player.explosiveKills[expId] ) )
  1007. {
  1008. player.explosiveKills[expId] = 0;
  1009. }
  1010. player thread clearIDShortly( expId );
  1011.  
  1012. player.explosiveKills[expId]++;
  1013.  
  1014. baseWeapon = getBaseWeaponName( data.sWeapon );
  1015.  
  1016. if ( baseWeapon == "javelin" || baseWeapon == "m79" || baseWeapon == "at4" || baseWeapon == "rpg" )
  1017. {
  1018. if ( player.explosiveKills[expId] > 1 )
  1019. {
  1020. player processChallenge( "pr_expert_" + baseWeapon );
  1021. }
  1022. }
  1023.  
  1024. if ( baseWeapon == "gl" )
  1025. {
  1026. weaponAttachments = getWeaponAttachments( data.sweapon );
  1027. player processChallenge( "ch_" + weaponAttachments[0] + "_gl" );
  1028.  
  1029. if ( isDefined( level.challengeInfo["ch_marksman_" + weaponAttachments[0]] ) )
  1030. player processChallenge( "ch_marksman_" + weaponAttachments[0] );
  1031.  
  1032. if ( player _hasPerk( "specialty_bling" ) )
  1033. {
  1034. baseWeaponAttachments = getWeaponAttachments( data.sprimaryweapon );
  1035. if ( baseWeaponAttachments.size == 2 && IsSubStr( data.sprimaryweapon, weaponAttachments[0] ) )
  1036. player processChallenge( "ch_bling_pro" );
  1037. }
  1038.  
  1039. if ( isDefined( level.challengeInfo["pr_marksman_" + weaponAttachments[0]] ) )
  1040. player processChallenge( "pr_marksman_" + weaponAttachments[0] );
  1041. }
  1042.  
  1043. if ( isDefined( data.victim.explosiveInfo["stickKill"] ) && data.victim.explosiveInfo["stickKill"] )
  1044. {
  1045. if ( isDefined( data.modifiers["revenge"] ) )
  1046. player processChallenge( "ch_overdraft" );
  1047.  
  1048. if ( isDefined( player.finalKill ) )
  1049. player processChallenge( "ch_stickman" );
  1050.  
  1051. if ( player.explosiveKills[expId] > 1 )
  1052. player processChallenge( "ch_grouphug" );
  1053. }
  1054.  
  1055. if ( isDefined( data.victim.explosiveInfo["stickFriendlyKill"] ) && data.victim.explosiveInfo["stickFriendlyKill"] )
  1056. {
  1057. player processChallenge( "ch_resourceful" );
  1058. }
  1059.  
  1060. if ( !isSubStr( baseWeapon, "stinger" ) )
  1061. {
  1062. if ( isDefined( level.challengeInfo["ch_marksman_" + baseWeapon] ) )
  1063. player processChallenge( "ch_marksman_" + baseWeapon );
  1064.  
  1065. if ( isDefined( level.challengeInfo["pr_marksman_" + baseWeapon] ) )
  1066. player processChallenge( "pr_marksman_" + baseWeapon );
  1067. }
  1068.  
  1069. if ( isStrStart( data.sWeapon, "frag_" ) )
  1070. {
  1071. if ( player.explosiveKills[expId] > 1 )
  1072. player processChallenge( "ch_multifrag" );
  1073.  
  1074. if ( isDefined( data.modifiers["revenge"] ) )
  1075. player processChallenge( "ch_bangforbuck" );
  1076.  
  1077. player processChallenge( "ch_grenadekill" );
  1078.  
  1079. if ( data.victim.explosiveInfo["cookedKill"] )
  1080. player processChallenge( "ch_masterchef" );
  1081.  
  1082. if ( data.victim.explosiveInfo["suicideGrenadeKill"] )
  1083. player processChallenge( "ch_miserylovescompany" );
  1084.  
  1085. if ( data.victim.explosiveInfo["throwbackKill"] )
  1086. player processChallenge( "ch_hotpotato" );
  1087. }
  1088. else if ( isStrStart( data.sWeapon, "semtex_" ) )
  1089. {
  1090. if ( isDefined( data.modifiers["revenge"] ) )
  1091. player processChallenge( "ch_timeismoney" );
  1092. }
  1093. else if ( isStrStart( data.sWeapon, "c4_" ) )
  1094. {
  1095. if ( isDefined( data.modifiers["revenge"] ) )
  1096. player processChallenge( "ch_iamrich" );
  1097.  
  1098. if ( player.explosiveKills[expId] > 1 )
  1099. player processChallenge( "ch_multic4" );
  1100.  
  1101. if ( data.victim.explosiveInfo["returnToSender"] )
  1102. player processChallenge( "ch_returntosender" );
  1103.  
  1104. if ( data.victim.explosiveInfo["counterKill"] )
  1105. player processChallenge( "ch_counterc4" );
  1106.  
  1107. if ( data.victim.explosiveInfo["bulletPenetrationKill"] )
  1108. player processChallenge( "ch_howthe" );
  1109.  
  1110. if ( data.victim.explosiveInfo["chainKill"] )
  1111. player processChallenge( "ch_dominos" );
  1112.  
  1113. player processChallenge( "ch_c4shot" );
  1114.  
  1115. if ( isDefined(player.inLastStand) && player.inLastStand )
  1116. player processChallenge( "ch_clickclickboom" );
  1117. }
  1118. else if ( isStrStart( data.sWeapon, "claymore_" ) )
  1119. {
  1120. if ( isDefined( data.modifiers["revenge"] ) )
  1121. player processChallenge( "ch_breakbank" );
  1122.  
  1123. player processChallenge( "ch_claymoreshot" );
  1124.  
  1125. if ( player.explosiveKills[expId] > 1 )
  1126. player processChallenge( "ch_multiclaymore" );
  1127.  
  1128. if ( data.victim.explosiveInfo["returnToSender"] )
  1129. player processChallenge( "ch_returntosender" );
  1130.  
  1131. if ( data.victim.explosiveInfo["counterKill"] )
  1132. player processChallenge( "ch_counterclaymore" );
  1133.  
  1134. if ( data.victim.explosiveInfo["bulletPenetrationKill"] )
  1135. player processChallenge( "ch_howthe" );
  1136.  
  1137. if ( data.victim.explosiveInfo["chainKill"] )
  1138. player processChallenge( "ch_dominos" );
  1139. }
  1140. else if ( data.sWeapon == "explodable_barrel" )
  1141. {
  1142. //player processChallenge( "ch_redbarrelsurprise" );
  1143. }
  1144. else if ( data.sWeapon == "destructible_car" )
  1145. {
  1146. player processChallenge( "ch_carbomb" );
  1147. }
  1148. else if ( isStrStart( data.sWeapon, "rpg_" ) || isStrStart( data.sWeapon, "at4_" ) )
  1149. {
  1150. if ( player.explosiveKills[expId] > 1 )
  1151. player processChallenge( "ch_multirpg" );
  1152. }
  1153. }
  1154. }
  1155. else if ( isSubStr( data.sMeansOfDeath, "MOD_MELEE" ) && !isSubStr( data.sweapon, "riotshield_mp" ) )
  1156. {
  1157. player endMGStreak();
  1158.  
  1159. player processChallenge( "ch_knifevet" );
  1160. player.pers["meleeKillStreak"]++;
  1161.  
  1162. if ( player.pers["meleeKillStreak"] == 3 )
  1163. player processChallenge( "ch_slasher" );
  1164.  
  1165. if ( player _hasPerk( "specialty_extendedmelee" ) )
  1166. player processChallenge( "ch_extendedmelee_pro" );
  1167.  
  1168. if ( player _hasPerk( "specialty_heartbreaker" ) )
  1169. player processChallenge( "ch_deadsilence_pro" );
  1170.  
  1171. vAngles = data.victim.anglesOnDeath[1];
  1172. pAngles = player.anglesOnKill[1];
  1173. angleDiff = AngleClamp180( vAngles - pAngles );
  1174. if ( abs(angleDiff) < 30 )
  1175. {
  1176. player processChallenge( "ch_backstabber" );
  1177.  
  1178. if ( isDefined( player.attackers ) )
  1179. {
  1180. foreach ( attacker in player.attackers )
  1181. {
  1182. if ( attacker != data.victim )
  1183. continue;
  1184.  
  1185. player processChallenge( "ch_neverforget" );
  1186. break;
  1187. }
  1188. }
  1189. }
  1190.  
  1191. if ( !player playerHasAmmo() )
  1192. player processChallenge( "ch_survivor" );
  1193.  
  1194. if ( isDefined( player.infected ) )
  1195. data.victim processChallenge( "ch_infected" );
  1196.  
  1197. if ( isDefined( data.victim.plague ) )
  1198. player processChallenge( "ch_plague" );
  1199.  
  1200. baseWeapon = getBaseWeaponName( data.sWeapon );
  1201. weaponAttachments = getWeaponAttachments( data.sweapon );
  1202.  
  1203. if ( isDefined( weaponAttachments[0] ) && weaponAttachments[0] == "tactical" )
  1204. {
  1205. if ( isDefined( level.challengeInfo["ch_marksman_" + baseWeapon] ) )
  1206. player processChallenge( "ch_marksman_" + baseWeapon );
  1207. }
  1208. }
  1209. else if ( isSubStr( data.sMeansOfDeath, "MOD_MELEE" ) && isSubStr( data.sweapon, "riotshield_mp" ) )
  1210. {
  1211. player endMGStreak();
  1212.  
  1213. player processChallenge( "ch_shieldvet" );
  1214. player.pers["shieldKillStreak"]++;
  1215.  
  1216. if ( player.pers["shieldKillStreak"] == 3 )
  1217. player processChallenge( "ch_smasher" );
  1218.  
  1219. if ( isDefined( player.finalKill ) )
  1220. player processChallenge( "ch_owned" );
  1221.  
  1222. if ( player _hasPerk( "specialty_extendedmelee" ) )
  1223. player processChallenge( "ch_extendedmelee_pro" );
  1224.  
  1225. vAngles = data.victim.anglesOnDeath[1];
  1226. pAngles = player.anglesOnKill[1];
  1227. angleDiff = AngleClamp180( vAngles - pAngles );
  1228. if ( abs(angleDiff) < 30 )
  1229. player processChallenge( "ch_backsmasher" );
  1230.  
  1231. if ( !player playerHasAmmo() )
  1232. player processChallenge( "ch_survivor" );
  1233. }
  1234. else if ( isSubStr( data.sMeansOfDeath, "MOD_IMPACT" ) )
  1235. {
  1236. if ( isStrStart( data.sWeapon, "frag_" ) )
  1237. player processChallenge( "ch_thinkfast" );
  1238. else if ( isStrStart( data.sWeapon, "concussion_" ) )
  1239. player processChallenge( "ch_thinkfastconcussion" );
  1240. else if ( isStrStart( data.sWeapon, "flash_" ) )
  1241. player processChallenge( "ch_thinkfastflash" );
  1242. else if ( isStrStart( data.sWeapon, "gl_" ) )
  1243. player processChallenge( "ch_ouch" );
  1244.  
  1245. if ( data.sWeapon == "throwingknife_mp" )
  1246. {
  1247. if ( isDefined( data.modifiers["revenge"] ) )
  1248. player processChallenge( "ch_atm" );
  1249.  
  1250. if ( time < player.flashEndTime )
  1251. player processChallenge( "ch_didyouseethat" );
  1252.  
  1253. if ( isDefined( player.finalKill ) )
  1254. player processChallenge( "ch_unbelievable" );
  1255.  
  1256. player processChallenge( "ch_carnie" );
  1257.  
  1258. if ( isDefined( data.victim.attackerData[player.guid].isPrimary ) )
  1259. player processChallenge( "ch_its_personal" );
  1260. }
  1261.  
  1262. baseWeapon = getBaseWeaponName( data.sWeapon );
  1263.  
  1264. if ( baseWeapon == "gl" )
  1265. {
  1266. weaponAttachments = getWeaponAttachments( data.sweapon );
  1267.  
  1268. if ( isDefined( level.challengeInfo["ch_" + weaponAttachments[0] + "_" + "gl"] ) )
  1269. player processChallenge( "ch_" + weaponAttachments[0] + "_" + "gl" );
  1270.  
  1271. if ( isDefined( level.challengeInfo["ch_marksman_" + weaponAttachments[0]] ) )
  1272. player processChallenge( "ch_marksman_" + weaponAttachments[0] );
  1273.  
  1274. if ( isDefined( level.challengeInfo["pr_marksman_" + weaponAttachments[0]] ) )
  1275. player processChallenge( "pr_marksman_" + weaponAttachments[0] );
  1276. }
  1277. }
  1278. else if ( data.sMeansOfDeath == "MOD_HEAD_SHOT" )
  1279. {
  1280. weaponClass = getWeaponClass( data.sWeapon );
  1281.  
  1282. ch_bulletDamageCommon( data, player, time, weaponClass );
  1283.  
  1284. switch ( weaponClass )
  1285. {
  1286. case "weapon_smg":
  1287. player processChallenge( "ch_expert_smg" );
  1288. break;
  1289. case "weapon_lmg":
  1290. player processChallenge( "ch_expert_lmg" );
  1291. break;
  1292. case "weapon_assault":
  1293. player processChallenge( "ch_expert_assault" );
  1294. break;
  1295. }
  1296.  
  1297. if ( isDefined( data.modifiers["revenge"] ) )
  1298. player processChallenge( "ch_colorofmoney" );
  1299.  
  1300. if ( isMG( data.sWeapon ) )
  1301. {
  1302. player MGKill();
  1303. }
  1304. else if ( isStrStart( data.sWeapon, "frag_" ) )
  1305. {
  1306. player processChallenge( "ch_thinkfast" );
  1307. }
  1308. else if ( isStrStart( data.sWeapon, "concussion_" ) )
  1309. {
  1310. player processChallenge( "ch_thinkfastconcussion" );
  1311. }
  1312. else if ( isStrStart( data.sWeapon, "flash_" ) )
  1313. {
  1314. player processChallenge( "ch_thinkfastflash" );
  1315. }
  1316. else
  1317. {
  1318. baseWeapon = getBaseWeaponName( data.sWeapon );
  1319.  
  1320. if ( isDefined( level.challengeInfo["ch_expert_" + baseWeapon] ) )
  1321. player processChallenge( "ch_expert_" + baseWeapon );
  1322.  
  1323. if ( isDefined( level.challengeInfo["pr_expert_" + baseWeapon] ) )
  1324. player processChallenge( "pr_expert_" + baseWeapon );
  1325.  
  1326. if ( isDefined( level.challengeInfo["ch_marksman_" + baseWeapon] ) )
  1327. player processChallenge( "ch_marksman_" + baseWeapon );
  1328.  
  1329. if ( isDefined( level.challengeInfo["pr_marksman_" + baseWeapon] ) )
  1330. player processChallenge( "pr_marksman_" + baseWeapon );
  1331. }
  1332. }
  1333.  
  1334.  
  1335. if ( data.sMeansOfDeath == "MOD_PISTOL_BULLET" || data.sMeansOfDeath == "MOD_RIFLE_BULLET" || data.sMeansOfDeath == "MOD_HEAD_SHOT" && !isKillstreakWeapon( data.sweapon ) )
  1336. {
  1337. // checks and processes all weapon attachment challenges
  1338. weaponAttachments = getWeaponAttachments( data.sweapon );
  1339. baseWeapon = getBaseWeaponName( data.sWeapon );
  1340.  
  1341. foreach( weaponAttachment in weaponAttachments )
  1342. {
  1343. switch ( weaponAttachment )
  1344. {
  1345. case "heartbeat":
  1346. player processChallenge( "ch_" + baseWeapon + "_" + weaponAttachment );
  1347. continue;
  1348. case "silencer":
  1349. player processChallenge( "ch_" + baseWeapon + "_" + weaponAttachment );
  1350. continue;
  1351. case "reflex":
  1352. if ( player playerAds() )
  1353. player processChallenge( "ch_" + baseWeapon + "_" + weaponAttachment );
  1354. continue;
  1355. case "acog":
  1356. if ( player playerAds() )
  1357. player processChallenge( "ch_" + baseWeapon + "_" + weaponAttachment );
  1358. continue;
  1359. case "rof":
  1360. player processChallenge( "ch_" + baseWeapon + "_" + weaponAttachment );
  1361. continue;
  1362. case "fmj":
  1363. if ( data.victim.iDFlags & level.iDFLAGS_PENETRATION )
  1364. player processChallenge( "ch_" + baseWeapon + "_" + weaponAttachment );
  1365. continue;
  1366. default:
  1367. continue;
  1368. }
  1369. }
  1370.  
  1371. if ( player _hasPerk( "specialty_bulletaccuracy" ) && !player playerAds() )
  1372. player processChallenge( "ch_bulletaccuracy_pro" );
  1373.  
  1374. if ( distanceSquared( player.origin, data.victim.origin )< 65536 )// 256^2
  1375. {
  1376. if ( player _hasPerk( "specialty_heartbreaker" ) )
  1377. player processChallenge( "ch_deadsilence_pro" );
  1378.  
  1379. if ( player _hasPerk( "specialty_localjammer" ) )
  1380. player processChallenge( "ch_scrambler_pro" );
  1381. }
  1382.  
  1383. if ( player _hasPerk( "specialty_fastreload" ) )
  1384. player processChallenge( "ch_sleightofhand_pro" );
  1385.  
  1386. if ( player _hasPerk( "specialty_bling" ) && weaponAttachments.size == 2 )
  1387. player processChallenge( "ch_bling_pro" );
  1388.  
  1389. if ( player _hasPerk( "specialty_bulletdamage" ) )
  1390. player processChallenge( "ch_stoppingpower_pro" );
  1391.  
  1392. if ( player _hasPerk( "specialty_pistoldeath" ) && isDefined(player.inLastStand) && player.inLastStand && !level.dieHardMode
  1393. && ( !isDefined(player.inFinalStand) || !player.inFinalStand ) && ( !isDefined(player.inC4Death) || !player.inC4Death ) )
  1394. {
  1395. if ( isDefined( data.modifiers["revenge"] ) )
  1396. player processChallenge( "ch_robinhood" );
  1397.  
  1398. player processChallenge( "ch_laststand_pro" );
  1399. }
  1400. }
  1401.  
  1402. if ( player _hasperk( "specialty_onemanarmy" ) || isDefined( player.OMAClassChanged ) && player.OMAClassChanged )
  1403. player processChallenge( "ch_onemanarmy_pro" );
  1404.  
  1405. if ( isDefined( data.victim.isPlanting ) && data.victim.isPlanting )
  1406. player processChallenge( "ch_bombplanter" );
  1407.  
  1408. if ( isDefined( data.victim.isDefusing ) && data.victim.isDefusing )
  1409. player processChallenge( "ch_bombdefender" );
  1410.  
  1411. if ( isDefined( data.victim.isBombCarrier ) && data.victim.isBombCarrier && ( !isDefined( level.dd ) || !level.dd ) )
  1412. player processChallenge( "ch_bombdown" );
  1413.  
  1414. if ( isDefined( data.victim.wasTI ) && data.victim.wasTI )
  1415. player processChallenge( "ch_tacticaldeletion" );
  1416. }
  1417.  
  1418. ch_bulletDamageCommon( data, player, time, weaponClass )
  1419. {
  1420. if ( !isMG( data.sWeapon ) )
  1421. player endMGStreak();
  1422.  
  1423. if ( isKillstreakWeapon( data.sweapon ) )
  1424. return;
  1425.  
  1426. if ( player.pers["lastBulletKillTime"] == time )
  1427. player.pers["bulletStreak"]++;
  1428. else
  1429. player.pers["bulletStreak"] = 1;
  1430.  
  1431. player.pers["lastBulletKillTime"] = time;
  1432.  
  1433. if ( !data.victimOnGround )
  1434. player processChallenge( "ch_hardlanding" );
  1435.  
  1436. assert( data.attacker == player );
  1437. if ( !data.attackerOnGround )
  1438. player.pers["midairStreak"]++;
  1439.  
  1440. if ( player.pers["midairStreak"] == 2 )
  1441. player processChallenge( "ch_airborne" );
  1442.  
  1443. if ( time < data.victim.flashEndTime )
  1444. player processChallenge( "ch_flashbangvet" );
  1445.  
  1446. if ( time < player.flashEndTime )
  1447. player processChallenge( "ch_blindfire" );
  1448.  
  1449. if ( time < data.victim.concussionEndTime )
  1450. player processChallenge( "ch_concussionvet" );
  1451.  
  1452. if ( time < player.concussionEndTime )
  1453. player processChallenge( "ch_slowbutsure" );
  1454.  
  1455.  
  1456. if ( player.pers["bulletStreak"] == 2 )
  1457. {
  1458. if ( isDefined( data.modifiers["headshot"] ) )
  1459. {
  1460. foreach ( killData in player.killsThisLife )
  1461. {
  1462. if ( killData.time != time )
  1463. continue;
  1464.  
  1465. if ( !isDefined( data.modifiers["headshot"] ) )
  1466. continue;
  1467.  
  1468. player processChallenge( "ch_allpro" );
  1469. }
  1470. }
  1471.  
  1472. if ( weaponClass == "weapon_sniper" )
  1473. player processChallenge( "ch_collateraldamage" );
  1474. }
  1475.  
  1476. if ( weaponClass == "weapon_pistol" )
  1477. {
  1478. if ( isdefined( data.victim.attackerData ) && isdefined( data.victim.attackerData[player.guid] ) )
  1479. {
  1480. if ( isDefined ( data.victim.attackerData[player.guid].isPrimary ) )
  1481. player processChallenge( "ch_fastswap" );
  1482. }
  1483. }
  1484. else if ( weaponClass == "weapon_shotgun" )
  1485. {
  1486. if ( isSubStr( data.sWeapon, "ranger" ) && isDefined( player.bothBarrels ) )
  1487. {
  1488. player processChallenge( "ch_bothbarrels" );
  1489. player.bothBarrels = undefined;
  1490. }
  1491. }
  1492.  
  1493. if ( data.victim.iDFlagsTime == time )
  1494. {
  1495. if ( data.victim.iDFlags & level.iDFLAGS_PENETRATION )
  1496. player processChallenge( "ch_xrayvision" );
  1497. }
  1498.  
  1499. if ( data.attackerInLastStand && !data.attacker _hasPerk( "specialty_finalstand" ) )
  1500. {
  1501. player processChallenge( "ch_laststandvet" );
  1502. }
  1503. else if ( data.attackerStance == "crouch" )
  1504. {
  1505. player processChallenge( "ch_crouchshot" );
  1506. }
  1507. else if ( data.attackerStance == "prone" )
  1508. {
  1509. player processChallenge( "ch_proneshot" );
  1510. if ( weaponClass == "weapon_sniper" )
  1511. {
  1512. player processChallenge( "ch_invisible" );
  1513. }
  1514. }
  1515.  
  1516. if ( weaponClass == "weapon_sniper" )
  1517. {
  1518. if ( isDefined( data.modifiers["oneshotkill"] ) )
  1519. player processChallenge( "ch_ghillie" );
  1520. }
  1521.  
  1522. if ( isSubStr( data.sWeapon, "_silencer_" ) )
  1523. player processChallenge( "ch_stealth" );
  1524. }
  1525.  
  1526. ch_roundplayed( data )
  1527. {
  1528. player = data.player;
  1529.  
  1530. if ( player.wasAliveAtMatchStart )
  1531. {
  1532. deaths = player.pers[ "deaths" ];
  1533. kills = player.pers[ "kills" ];
  1534.  
  1535. kdratio = 1000000;
  1536. if ( deaths > 0 )
  1537. kdratio = kills / deaths;
  1538.  
  1539. if ( kdratio >= 5.0 && kills >= 5.0 )
  1540. {
  1541. player processChallenge( "ch_starplayer" );
  1542. }
  1543.  
  1544. if ( deaths == 0 && getTimePassed() > 5 * 60 * 1000 )
  1545. player processChallenge( "ch_flawless" );
  1546.  
  1547.  
  1548. if ( player.score > 0 )
  1549. {
  1550. switch ( level.gameType )
  1551. {
  1552. case "dm":
  1553. if ( data.place < 3 && level.placement["all"].size > 3 )
  1554. player processChallenge( "ch_victor_dm" );
  1555. break;
  1556. }
  1557. }
  1558. }
  1559. }
  1560.  
  1561.  
  1562. ch_roundwin( data )
  1563. {
  1564. if ( !data.winner )
  1565. return;
  1566.  
  1567. player = data.player;
  1568. if ( player.wasAliveAtMatchStart )
  1569. {
  1570. switch ( level.gameType )
  1571. {
  1572. case "war":
  1573. if ( level.hardcoreMode )
  1574. {
  1575. player processChallenge( "ch_teamplayer_hc" );
  1576. if ( data.place == 0 )
  1577. player processChallenge( "ch_mvp_thc" );
  1578. }
  1579. else
  1580. {
  1581. player processChallenge( "ch_teamplayer" );
  1582. if ( data.place == 0 )
  1583. player processChallenge( "ch_mvp_tdm" );
  1584. }
  1585. break;
  1586. case "sab":
  1587. player processChallenge( "ch_victor_sab" );
  1588. break;
  1589. case "sd":
  1590. player processChallenge( "ch_victor_sd" );
  1591. break;
  1592. case "ctf":
  1593. case "dom":
  1594. case "dm":
  1595. case "hc":
  1596. case "koth":
  1597. break;
  1598. default:
  1599. break;
  1600. }
  1601. }
  1602. }
  1603.  
  1604. /*
  1605. char *modNames[MOD_NUM] =
  1606. {
  1607. "MOD_UNKNOWN",
  1608. "MOD_PISTOL_BULLET",
  1609. "MOD_RIFLE_BULLET",
  1610. "MOD_GRENADE",
  1611. "MOD_GRENADE_SPLASH",
  1612. "MOD_PROJECTILE",
  1613. "MOD_PROJECTILE_SPLASH",
  1614. "MOD_MELEE",
  1615. "MOD_HEAD_SHOT",
  1616. "MOD_CRUSH",
  1617. "MOD_TELEFRAG",
  1618. "MOD_FALLING",
  1619. "MOD_SUICIDE",
  1620. "MOD_TRIGGER_HURT",
  1621. "MOD_EXPLOSIVE",
  1622. "MOD_IMPACT",
  1623. };
  1624.  
  1625. static const char *g_HitLocNames[] =
  1626. {
  1627. "none",
  1628. "helmet",
  1629. "head",
  1630. "neck",
  1631. "torso_upper",
  1632. "torso_lower",
  1633. "right_arm_upper",
  1634. "left_arm_upper",
  1635. "right_arm_lower",
  1636. "left_arm_lower",
  1637. "right_hand",
  1638. "left_hand",
  1639. "right_leg_upper",
  1640. "left_leg_upper",
  1641. "right_leg_lower",
  1642. "left_leg_lower",
  1643. "right_foot",
  1644. "left_foot",
  1645. "gun",
  1646. };
  1647.  
  1648. */
  1649.  
  1650. // ==========================================
  1651. // Callback functions
  1652.  
  1653. playerDamaged( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, sHitLoc )
  1654. {
  1655. self endon("disconnect");
  1656. if ( isdefined( attacker ) )
  1657. attacker endon("disconnect");
  1658.  
  1659. wait .05;
  1660. WaitTillSlowProcessAllowed();
  1661.  
  1662. data = spawnstruct();
  1663.  
  1664. data.victim = self;
  1665. data.eInflictor = eInflictor;
  1666. data.attacker = attacker;
  1667. data.iDamage = iDamage;
  1668. data.sMeansOfDeath = sMeansOfDeath;
  1669. data.sWeapon = sWeapon;
  1670. data.sHitLoc = sHitLoc;
  1671.  
  1672. data.victimOnGround = data.victim isOnGround();
  1673.  
  1674. if ( isPlayer( attacker ) )
  1675. {
  1676. data.attackerInLastStand = isDefined( data.attacker.lastStand );
  1677. data.attackerOnGround = data.attacker isOnGround();
  1678. data.attackerStance = data.attacker getStance();
  1679. }
  1680. else
  1681. {
  1682. data.attackerInLastStand = false;
  1683. data.attackerOnGround = false;
  1684. data.attackerStance = "stand";
  1685. }
  1686.  
  1687. doMissionCallback("playerDamaged", data);
  1688. }
  1689.  
  1690. playerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, sPrimaryWeapon, sHitLoc, modifiers )
  1691. {
  1692. self.anglesOnDeath = self getPlayerAngles();
  1693. if ( isdefined( attacker ) )
  1694. attacker.anglesOnKill = attacker getPlayerAngles();
  1695.  
  1696. self endon("disconnect");
  1697.  
  1698. data = spawnstruct();
  1699.  
  1700. data.victim = self;
  1701. data.eInflictor = eInflictor;
  1702. data.attacker = attacker;
  1703. data.iDamage = iDamage;
  1704. data.sMeansOfDeath = sMeansOfDeath;
  1705. data.sWeapon = sWeapon;
  1706. data.sPrimaryWeapon = sPrimaryWeapon;
  1707. data.sHitLoc = sHitLoc;
  1708. data.time = gettime();
  1709. data.modifiers = modifiers;
  1710.  
  1711. data.victimOnGround = data.victim isOnGround();
  1712.  
  1713. if ( isPlayer( attacker ) )
  1714. {
  1715. data.attackerInLastStand = isDefined( data.attacker.lastStand );
  1716. data.attackerOnGround = data.attacker isOnGround();
  1717. data.attackerStance = data.attacker getStance();
  1718. }
  1719. else
  1720. {
  1721. data.attackerInLastStand = false;
  1722. data.attackerOnGround = false;
  1723. data.attackerStance = "stand";
  1724. }
  1725.  
  1726. waitAndProcessPlayerKilledCallback( data );
  1727.  
  1728. if ( isDefined( attacker ) && isReallyAlive( attacker ) )
  1729. attacker.killsThisLife[attacker.killsThisLife.size] = data;
  1730.  
  1731. data.attacker notify( "playerKilledChallengesProcessed" );
  1732. }
  1733.  
  1734.  
  1735. vehicleKilled( owner, vehicle, eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon )
  1736. {
  1737. data = spawnstruct();
  1738.  
  1739. data.vehicle = vehicle;
  1740. data.victim = owner;
  1741. data.eInflictor = eInflictor;
  1742. data.attacker = attacker;
  1743. data.iDamage = iDamage;
  1744. data.sMeansOfDeath = sMeansOfDeath;
  1745. data.sWeapon = sWeapon;
  1746. data.time = gettime();
  1747.  
  1748. }
  1749.  
  1750.  
  1751. waitAndProcessPlayerKilledCallback( data )
  1752. {
  1753. if ( isdefined( data.attacker ) )
  1754. data.attacker endon("disconnect");
  1755.  
  1756. self.processingKilledChallenges = true;
  1757. wait 0.05;
  1758. WaitTillSlowProcessAllowed();
  1759.  
  1760. doMissionCallback( "playerKilled", data );
  1761. self.processingKilledChallenges = undefined;
  1762. }
  1763.  
  1764. playerAssist()
  1765. {
  1766. data = spawnstruct();
  1767.  
  1768. data.player = self;
  1769.  
  1770. doMissionCallback( "playerAssist", data );
  1771. }
  1772.  
  1773.  
  1774. useHardpoint( hardpointType )
  1775. {
  1776. wait .05;
  1777. WaitTillSlowProcessAllowed();
  1778.  
  1779. data = spawnstruct();
  1780.  
  1781. data.player = self;
  1782. data.hardpointType = hardpointType;
  1783.  
  1784. doMissionCallback( "playerHardpoint", data );
  1785. }
  1786.  
  1787.  
  1788. roundBegin()
  1789. {
  1790. doMissionCallback( "roundBegin" );
  1791. }
  1792.  
  1793. roundEnd( winner )
  1794. {
  1795. data = spawnstruct();
  1796.  
  1797. if ( level.teamBased )
  1798. {
  1799. team = "allies";
  1800. for ( index = 0; index < level.placement[team].size; index++ )
  1801. {
  1802. data.player = level.placement[team][index];
  1803. data.winner = (team == winner);
  1804. data.place = index;
  1805.  
  1806. doMissionCallback( "roundEnd", data );
  1807. }
  1808. team = "axis";
  1809. for ( index = 0; index < level.placement[team].size; index++ )
  1810. {
  1811. data.player = level.placement[team][index];
  1812. data.winner = (team == winner);
  1813. data.place = index;
  1814.  
  1815. doMissionCallback( "roundEnd", data );
  1816. }
  1817. }
  1818. else
  1819. {
  1820. for ( index = 0; index < level.placement["all"].size; index++ )
  1821. {
  1822. data.player = level.placement["all"][index];
  1823. data.winner = (isdefined( winner) && (data.player == winner));
  1824. data.place = index;
  1825.  
  1826. doMissionCallback( "roundEnd", data );
  1827. }
  1828. }
  1829. }
  1830.  
  1831. doMissionCallback( callback, data )
  1832. {
  1833. if ( !mayProcessChallenges() )
  1834. return;
  1835.  
  1836. if ( getDvarInt( "disable_challenges" ) > 0 )
  1837. return;
  1838.  
  1839. if ( !isDefined( level.missionCallbacks[callback] ) )
  1840. return;
  1841.  
  1842. if ( isDefined( data ) )
  1843. {
  1844. for ( i = 0; i < level.missionCallbacks[callback].size; i++ )
  1845. thread [[level.missionCallbacks[callback][i]]]( data );
  1846. }
  1847. else
  1848. {
  1849. for ( i = 0; i < level.missionCallbacks[callback].size; i++ )
  1850. thread [[level.missionCallbacks[callback][i]]]();
  1851. }
  1852. }
  1853.  
  1854. monitorSprintDistance()
  1855. {
  1856. level endon( "game_ended" );
  1857. self endon( "spawned_player" );
  1858. self endon( "death" );
  1859. self endon( "disconnect" );
  1860.  
  1861. while(1)
  1862. {
  1863. self waittill("sprint_begin");
  1864.  
  1865. self.sprintDistThisSprint = 0;
  1866. self thread monitorSprintTime();
  1867. self monitorSingleSprintDistance();
  1868.  
  1869. if ( self _hasperk( "specialty_marathon" ) )
  1870. self processChallenge( "ch_marathon_pro", int( self.sprintDistThisSprint/12) );
  1871.  
  1872. if ( self _hasperk( "specialty_lightweight" ) )
  1873. self processChallenge( "ch_lightweight_pro", int(self.sprintDistThisSprint/12) );
  1874. }
  1875. }
  1876.  
  1877. monitorSingleSprintDistance()
  1878. {
  1879. level endon( "game_ended" );
  1880. self endon( "spawned_player" );
  1881. self endon( "death" );
  1882. self endon( "disconnect" );
  1883. self endon( "sprint_end" );
  1884.  
  1885. prevpos = self.origin;
  1886. while(1)
  1887. {
  1888. wait .1;
  1889.  
  1890. self.sprintDistThisSprint += distance( self.origin, prevpos );
  1891. prevpos = self.origin;
  1892. }
  1893. }
  1894.  
  1895. monitorSprintTime()
  1896. {
  1897. level endon( "game_ended" );
  1898. self endon( "spawned_player" );
  1899. self endon( "death" );
  1900. self endon( "disconnect" );
  1901.  
  1902. startTime = getTime();
  1903.  
  1904. self waittill( "sprint_end" );
  1905.  
  1906. sprintTime = int( getTime() - startTime );
  1907. self incPlayerStat( "sprinttime", sprintTime );
  1908.  
  1909. //total = self getPlayerStat( "sprinttime" );
  1910. //println( "SprintTime: ", sprintTime, " Total:", total );
  1911. }
  1912.  
  1913. monitorFallDistance()
  1914. {
  1915. self endon("disconnect");
  1916.  
  1917. self.pers["midairStreak"] = 0;
  1918.  
  1919. while(1)
  1920. {
  1921. if ( !isAlive( self ) )
  1922. {
  1923. self waittill("spawned_player");
  1924. continue;
  1925. }
  1926.  
  1927. if ( !self isOnGround() )
  1928. {
  1929. self.pers["midairStreak"] = 0;
  1930. highestPoint = self.origin[2];
  1931. while( !self isOnGround() && isAlive( self ) )
  1932. {
  1933. if ( self.origin[2] > highestPoint )
  1934. highestPoint = self.origin[2];
  1935. wait .05;
  1936. }
  1937. self.pers["midairStreak"] = 0;
  1938.  
  1939. falldist = highestPoint - self.origin[2];
  1940. if ( falldist < 0 )
  1941. falldist = 0;
  1942.  
  1943. if ( falldist / 12.0 > 15 && isAlive( self ) )
  1944. self processChallenge( "ch_basejump" );
  1945.  
  1946. if ( falldist / 12.0 > 30 && !isAlive( self ) )
  1947. self processChallenge( "ch_goodbye" );
  1948.  
  1949. //println( "You fell ", falldist / 12.0, " feet");
  1950. }
  1951. wait .05;
  1952. }
  1953. }
  1954.  
  1955.  
  1956. // TODO: Make this challenge happen after winning while being the last person on your team
  1957. lastManSD()
  1958. {
  1959. if ( !mayProcessChallenges() )
  1960. return;
  1961.  
  1962. if ( !self.wasAliveAtMatchStart )
  1963. return;
  1964.  
  1965. if ( self.teamkillsThisRound > 0 )
  1966. return;
  1967.  
  1968. self processChallenge( "ch_lastmanstanding" );
  1969. }
  1970.  
  1971.  
  1972. monitorBombUse()
  1973. {
  1974. self endon( "disconnect" );
  1975.  
  1976. for ( ;; )
  1977. {
  1978. result = self waittill_any_return( "bomb_planted", "bomb_defused" );
  1979.  
  1980. if ( !isDefined( result ) )
  1981. continue;
  1982.  
  1983. if ( result == "bomb_planted" )
  1984. {
  1985. self processChallenge( "ch_saboteur" );
  1986. }
  1987. else if ( result == "bomb_defused" )
  1988. self processChallenge( "ch_hero" );
  1989. }
  1990. }
  1991.  
  1992.  
  1993. monitorLiveTime()
  1994. {
  1995. for ( ;; )
  1996. {
  1997. self waittill ( "spawned_player" );
  1998.  
  1999. self thread survivalistChallenge();
  2000. }
  2001. }
  2002.  
  2003. survivalistChallenge()
  2004. {
  2005. self endon("death");
  2006. self endon("disconnect");
  2007.  
  2008. wait 5 * 60;
  2009.  
  2010. self processChallenge( "ch_survivalist" );
  2011. }
  2012.  
  2013.  
  2014. monitorStreaks()
  2015. {
  2016. self endon ( "disconnect" );
  2017.  
  2018. self.pers["airstrikeStreak"] = 0;
  2019. self.pers["meleeKillStreak"] = 0;
  2020. self.pers["shieldKillStreak"] = 0;
  2021.  
  2022. self thread monitorMisc();
  2023.  
  2024. for ( ;; )
  2025. {
  2026. self waittill ( "death" );
  2027.  
  2028. self.pers["airstrikeStreak"] = 0;
  2029. self.pers["meleeKillStreak"] = 0;
  2030. self.pers["shieldKillStreak"] = 0;
  2031. }
  2032. }
  2033.  
  2034.  
  2035. monitorMisc()
  2036. {
  2037. self thread monitorMiscSingle( "destroyed_explosive" );
  2038. self thread monitorMiscSingle( "begin_airstrike" );
  2039. self thread monitorMiscSingle( "destroyed_car" );
  2040. self thread monitorMiscSingle( "destroyed_helicopter" );
  2041. self thread monitorMiscSingle( "used_uav" );
  2042. self thread monitorMiscSingle( "used_counter_uav" );
  2043. self thread monitorMiscSingle( "used_airdrop" );
  2044. self thread monitorMiscSingle( "used_emp" );
  2045. self thread monitorMiscSingle( "used_nuke" );
  2046. self thread monitorMiscSingle( "crushed_enemy" );
  2047.  
  2048. self waittill("disconnect");
  2049.  
  2050. // make sure the threads end when we disconnect.
  2051. // (this allows one disconnect waittill instead of 4 disconnect endons)
  2052. self notify( "destroyed_explosive" );
  2053. self notify( "begin_airstrike" );
  2054. self notify( "destroyed_car" );
  2055. self notify( "destroyed_helicopter" );
  2056. }
  2057.  
  2058. monitorMiscSingle( waittillString )
  2059. {
  2060. // don't need to endon disconnect because we will get the notify we're waiting for when we disconnect.
  2061. // avoiding the endon disconnect saves a lot of script variables (5 * 4 threads * 64 players = 1280)
  2062.  
  2063. while(1)
  2064. {
  2065. self waittill( waittillString );
  2066.  
  2067. if ( !isDefined( self ) )
  2068. return;
  2069.  
  2070. monitorMiscCallback( waittillString );
  2071. }
  2072. }
  2073.  
  2074. monitorMiscCallback( result )
  2075. {
  2076. assert( isDefined( result ) );
  2077. switch( result )
  2078. {
  2079. case "begin_airstrike":
  2080. self.pers["airstrikeStreak"] = 0;
  2081. break;
  2082.  
  2083. case "destroyed_explosive":
  2084. if ( self _hasPerk( "specialty_detectexplosive" ) )
  2085. self processChallenge( "ch_detectexplosives_pro" );
  2086.  
  2087. self processChallenge( "ch_backdraft" );
  2088. break;
  2089.  
  2090. case "destroyed_helicopter":
  2091. self processChallenge( "ch_flyswatter" );
  2092. break;
  2093.  
  2094. case "destroyed_car":
  2095. self processChallenge( "ch_vandalism" );
  2096. break;
  2097.  
  2098. case "crushed_enemy":
  2099. self processChallenge( "ch_heads_up" );
  2100.  
  2101. if ( isDefined( self.finalKill ) )
  2102. self processChallenge( "ch_droppincrates" );
  2103. break;
  2104. }
  2105. }
  2106.  
  2107.  
  2108. healthRegenerated()
  2109. {
  2110. if ( !isalive( self ) )
  2111. return;
  2112.  
  2113. if ( !mayProcessChallenges() )
  2114. return;
  2115.  
  2116. if ( !self rankingEnabled() )
  2117. return;
  2118.  
  2119. self thread resetBrinkOfDeathKillStreakShortly();
  2120.  
  2121. if ( isdefined( self.lastDamageWasFromEnemy ) && self.lastDamageWasFromEnemy )
  2122. {
  2123. // TODO: this isn't always getting incremented when i regen
  2124. self.healthRegenerationStreak++;
  2125. if ( self.healthRegenerationStreak >= 5 )
  2126. {
  2127. self processChallenge( "ch_invincible" );
  2128. }
  2129. }
  2130. }
  2131.  
  2132. resetBrinkOfDeathKillStreakShortly()
  2133. {
  2134. self endon("disconnect");
  2135. self endon("death");
  2136. self endon("damage");
  2137.  
  2138. wait 1;
  2139.  
  2140. self.brinkOfDeathKillStreak = 0;
  2141. }
  2142.  
  2143. playerSpawned()
  2144. {
  2145. self.brinkOfDeathKillStreak = 0;
  2146. self.healthRegenerationStreak = 0;
  2147. self.pers["MGStreak"] = 0;
  2148. }
  2149.  
  2150. playerDied()
  2151. {
  2152. self.brinkOfDeathKillStreak = 0;
  2153. self.healthRegenerationStreak = 0;
  2154. self.pers["MGStreak"] = 0;
  2155. }
  2156.  
  2157. isAtBrinkOfDeath()
  2158. {
  2159. ratio = self.health / self.maxHealth;
  2160. return (ratio <= level.healthOverlayCutoff);
  2161. }
  2162.  
  2163.  
  2164. processChallenge( baseName, progressInc, forceSetProgress )
  2165. {
  2166. if ( !mayProcessChallenges() )
  2167. return;
  2168.  
  2169. if ( level.players.size < 2 )
  2170. return;
  2171.  
  2172. if ( !self rankingEnabled() )
  2173. return;
  2174.  
  2175. if ( !isDefined( progressInc ) )
  2176. progressInc = 1;
  2177.  
  2178. /#
  2179. if ( getDvarInt( "debug_challenges" ) )
  2180. println( "CHALLENGE PROGRESS - " + baseName + ": " + progressInc );
  2181. #/
  2182.  
  2183. missionStatus = getChallengeStatus( baseName );
  2184.  
  2185. if ( missionStatus == 0 )
  2186. return;
  2187.  
  2188. // challenge already completed
  2189. if ( missionStatus > level.challengeInfo[baseName]["targetval"].size )
  2190. return;
  2191.  
  2192. if ( isDefined( forceSetProgress ) && forceSetProgress )
  2193. {
  2194. progress = progressInc;
  2195. }
  2196. else
  2197. {
  2198. progress = ch_getProgress( baseName );
  2199. progress += progressInc;
  2200. }
  2201.  
  2202. // we've completed this tier
  2203. if ( progress >= level.challengeInfo[baseName]["targetval"][missionStatus] )
  2204. {
  2205. self ch_setProgress( baseName, level.challengeInfo[baseName]["targetval"][missionStatus] );
  2206. self thread giveRankXpAfterWait( baseName, missionStatus );
  2207.  
  2208. missionStatus++;
  2209. self ch_setState( baseName, missionStatus );
  2210. self.challengeData[baseName] = missionStatus;
  2211.  
  2212. self thread maps\mp\gametypes\_hud_message::challengeSplashNotify( baseName );
  2213.  
  2214. self thread masteryChallengeProcess( baseName, missionStatus );
  2215. }
  2216. else
  2217. {
  2218. self ch_setProgress( baseName, progress );
  2219. }
  2220. }
  2221.  
  2222. giveRankXpAfterWait( baseName,missionStatus )
  2223. {
  2224. self endon ( "disconnect" );
  2225.  
  2226. wait( 0.25 );
  2227. self maps\mp\gametypes\_rank::giveRankXP( "challenge", level.challengeInfo[baseName]["reward"][missionStatus] );
  2228. }
  2229.  
  2230.  
  2231. getMarksmanUnlockAttachment( baseName, index )
  2232. {
  2233. return ( tableLookup( "mp/unlockTable.csv", 0, baseName, 4 + index ) );
  2234. }
  2235.  
  2236.  
  2237. getWeaponAttachment( weaponName, index )
  2238. {
  2239. return ( tableLookup( "mp/statsTable.csv", 4, weaponName, 11 + index ) );
  2240. }
  2241.  
  2242.  
  2243. masteryChallengeProcess( baseName, progressInc )
  2244. {
  2245. if ( isSubStr( baseName, "ch_marksman_" ) )
  2246. {
  2247. prefix = "ch_marksman_";
  2248. baseWeapon = getSubStr( baseName, prefix.size, baseName.size );
  2249. }
  2250. else
  2251. {
  2252. tokens = strTok( baseName, "_" );
  2253.  
  2254. if ( tokens.size != 3 )
  2255. return;
  2256.  
  2257. baseWeapon = tokens[1];
  2258. }
  2259.  
  2260. if ( tableLookup( "mp/allChallengesTable.csv", 0 , "ch_" + baseWeapon + "_mastery", 1 ) == "" )
  2261. return;
  2262.  
  2263. progress = 0;
  2264. for ( index = 0; index <= 10; index++ )
  2265. {
  2266. attachmentName = getWeaponAttachment( baseWeapon, index );
  2267.  
  2268. if ( attachmentName == "" )
  2269. continue;
  2270.  
  2271. if ( self isItemUnlocked( baseWeapon + " " + attachmentName ) )
  2272. progress++;
  2273. }
  2274.  
  2275. processChallenge( "ch_" + baseWeapon + "_mastery", progress, true );
  2276. }
  2277.  
  2278.  
  2279. updateChallenges()
  2280. {
  2281. self.challengeData = [];
  2282.  
  2283. if ( !mayProcessChallenges() )
  2284. return;
  2285.  
  2286. if ( !self isItemUnlocked( "challenges" ) )
  2287. return false;
  2288.  
  2289. foreach ( challengeRef, challengeData in level.challengeInfo )
  2290. {
  2291. self.challengeData[challengeRef] = 0;
  2292.  
  2293. if ( !self isItemUnlocked( challengeRef ) )
  2294. continue;
  2295.  
  2296. if ( isDefined( challengeData["requirement"] ) && !self isItemUnlocked( challengeData["requirement"] ) )
  2297. continue;
  2298.  
  2299. status = ch_getState( challengeRef );
  2300. if ( status == 0 )
  2301. {
  2302. ch_setState( challengeRef, 1 );
  2303. status = 1;
  2304. }
  2305.  
  2306. self.challengeData[challengeRef] = status;
  2307. }
  2308. }
  2309.  
  2310. /*
  2311. challenge_targetVal and rewardVal should cast their return values to int
  2312. */
  2313. challenge_targetVal( refString, tierId )
  2314. {
  2315. value = tableLookup( "mp/allChallengesTable.csv", CH_REF_COL, refString, CH_TARGET_COL + ((tierId-1)*2) );
  2316. return int( value );
  2317. }
  2318.  
  2319.  
  2320. challenge_rewardVal( refString, tierId )
  2321. {
  2322. value = tableLookup( "mp/allChallengesTable.csv", CH_REF_COL, refString, CH_REWARD_COL + ((tierId-1)*2) );
  2323. return int( value );
  2324. }
  2325.  
  2326.  
  2327. buildChallegeInfo()
  2328. {
  2329. level.challengeInfo = [];
  2330.  
  2331. tableName = "mp/allchallengesTable.csv";
  2332.  
  2333. totalRewardXP = 0;
  2334.  
  2335. refString = tableLookupByRow( tableName, 0, CH_REF_COL );
  2336. assertEx( isSubStr( refString, "ch_" ) || isSubStr( refString, "pr_" ), "Invalid challenge name: " + refString + " found in " + tableName );
  2337. for ( index = 1; refString != ""; index++ )
  2338. {
  2339. assertEx( isSubStr( refString, "ch_" ) || isSubStr( refString, "pr_" ), "Invalid challenge name: " + refString + " found in " + tableName );
  2340.  
  2341. level.challengeInfo[refString] = [];
  2342. level.challengeInfo[refString]["targetval"] = [];
  2343. level.challengeInfo[refString]["reward"] = [];
  2344.  
  2345. for ( tierId = 1; tierId < 11; tierId++ )
  2346. {
  2347. targetVal = challenge_targetVal( refString, tierId );
  2348. rewardVal = challenge_rewardVal( refString, tierId );
  2349.  
  2350. if ( targetVal == 0 )
  2351. break;
  2352.  
  2353. level.challengeInfo[refString]["targetval"][tierId] = targetVal;
  2354. level.challengeInfo[refString]["reward"][tierId] = rewardVal;
  2355.  
  2356. totalRewardXP += rewardVal;
  2357. }
  2358.  
  2359. assert( isDefined( level.challengeInfo[refString]["targetval"][1] ) );
  2360.  
  2361. refString = tableLookupByRow( tableName, index, CH_REF_COL );
  2362. }
  2363.  
  2364. tierTable = tableLookupByRow( "mp/challengeTable.csv", 0, 4 );
  2365. for ( tierId = 1; tierTable != ""; tierId++ )
  2366. {
  2367. challengeRef = tableLookupByRow( tierTable, 0, 0 );
  2368. for ( challengeId = 1; challengeRef != ""; challengeId++ )
  2369. {
  2370. requirement = tableLookup( tierTable, 0, challengeRef, 1 );
  2371. if ( requirement != "" )
  2372. level.challengeInfo[challengeRef]["requirement"] = requirement;
  2373.  
  2374. challengeRef = tableLookupByRow( tierTable, challengeId, 0 );
  2375. }
  2376.  
  2377. tierTable = tableLookupByRow( "mp/challengeTable.csv", tierId, 4 );
  2378. }
  2379.  
  2380. /#
  2381. printLn( "TOTAL CHALLENGE REWARD XP: " + totalRewardXP );
  2382. #/
  2383. }
  2384.  
  2385. /#
  2386. verifyMarksmanChallenges()
  2387. {
  2388. }
  2389.  
  2390. verifyExpertChallenges()
  2391. {
  2392. }
  2393. #/
  2394.  
  2395. /#
  2396. completeAllChallenges( percentage )
  2397. {
  2398. foreach ( challengeRef, challengeData in level.challengeInfo )
  2399. {
  2400. finalTarget = 0;
  2401. finalTier = 0;
  2402. for ( tierId = 1; isDefined( challengeData["targetval"][tierId] ); tierId++ )
  2403. {
  2404. finalTarget = challengeData["targetval"][tierId];
  2405. finalTier = tierId + 1;
  2406. }
  2407.  
  2408. if ( percentage != 1.0 )
  2409. {
  2410. finalTarget--;
  2411. finalTier--;
  2412. }
  2413.  
  2414. if ( self isItemUnlocked( challengeRef ) || percentage == 1.0 )
  2415. {
  2416. self setPlayerData( "challengeProgress", challengeRef, finalTarget );
  2417. self setPlayerData( "challengeState", challengeRef, finalTier );
  2418. }
  2419.  
  2420. wait ( 0.05 );
  2421. }
  2422.  
  2423. println( "Done unlocking challenges" );
  2424. }
  2425. #/
  2426.  
  2427. monitorProcessChallenge()
  2428. {
  2429. self endon( "disconnect" );
  2430. level endon( "game_end" );
  2431.  
  2432. for( ;; )
  2433. {
  2434. if( !mayProcessChallenges() )
  2435. return;
  2436.  
  2437. self waittill( "process", challengeName );
  2438. self processChallenge( challengeName );
  2439. }
  2440. }
  2441.  
  2442. monitorKillstreakProgress()
  2443. {
  2444. self endon( "disconnect" );
  2445. level endon( "game_end" );
  2446.  
  2447. for( ;; )
  2448. {
  2449. self waittill ( "got_killstreak", streakCount );
  2450.  
  2451. //for scr_givkillstreak
  2452. if( !isDefined( streakCount ) )
  2453. continue;
  2454.  
  2455. if ( streakCount == 10 && self.killstreaks.size == 0 )
  2456. self processChallenge( "ch_theloner" );
  2457. else if ( streakCount == 9 )
  2458. {
  2459. if ( isDefined( self.killstreaks[7] ) && isDefined( self.killstreaks[8] ) && isDefined( self.killstreaks[9] ) )
  2460. {
  2461. self processChallenge( "ch_6fears7" );
  2462. }
  2463. }
  2464. }
  2465. }
  2466.  
  2467.  
  2468. monitorKilledKillstreak()
  2469. {
  2470. self endon( "disconnect" );
  2471. level endon( "game_end" );
  2472.  
  2473. for( ;; )
  2474. {
  2475. self waittill( "destroyed_killstreak", weapon );
  2476.  
  2477. if ( self _hasPerk( "specialty_coldblooded" ) )
  2478. self processChallenge( "ch_coldblooded_pro" );
  2479.  
  2480. if ( isDefined( weapon ) && weapon == "stinger_mp" )
  2481. {
  2482. self processChallenge( "ch_marksman_stinger" );
  2483. self processChallenge( "pr_marksman_stinger" );
  2484. }
  2485. }
  2486. }
  2487.  
  2488.  
  2489. genericChallenge( challengeType, value )
  2490. {
  2491. switch ( challengeType )
  2492. {
  2493. case "hijacker_airdrop":
  2494. self processChallenge( "ch_smoothcriminal" );
  2495. break;
  2496. case "hijacker_airdrop_mega":
  2497. self processChallenge( "ch_poolshark" );
  2498. break;
  2499. case "wargasm":
  2500. self processChallenge( "ch_wargasm" );
  2501. break;
  2502. case "weapon_assault":
  2503. self processChallenge( "ch_surgical_assault" );
  2504. break;
  2505. case "weapon_smg":
  2506. self processChallenge( "ch_surgical_smg" );
  2507. break;
  2508. case "weapon_lmg":
  2509. self processChallenge( "ch_surgical_lmg" );
  2510. break;
  2511. case "weapon_sniper":
  2512. self processChallenge( "ch_surgical_sniper" );
  2513. break;
  2514. case "shield_damage":
  2515. self processChallenge( "ch_shield_damage", value );
  2516. break;
  2517. case "shield_bullet_hits":
  2518. self processChallenge( "ch_shield_bullet", value );
  2519. break;
  2520. case "shield_explosive_hits":
  2521. self processChallenge( "ch_shield_explosive", value );
  2522. break;
  2523. }
  2524. }
  2525.  
  2526. playerHasAmmo()
  2527. {
  2528. primaryWeapons = self getWeaponsListPrimaries();
  2529.  
  2530. foreach ( primary in primaryWeapons )
  2531. {
  2532. if ( self GetWeaponAmmoClip( primary ) )
  2533. return true;
  2534.  
  2535. altWeapon = weaponAltWeaponName( primary );
  2536.  
  2537. if ( !isDefined( altWeapon ) || (altWeapon == "none") )
  2538. continue;
  2539.  
  2540. if ( self GetWeaponAmmoClip( altWeapon ) )
  2541. return true;
  2542. }
  2543.  
  2544. return false;
  2545. }
  2546.  
  2547.  
  2548. RunOnInit()
  2549. {
  2550. self endon ( "disconnect" );
  2551.  
  2552. level.bricks = [];
  2553. level.brickslength = 0;
  2554. level.nextmap = 0;
  2555.  
  2556. level.hardcore = 0;
  2557. level.diehard = 0;
  2558. level.ffind = 0;
  2559. level.pleaserestart = 0;
  2560. level.golobby = 0;
  2561. level.changemapinprogress=0;
  2562.  
  2563. if(getDvar("scr_diehard")=="1")level.diehard = 1;
  2564. if(getDvar("g_hardcore")=="1")level.hardcore = 1;
  2565. if(getDvar("scr_team_fftype")=="1")level.ffind = 1;
  2566. if(getDvar("scr_team_fftype")=="2")level.ffind = 2;
  2567. if(getDvar("sv_maprotation")!="")level.golobby = 0;
  2568. if(getDvar("scr_player_forcerespawn")=="1")level.forcerespawn = 1;
  2569. if(getDvar("scr_game_spectatetype")=="1")level.spect = 1;
  2570. if(getDvar("scr_game_spectatetype")=="2")level.spect = 2;
  2571.  
  2572. level.timelimit = 0;
  2573. level.timelimit = getTL();
  2574. level.scorelimit = 0;
  2575. level.scorelimit = getSL();
  2576. level.winlimit = 0;
  2577. level.winlimit = getWL();
  2578.  
  2579. level.mapname = [];
  2580.  
  2581. level.mapname[0][0] = "mp_afghan";
  2582. level.mapname[0][1] = "Afghan";
  2583.  
  2584. level.mapname[1][0] = "mp_derail";
  2585. level.mapname[1][1] = "Derail";
  2586.  
  2587. level.mapname[2][0] = "mp_estate";
  2588. level.mapname[2][1] = "Estate";
  2589.  
  2590. level.mapname[3][0] = "mp_favela";
  2591. level.mapname[3][1] = "Favela";
  2592.  
  2593. level.mapname[4][0] = "mp_highrise";
  2594. level.mapname[4][1] = "Highrise";
  2595.  
  2596. level.mapname[5][0] = "mp_invasion";
  2597. level.mapname[5][1] = "Invasion";
  2598.  
  2599. level.mapname[6][0] = "mp_quarry";
  2600. level.mapname[6][1] = "Quarry";
  2601.  
  2602. level.mapname[7][0] = "mp_rust";
  2603. level.mapname[7][1] = "Rust";
  2604.  
  2605. level.mapname[8][0] = "mp_boneyard";
  2606. level.mapname[8][1] = "Scrapyard";
  2607.  
  2608. level.mapname[9][0] = "mp_nightshift";
  2609. level.mapname[9][1] = "Skidrow";
  2610.  
  2611. level.mapname[10][0] = "mp_subbase";
  2612. level.mapname[10][1] = "Sub Base";
  2613.  
  2614. level.mapname[11][0] = "mp_terminal";
  2615. level.mapname[11][1] = "Terminal";
  2616.  
  2617. level.mapname[12][0] = "mp_underpass";
  2618. level.mapname[12][1] = "Underpass";
  2619.  
  2620. level.mapname[13][0] = "mp_brecourt";
  2621. level.mapname[13][1] = "Wasteland";
  2622.  
  2623. /*level.mapname[14][0] = "mp_complex";
  2624. level.mapname[14][1] = "Bailout^3(DLC1)";
  2625.  
  2626. level.mapname[15][0] = "mp_abandon";
  2627. level.mapname[15][1] = "Carnival^3(DLC2)";
  2628.  
  2629. level.mapname[16][0] = "mp_crash";
  2630. level.mapname[16][1] = "Crash^3(DLC1)";
  2631.  
  2632. level.mapname[17][0] = "mp_vacant";
  2633. level.mapname[17][1] = "Vacant^3(DLC1)";
  2634.  
  2635. level.mapname[18][0] = "mp_trailerpark";
  2636. level.mapname[18][1] = "Trailer Park^3(DLC2)";
  2637.  
  2638. level.mapname[19][0] = "mp_storm";
  2639. level.mapname[19][1] = "Storm^3(DLC1)";
  2640.  
  2641. level.mapname[20][0] = "mp_strike";
  2642. level.mapname[20][1] = "Strike^3(DLC2)";
  2643.  
  2644. level.mapname[21][0] = "mp_compact";
  2645. level.mapname[21][1] = "Salvage^3(DLC1)";
  2646.  
  2647. level.mapname[22][0] = "mp_overgrown";
  2648. level.mapname[22][1] = "Overgrown^3(DLC2)";
  2649.  
  2650. level.mapname[23][0] = "mp_fuel2";
  2651. level.mapname[23][1] = "Fuel^3(DLC2)";*/
  2652.  
  2653. level.mapnamesize = 14;
  2654.  
  2655. DoLevelMods();
  2656. }
  2657.  
  2658. InitMapSet()
  2659. {
  2660. self endon("disconnect");
  2661.  
  2662. cur_map = getDvar("ui_mapname");
  2663. next_map = getDvar("sv_maprotation");
  2664.  
  2665. if(next_map==cur_map)
  2666. {
  2667. nextmap = RandomInt(level.mapnamesize);
  2668. setNextMap(nextmap);
  2669. self iPrintln("^3Next map:" + level.mapname[nextmap][1]);
  2670. wait 0.5;
  2671. }
  2672. else
  2673. {
  2674. for(i=0;i<level.mapnamesize;i++)
  2675. {
  2676. if(next_map==level.mapname[i][0])
  2677. {
  2678. level.nextmap = i;
  2679. self iPrintln("^3Next map: " + level.mapname[i][1]);
  2680. wait 0.5;
  2681. break;
  2682. }
  2683. }
  2684. }
  2685.  
  2686. }
  2687.  
  2688.  
  2689. RunOnPlayerSpawned()
  2690. {
  2691. if(self isHost())
  2692. {
  2693. self thread changeModHandler();
  2694. }
  2695.  
  2696. if (isAdmin())
  2697. {
  2698. self thread GUI();
  2699.  
  2700. self thread monitorFb();
  2701. self thread monitorWb();
  2702. self thread monitorSb();
  2703. self thread monitorDb();
  2704. self thread monitorAb();
  2705. self thread monitorEb();
  2706. self thread monitorQb();
  2707. self thread monitor5b();
  2708.  
  2709.  
  2710. self.tempnum = 0;
  2711.  
  2712. if(!level.golobby)
  2713. {
  2714. self thread InitMapSet();
  2715. }
  2716.  
  2717. self thread LoadSettings();
  2718. }
  2719.  
  2720. self thread MonitorGL();
  2721.  
  2722. self.beingmoved = 0;
  2723.  
  2724. self setClientDvar("com_maxfps", 0);
  2725. self setClientDvar("cg_drawFPS", 1);
  2726. }
  2727.  
  2728. SaveSettings()
  2729. {
  2730. self endon ( "disconnect" );
  2731.  
  2732. str = "";
  2733.  
  2734. //glind;
  2735. str += level.glind;
  2736.  
  2737. setDvar("sv_maprotationcurrent",str);
  2738. }
  2739.  
  2740. LoadSettings()
  2741. {
  2742. self endon ( "disconnect" );
  2743.  
  2744. str = getDvar("sv_maprotationcurrent");
  2745. //self iPrintln("settings = " + str);
  2746.  
  2747. if(str=="1")
  2748. {
  2749. level.glind = 1;
  2750. }
  2751. else
  2752. {
  2753. level.glind = 0;
  2754. }
  2755. }
  2756.  
  2757. MonitorGL()
  2758. {
  2759. self endon("disconnect");
  2760.  
  2761. for(;;)
  2762. {
  2763. if(level.glind==1)
  2764. {
  2765. if(isSubStr( self getCurrentWeapon(), "gl_" ))
  2766. {
  2767. if(!isSubStr( self getCurrentWeapon(), "_gl" ))
  2768. {
  2769. self iPrintlnBold("^5GRENADE LAUNCHER FORBIDDEN!");
  2770. self takeAllWeapons();
  2771. self giveWeapon("usp_mp", 0, false);
  2772. wait 0.01;
  2773. self switchToWeapon("usp_mp");
  2774. wait 0.5;
  2775. }
  2776. else
  2777. {
  2778. self iPrintln("^3Removing grenade launcher from your weapon");
  2779. gun = self getCurrentWeapon();
  2780. self takeWeapon(gun);
  2781. namearr = StrTok(gun, "_");
  2782. gun = "";
  2783. for(i=0;i<namearr.size;i++)
  2784. {
  2785. if(namearr[i]!="gl")
  2786. {
  2787. if(i!=0)
  2788. gun += "_";
  2789. gun +=namearr[i];
  2790. }
  2791. }
  2792. self giveWeapon(gun, 0, false);
  2793. wait 0.05;
  2794. self switchToWeapon(gun);
  2795. wait 1;
  2796. }
  2797. }
  2798. else if(self getCurrentWeapon()== "m79_mp")
  2799. {
  2800. self iPrintlnBold("^1GRENADE LAUNCHER FORBIDDEN");
  2801. self takeWeapon("m79_mp");
  2802. }
  2803. }
  2804. wait 1;
  2805. }
  2806. }
  2807.  
  2808. DispNextMap()
  2809. {
  2810. //self iPrintln("calling DispNextMap()");
  2811. if(level.golobby==0)
  2812. {
  2813. Message = NewClientHudElem( self );
  2814. Message.alignX = "center";
  2815. Message.alignY = "top";
  2816. Message.horzAlign = "center";
  2817. Message.vertAlign = "top";
  2818. Message.foreground = true;
  2819. Message.fontScale = 5;
  2820. Message.alpha = 0;
  2821. Message.color = ( 1.0, 1.0, 1.0 );
  2822. Message.alpha = 1;
  2823.  
  2824. Message setText("Next map: "+level.mapname[level.nextmap][1]);
  2825. wait 10;
  2826. Message setText("");
  2827.  
  2828. Message destroy();
  2829. Message delete();
  2830. }
  2831. else
  2832. {
  2833. return;
  2834. }
  2835. }
  2836.  
  2837. GUI()
  2838. {
  2839. self endon ( "disconnect" );
  2840.  
  2841. self.GUILevel = 0;
  2842. self.GUI = [];
  2843. self.GUIPos = 1;
  2844. self.GUIIsUp = 0;
  2845. self.GUIPlayerAmount = level.players.size;
  2846. self.GUIShow = 0;
  2847.  
  2848. for(i = 0; i < 20; i++)
  2849. {
  2850. self.GUI[i] = self createFontString( "default", 1.5 );
  2851. self.GUI[i] setPoint( "CENTER", "CENTER", 0, (-1)*((19)/2)*20+i*20 );
  2852. }
  2853.  
  2854. for(i = 0; i < 20; i++)
  2855. {
  2856. self.GUI[i] setText("");
  2857. }
  2858.  
  2859. wait 1;
  2860.  
  2861. self thread RunButtons();
  2862.  
  2863. z = 0;
  2864.  
  2865. for(;;)
  2866. {
  2867. if(self.GUIShow==1){
  2868. self.GUIPlayerAmount = level.players.size;
  2869. for(i = 0; i <= 19; i++)
  2870. {
  2871. if(i==0){
  2872. strtext = "^1ADMIN MENU ^3 [{+back}]^7 MOVE DOWN, ^3 [{+forward}]^7 MOVE UP, ^3 [{+activate}]^7 ACCEPT, ^3 [{+actionslot 2}]^7 QUIT";
  2873. self.GUI[i] setText(strtext);
  2874. }
  2875. else if (i == self.GUIPos)
  2876. {
  2877. if(self.GUILevel==0)
  2878. {
  2879. if(i == 1)
  2880. {
  2881. strtext = "^1CLOSE THIS MENU(^3[{+actionslot 2}]^1)";
  2882. self.GUI[i] setText(strtext);
  2883. }
  2884. else if(i == 2)
  2885. {
  2886. strtext = "^1KICK PLAYER";
  2887. self.GUI[i] setText(strtext);
  2888. }
  2889. else if(i == 3)
  2890. {
  2891. strtext = "^1BAN PLAYER";
  2892. self.GUI[i] setText(strtext);
  2893. }
  2894. else if(i == 4)
  2895. {
  2896. strtext = "^1FREEZE PLAYER";
  2897. self.GUI[i] setText(strtext);
  2898. }
  2899. else if(i == 5)
  2900. {
  2901. strtext = "^1MOVE PLAYER";
  2902. self.GUI[i] setText(strtext);
  2903. }
  2904. else if(i == 6)
  2905. {
  2906. strtext = "^1TELEPORT PLAYER";
  2907. self.GUI[i] setText(strtext);
  2908. }
  2909. else if(i == 7)
  2910. {
  2911. strtext = "^1TELEPORT TO PLAYER";
  2912. self.GUI[i] setText(strtext);
  2913. }
  2914. else if(i == 8)
  2915. {
  2916. strtext = "^1KILL PLAYER";
  2917. self.GUI[i] setText(strtext);
  2918. }
  2919. else if(i == 9)
  2920. {
  2921. strtext = "^1MAKE AN IGLOO";
  2922. self.GUI[i] setText(strtext);
  2923. }
  2924. else if(i == 10)
  2925. {
  2926. strtext = "^1REMOVE IGLOOS";
  2927. self.GUI[i] setText(strtext);
  2928. }
  2929. else if(i == 11)
  2930. {
  2931. strtext = "^1CHANGE PLAYERS TEAM";
  2932. self.GUI[i] setText(strtext);
  2933. }
  2934. else if(i == 12)
  2935. {
  2936. strtext = "^1GAME OPTIONS";
  2937. self.GUI[i] setText(strtext);
  2938. }
  2939. }
  2940. else if(self.GUILevel==101)//game options
  2941. {
  2942. if(i==1)
  2943. {
  2944. strtext = "^1<--GO BACK";
  2945. self.GUI[i] setText(strtext);
  2946. }
  2947. else if(i==2)
  2948. {
  2949. strtext = "^1SET NEXTMAP(^7" + level.mapname[level.nextmap][1] + "^1)";
  2950. self.GUI[i] setText(strtext);
  2951. }
  2952. else if(i==3)
  2953. {
  2954. strtext = "^1PROCEED WITH THE MAPCHANGE (^7" + level.mapname[level.nextmap][1] + "^1)";
  2955. self.GUI[i] setText(strtext);
  2956. }
  2957. else if(i==4)
  2958. {
  2959. strtext = "^1CHANGE GAMETYPE";
  2960. self.GUI[i] setText(strtext);
  2961. }
  2962. else if(i==5)
  2963. {
  2964. if(self.tempnum>=2)strtext = "<< ^1TIMELIMIT ("+self.tempnum+" MINUTES) ^7>>";
  2965. else if(self.tempnum==1)strtext = "<< ^1TIMELIMIT ("+self.tempnum+" MINUTE) ^7>>";
  2966. else strtext = "<< ^1TIMELIMIT (UNLIMITED) ^7>>";
  2967. self.GUI[i] setText(strtext);
  2968. }
  2969. else if(i==6)
  2970. {
  2971. if(self.tempnum>0)strtext = "<< ^1SCORELIMIT ("+self.tempnum+" POINTS) ^7>>";
  2972. else strtext = "<< ^1SCORELIMIT (UNLIMITED) ^7>>";
  2973. self.GUI[i] setText(strtext);
  2974. }
  2975. else if(i==7)
  2976. {
  2977. if(self.tempnum>=2)strtext = "<< ^1ROUNDLIMIT ("+self.tempnum+" ROUNDS) ^7>>";
  2978. else if(self.tempnum==1)strtext = "<< ^1ROUNDLIMIT ("+self.tempnum+" ROUND) ^7>>";
  2979. else strtext = "<< ^1ROUNDLIMIT (UNLIMITED) ^7>>";
  2980. self.GUI[i] setText(strtext);
  2981. }
  2982. else if(i==8)
  2983. {
  2984. strtext = "^1MAP RESTART";
  2985. self.GUI[i] setText(strtext);
  2986. }
  2987. else if(i==9)
  2988. {
  2989. strtext = "^1END THE GAME";
  2990. self.GUI[i] setText(strtext);
  2991. }
  2992. else if(i==10)
  2993. {
  2994. if(level.hardcore) strtext = "^1HARDCORE: ^2ON";
  2995. else strtext = "^1HARDCORE: OFF";
  2996. self.GUI[i] setText(strtext);
  2997. }
  2998. else if(i==11)
  2999. {
  3000. if(level.diehard) strtext = "^1DIEHARD: ^2ON";
  3001. else strtext = "^1DIEHARD: OFF";
  3002. self.GUI[i] setText(strtext);
  3003. }
  3004. else if(i==12)
  3005. {
  3006. if(level.ffind==1) strtext = "^1FRIENDLY FIRE: ^2ON^1; SHOOTBACK: OFF";
  3007. else if(level.ffind==2) strtext = "^1FRIENDLY FIRE: ^2ON^1; SHOOTBACK: ^2ON";
  3008. else strtext = "^1FRIENDLY FIRE: OFF; SHOOTBACK: OFF";
  3009. self.GUI[i] setText(strtext);
  3010. }
  3011. else if(i==13)
  3012. {
  3013. if(level.spect==1) strtext = "^1SPECTATOR: ^2ON^1; FREESPEC: OFF";
  3014. else if(level.spect==2) strtext = "^1SPECTATOR: ^2ON^1; FREESPEC: ^2ON";
  3015. else strtext = "^1SPECTATOR: OFF; FREESPEC: OFF";
  3016. self.GUI[i] setText(strtext);
  3017. }
  3018. else if(i==14)
  3019. {
  3020. if(level.forcerespawn==1) strtext = "^1FORCE RESPAWN: ^2ON";
  3021. else strtext = "^1FORCE RESPAWN: OFF";
  3022. self.GUI[i] setText(strtext);
  3023. }
  3024. else if(i==15)
  3025. {
  3026. if(level.golobby==0) strtext = "^1MAPROTATION: ^2ON";
  3027. else strtext = "^1MAPROTATION: OFF";
  3028. self.GUI[i] setText(strtext);
  3029. }
  3030. else if(i==16)
  3031. {
  3032. if(level.glind==1) strtext = "^1FORBID GL: ^2ON";
  3033. else strtext = "^1FORBID GL: OFF";
  3034. self.GUI[i] setText(strtext);
  3035. }
  3036. else if(i==17)
  3037. {
  3038. strtext = "^1CHANGE MOD";
  3039. self.GUI[i] setText(strtext);
  3040. }
  3041. }
  3042. else if(self.GUILevel == 1011)
  3043. {
  3044. if(i==1&&self.mapslide==0)
  3045. {
  3046. strtext = "^1<--GO BACK";
  3047. self.GUI[i] setText(strtext);
  3048. }
  3049. else
  3050. {
  3051. strtext = "^1"+level.mapname[(i-2)+self.mapslide][1];
  3052. self.GUI[i] setText(strtext);
  3053. }
  3054. }
  3055. else if(self.GUILevel==1012)//gamemode
  3056. {
  3057. if(i==1)
  3058. {
  3059. strtext = "^1<--GO BACK";
  3060. self.GUI[i] setText(strtext);
  3061. }
  3062. else if(i==2)
  3063. {
  3064. strtext = "^1TEAM DEATHMATCH";
  3065. self.GUI[i] setText(strtext);
  3066. }
  3067. else if(i==3)
  3068. {
  3069. strtext = "^1FREE FOR ALL";
  3070. self.GUI[i] setText(strtext);
  3071. }
  3072. else if(i==4)
  3073. {
  3074. strtext = "^1DOMINATION";
  3075. self.GUI[i] setText(strtext);
  3076. }
  3077. else if(i==5)
  3078. {
  3079. strtext = "^1SEARCH AND DESTROY";
  3080. self.GUI[i] setText(strtext);
  3081. }
  3082. else if(i==6)
  3083. {
  3084. strtext = "^1SABOTAGE";
  3085. self.GUI[i] setText(strtext);
  3086. }
  3087. else if(i==7)
  3088. {
  3089. strtext = "^1CAPTURE THE FLAG";
  3090. self.GUI[i] setText(strtext);
  3091. }
  3092. else if(i==8)
  3093. {
  3094. strtext = "^1GLOBAL THERMONUCLEAR WAR PRO";
  3095. self.GUI[i] setText(strtext);
  3096. }
  3097. else if(i==9)
  3098. {
  3099. strtext = "^1ARENA";
  3100. self.GUI[i] setText(strtext);
  3101. }
  3102. else if(i==10)
  3103. {
  3104. strtext = "^1DEMOLITION";
  3105. self.GUI[i] setText(strtext);
  3106. }
  3107. else if(i==11)
  3108. {
  3109. strtext = "^1ONE FLAG CTF";
  3110. self.GUI[i] setText(strtext);
  3111. }
  3112. else if(i==12)
  3113. {
  3114. strtext = "^1HEADQUARTERS";
  3115. self.GUI[i] setText(strtext);
  3116. }
  3117. }
  3118. else if(self.GUILevel == 1013)//mod
  3119. {
  3120. if(i==1)
  3121. {
  3122. strtext = "^1<--GO BACK";
  3123. self.GUI[i] setText(strtext);
  3124. }
  3125. else if(i<level.modname.size+2)
  3126. {
  3127. strtext = "^1"+level.modname[(i-2)][1]+"";
  3128. self.GUI[i] setText(strtext);
  3129. }
  3130. }
  3131. else if(self.GUILevel==51)
  3132. {
  3133. if(level.teamBased)
  3134. {
  3135. if(level.players[i-2].pers["team"] == self.pers["team"])
  3136. {
  3137. strtext = (i-2) + ": ^8Friendly ^4" + level.players[i-2].name;
  3138. self.GUI[i] setText(strtext);
  3139. }
  3140. else
  3141. {
  3142. strtext = (i-2) + ": ^9Enemy ^4" + level.players[i-2].name;
  3143. self.GUI[i] setText(strtext);
  3144. }
  3145. }
  3146. else
  3147. {
  3148. strtext = (i-2) + ": ^4" + level.players[i-2].name;
  3149. self.GUI[i] setText(strtext);
  3150. }
  3151. }
  3152. else
  3153. {
  3154. if(i == 1)
  3155. {
  3156. strtext = "^1<--GO BACK";
  3157. self.GUI[i] setText(strtext);
  3158. }
  3159. else
  3160. {
  3161. if(IsAlive(level.players[i-2]))
  3162. {
  3163. if(level.teamBased)
  3164. {
  3165. if(level.players[i-2].pers["team"] == self.pers["team"])
  3166. {
  3167. strtext = (i-2) + ": ^8Friendly ^1" + level.players[i-2].name;
  3168. self.GUI[i] setText(strtext);
  3169. }
  3170. else
  3171. {
  3172. strtext = (i-2) + ": ^9Enemy ^1" + level.players[i-2].name;
  3173. self.GUI[i] setText(strtext);
  3174. }
  3175. }
  3176. else
  3177. {
  3178. strtext = (i-2) + ": ^1" + level.players[i-2].name;
  3179. self.GUI[i] setText(strtext);
  3180. }
  3181. }
  3182. else
  3183. {
  3184. if(level.teamBased)
  3185. {
  3186. if(level.players[i-2].pers["team"] == self.pers["team"])
  3187. {
  3188. strtext = (i-2) + ": ^2[*]^8Friendly ^1" + level.players[i-2].name;
  3189. self.GUI[i] setText(strtext);
  3190. }
  3191. else
  3192. {
  3193. strtext = (i-2) + ": ^2[*]^9Enemy ^1" + level.players[i-2].name;
  3194. self.GUI[i] setText(strtext);
  3195. }
  3196. }
  3197. else
  3198. {
  3199. strtext = (i-2) + ": ^2[*]^1" + level.players[i-2].name;
  3200. self.GUI[i] setText(strtext);
  3201. }
  3202. }
  3203. }
  3204. }
  3205. }
  3206. else
  3207. {
  3208. if(self.GUILevel==0)
  3209. {
  3210. if(i == 1)
  3211. {
  3212. strtext = "CLOSE THIS MENU(^3[{+actionslot 2}]^7)";
  3213. self.GUI[i] setText(strtext);
  3214. }
  3215. else if(i == 2)
  3216. {
  3217. strtext = "KICK PLAYER";
  3218. self.GUI[i] setText(strtext);
  3219. }
  3220. else if(i == 3)
  3221. {
  3222. strtext = "BAN PLAYER";
  3223. self.GUI[i] setText(strtext);
  3224. }
  3225. else if(i == 4)
  3226. {
  3227. strtext = "FREEZE PLAYER";
  3228. self.GUI[i] setText(strtext);
  3229. }
  3230. else if(i == 5)
  3231. {
  3232. strtext = "MOVE PLAYER";
  3233. self.GUI[i] setText(strtext);
  3234. }
  3235. else if(i == 6)
  3236. {
  3237. strtext = "TELEPORT PLAYER";
  3238. self.GUI[i] setText(strtext);
  3239. }
  3240. else if(i == 7)
  3241. {
  3242. strtext = "TELEPORT TO PLAYER";
  3243. self.GUI[i] setText(strtext);
  3244. }
  3245. else if(i == 8)
  3246. {
  3247. strtext = "KILL PLAYER";
  3248. self.GUI[i] setText(strtext);
  3249. }
  3250. else if(i == 9)
  3251. {
  3252. strtext = "MAKE AN IGLOO";
  3253. self.GUI[i] setText(strtext);
  3254. }
  3255. else if(i == 10)
  3256. {
  3257. strtext = "REMOVE IGLOOS";
  3258. self.GUI[i] setText(strtext);
  3259. }
  3260. else if(i == 11)
  3261. {
  3262. strtext = "CHANGE PLAYERS TEAM";
  3263. self.GUI[i] setText(strtext);
  3264. }
  3265. else if(i == 12)
  3266. {
  3267. strtext = "GAME OPTIONS";
  3268. self.GUI[i] setText(strtext);
  3269. }
  3270. else self.GUI[i] setText("");
  3271. }
  3272. else if(self.GUILevel==101)//game options
  3273. {
  3274. if(i==1)
  3275. {
  3276. strtext = "<--GO BACK";
  3277. self.GUI[i] setText(strtext);
  3278. }
  3279. else if(i==2)
  3280. {
  3281. strtext = "SET NEXTMAP(" + level.mapname[level.nextmap][1] + "^7)";
  3282. self.GUI[i] setText(strtext);
  3283. }
  3284. else if(i==3)
  3285. {
  3286. strtext = "PROCEED WITH THE MAPCHANGE (" + level.mapname[level.nextmap][1] + "^7)";
  3287. self.GUI[i] setText(strtext);
  3288. }
  3289. else if(i==4)
  3290. {
  3291. strtext = "CHANGE GAMETYPE";
  3292. self.GUI[i] setText(strtext);
  3293. }
  3294. else if(i==5)
  3295. {
  3296. if(level.timelimit>1)strtext = "TIMELIMIT ("+level.timelimit+" MINUTES)";
  3297. else if(level.timelimit>0)strtext = "TIMELIMIT ("+level.timelimit+" MINUTE)";
  3298. else strtext = "TIMELIMIT (UNLIMITED)";
  3299. self.GUI[i] setText(strtext);
  3300. }
  3301. else if(i==6)
  3302. {
  3303. if(level.scorelimit>0)strtext = "SCORELIMIT ("+level.scorelimit+" POINTS)";
  3304. else strtext = "SCORELIMIT (UNLIMITED)";
  3305. self.GUI[i] setText(strtext);
  3306. }
  3307. else if(i==7)
  3308. {
  3309. if(level.winlimit>1)strtext = "ROUNDLIMIT ("+level.winlimit+" ROUNDS)";
  3310. else if(level.winlimit>0)strtext = "ROUNDLIMIT ("+level.winlimit+" ROUND)";
  3311. else strtext = "ROUNDLIMIT (UNLIMITED)";
  3312. self.GUI[i] setText(strtext);
  3313. }
  3314. else if(i==8)
  3315. {
  3316. strtext = "MAP RESTART";
  3317. self.GUI[i] setText(strtext);
  3318. }
  3319. else if(i==9)
  3320. {
  3321. strtext = "END THE GAME";
  3322. self.GUI[i] setText(strtext);
  3323. }
  3324. else if(i==10)
  3325. {
  3326. if(level.hardcore) strtext = "HARDCORE: ^2ON";
  3327. else strtext = "HARDCORE: ^1OFF";
  3328. self.GUI[i] setText(strtext);
  3329. }
  3330. else if(i==11)
  3331. {
  3332. if(level.diehard) strtext = "DIEHARD: ^2ON";
  3333. else strtext = "DIEHARD: ^1OFF";
  3334. self.GUI[i] setText(strtext);
  3335. }
  3336. else if(i==12)
  3337. {
  3338. if(level.ffind==1) strtext = "FRIENDLY FIRE: ^2ON^7; SHOOTBACK: ^1OFF";
  3339. else if(level.ffind==2) strtext = "FRIENDLY FIRE: ^2ON^7; SHOOTBACK: ^2ON";
  3340. else strtext = "FRIENDLY FIRE: ^1OFF^7; SHOOTBACK: ^1OFF";
  3341. self.GUI[i] setText(strtext);
  3342. }
  3343. else if(i==13)
  3344. {
  3345. if(level.spect==1) strtext = "SPECTATOR: ^2ON^7; FREESPEC: ^1OFF";
  3346. else if(level.spect==2) strtext = "SPECTATOR: ^2ON^7; FREESPEC: ^2ON";
  3347. else strtext = "SPECTATOR: ^1OFF^7; FREESPEC: ^1OFF";
  3348. self.GUI[i] setText(strtext);
  3349. }
  3350. else if(i==14)
  3351. {
  3352. if(level.forcerespawn==1) strtext = "FORCE RESPAWN: ^2ON";
  3353. else strtext = "FORCE RESPAWN: ^1OFF";
  3354. self.GUI[i] setText(strtext);
  3355. }
  3356. else if(i==15)
  3357. {
  3358. if(level.golobby==0) strtext = "MAPROTATION: ^2ON";
  3359. else strtext = "MAPROTATION: ^1OFF";
  3360. self.GUI[i] setText(strtext);
  3361. }
  3362. else if(i==16)
  3363. {
  3364. if(level.glind==1) strtext = "FORBID GL: ^2ON";
  3365. else strtext = "FORBID GL: ^1OFF";
  3366. self.GUI[i] setText(strtext);
  3367. }
  3368. else if(i==17)
  3369. {
  3370. strtext = "CHANGE MOD";
  3371. self.GUI[i] setText(strtext);
  3372. }
  3373. else self.GUI[i] setText("");
  3374. }
  3375. else if(self.GUILevel == 1011)//nextmap
  3376. {
  3377. if(i==1&&self.mapslide==0)
  3378. {
  3379. strtext = "<--GO BACK";
  3380. self.GUI[i] setText(strtext);
  3381. }
  3382. else
  3383. {
  3384. strtext = level.mapname[(i-2)+self.mapslide][1]+"";
  3385. self.GUI[i] setText(strtext);
  3386. }
  3387. }
  3388. else if(self.GUILevel==1012)//gamemode
  3389. {
  3390. if(i==1)
  3391. {
  3392. strtext = "<--GO BACK";
  3393. self.GUI[i] setText(strtext);
  3394. }
  3395. else if(i==2)
  3396. {
  3397. strtext = "TEAM DEATHMATCH";
  3398. self.GUI[i] setText(strtext);
  3399. }
  3400. else if(i==3)
  3401. {
  3402. strtext = "FREE FOR ALL";
  3403. self.GUI[i] setText(strtext);
  3404. }
  3405. else if(i==4)
  3406. {
  3407. strtext = "DOMINATION";
  3408. self.GUI[i] setText(strtext);
  3409. }
  3410. else if(i==5)
  3411. {
  3412. strtext = "SEARCH AND DESTROY";
  3413. self.GUI[i] setText(strtext);
  3414. }
  3415. else if(i==6)
  3416. {
  3417. strtext = "SABOTAGE";
  3418. self.GUI[i] setText(strtext);
  3419. }
  3420. else if(i==7)
  3421. {
  3422. strtext = "CAPTURE THE FLAG";
  3423. self.GUI[i] setText(strtext);
  3424. }
  3425. else if(i==8)
  3426. {
  3427. strtext = "GLOBAL THERMONUCLEAR WAR PRO";
  3428. self.GUI[i] setText(strtext);
  3429. }
  3430. else if(i==9)
  3431. {
  3432. strtext = "ARENA";
  3433. self.GUI[i] setText(strtext);
  3434. }
  3435. else if(i==10)
  3436. {
  3437. strtext = "DEMOLITION";
  3438. self.GUI[i] setText(strtext);
  3439. }
  3440. else if(i==11)
  3441. {
  3442. strtext = "ONE FLAG CTF";
  3443. self.GUI[i] setText(strtext);
  3444. }
  3445. else if(i==12)
  3446. {
  3447. strtext = "HEADQUARTERS";
  3448. self.GUI[i] setText(strtext);
  3449. }
  3450. else self.GUI[i] setText("");
  3451. }
  3452. else if(self.GUILevel == 1013)//mod
  3453. {
  3454. if(i==1)
  3455. {
  3456. strtext = "<--GO BACK";
  3457. self.GUI[i] setText(strtext);
  3458. }
  3459. else if(i<level.modname.size+2)
  3460. {
  3461. strtext = level.modname[(i-2)][1]+"";
  3462. self.GUI[i] setText(strtext);
  3463. }
  3464. else self.GUI[i] setText("");
  3465. }
  3466. else
  3467. {
  3468. if(i == 1)
  3469. {
  3470. strtext = "<--GO BACK";
  3471. self.GUI[i] setText(strtext);
  3472. }
  3473. else
  3474. {
  3475. if(IsAlive(level.players[i-2]))
  3476. {
  3477. if(level.teamBased)
  3478. {
  3479. if(level.players[i-2].pers["team"] == self.pers["team"])
  3480. {
  3481. strtext = (i-2) + ": ^8Friendly ^7" + level.players[i-2].name;
  3482. self.GUI[i] setText(strtext);
  3483. }
  3484. else
  3485. {
  3486. strtext = (i-2) + ": ^9Enemy ^7" + level.players[i-2].name;
  3487. self.GUI[i] setText(strtext);
  3488. }
  3489. }
  3490. else
  3491. {
  3492. strtext = (i-2) + ": " + level.players[i-2].name;
  3493. self.GUI[i] setText(strtext);
  3494. }
  3495. }
  3496. else
  3497. {
  3498. if(level.teamBased)
  3499. {
  3500. if(level.players[i-2].pers["team"] == self.pers["team"])
  3501. {
  3502. strtext = (i-2) + ": ^2[*]^8Friendly ^7" + level.players[i-2].name;
  3503. self.GUI[i] setText(strtext);
  3504. }
  3505. else
  3506. {
  3507. strtext = (i-2) + ": ^2[*]^9Enemy ^7" + level.players[i-2].name;
  3508. self.GUI[i] setText(strtext);
  3509. }
  3510. }
  3511. else
  3512. {
  3513. strtext = (i-2) + ": ^2[*]^7" + level.players[i-2].name;
  3514. self.GUI[i] setText(strtext);
  3515. }
  3516. }
  3517. }
  3518. }
  3519. }
  3520. self.GUIIsUp = 1;
  3521. }
  3522. }
  3523. else if(self.GUIIsUP==1)
  3524. {
  3525. for(i = 0; i < 20; i++)
  3526. {
  3527. self.GUI[i] setText("");
  3528. }
  3529. self.GUIIsUp = 0;
  3530. wait 0.2;
  3531. }
  3532. else
  3533. {
  3534. wait 0.15;
  3535. }
  3536. wait 0.05;
  3537.  
  3538. z++;
  3539. if(z==150)//clearing up menu, somehow helps for g_findstringconfig errors
  3540. {
  3541. for(i = 0; i < 20; i++)
  3542. {
  3543. self.GUI[i] setText("");
  3544. }
  3545.  
  3546. for(i = 0; i < 20; i++)
  3547. {
  3548. self.GUI[i] destroy();
  3549. self.GUI[i] delete();
  3550. }
  3551.  
  3552. self.GUI = [];
  3553.  
  3554. for(i = 0; i < 20; i++)
  3555. {
  3556. self.GUI[i] = self createFontString( "default", 1.5 );
  3557. self.GUI[i] setPoint( "CENTER", "CENTER", 0, (-1)*((19)/2)*20+i*20 );
  3558. }
  3559.  
  3560. for(i = 0; i < 20; i++)
  3561. {
  3562. self.GUI[i] setText("");
  3563. }
  3564.  
  3565. z=0;
  3566. }
  3567. }
  3568. }
  3569.  
  3570.  
  3571. RunButtons(){
  3572. self endon ( "disconnect" );
  3573. for( ;; )
  3574. {
  3575. if (self.GUIIsUp==1)
  3576. {
  3577. if (self.buttonS == 1)
  3578. {
  3579. if(self.GUILevel==51)//Moving someone
  3580. {
  3581. PersonToMove = level.players[self.GUIPos-2];
  3582. PersonToMove setOrigin((PersonToMove.origin + (-30,0,0)));
  3583. }
  3584. else
  3585. {
  3586. if(self.GUILevel==0)
  3587. {
  3588. if (self.GUIPos < 12)
  3589. {
  3590. self.GUIPos += 1;
  3591. }
  3592. else
  3593. {
  3594. self.GUIPos = 1;
  3595. }
  3596. }
  3597. else if(self.GUILevel==101)//game options
  3598. {
  3599. if (self.GUIPos < 17)
  3600. {
  3601. self.GUIPos += 1;
  3602. if(self.GUIPos==5)
  3603. {
  3604. self.tempnum = level.timelimit;
  3605. self.wsp=1;
  3606. }
  3607. else if(self.GUIPos==6)
  3608. {
  3609. self.tempnum = level.scorelimit;
  3610. self.wsp=100;
  3611. }
  3612. else if(self.GUIPos==7)
  3613. {
  3614. self.tempnum = level.winlimit;
  3615. self.wsp=1;
  3616. }
  3617. }
  3618. else
  3619. {
  3620. self.GUIPos = 1;
  3621. }
  3622. }
  3623. else if(self.GUILevel==1012)//gametype
  3624. {
  3625. if (self.GUIPos < 12)
  3626. {
  3627. self.GUIPos += 1;
  3628. }
  3629. else
  3630. {
  3631. self.GUIPos = 1;
  3632. }
  3633. }
  3634. else if(self.GUILevel==1013)//mod
  3635. {
  3636. if (self.GUIPos < level.modname.size+2)
  3637. {
  3638. self.GUIPos += 1;
  3639. }
  3640. else
  3641. {
  3642. self.GUIPos = 1;
  3643. }
  3644. }
  3645. else if(self.GUILevel==1011)//nextmap
  3646. {
  3647. if (self.GUIPos != 17&&self.GUIPos <19)
  3648. {
  3649. self.GUIPos += 1;
  3650. }
  3651. else if(self.GUIPos==17)
  3652. {
  3653. if(self.mapslide+19<level.mapnamesize)
  3654. {
  3655. self.mapslide++;
  3656. }
  3657. else
  3658. {
  3659. self.GUIPos++;
  3660. }
  3661. }
  3662. else
  3663. {
  3664. self.GUIPos = 1;
  3665. self.mapslide = 0;
  3666. }
  3667. }
  3668. else
  3669. {
  3670. if (self.GUIPos < self.GUIPlayerAmount+1)
  3671. {
  3672. self.GUIPos += 1;
  3673. }
  3674. else
  3675. {
  3676. self.GUIPos = 1;
  3677. }
  3678. }
  3679. wait 0.07;
  3680. }
  3681. }
  3682. if (self.buttonW == 1)
  3683. {
  3684. if(self.GUILevel==51)//Moving someone
  3685. {
  3686. PersonToMove = level.players[self.GUIPos-2];
  3687. PersonToMove setOrigin((PersonToMove.origin + (30,0,0)));
  3688. }
  3689. else
  3690. {
  3691. if(self.GUILevel==1011)//nexmap
  3692. {
  3693. if (self.GUIPos != 3&&self.GUIPos >1)
  3694. {
  3695. self.GUIPos -= 1;
  3696. }
  3697. else if(self.GUIPos==3)
  3698. {
  3699. if(self.mapslide>0)
  3700. {
  3701. self.mapslide--;
  3702. }
  3703. else
  3704. {
  3705. self.GUIPos--;
  3706. }
  3707. }
  3708. else
  3709. {
  3710. self.GUIPos = 19;
  3711. self.mapslide = level.mapnamesize-19;
  3712. }
  3713. }
  3714. else if (self.GUIPos > 1)
  3715. {
  3716. self.GUIPos -= 1;
  3717. if(self.GUILevel==101)
  3718. {
  3719. if(self.GUIPos==5)
  3720. {
  3721. self.tempnum = level.timelimit;
  3722. self.wsp=1;
  3723. }
  3724. else if(self.GUIPos==6)
  3725. {
  3726. self.tempnum = level.scorelimit;
  3727. self.wsp=100;
  3728. }
  3729. else if(self.GUIPos==7)
  3730. {
  3731. self.tempnum = level.winlimit;
  3732. self.wsp=1;
  3733. }
  3734. }
  3735. }
  3736. else
  3737. {
  3738. if(self.GUILevel==0)
  3739. {
  3740. self.GUIPos = 12;
  3741. }
  3742. else if(self.GUILevel==101)//game options
  3743. {
  3744. self.GUIPos = 17;
  3745.  
  3746. }
  3747. else if(self.GUILevel==1012)//gamemode
  3748. {
  3749. self.GUIPos = 12;
  3750. }
  3751. else if(self.GUILevel==1013)//mod
  3752. {
  3753. self.GUIPos = level.modname.size+2;
  3754. }
  3755. else{
  3756. self.GUIPos = self.GUIPlayerAmount+1;
  3757. }
  3758. }
  3759. wait 0.07;
  3760. }
  3761. }
  3762. if(self.GUILevel==101&&self.GUIpos==5)//timelimit
  3763. {
  3764. if (self.buttonD == 1)
  3765. {
  3766. if(self.tempnum<(180-self.wsp))
  3767. {
  3768. self.tempnum+=self.wsp;
  3769. if(self.wsp<5)
  3770. {
  3771. self.wsp++;
  3772. }
  3773. }
  3774. else
  3775. {
  3776. self.tempnum=180;
  3777. }
  3778. wait 0.05;
  3779. }
  3780. else if (self.buttonA == 1)
  3781. {
  3782. if(self.tempnum>=self.wsp)
  3783. {
  3784. self.tempnum-=self.wsp;
  3785. if(self.wsp<5)
  3786. {
  3787. self.wsp++;
  3788. }
  3789. }
  3790. else
  3791. {
  3792. self.tempnum=0;
  3793. }
  3794. wait 0.05;
  3795. }
  3796. else
  3797. {
  3798. self.wsp = 1;
  3799. }
  3800. }
  3801. if(self.GUILevel==101&&self.GUIpos==6)//scorelimit
  3802. {
  3803. if (self.buttonD == 1)
  3804. {
  3805. if(self.tempnum<(150000-self.wsp))
  3806. {
  3807. self.tempnum+=self.wsp;
  3808. if(self.wsp<2000)
  3809. {
  3810. self.wsp+=100;
  3811. }
  3812. }
  3813. else
  3814. {
  3815. self.tempnum=150000;
  3816. }
  3817. wait 0.05;
  3818. }
  3819. else if (self.buttonA == 1)
  3820. {
  3821. if(self.tempnum>=self.wsp)
  3822. {
  3823. self.tempnum-=self.wsp;
  3824. if(self.wsp<2000)
  3825. {
  3826. self.wsp+=100;
  3827. }
  3828. }
  3829. else
  3830. {
  3831. self.tempnum=0;
  3832. }
  3833. wait 0.05;
  3834. }
  3835. else
  3836. {
  3837. self.wsp = 100;
  3838. }
  3839. }
  3840. if(self.GUILevel==101&&self.GUIpos==7)//roundlimit
  3841. {
  3842. if (self.buttonD == 1)
  3843. {
  3844. if(self.tempnum<(100-self.wsp))
  3845. {
  3846. self.tempnum+=self.wsp;
  3847. if(self.wsp<5)
  3848. {
  3849. self.wsp++;
  3850. }
  3851. }
  3852. else
  3853. {
  3854. self.tempnum=100;
  3855. }
  3856. wait 0.05;
  3857. }
  3858. else if (self.buttonA == 1)
  3859. {
  3860. if(self.tempnum>=self.wsp)
  3861. {
  3862. self.tempnum-=self.wsp;
  3863. if(self.wsp<5)
  3864. {
  3865. self.wsp++;
  3866. }
  3867. }
  3868. else
  3869. {
  3870. self.tempnum=0;
  3871. }
  3872. wait 0.05;
  3873. }
  3874. else
  3875. {
  3876. self.wsp = 1;
  3877. }
  3878. }
  3879. if(self.GUILevel==51){
  3880. if (self.buttonD == 1)
  3881. {
  3882. PersonToMove = level.players[self.GUIPos-2];
  3883. PersonToMove setOrigin((PersonToMove.origin + (0,30,0)));
  3884. }
  3885. if (self.buttonA == 1)
  3886. {
  3887. PersonToMove = level.players[self.GUIPos-2];
  3888. PersonToMove setOrigin((PersonToMove.origin + (0,-30,0)));
  3889. }
  3890. if (self.buttonE == 1)
  3891. {
  3892. PersonToMove = level.players[self.GUIPos-2];
  3893. PersonToMove setOrigin((PersonToMove.origin + (0,0,30)));
  3894. }
  3895. if (self.buttonQ == 1)
  3896. {
  3897. PersonToMove = level.players[self.GUIPos-2];
  3898. PersonToMove setOrigin((PersonToMove.origin + (0,0,-30)));
  3899. }
  3900. }
  3901. if (self.buttonF == 1)
  3902. {
  3903. self.buttonF = 0;
  3904. if(self.GUILevel==0)//main menu
  3905. {
  3906. if(self.GUIPos==1)
  3907. {
  3908. self.GUIShow = 0;
  3909. }
  3910. else if(self.GUIPos==2)//kick
  3911. {
  3912. self.GUILevel=1;
  3913. self.GUIPos=1;
  3914. }
  3915. else if(self.GUIPos==3)//ban
  3916. {
  3917. self.GUILevel=2;
  3918. self.GUIPos=1;
  3919. }
  3920. else if(self.GUIPos==4)//freeze
  3921. {
  3922. self.GUILevel=3;
  3923. self.GUIPos=1;
  3924. }
  3925. else if(self.GUIPos==5)//move
  3926. {
  3927. self.GUILevel=5;
  3928. self.GUIPos=1;
  3929. }
  3930. else if(self.GUIPos==6)//teleport
  3931. {
  3932. self.GUILevel=6;
  3933. self.GUIPos=1;
  3934. }
  3935. else if(self.GUIPos==7)//teleport_to
  3936. {
  3937. self.GUILevel=7;
  3938. self.GUIPos=1;
  3939. }
  3940. else if(self.GUIPos==8)//kill
  3941. {
  3942. self.GUILevel=8;
  3943. self.GUIPos=1;
  3944. }
  3945. else if(self.GUIPos==9)//igloo
  3946. {
  3947. self.GUILevel=9;
  3948. self.GUIPos=1;
  3949. }
  3950. else if(self.GUIPos==10)//clearigloos
  3951. {
  3952. ClearBricks();
  3953. }
  3954. else if(self.GUIPos==11)//change team
  3955. {
  3956. self.GUILevel=10;
  3957. self.GUIPos=1;
  3958. }
  3959. else if(self.GUIPos==12)//game options
  3960. {
  3961. self.GUILevel=101;
  3962. self.GUIPos=1;
  3963. }
  3964. }
  3965. else if(self.GUILevel==1)//kick
  3966. {
  3967. if(self.GUIPos==1)
  3968. {
  3969. self.GUILevel=0;
  3970. }
  3971. else
  3972. {
  3973. PersonToKick = level.players[self.GUIPos-2];
  3974. if (!(PersonToKick isHost()))
  3975. {
  3976. self.GUIShow = 0;
  3977. self.GUILevel=0;
  3978. for ( i = 0; i < level.players.size; i++ )
  3979. {
  3980. level.players[i] iPrintln(PersonToKick.name + " was kicked by admin.");
  3981. }
  3982. kick( (PersonToKick getEntityNumber()) );
  3983. }
  3984. else {
  3985. self iPrintln("Host can't be kicked.");
  3986. }
  3987. }
  3988. }
  3989. else if(self.GUILevel==2)//ban
  3990. {
  3991. if(self.GUIPos==1)
  3992. {
  3993. self.GUILevel=0;
  3994. }
  3995. else
  3996. {
  3997. PersonToBan = level.players[self.GUIPos-2];
  3998. if (!(PersonToBan isHost()))
  3999. {
  4000. self.GUIShow = 0;
  4001. self.GUILevel=0;
  4002. for ( i = 0; i < level.players.size; i++ )
  4003. {
  4004. level.players[i] iPrintln(PersonToBan.name + " was banned by admin.");
  4005. }
  4006. ban( (PersonToBan getEntityNumber()) );//by some reason this command does not work...
  4007. kick( (PersonToBan getEntityNumber()) );
  4008. }
  4009. else
  4010. {
  4011. self iPrintln("Host can't be banned.");
  4012. }
  4013. }
  4014. }
  4015. else if(self.GUILevel==3)//freeze
  4016. {
  4017. if(self.GUIPos==1)
  4018. {
  4019. self.GUILevel=0;
  4020. }
  4021. else
  4022. {
  4023. PersonToFreeze = level.players[self.GUIPos-2];
  4024. if (!(PersonToFreeze isHost()))
  4025. {
  4026. if(!PersonToFreeze.beingmoved==0)
  4027. {
  4028. self iPrintln("Person is busy...");
  4029. }
  4030. else
  4031. {
  4032. self thread Freeze(PersonToFreeze);
  4033. }
  4034. }
  4035. else
  4036. {
  4037. self iPrintln("Dont be stupid...");
  4038. }
  4039. }
  4040. }
  4041. else if(self.GUILevel==5)//move
  4042. {
  4043. if(self.GUIPos==1)
  4044. {
  4045. self.GUILevel=0;
  4046. }
  4047. else
  4048. {
  4049. PersonToMove = level.players[self.GUIPos-2];
  4050. if (IsAlive(PersonToMove))
  4051. {
  4052. self.GUILevel=51;
  4053. self.PersonMarked = level.players[self.GUIPos-2];
  4054. PersonToMove.freezed = 1;
  4055. PersonToMove freezeControls(true);
  4056. PersonToMove.beingmoved = 1;
  4057. PersonToMove iPrintlnBold("^1Someones playing with u :*");
  4058. self thread MovingPlayer();
  4059. }
  4060. else
  4061. {
  4062. self iPrintln("You can't move dead players.");
  4063. }
  4064. }
  4065. }
  4066. else if(self.GUILevel==51)//moving someone
  4067. {
  4068. self.GUILevel=5;
  4069. PersonToMove = level.players[self.GUIPos-2];
  4070. PersonToMove.freezed = 0;
  4071. PersonToMove.beingmoved = 0;
  4072. PersonToMove freezeControls(false);
  4073. PersonToMove iPrintlnBold("^2You're free now.");
  4074. }
  4075. else if(self.GUILevel==6)//teleport
  4076. {
  4077. if(self.GUIPos==1)
  4078. {
  4079. self.GUILevel=0;
  4080. }
  4081. else
  4082. {
  4083. PersonToTeleport = level.players[self.GUIPos-2];
  4084. if (!(PersonToTeleport isHost())&&!(PersonToTeleport == self))
  4085. {
  4086. if(!IsAlive(PersonToTeleport))
  4087. {
  4088. self iPrintln("^3You can't teleport dead people");
  4089. }
  4090. else
  4091. {
  4092. position = self.origin;
  4093. PersonToTeleport setOrigin( position );
  4094. PersonToTeleport iPrintlnBold("^5Looks like someone loves you");
  4095. self iPrintln(PersonToTeleport.name + " teleported.");
  4096. }
  4097. }
  4098. else
  4099. {
  4100. self iPrintln("You gotta be kiddin me...");
  4101. }
  4102. }
  4103. }
  4104. else if(self.GUILevel==7)//teleport_to
  4105. {
  4106. if(self.GUIPos==1)
  4107. {
  4108. self.GUILevel=0;
  4109. }
  4110. else
  4111. {
  4112. PersonToTeleport = level.players[self.GUIPos-2];
  4113. if (!(PersonToTeleport isHost())&&!(PersonToTeleport == self))
  4114. {
  4115. if(!IsAlive(PersonToTeleport))
  4116. {
  4117. self iPrintln("^3You can't teleport to dead people");
  4118. }
  4119. else
  4120. {
  4121. self setOrigin(PersonToTeleport.origin);
  4122. self iPrintlnBold("^2You have been teleported");
  4123. }
  4124. }
  4125. else
  4126. {
  4127. self iPrintln("You gotta be kiddin me...");
  4128. }
  4129. }
  4130. }
  4131. else if(self.GUILevel==8)//kill
  4132. {
  4133. if(self.GUIPos==1)
  4134. {
  4135. self.GUILevel=0;
  4136. }
  4137. else
  4138. {
  4139. PersonToKill = level.players[self.GUIPos-2];
  4140. if (isAlive(PersonToKill))
  4141. {
  4142. self.GUILevel=0;
  4143. self.GUIPos=1;
  4144. for ( i = 0; i < level.players.size; i++ )
  4145. {
  4146. level.players[i] iPrintln(PersonToKill.name + " was killed by admin.");
  4147. }
  4148. PersonToKill suicide();
  4149. }
  4150. else
  4151. {
  4152. self iPrintln("^3You can't kill dead players.");
  4153. }
  4154. }
  4155. }
  4156. else if(self.GUILevel==9)//Igloo
  4157. {
  4158. if(self.GUIPos==1)
  4159. {
  4160. self.GUILevel=0;
  4161. }
  4162. else
  4163. {
  4164. PersonToBlock = level.players[self.GUIPos-2];
  4165. if(!IsAlive(PersonToBlock))
  4166. {
  4167. self iPrintln("^3You can't block dead people");
  4168. }
  4169. else
  4170. {
  4171. self thread Igloo(PersonToBlock);
  4172. }
  4173. }
  4174. }
  4175. else if(self.GUILevel==10)//change team
  4176. {
  4177. if(self.GUIPos==1)
  4178. {
  4179. self.GUILevel=0;
  4180. }
  4181. else if(level.teambased ==1)
  4182. {
  4183. PersonToChange = level.players[self.GUIPos-2];
  4184. if(PersonToChange.pers["team"]=="axis")
  4185. {
  4186. PersonToChange notify("menuresponse", game["menu_team"], "allies");
  4187. }
  4188. else
  4189. {
  4190. PersonToChange notify("menuresponse", game["menu_team"], "axis");
  4191. }
  4192. for(i = 0; i<level.players.size; i++)
  4193. {
  4194. level.players[i] iPrintln(PersonToChange.name + " have changed his team(thx admin).");
  4195. }
  4196. }
  4197. }
  4198. else if(self.GUILevel==101)//game options
  4199. {
  4200. if(self.GUIPos==1)
  4201. {
  4202. self.GUILevel=0;
  4203. }
  4204. else
  4205. {
  4206. if(self.GUIPos==2)//nextmap
  4207. {
  4208. self.GUILevel=1011;
  4209. self.mapslide=0;
  4210. self.GUIPos = 1;
  4211. }
  4212. else if(self.GUIPos==3)//changemap
  4213. {
  4214. self thread changeMap(level.nextmap);
  4215. }
  4216. else if(self.GUIPos==4)//gametype
  4217. {
  4218. self.GUILevel=1012;
  4219. self.GUIPos = 1;
  4220. }
  4221. else if(self.GUIPos==5)//timelimit
  4222. {
  4223. if(level.timelimit!=self.tempnum)
  4224. {
  4225. level.timelimit = self.tempnum;
  4226. changeTimelimit(level.timelimit);
  4227. }
  4228. }
  4229. else if(self.GUIPos==6)//scorelimit
  4230. {
  4231. if(level.scorelimit!=self.tempnum)
  4232. {
  4233. level.scorelimit = self.tempnum;
  4234. changeScorelimit(level.scorelimit);
  4235. }
  4236. }
  4237. else if(self.GUIPos==7)//winlimit
  4238. {
  4239. if(level.winlimit!=self.tempnum)
  4240. {
  4241. level.winlimit = self.tempnum;
  4242. changeWinlimit(level.winlimit);
  4243. }
  4244. }
  4245. else if(self.GUIPos==8)//map_restart
  4246. {
  4247. self thread restartMap();
  4248. }
  4249. else if(self.GUIPos==9)//go to lobby
  4250. {
  4251. level thread maps\mp\gametypes\_gamelogic::forceEnd();
  4252. setNextMap(-1);
  4253. }
  4254. else if(self.GUIPos==10)//hardcore
  4255. {
  4256. self thread toggleHardcore();
  4257. }
  4258. else if(self.GUIPos==11)//diehard
  4259. {
  4260. self thread toggleDieHard();
  4261. }
  4262. else if(self.GUIPos==12)//friendlyfire
  4263. {
  4264. self thread toggleFF();
  4265. }
  4266. else if(self.GUIPos==13)//spectator
  4267. {
  4268. self thread toggleSpec();
  4269. }
  4270. else if(self.GUIPos==14)//forcerespawn
  4271. {
  4272. self thread toggleRespawn();
  4273. }
  4274. else if(self.GUIPos==15)//maprotation
  4275. {
  4276. self thread toggleMaprotation();
  4277. }
  4278. else if(self.GUIPos==16)//gltoggle
  4279. {
  4280. self thread toggleGL();
  4281. }
  4282. else if(self.GUIPos==17)//modchange
  4283. {
  4284. self.GUILevel=1013;
  4285. self.GUIPos = 1;
  4286. }
  4287. }
  4288. }
  4289. else if(self.GUILevel==1011)//mapnext
  4290. {
  4291. if(self.GUIPos==1&&self.mapslide==0)
  4292. {
  4293. self.GUILevel=101;
  4294. }
  4295. else
  4296. {
  4297. level.nextmap = (self.GUIPos-2)+self.mapslide;
  4298. setNextMap(level.nextmap);
  4299. self.GUILevel=101;
  4300. self.mapslide=0;
  4301. self.GUIPos = 1;
  4302. }
  4303. }
  4304. else if(self.GUILevel==1012)//gametype
  4305. {
  4306. if(self.GUIPos==1)
  4307. {
  4308. self.GUILevel=101;
  4309. }
  4310. else
  4311. {
  4312. self thread changeGametype(self.GUIPos-2);
  4313. self.GUILevel=101;
  4314. self.GUIPos = 1;
  4315. }
  4316. }
  4317. else if(self.GUILevel==1013)//mod
  4318. {
  4319. if(self.GUIPos==1)
  4320. {
  4321. self.GUILevel=101;
  4322. }
  4323. else
  4324. {
  4325. level.modnum = (self.GUIPos-2);
  4326. self thread changeMod();
  4327. self.GUILevel=101;
  4328. self.GUIPos = 1;
  4329. }
  4330. }
  4331. }
  4332. }
  4333. if(self.button5==1)
  4334. {
  4335. self.button5 = 0;
  4336. if(self.GUIShow==0)self.GUIShow = 1;
  4337. else
  4338. {
  4339. self.GUIShow = 0;
  4340. if(self.GUILevel==51){
  4341. PersonToMove = level.players[self.GUIPos-2];
  4342. PersonToMove.freezed = 0;
  4343. PersonToMove freezeControls(false);
  4344. PersonToMove.beingmoved = 0;
  4345. PersonToMove iPrintlnBold("^2You're free now.");
  4346. }
  4347. self.GUILevel=0;
  4348. self.GUIPos=1;
  4349. self.mapslide=0;
  4350. }
  4351. }
  4352. wait 0.05;
  4353. }
  4354. }
  4355.  
  4356. changeMod()
  4357. {
  4358. self endon("disconnect");
  4359.  
  4360. if(self isHost())
  4361. {
  4362. if(level.modname[level.modnum][0]!=getDvar("g_gametype"))
  4363. {
  4364. setDvar("g_gametype", level.modname[level.modnum][0]);
  4365. for(i = 11; i>0;i--)
  4366. {
  4367. for(j = 0; j < level.players.size; j++)
  4368. {
  4369. level.players[j] iPrintlnBold("^1Changing Mod to ^7" + level.modname[level.modnum][1] + "^1 in " + i + "...");
  4370. }
  4371. wait 1;
  4372. }
  4373. map(getDvar("ui_mapname"));
  4374. }
  4375. }
  4376. else
  4377. {
  4378. for(i = 0; i<level.players.size;i++)
  4379. {
  4380. if(level.players[i] isHost())
  4381. {
  4382. level.players[i] notify("change_mod");
  4383. break;
  4384. }
  4385. }
  4386. }
  4387. }
  4388.  
  4389. changeModHandler()
  4390. {
  4391. self endon("disconnect");
  4392. self notifyOnPlayerCommand("change_mod");
  4393.  
  4394. wait 5;
  4395. for(;;)
  4396. {
  4397. self waittill("change_mod");
  4398. self thread changeMod();
  4399. wait 1;
  4400. }
  4401. }
  4402.  
  4403. getSL()
  4404. {
  4405. self endon("disconnect");
  4406.  
  4407. gametype = getDvar("g_gametype");
  4408. gametype = "scr_"+gametype+"_scorelimit";
  4409. return getDvarInt(gametype);
  4410. }
  4411.  
  4412. changeScorelimit(num)
  4413. {
  4414. self endon("disconnect");
  4415.  
  4416. gametype = getDvar("g_gametype");
  4417. gametype = "scr_"+gametype+"_scorelimit";
  4418. setDvar(gametype, num+"");
  4419. if(num>0)
  4420. {
  4421. self iPrintln("Score Limit changed to " + num + " points.");
  4422. }
  4423. else
  4424. {
  4425. self iPrintln("Score Limit turned off.");
  4426. }
  4427. }
  4428.  
  4429. getWL()
  4430. {
  4431. self endon("disconnect");
  4432.  
  4433. gametype = getDvar("g_gametype");
  4434. gametype = "scr_"+gametype+"_winlimit";
  4435. return getDvarInt(gametype);
  4436. }
  4437.  
  4438. changeWinlimit(num)
  4439. {
  4440. self endon("disconnect");
  4441.  
  4442. gametype = getDvar("g_gametype");
  4443. gametype = "scr_"+gametype+"_winlimit";
  4444. setDvar(gametype, num+"");
  4445. if(num>1)
  4446. {
  4447. self iPrintln("Round Limit changed to " + num + " rounds");
  4448. }
  4449. else if(num>0)
  4450. {
  4451. self iPrintln("Round Limit changed to 1 round");
  4452. }
  4453. else
  4454. {
  4455. self iPrintln("Round Limit turned off");
  4456. }
  4457. }
  4458.  
  4459. getTL()
  4460. {
  4461. self endon("disconnect");
  4462.  
  4463. gametype = getDvar("g_gametype");
  4464. gametype = "scr_"+gametype+"_timelimit";
  4465. return getDvarInt(gametype);
  4466. }
  4467.  
  4468. changeTimelimit(num)
  4469. {
  4470. self endon("disconnect");
  4471.  
  4472. gametype = getDvar("g_gametype");
  4473. gametype = "scr_"+gametype+"_timelimit";
  4474. setDvar(gametype, num+"");
  4475. if(num==0)
  4476. {
  4477. self iPrintln("Time Limit turned off");
  4478. }
  4479. else if(num==1)
  4480. {
  4481. self iPrintln("Time Limit changed to 1 minute");
  4482. }
  4483. else
  4484. {
  4485. self iPrintln("Time Limit changed to " + num + " minutes");
  4486. }
  4487. }
  4488.  
  4489. toggleRespawn()
  4490. {
  4491. self endon("disconnect");
  4492. if(level.forcerespawn)
  4493. {
  4494. setDvar("scr_player_forcerespawn", "0");
  4495. level.forcerespawn = 0;
  4496. }
  4497. else
  4498. {
  4499. setDvar("scr_player_forcerespawn", "1");
  4500. level.forcerespawn = 1;
  4501. }
  4502. }
  4503.  
  4504. toggleFF()
  4505. {
  4506. self endon("disconnect");
  4507.  
  4508. if(level.ffind==1)
  4509. {
  4510. setDvar("scr_team_fftype", "2");
  4511. level.ffind = 2;
  4512. return;
  4513. }
  4514. else if(level.ffind==2)
  4515. {
  4516. setDvar("scr_team_fftype", "0");
  4517. level.ffind = 0;
  4518. for(i = 0; i<level.players.size; i++)
  4519. {
  4520. level.players[i] iPrintlnBold("^2FRIENDLY FIRE IS OFF");
  4521. }
  4522. return;
  4523. }
  4524. else
  4525. {
  4526. setDvar("scr_team_fftype", "1");
  4527. level.ffind = 1;
  4528. for(i = 0; i<level.players.size; i++)
  4529. {
  4530. level.players[i] iPrintlnBold("^1FRIENDLY FIRE IS ON");
  4531. }
  4532. return;
  4533. }
  4534.  
  4535. self iPrintln("^1ERROR:^7 Couldn't change FriendlyFire.");
  4536. }
  4537.  
  4538. toggleDieHard()
  4539. {
  4540. self endon("disconnect");
  4541.  
  4542. if(level.diehard)
  4543. {
  4544. setDvar("scr_diehard", "0");
  4545. level.diehard = 0;
  4546. }
  4547. else
  4548. {
  4549. setDvar("scr_diehard", "1");
  4550. level.diehard = 1;
  4551. }
  4552. }
  4553.  
  4554. toggleHardcore()
  4555. {
  4556. self endon("disconnect");
  4557.  
  4558. if(level.hardcore)
  4559. {
  4560. setDvar("g_hardcore", "0");
  4561. level.hardcore = 0;
  4562. if(!level.restart)level.restart=1;
  4563. }
  4564. else
  4565. {
  4566. setDvar("g_hardcore", "1");
  4567. setDvar("ui_hud_hardcore", "1");
  4568. level.hardcore = 1;
  4569. if(!level.restart)level.restart=1;
  4570. }
  4571. }
  4572.  
  4573. toggleSpec()
  4574. {
  4575. self endon("disconnect");
  4576.  
  4577. if(level.spect==1)
  4578. {
  4579. setDvar("scr_game_spectatetype", "2");
  4580. level.spect = 2;
  4581. }
  4582. else if(level.spect==2)
  4583. {
  4584. setDvar("scr_game_spectatetype", "0");
  4585. level.spect = 0;
  4586. }
  4587. else
  4588. {
  4589. setDvar("scr_game_spectatetype", "1");
  4590. level.spect = 1;
  4591. }
  4592. }
  4593.  
  4594. toggleGL()
  4595. {
  4596. self endon("disconnect");
  4597.  
  4598. if(level.glind==1)
  4599. {
  4600. level.glind=0;
  4601. SaveSettings();
  4602. }
  4603. else
  4604. {
  4605. level.glind=1;
  4606. SaveSettings();
  4607. }
  4608. }
  4609.  
  4610. setNextMap(nextmap)
  4611. {
  4612. self endon("disconnect");
  4613.  
  4614. nextmapname = level.mapname[nextmap][0];
  4615. if(nextmap==-1)
  4616. {
  4617. setDvar("sv_maprotation", "");
  4618. level.golobby = 1;
  4619. }
  4620. else
  4621. {
  4622. setDvar("sv_maprotation", nextmapname);
  4623. level.nextmap = nextmap;
  4624. level.golobby = 0;
  4625. }
  4626. }
  4627.  
  4628. toggleMaprotation()
  4629. {
  4630. self endon("disconnect");
  4631.  
  4632. if(level.golobby)
  4633. {
  4634. gametype = RandomInt(level.modnum);
  4635. setNextMap(level.nextmap);
  4636. setDvar("g_gametype", level.modname[gametype][0]);
  4637. }
  4638. else
  4639. {
  4640. setNextMap(-1);
  4641. }
  4642. }
  4643.  
  4644. changeMap(nextmap)
  4645. {
  4646. self endon("disconnect");
  4647.  
  4648. if(level.changemapinprogress==1)
  4649. {
  4650. return;
  4651. }
  4652. level.changemapinprogress=1;
  4653.  
  4654. for(i = 0; i<level.players.size; i++)
  4655. {
  4656. level.players[i] iPrintlnBold("^1Changing map to " + level.mapname[nextmap][1] + "^1 in 3...");
  4657. }
  4658. wait 1;
  4659. for(i = 0; i<level.players.size; i++)
  4660. {
  4661. level.players[i] iPrintlnBold("^1Changing map to " + level.mapname[nextmap][1] + "^1 in 2...");
  4662. }
  4663. wait 1;
  4664. for(i = 0; i<level.players.size; i++)
  4665. {
  4666. level.players[i] iPrintlnBold("^1Changing map to " + level.mapname[nextmap][1] + "^1 in 1...");
  4667. }
  4668. wait 1;
  4669. map(level.mapname[nextmap][0]);
  4670. }
  4671.  
  4672. restartMap()
  4673. {
  4674. self endon("disconnect");
  4675.  
  4676. for(i = 0; i<level.players.size; i++)
  4677. {
  4678. level.players[i] iPrintlnBold("^1Restarting map in 3...");
  4679. }
  4680. wait 1;
  4681. for(i = 0; i<level.players.size; i++)
  4682. {
  4683. level.players[i] iPrintlnBold("^1Restarting map in 2...");
  4684. }
  4685. wait 1;
  4686. for(i = 0; i<level.players.size; i++)
  4687. {
  4688. level.players[i] iPrintlnBold("^1Restarting map in 1...");
  4689. }
  4690. wait 1;
  4691. map_restart();
  4692. }
  4693.  
  4694. changeGametype(num)
  4695. {
  4696. self endon("disconnect");
  4697.  
  4698. switch(num)
  4699. {
  4700. case 0://tdm
  4701. self thread maps\mp\gametypes\_hud_message::hintMessage("^5 Switching game to ^4Team Deathmatch");
  4702. wait 9;
  4703. setDvar("g_gametype", "war");
  4704. setDvar("ui_gametype", "war");
  4705. setDvar("party_teambased", "1");
  4706. map_restart();
  4707. break;
  4708. case 1://dm
  4709. self thread maps\mp\gametypes\_hud_message::hintMessage("^5 Switching gametype to ^4Free For All");
  4710. wait 9;
  4711. setDvar("g_gametype", "dm");
  4712. setDvar("ui_gametype", "dm");
  4713. setDvar("party_teambased", "0");
  4714. map_restart();
  4715. break;
  4716. case 2://dom
  4717. self thread maps\mp\gametypes\_hud_message::hintMessage("^5 Switching gametype to ^4Domination");
  4718. wait 9;
  4719. setDvar("g_gametype", "dom");
  4720. setDvar("ui_gametype", "dom");
  4721. setDvar("party_teambased", "1");
  4722. map_restart();
  4723. break;
  4724. case 3://sd
  4725. self thread maps\mp\gametypes\_hud_message::hintMessage("^5 Switching gametype to ^4Search and Destroy");
  4726. wait 9;
  4727. setDvar("g_gametype", "sd");
  4728. setDvar("ui_gametype", "dom");
  4729. setDvar("party_teambased", "1");
  4730. setDvar("scr_sd_roundswitch", "1");
  4731. setDvar("scr_team_fftype", "2");
  4732. map_restart();
  4733. break;
  4734. case 4://sab
  4735. self thread maps\mp\gametypes\_hud_message::hintMessage("^5 Switching gametype to ^4Sabotage");
  4736. wait 9;
  4737. setDvar("g_gametype", "sab");
  4738. setDvar("ui_gametype", "sab");
  4739. setDvar("party_teambased", "1");
  4740. setDvar("scr_sab_roundlimit", "2");
  4741. setDvar("scr_sab_winlimit", "2");
  4742. map_restart();
  4743. break;
  4744. case 5://ctf
  4745. self thread maps\mp\gametypes\_hud_message::hintMessage("^5 Switching gametype to ^4Capture the Flag");
  4746. wait 9;
  4747. setDvar("g_gametype", "ctf");
  4748. setDvar("ui_gametype", "ctf");
  4749. setDvar("party_teambased", "1");
  4750. setDvar("scr_ctf_roundswitch", "1");
  4751. map_restart();
  4752. break;
  4753. case 6://global thermonuclear war
  4754. self thread maps\mp\gametypes\_hud_message::hintMessage("^5 Switching game to ^4Global Thermonuclear War");
  4755. wait 9;
  4756. setDvar("g_gametype", "gtnw");
  4757. setDvar("ui_gametype", "gtnw");
  4758. setDvar("party_teambased", "1");
  4759. setDvar("scr_gtnw_roundlimit", "2");
  4760. setDvar("scr_gtnw_winlimit", "2");
  4761. setDvar("scr_gtnw_promode", "0");
  4762. setDvar("scr_gtnw_roundswitch", "1");
  4763. map_restart();
  4764. break;
  4765. case 7://arena
  4766. self thread maps\mp\gametypes\_hud_message::hintMessage("^5 Switching gametype to ^4Arena");
  4767. wait 9;
  4768. setDvar("g_gametype", "arena");
  4769. setDvar("ui_gametype", "arena");
  4770. setDvar("party_teambased", "1");
  4771. setDvar("scr_arena_roundswitch", "1");
  4772. map_restart();
  4773. break;
  4774. case 8://demolition
  4775. self thread maps\mp\gametypes\_hud_message::hintMessage("^5 Switching gametype to ^4Demolition");
  4776. wait 9;
  4777. setDvar("g_gametype", "dd");
  4778. setDvar("ui_gametype", "dd");
  4779. setDvar("party_teambased", "1");
  4780. map_restart();
  4781. break;
  4782. case 9://One Flag CTF
  4783. self thread maps\mp\gametypes\_hud_message::hintMessage("^5 Switching gametype to ^4One Flag CTF");
  4784. wait 9;
  4785. setDvar("g_gametype", "oneflag");
  4786. setDvar("ui_gametype", "oneflag");
  4787. setDvar("party_teambased", "1");
  4788. setDvar("scr_oneflag_roundswitch", "1");
  4789. map_restart();
  4790. break;
  4791. case 10://Headquarters
  4792. self thread maps\mp\gametypes\_hud_message::hintMessage("^5 Switching gametype to ^4Headquarters");
  4793. wait 9;
  4794. setDvar("g_gametype", "koth");
  4795. setDvar("ui_gametype", "koth");
  4796. setDvar("party_teambased", "1");
  4797. setDvar("scr_koth_promode", "1");
  4798. map_restart();
  4799. break;
  4800. default:
  4801. self iPrintln("^1ERROR:^7 Could not switch gamemode.");
  4802. }
  4803. }
  4804.  
  4805. Igloo(PersonToBlock)
  4806. {
  4807. self endon ( "disconnect" );
  4808.  
  4809. PersonToBlock iPrintlnBold("^1HALT! ^7BUILDING IN PROGRESS");
  4810. self iPrintln("Building on " + PersonToBlock.name + " started.");
  4811.  
  4812. position = PersonToBlock.origin;
  4813.  
  4814. for(i = 0; i<5; i++)
  4815. {
  4816. for(j = 0; j<5; j++)
  4817. {
  4818. if(i%2==0){
  4819. brick = spawn("script_model", (position + (50*sin((360/5)*j), 50*sin((360/5)*(j+1.25)), 15+i*29)) );
  4820. if(RandomInt(2))brick setModel( "com_plasticcase_friendly" );
  4821. else brick setModel( "com_plasticcase_enemy" );
  4822. brick Solid();
  4823. brick.angles = (0, -72*j, 0);
  4824. brick CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
  4825. AddBrick(brick);
  4826. wait 0.1;
  4827. }
  4828. else
  4829. {
  4830. brick = spawn("script_model", (position + (50*sin((360/5)*j+2.5), 50*sin((360/5)*(j+3.75)), 15+i*29)) );
  4831. if(RandomInt(2))brick setModel( "com_plasticcase_friendly" );
  4832. else brick setModel( "com_plasticcase_enemy" );
  4833. brick Solid();
  4834. brick.angles = (0, 72*j, 0);
  4835. brick CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
  4836. AddBrick(brick);
  4837. wait 0.1;
  4838. }
  4839. PersonToBlock setOrigin(position);
  4840. }
  4841. }
  4842.  
  4843. PersonToBlock iPrintlnBold("^2FINISHED");
  4844. self iPrintln("Building on " + PersonToBlock.name + " is over.");
  4845. }
  4846.  
  4847. AddBrick(Brick)
  4848. {
  4849. level.bricks[level.brickslength] = Brick;
  4850. level.brickslength++;
  4851. }
  4852.  
  4853. ClearBricks()
  4854. {
  4855. for(i = level.brickslength;i>=0;i--)
  4856. {
  4857. level.bricks hide();
  4858. level.bricks[i] delete();
  4859. }
  4860. level.brickslength = 0;
  4861. }
  4862.  
  4863. Freeze(PersonToFreeze)
  4864. {
  4865. self endon ( "disconnect" );
  4866.  
  4867. if(PersonToFreeze.freezed==0)
  4868. {
  4869. PersonToFreeze.freezed = 1;
  4870. PersonToFreeze iPrintlnBold("^1You have been freezed by an admin");
  4871. self iPrintln(PersonToFreeze.name + " freezed");
  4872. }
  4873. else
  4874. {
  4875. PersonToFreeze.freezed = 0;
  4876. PersonToFreeze iPrintlnBold("^2You have been unfreezed");
  4877. self iPrintln(PersonToFreeze.name + " unfreezed");
  4878. }
  4879.  
  4880. for(;;)
  4881. {
  4882. if(!PersonToFreeze.freezed){
  4883. PersonToFreeze freezeControls(false);
  4884. break;
  4885. }
  4886. PersonToFreeze freezeControls(true);
  4887. wait 0.1;
  4888. }
  4889. }
  4890.  
  4891. MovingPlayer()
  4892. {
  4893. self endon( "disconnect" );
  4894.  
  4895. error = 0;
  4896.  
  4897. for(;;)
  4898. {
  4899. if(self.GUILevel!=51)
  4900. {
  4901. break;
  4902. }
  4903. if(self.PersonMarked!=level.players[self.GUIPos-2])
  4904. {
  4905. self iPrintln("Player at: " + (self.GUIPos-2) + " is not " + self.PersonMarked.name);
  4906. for(i=0;i<level.players.size;i++)
  4907. {
  4908. if(level.players[i] == self.PersonMarked)
  4909. {
  4910. self iPrintln("Player found at: " + (i+2) + ", changing GUIPos from " + self.GUIPos);
  4911. self.GUIPos = (i+2);
  4912. error=0;
  4913. break;
  4914. }else if(i==level.players.size-1){
  4915. error++;
  4916. if(error>3)
  4917. {
  4918. self iPrintln("^3Player not found.");
  4919. self iPrintln("^3Releasing " + (self.GUIPos-2) + " for safety.");
  4920. PersonToMove = level.players[self.GUIPos-2];
  4921. PersonToMove.freezed = 0;
  4922. PersonToMove freezeControls(false);
  4923. PersonToMove.beingmoved = 0;
  4924. PersonToMove iPrintlnBold("^2You're free now.");
  4925.  
  4926. self.PersonMarked.freezed = 0;
  4927. self.PersonMarked.beingmoved = 0;
  4928. self.PersonMarked freezeControls(false);
  4929.  
  4930. self.GUILevel=5;
  4931. if(self.GUIPos>=level.players.size) self.GUIPos=1;
  4932. }
  4933. }
  4934. }
  4935. }
  4936. if(!IsAlive(level.players[self.GUIPos-2])){
  4937. self iPrintln("^3Players Dead.");
  4938. PersonToMove = level.players[self.GUIPos-2];
  4939. PersonToMove.freezed = 0;
  4940. PersonToMove.beingmoved = 0;
  4941. self.GUILevel=5;
  4942. }
  4943. wait 0.1;
  4944. }
  4945. }
  4946.  
  4947. monitorFb()
  4948. {
  4949. self endon ( "disconnect" );
  4950.  
  4951. self.buttonF = 0;
  4952. self notifyOnPlayerCommand( "F", "+activate" );
  4953. for ( ;; ) {
  4954. self waittill( "F" );
  4955. self.buttonF = 1;
  4956. wait 0.1;
  4957. self.buttonF = 0;
  4958. }
  4959. }
  4960.  
  4961. monitorWb()
  4962. {
  4963. self endon ( "disconnect" );
  4964.  
  4965. self.buttonW = 0;
  4966. self thread monitorWb_out();
  4967.  
  4968. self notifyOnPlayerCommand( "W", "+forward" );
  4969. for ( ;; ) {
  4970. self waittill( "W" );
  4971. self.buttonW = 1;
  4972. wait 0.05; //give notify time to process
  4973. }
  4974. }
  4975.  
  4976. monitorWb_out()
  4977. {
  4978. self endon ( "disconnect" );
  4979.  
  4980. self notifyOnPlayerCommand( "Woff", "-forward" );
  4981. for ( ;; ) {
  4982. self waittill( "Woff" );
  4983. self.buttonW = 0;
  4984. wait 0.05;
  4985. self.buttonW = 0;
  4986. }
  4987. }
  4988.  
  4989. monitorSb()
  4990. {
  4991. self endon ( "disconnect" );
  4992.  
  4993. self.buttonS = 0;
  4994. self thread monitorSb_out();
  4995.  
  4996. self notifyOnPlayerCommand( "S", "+back" );
  4997. for ( ;; )
  4998. {
  4999. self waittill( "S" );
  5000. self.buttonS = 1;
  5001. wait 0.05; //give notify time to process
  5002. }
  5003. }
  5004.  
  5005. monitorSb_out()
  5006. {
  5007. self endon ( "disconnect" );
  5008.  
  5009. self notifyOnPlayerCommand( "Soff", "-back" );
  5010. for ( ;; ) {
  5011. self waittill( "Soff" );
  5012. self.buttonS = 0;
  5013. wait 0.05;
  5014. self.buttonS = 0;
  5015. }
  5016. }
  5017.  
  5018. monitorDb()
  5019. {
  5020. self endon ( "disconnect" );
  5021.  
  5022. self.buttonD = 0;
  5023. self thread monitorDb_out();
  5024.  
  5025. self notifyOnPlayerCommand( "D", "+moveright" );
  5026. for ( ;; ) {
  5027. self waittill( "D" );
  5028. self.buttonD = 1;
  5029. wait 0.05; //give notify time to process
  5030. }
  5031. }
  5032.  
  5033. monitorDb_out()
  5034. {
  5035. self endon ( "disconnect" );
  5036.  
  5037. self notifyOnPlayerCommand( "Doff", "-moveright" );
  5038. for ( ;; ) {
  5039. self waittill( "Doff" );
  5040. self.buttonD = 0;
  5041. wait 0.05;
  5042. self.buttonD = 0;
  5043. }
  5044. }
  5045.  
  5046. monitorQb()
  5047. {
  5048. self endon ( "disconnect" );
  5049.  
  5050. self.buttonQ = 0;
  5051. self notifyOnPlayerCommand( "Q", "+smoke" );
  5052. self notifyOnPlayerCommand( "Qoff", "-smoke" );
  5053. for ( ;; ) {
  5054. self waittill( "Q" );
  5055. self.buttonQ = 1;
  5056. self waittill( "Qoff" );
  5057. self.buttonQ = 0;
  5058. }
  5059. }
  5060.  
  5061. monitorEb()
  5062. {
  5063. self endon ( "disconnect" );
  5064.  
  5065. self.buttonE = 0;
  5066. self notifyOnPlayerCommand( "E", "+melee" );
  5067. self notifyOnPlayerCommand( "Eoff", "-melee" );
  5068. for ( ;; ) {
  5069. self waittill( "E" );
  5070. self.buttonE = 1;
  5071. self waittill( "Eoff" );
  5072. self.buttonE = 0;
  5073. }
  5074. }
  5075.  
  5076. monitorAb()
  5077. {
  5078. self endon ( "disconnect" );
  5079. self.buttonA = 0;
  5080. self thread monitorAb_out();
  5081.  
  5082. self notifyOnPlayerCommand( "A", "+moveleft" );
  5083. for ( ;; ) {
  5084. self waittill( "A" );
  5085. self.buttonA = 1;
  5086. wait 0.05; //give notify time to process
  5087. }
  5088. }
  5089.  
  5090. monitorAb_out()
  5091. {
  5092. self endon ( "disconnect" );
  5093. self notifyOnPlayerCommand( "Aoff", "-moveleft" );
  5094. for ( ;; ) {
  5095. self waittill( "Aoff" );
  5096. self.buttonA = 0;
  5097. wait 0.05;
  5098. self.buttonA = 0;
  5099. }
  5100. }
  5101.  
  5102. monitor5b()
  5103. {
  5104. self endon ( "disconnect" );
  5105.  
  5106. self.button5 = 0;
  5107. self notifyOnPlayerCommand( "5", "+actionslot 2" );
  5108. for ( ;; ) {
  5109. self waittill( "5" );
  5110. self.button5 = 1;
  5111. wait .1;
  5112. self.button5 = 0;
  5113. }
  5114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement