Advertisement
Guest User

admin menu

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