Advertisement
Guest User

Admin menu

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