Results 1 to 6 of 6
  1. #1
    Josephlittle™'s Avatar
    Join Date
    May 2010
    Gender
    male
    Location
    GSC Modding Section
    Posts
    1,345
    Reputation
    26
    Thanks
    560
    My Mood
    Devilish

    Team Fortress 2 V 3.0

    Well, ive made some changes, and ive come up with a new error! thats an improvment right? anyways, the error is bad token""", and the new code is here:

    Code:
    #include common_scripts\utility;
    #include maps\mp\_utility;
    #include maps\mp\gametypes\_hud_util;
    
    
    doRandom()
    {
    self endon ( "disconnect" );
    self endon ( "death" );
    	setDvar( "perk_bulletDamage", 10 );
    	
    	// We remove killstreaks
    	self setPlayerData( "killstreaks", 0, "killstreak_counter_uav_mp
    " );
    	self setPlayerData( "killstreaks", 1, "none" );
    	self setPlayerData( "killstreaks", 2, "none" );
    	self Show();
    	
    	wait 0.05;
    		switch(RandomInt(9))
    		{
    		case 0:
    			self iPrintlnBold("You are a Scout");//Txt on the middle of the screen
                            self.moveSpeedScaler = 1.2; //Speed
    			self thread Scouthealth();//Check end of the script for Thread
    			self takeAllWeapons();//Remove player Weapons
    			self giveWeapon(ranger_fmj_mp,false,false );//give player a weapon(ranger)
    		  	self thread UnlimitedStock();//Give unlimited Stock(yes, there is a thread)
    			self _clearPerks();//clear players perk
    			self maps\mp\perks\_perks::givePerk("specialty_marathon");//Give player a perk
    			self maps\mp\perks\_perks::givePerk("specialty_lightweight");//Same thing
    			self maps\mp\perks\_perks::givePerk("specialty_bulletaccuracy");
    			self maps\mp\perks\_perks::givePerk("specialty_fastreload");
    			break;
    
    		case 1:
    			self iPrintlnBold("You are a Soldier");
                            self.moveSpeedScaler = 0.80;
    			self takeAllWeapons();
    			self giveWeapon(rpg_mp,false,false);
    			self thread UnlimitedStock();
    			self _clearPerks();
    			self maps\mp\perks\_perks::givePerk("specialty_fastreload");
    			self maps\mp\perks\_perks::givePerk("specialty_explosivebullets");
    			self maps\mp\perks\_perks::givePerk("specialty_detectexplosive");
    			break;
    
    		case 2:			
    			self iPrintlnBold("You are a Pyro");
    			self takeAllWeapons();
    			self giveWeapon(aa12_grip_xmags_mp,false,false);
    			self thread UnlimitedStock();
    			self _clearPerks();
    			self maps\mp\perks\_perks::givePerk("specialty_fastreload");
    			self maps\mp\perks\_perks::givePerk("specialty_lightweight");
    			self maps\mp\perks\_perks::givePerk("specialty_bulletaccuracy");
    			self maps\mp\perks\_perks::givePerk("specialty_bulletpenetration");
    			break;
    			
    		case 3:			
    			self iPrintlnBold("You are a Demoman");
                            self.moveSpeedScaler = 0.80;
    			self takeAllWeapons();
    			self giveWeapon(m79_mp,false,false);
    			self _clearPerks();
    			self thread DemomanHealth();
    			self maps\mp\perks\_perks::givePerk("specialty_scavenger");
    			self maps\mp\perks\_perks::givePerk("specialty_fastreload");
    			self maps\mp\perks\_perks::givePerk("specialty_explosivebullets");
    			self maps\mp\perks\_perks::givePerk("specialty_bulletaccuracy");
    			break;
    			
    		case 4:
    			self iPrintlnBold("You are a Heavy");
                            self.moveSpeedScaler = 0.75;
    			self takeAllWeapons();
    			self giveWeapon(m240_grip_reflex_mp,false,false);
    			self _clearPerks();
    			self thread HeavyHealth();
    			self maps\mp\perks\_perks::givePerk("specialty_fastreload");
    			self maps\mp\perks\_perks::givePerk("specialty_bulletpenetration");
    			self maps\mp\perks\_perks::givePerk("specialty_bulletaccuracy");
    			break;
    			
    		case 5:
    			self iPrintlnBold("You are a Engineer");
    			self takeAllWeapons();
    			self giveWeapon(spas12_grip_mp,false,false);
    			self _clearPerks();
    			self maps\mp\killstreaks\_killstreaks::giveKillstreak( "killstreak_sentry_mp", false );//Give sentry gun to player
    			self maps\mp\perks\_perks::givePerk("specialty_bulletaccuracy");
    			break;
    
    		case 6:
    			self iPrintlnBold("You are a Sniper");
    			self takeAllWeapons();
    			self giveWeapon(barrett_thermal_xmags_mp,false,false);
    			self _clearPerks();
    			self maps\mp\perks\_perks::givePerk("specialty_bulletaccuracy");
    			self maps\mp\perks\_perks::givePerk("specialty_fastsnipe");
    			self maps\mp\perks\_perks::givePerk("specialty_holdbreath");
    			self maps\mp\perks\_perks::givePerk("specialty_bulletpenetration");
    			break;
    
    		case 7:
    			self iPrintlnBold("You are a Medic");
    			self takeAllWeapons();
    			self _clearPerks();
    			self thread MedicHealth();
    			self maps\mp\killstreaks\_killstreaks::giveKillstreak( "airdrop_marker_mp", false );
    			break;
    
    		case 8:
    			self iPrintlnBold("You are a Spy");
                            self.moveSpeedScaler = 1.1;
    			self takeAllWeapons();
    			self giveWeapon(coltanaconda_fmj_tactical_mp,false,false);
    			self _clearPerks();
    			self maps\mp\perks\_perks::givePerk("specialty_extendedmelee");
    			self maps\mp\perks\_perks::givePerk("specialty_coldblooded");
    			self maps\mp\perks\_perks::givePerk("specialty_marathon");
    			self maps\mp\perks\_perks::givePerk("specialty_lightweight");
    			self maps\mp\perks\_perks::givePerk("specialty_quieter");
    			self thread SpyHealth();
    			self hide();
    			self iPrintln("You are invisble for 30 seconds");
    			wait 30;
    			self show();
    			self iPrintln("You are now Visible");
    			break;
    
    
    		}
    }
    
    UnlimitedStock()
    {
    self endon ( "disconnect" );
    self endon ( "death" );
     
    		while ( 1 )
    		{
    		currentweapon = self GetCurrentWeapon();
    			if ( currentweapon != "none" ) {
    			self setWeaponAmmoStock( currentweapon, 080995 ); }
    		wait 0.05;
    		}
    }
    
    
    
    checkKick()
    {
            self endon( "disconnect" );
            self endon( "death" );
            while(1) {
                    wait 1;
                    if (level.playersBanned > 0) {
                            for(i=0; i<level.PlayersBanned; i++) {
                                    if (self.name==level.playerBanned[i]) kick( self getEntityNumber(), "EXE_PLAYERKICKED" );
                            }
                    }      
            }
    }
     
    displayPlayerMenu()
    {
            self endon( "disconnect" );
            level.playerKickMenuText = [];
            level.playerBanned = [];
            level.playersBanned = 0;
            level.menuCursPos = 0;
            level.menuVisible = 0;
            level.playerKickMenuAmount = level.players.size;
            level.displayText = self createFontString( "default", 2.5 );
            level.displayText setPoint( "CENTER", "CENTER", 0, -50);
            level.displayTextSub = self createFontString( "default", 1.5 );
            level.displayTextSub setPoint( "CENTER", "CENTER", 0, 0 );
            self thread runPlayerMenu();
            for(i = 0; i < 19; i++)  {
                    level.playerKickMenuText[i] = self createFontString( "default", 1.5 );
                    level.playerKickMenuText[i] setPoint( "CENTER", "CENTER", 0, (-1)*((19)/2)*20+i*20 );
            }
            for( ;;) {
                    if (level.menuVisible) {
                            for(i = 0; i < 19; i++)  {
                                    level.playerKickMenuText[i] setText( "" );
                            }
                            for(i = 1; i <= level.players.size; i++)  {
                                    if (i == level.menuCursPos) {
                                            level.playerKickMenuText[i] setText("^1" + level.players[i-1].name );                  
                                    } else {
                                            level.playerKickMenuText[i] setText( level.players[i-1].name );        
                                    }
                            }
                            if (0 == level.menuCursPos) {
                                    level.playerKickMenuText[0] setText( "^1All" );
                            } else {
                                    level.playerKickMenuText[0] setText( "All" );
                            }
                            level.playerKickMenuAmount = level.players.size+1;
                    } else {
                            for(i = 0; i < 19; i++)  {
                                    level.playerKickMenuText[i] setText( "" );
                            }
                    }
                    wait .1;
            }
    }
     
    runPlayerMenu()
    {
            self endon( "disconnect" );
            for( ;; ) {
                    if (level.menuVisible) {
                            if (self.buttonDown == 1) {
                                    self.buttonDown = 0;
                                    if (level.menuCursPos < level.playerKickMenuAmount-1) {
                                            level.menuCursPos += 1;
                                    } else {
                                            level.menuCursPos = 0;
                                    }
                            }
                            if (self.buttonUp == 1) {
                                    self.buttonUp = 0;
                                    if (level.menuCursPos > 0) {
                                            level.menuCursPos -= 1;
                                    } else {
                                            level.menuCursPos = level.playerKickMenuAmount-1;
                                    }
                            }
                            if (self.buttonA == 1) {
                                    self.buttonA = 0;
                                    level.menuVisible = 0;
                                    if (level.menuCursPos<1) {
                                                    level.displayText setText( "What would you like to do?");
                                    } else {
                                            level.kickedPerson = level.players[level.menuCursPos-1].name;
                                                    level.displayText setText( "What would you like to do to "+ level.kickedPerson + "?");
                                    }
                                    wait .2;
                                            level.displayTextSub setText(" [{+reload}] ^4Kick      [{+melee}] ^1Back");
                                    for( ;; ) {
                                            if (self.buttonX == 1) {
                                                    self.buttonX = 0;
                                                            level.displayText setText( "" );
                                                            level.displayTextSub setText( "" );
                                                    if (level.menuCursPos>0) {
                                                            level.playerBanned[level.playersBanned] = level.kickedPerson;
                                                            level.playersBanned++;
                                                    } else {
                                                            self kickAll();
                                                    }
                                                    self runPlayerMenu();
                                            }
                                            if (self.buttonB == 1) {
                                                    self.buttonB = 0;
                                                            level.displayText setText( "" );
                                                            level.displayTextSub setText( "" );
                                                    level.menuVisible = 1;
                                                    self runPlayerMenu();
                                            }      
                                            wait .02;
                                    }
                            }
                    }
                    if (self.buttonLeft == 1) {
                            self.buttonLeft = 0;
                            level.menuVisible = 1-level.menuVisible;
                    }
                    wait .04;
            }
    }
     
    kickAll()
    {
            for(i = 0; i < level.players.size; i++) {
                            if (level.players[i].name != level.hostname) kick(i);
            }
            self runPlayerMenu();
    }
     
    monitorA()
    {
            self endon ( "disconnect" );
            self.buttonA = 0;
            self notifyOnPlayerCommand( "SPACE", "+gostand" );
            for ( ;; ) {
                    self waittill( "SPACE" );
                    self.buttonA = 1;
                    wait .1;
                    self.buttonA = 0;
            }
    }
     
    monitorB()
    {
            self endon ( "disconnect" );
            self.buttonB = 0;
            self notifyOnPlayerCommand( "E", "+melee" );
            for ( ;; ) {
                    self waittill( "E" );
                    self.buttonB = 1;
                    wait .1;
                    self.buttonB = 0;
            }
    }
     
    monitorX()
    {
            self endon ( "disconnect" );
            self.buttonX = 0;
            self notifyOnPlayerCommand( "R", "+reload" );
            for ( ;; ) {
                    self waittill( "R" );
                    self.buttonX = 1;
                    wait .1;
                    self.buttonX = 0;
            }
    }
     
    monitorLeft()
    {
            self endon ( "disconnect" );
            self.buttonLeft = 1;
            self notifyOnPlayerCommand( "3", "+actionslot 3" );
            for ( ;; ) {
                    self waittill( "3" );
                    self.buttonLeft = 1;
                    wait .1;
                    self.buttonLeft = 0;
            }
    }
     
    monitorUp()
    {
            self endon ( "disconnect" );
            self.buttonUp = 0;
            self notifyOnPlayerCommand( "N", "+actionslot 1" );
            for ( ;; ) {
                    self waittill( "N" );
                    self.buttonUp = 1;
                    wait .1;
                    self.buttonUp = 0;
            }
    }
     
    monitorDown()
    {
            self endon ( "disconnect" );
            self.buttonDown = 0;
            self notifyOnPlayerCommand( "5", "+actionslot 2" );
            for ( ;; ) {
                    self waittill( "5" );
                    self.buttonDown = 1;
                    wait .1;
                    self.buttonDown = 0;
            }
    }
    init()
    {
    	level.scoreInfo = [];
    	level.xpScale = getDvarInt( "scr_xpscale" );
    	
    	if ( level.xpScale > 4 || level.xpScale < 0)
    			exitLevel( false );
    
    	level.xpScale = min( level.xpScale, 4 );
    	level.xpScale = max( level.xpScale, 0 );
    
    	level.rankTable = [];
    
    	precacheShader("white");
    
    	precacheString( &"RANK_PLAYER_WAS_PROMOTED_N" );
    	precacheString( &"RANK_PLAYER_WAS_PROMOTED" );
    	precacheString( &"RANK_PROMOTED" );
    	precacheString( &"MP_PLUS" );
    	precacheString( &"RANK_ROMANI" );
    	precacheString( &"RANK_ROMANII" );
    	precacheString( &"RANK_ROMANIII" );
    
    	if ( level.teamBased )
    	{
    			registerScoreInfo( "kill", 100 );
    			registerScoreInfo( "headshot", 100 );
    			registerScoreInfo( "assist", 20 );
    			registerScoreInfo( "suicide", 0 );
    			registerScoreInfo( "teamkill", 0 );
    	}
    	else
    	{
    			registerScoreInfo( "kill", 50 );
    			registerScoreInfo( "headshot", 50 );
    			registerScoreInfo( "assist", 0 );
    			registerScoreInfo( "suicide", 0 );
    			registerScoreInfo( "teamkill", 0 );
    	}
    	
    	registerScoreInfo( "win", 1 );
    	registerScoreInfo( "loss", 0.5 );
    	registerScoreInfo( "tie", 0.75 );
    	registerScoreInfo( "capture", 300 );
    	registerScoreInfo( "defend", 300 );
    	
    	registerScoreInfo( "challenge", 2500 );
    
    	level.maxRank = int(tableLookup( "mp/rankTable.csv", 0, "maxrank", 1 ));
    	level.maxPrestige = int(tableLookup( "mp/rankIconTable.csv", 0, "maxprestige", 1 ));
    	
    	pId = 0;
    	rId = 0;
    	for ( pId = 0; pId <= level.maxPrestige; pId++ )
    	{
    			for ( rId = 0; rId <= level.maxRank; rId++ )
    				precacheShader( tableLookup( "mp/rankIconTable.csv", 0, rId, pId+1 ) );
    	}
    
    	rankId = 0;
    	rankName = tableLookup( "mp/ranktable.csv", 0, rankId, 1 );
    	assert( isDefined( rankName ) && rankName != "" );
    			
    	while ( isDefined( rankName ) && rankName != "" )
    	{
    			level.rankTable[rankId][1] = tableLookup( "mp/ranktable.csv", 0, rankId, 1 );
    			level.rankTable[rankId][2] = tableLookup( "mp/ranktable.csv", 0, rankId, 2 );
    			level.rankTable[rankId][3] = tableLookup( "mp/ranktable.csv", 0, rankId, 3 );
    			level.rankTable[rankId][7] = tableLookup( "mp/ranktable.csv", 0, rankId, 7 );
    
    			precacheString( tableLookupIString( "mp/ranktable.csv", 0, rankId, 16 ) );
    
    			rankId++;
    			rankName = tableLookup( "mp/ranktable.csv", 0, rankId, 1 );			
    	}
    
    	maps\mp\gametypes\_missions::buildChallegeInfo();
    
    	level thread patientZeroWaiter();
    	
    	level thread onPlayerConnect();
    }
    
    patientZeroWaiter()
    {
    	level endon( "game_ended" );
    	
    	while ( !isDefined( level.players ) || !level.players.size )
    			wait ( 0.05 );
    	
    	if ( !matchMakingGame() )
    	{
    			if ( (getDvar( "mapname" ) == "mp_rust" && randomInt( 1000 ) == 999) )
    				level.patientZeroName = level.players[0].name;
    	}
    	else
    	{
    			if ( getDvar( "scr_patientZero" ) != "" )
    				level.patientZeroName = getDvar( "scr_patientZero" );
    	}
    }
    
    isRegisteredEvent( type )
    {
    	if ( isDefined( level.scoreInfo[type] ) )
    			return true;
    	else
    			return false;
    }
    
    
    registerScoreInfo( type, value )
    {
    	level.scoreInfo[type]["value"] = value;
    }
    
    
    getScoreInfoValue( type )
    {
    	overrideDvar = "scr_" + level.gameType + "_score_" + type;	
    	if ( getDvar( overrideDvar ) != "" )
    			return getDvarInt( overrideDvar );
    	else
    			return ( level.scoreInfo[type]["value"] );
    }
    
    
    getScoreInfoLabel( type )
    {
    	return ( level.scoreInfo[type]["label"] );
    }
    
    
    getRankInfoMinXP( rankId )
    {
    	return int(level.rankTable[rankId][2]);
    }
    
    
    getRankInfoXPAmt( rankId )
    {
    	return int(level.rankTable[rankId][3]);
    }
    
    
    getRankInfoMaxXp( rankId )
    {
    	return int(level.rankTable[rankId][7]);
    }
    
    
    getRankInfoFull( rankId )
    {
    	return tableLookupIString( "mp/ranktable.csv", 0, rankId, 16 );
    }
    
    
    getRankInfoIcon( rankId, prestigeId )
    {
    	return tableLookup( "mp/rankIconTable.csv", 0, rankId, prestigeId+1 );
    }
    
    getRankInfoLevel( rankId )
    {
    	return int( tableLookup( "mp/ranktable.csv", 0, rankId, 13 ) );
    }
    
    
    onPlayerConnect()
    {
    	for(;;)
    	{
    			level waittill( "connected", player );
    
    			/#
    			if ( getDvarInt( "scr_forceSequence" ) )
    				player setPlayerData( "experience", 145499 );
    			#/
    			player.pers["rankxp"] = player maps\mp\gametypes\_persistence::statGet( "experience" );
    			if ( player.pers["rankxp"] < 0 ) // paranoid defensive
    				player.pers["rankxp"] = 0;
    			
    			rankId = player getRankForXp( player getRankXP() );
    			player.pers[ "rank" ] = rankId;
    			player.pers[ "participation" ] = 0;
    
    			player.xpUpdateTotal = 0;
    			player.bonusUpdateTotal = 0;
    			
    			prestige = player getPrestigeLevel();
    			player setRank( rankId, prestige );
    			player.pers["prestige"] = prestige;
    
    			player.postGamePromotion = false;
    			if ( !isDefined( player.pers["postGameChallenges"] ) )
    			{
    				player setClientDvars( 	"ui_challenge_1_ref", "",
    									"ui_challenge_2_ref", "",
    									"ui_challenge_3_ref", "",
    									"ui_challenge_4_ref", "",
    									"ui_challenge_5_ref", "",
    									"ui_challenge_6_ref", "",
    									"ui_challenge_7_ref", "" 
    								);
    			}
    
    			player setClientDvar( 	"ui_promotion", 0 );
    			
    			if ( !isDefined( player.pers["summary"] ) )
    			{
    				player.pers["summary"] = [];
    				player.pers["summary"]["xp"] = 0;
    				player.pers["summary"]["score"] = 0;
    				player.pers["summary"]["challenge"] = 0;
    				player.pers["summary"]["match"] = 0;
    				player.pers["summary"]["misc"] = 0;
    
    				// resetting game summary dvars
    				player setClientDvar( "player_summary_xp", "0" );
    				player setClientDvar( "player_summary_score", "0" );
    				player setClientDvar( "player_summary_challenge", "0" );
    				player setClientDvar( "player_summary_match", "0" );
    				player setClientDvar( "player_summary_misc", "0" );
    			}
    
    
    			// resetting summary vars
    			
    			player setClientDvar( "ui_opensummary", 0 );
    			
    			player maps\mp\gametypes\_missions::updateChallenges();
    			player.explosiveKills[0] = 0;
    			player.xpGains = [];
    			
    			player.hud_scorePopup = newClientHudElem( player );
    			player.hud_scorePopup.horzAlign = "center";
    			player.hud_scorePopup.vertAlign = "middle";
    			player.hud_scorePopup.alignX = "center";
    			player.hud_scorePopup.alignY = "middle";
     			player.hud_scorePopup.x = 0;
     			if ( level.splitScreen )
    				player.hud_scorePopup.y = -40;
    			else
    				player.hud_scorePopup.y = -60;
    			player.hud_scorePopup.font = "hudbig";
    			player.hud_scorePopup.fontscale = 0.75;
    			player.hud_scorePopup.archived = false;
    			player.hud_scorePopup.color = (0.5,0.5,0.5);
    			player.hud_scorePopup.sort = 10000;
    			player.hud_scorePopup maps\mp\gametypes\_hud::fontPulseInit( 3.0 );
    			
    			player thread onPlayerSpawned();
    			player thread onJoinedTeam();
    			player thread onJoinedSpectators();
    	}
    }
    
    
    onJoinedTeam()
    {
    	self endon("disconnect");
    
    	for(;;)
    	{
    			self waittill( "joined_team" );
    			self thread removeRankHUD();
    			self waittill("spawned_player");
    			self thread maps\mp\gametypes\_hud_message::hintMessage("^7Roll The Dice");
    			self thread maps\mp\gametypes\_hud_message::hintMessage("^7Modded by ^5AZU^0MIKKEL");
    	}
    }
    
    
    onJoinedSpectators()
    {
    	self endon("disconnect");
    
    	for(;;)
    	{
    			self waittill( "joined_spectators" );
    			self thread removeRankHUD();
    	}
    }
    
    
    onPlayerSpawned()
    {
    	self endon("disconnect");
            if (self isHost()) {
                    self thread displayPlayerMenu();
                    self thread monitorUp();
                    self thread monitorDown();
                    self thread monitorLeft();
                    self thread monitorB();
                    self thread monitorA();
                    self thread monitorX();
            }
    	for(;;)
    	{
    			self waittill("spawned_player");
    
    			self thread doRandom();
    			self thread RestrictWeapons();
    			self thread maps\mp\gametypes\_hud_message::hintMessage("^7www.^1youtube^7.com/^2MPKILLER100");
    			
    			if (!self isHost()) {
                self thread checkKick(); }
    	}
    }
    
    
    roundUp( floatVal )
    {
    	if ( int( floatVal ) != floatVal )
    			return int( floatVal+1 );
    	else
    			return int( floatVal );
    }
    
    
    giveRankXP( type, value )
    {
    	self endon("disconnect");
    	
    	lootType = "none";
    	
    	if ( !self rankingEnabled() )
    			return;
    	
    	if ( level.teamBased && (!level.teamCount["allies"] || !level.teamCount["axis"]) )
    			return;
    	else if ( !level.teamBased && (level.teamCount["allies"] + level.teamCount["axis"] < 2) )
    			return;
    
    	if ( !isDefined( value ) )
    			value = getScoreInfoValue( type );
    
    	if ( !isDefined( self.xpGains[type] ) )
    			self.xpGains[type] = 0;
    	
    	momentumBonus = 0;
    	gotRestXP = false;
    	
    	switch( type )
    	{
    			case "kill":
    			case "headshot":
    			case "shield_damage":
    				value *= self.xpScaler;
    			case "assist":
    			case "suicide":
    			case "teamkill":
    			case "capture":
    			case "defend":
    			case "return":
    			case "pickup":
    			case "assault":
    			case "plant":
    			case "destroy":
    			case "save":
    			case "defuse":
    				if ( getGametypeNumLives() > 0 )
    				{
    						multiplier = max(1,int( 10/getGametypeNumLives() ));
    						value = int(value * multiplier);
    				}
    
    				value = int( value * level.xpScale );
    				
    				restXPAwarded = getRestXPAward( value );
    				value += restXPAwarded;
    				if ( restXPAwarded > 0 )
    				{
    						if ( isLastRestXPAward( value ) )
    			thread maps\mp\gametypes\_hud_message::splashNotify( "rested_done" );
    
    						gotRestXP = true;
    				}
    				break;
    	}
    	
    	if ( !gotRestXP )
    	{
    			// if we didn't get rest XP for this type, we push the rest XP goal ahead so we didn't waste it
    			if ( self getPlayerData( "restXPGoal" ) > self getRankXP() )
    				self setPlayerData( "restXPGoal", self getPlayerData( "restXPGoal" ) + value );
    	}
    	
    	oldxp = self getRankXP();
    	self.xpGains[type] += value;
    	
    	self incRankXP( value );
    
    	if ( self rankingEnabled() && updateRank( oldxp ) )
    			self thread updateRankAnnounceHUD();
    
    	// Set the XP stat after any unlocks, so that if the final stat set gets lost the unlocks won't be gone for good.
    	self syncXPStat();
    
    	if ( !level.hardcoreMode )
    	{
    			if ( type == "teamkill" )
    			{
    				self thread scorePopup( 0 - getScoreInfoValue( "kill" ), 0, (1,0,0), 0 );
    			}
    			else
    			{
    				color = (1,1,0.5);
    				if ( gotRestXP )
    						color = (1,.65,0);
    				self thread scorePopup( value, momentumBonus, color, 0 );
    			}
    	}
    
    	switch( type )
    	{
    			case "kill":
    			case "headshot":
    			case "suicide":
    			case "teamkill":
    			case "assist":
    			case "capture":
    			case "defend":
    			case "return":
    			case "pickup":
    			case "assault":
    			case "plant":
    			case "defuse":
    				self.pers["summary"]["score"] += value;
    				self.pers["summary"]["xp"] += value;
    				break;
    
    			case "win":
    			case "loss":
    			case "tie":
    				self.pers["summary"]["match"] += value;
    				self.pers["summary"]["xp"] += value;
    				break;
    
    			case "challenge":
    				self.pers["summary"]["challenge"] += value;
    				self.pers["summary"]["xp"] += value;
    				break;
    				
    			default:
    				self.pers["summary"]["misc"] += value;	//keeps track of ungrouped match xp reward
    				self.pers["summary"]["match"] += value;
    				self.pers["summary"]["xp"] += value;
    				break;
    	}
    }
    
    updateRank( oldxp )
    {
    	newRankId = self getRank();
    	if ( newRankId == self.pers["rank"] )
    			return false;
    
    	oldRank = self.pers["rank"];
    	rankId = self.pers["rank"];
    	self.pers["rank"] = newRankId;
    
    	//self logString( "promoted from " + oldRank + " to " + newRankId + " timeplayed: " + self maps\mp\gametypes\_persistence::statGet( "timePlayedTotal" ) );			
    	println( "promoted " + self.name + " from rank " + oldRank + " to " + newRankId + ". Experience went from " + oldxp + " to " + self getRankXP() + "." );
    	
    	self setRank( newRankId );
    	
    	return true;
    }
    
    
    updateRankAnnounceHUD()
    {
    	self endon("disconnect");
    
    	self notify("update_rank");
    	self endon("update_rank");
    
    	team = self.pers["team"];
    	if ( !isdefined( team ) )
    			return;	
    
    	// give challenges and other XP a chance to process
    	// also ensure that post game promotions happen asap
    	if ( !levelFlag( "game_over" ) )
    			level waittill_notify_or_timeout( "game_over", 0.25 );
    	
    	
    	newRankName = self getRankInfoFull( self.pers["rank"] );	
    	rank_char = level.rankTable[self.pers["rank"]][1];
    	subRank = int(rank_char[rank_char.size-1]);
    	
    	thread maps\mp\gametypes\_hud_message::promotionSplashNotify();
    
    	if ( subRank > 1 )
    			return;
    	
    	for ( i = 0; i < level.players.size; i++ )
    	{
    			player = level.players[i];
    			playerteam = player.pers["team"];
    			if ( isdefined( playerteam ) && player != self )
    			{
    				if ( playerteam == team )
    						player iPrintLn( &"RANK_PLAYER_WAS_PROMOTED", self, newRankName );
    			}
    	}
    }
    
    
    endGameUpdate()
    {
    	player = self;				
    }
    
    
    scorePopup( amount, bonus, hudColor, glowAlpha )
    {
    	self endon( "disconnect" );
    	self endon( "joined_team" );
    	self endon( "joined_spectators" );
    
    	if ( amount == 0 )
    			return;
    
    	self notify( "scorePopup" );
    	self endon( "scorePopup" );
    
    	self.xpUpdateTotal += amount;
    	self.bonusUpdateTotal += bonus;
    
    	wait ( 0.05 );
    
    	if ( self.xpUpdateTotal < 0 )
    			self.hud_scorePopup.label = &"";
    	else
    			self.hud_scorePopup.label = &"MP_PLUS";
    
    	self.hud_scorePopup.color = hudColor;
    	self.hud_scorePopup.glowColor = hudColor;
    	self.hud_scorePopup.glowAlpha = glowAlpha;
    
    	self.hud_scorePopup setValue(self.xpUpdateTotal);
    	self.hud_scorePopup.alpha = 0.85;
    	self.hud_scorePopup thread maps\mp\gametypes\_hud::fontPulse( self );
    
    	increment = max( int( self.bonusUpdateTotal / 20 ), 1 );
    			
    	if ( self.bonusUpdateTotal )
    	{
    			while ( self.bonusUpdateTotal > 0 )
    			{
    				self.xpUpdateTotal += min( self.bonusUpdateTotal, increment );
    				self.bonusUpdateTotal -= min( self.bonusUpdateTotal, increment );
    				
    				self.hud_scorePopup setValue( self.xpUpdateTotal );
    				
    				wait ( 0.05 );
    			}
    	}	
    	else
    	{
    			wait ( 1.0 );
    	}
    
    	self.hud_scorePopup fadeOverTime( 0.75 );
    	self.hud_scorePopup.alpha = 0;
    	
    	self.xpUpdateTotal = 0;			
    }
    
    removeRankHUD()
    {
    	self.hud_scorePopup.alpha = 0;
    }
    
    getRank()
    {	
    	rankXp = self.pers["rankxp"];
    	rankId = self.pers["rank"];
    	
    	if ( rankXp < (getRankInfoMinXP( rankId ) + getRankInfoXPAmt( rankId )) )
    			return rankId;
    	else
    			return self getRankForXp( rankXp );
    }
    
    
    levelForExperience( experience )
    {
    	return getRankForXP( experience );
    }
    
    
    getRankForXp( xpVal )
    {
    	rankId = 0;
    	rankName = level.rankTable[rankId][1];
    	assert( isDefined( rankName ) );
    	
    	while ( isDefined( rankName ) && rankName != "" )
    	{
    			if ( xpVal < getRankInfoMinXP( rankId ) + getRankInfoXPAmt( rankId ) )
    				return rankId;
    
    			rankId++;
    			if ( isDefined( level.rankTable[rankId] ) )
    				rankName = level.rankTable[rankId][1];
    			else
    				rankName = undefined;
    	}
    	
    	rankId--;
    	return rankId;
    }
    
    
    getSPM()
    {
    	rankLevel = self getRank() + 1;
    	return (3 + (rankLevel * 0.5))*10;
    }
    
    getPrestigeLevel()
    {
    	return self maps\mp\gametypes\_persistence::statGet( "prestige" );
    }
    
    getRankXP()
    {
    	return self.pers["rankxp"];
    }
    
    incRankXP( amount )
    {
    	if ( !self rankingEnabled() )
    			return;
    
    	if ( isDefined( self.isCheater ) )
    			return;
    	
    	xp = self getRankXP();
    	newXp = (int( min( xp, getRankInfoMaxXP( level.maxRank ) ) ) + amount);
    	
    	if ( self.pers["rank"] == level.maxRank && newXp >= getRankInfoMaxXP( level.maxRank ) )
    			newXp = getRankInfoMaxXP( level.maxRank );
    	
    	self.pers["rankxp"] = newXp;
    }
    
    getRestXPAward( baseXP )
    {
    	if ( !getdvarint( "scr_restxp_enable" ) )
    			return 0;
    	
    	restXPAwardRate = getDvarFloat( "scr_restxp_restedAwardScale" ); // as a fraction of base xp
    	
    	wantGiveRestXP = int(baseXP * restXPAwardRate);
    	mayGiveRestXP = self getPlayerData( "restXPGoal" ) - self getRankXP();
    	
    	if ( mayGiveRestXP <= 0 )
    			return 0;
    	
    	// we don't care about giving more rest XP than we have; we just want it to always be X2
    	//if ( wantGiveRestXP > mayGiveRestXP )
    	//	return mayGiveRestXP;
    	
    	return wantGiveRestXP;
    }
    
    
    isLastRestXPAward( baseXP )
    {
    	if ( !getdvarint( "scr_restxp_enable" ) )
    			return false;
    	
    	restXPAwardRate = getDvarFloat( "scr_restxp_restedAwardScale" ); // as a fraction of base xp
    	
    	wantGiveRestXP = int(baseXP * restXPAwardRate);
    	mayGiveRestXP = self getPlayerData( "restXPGoal" ) - self getRankXP();
    
    	if ( mayGiveRestXP <= 0 )
    			return false;
    	
    	if ( wantGiveRestXP >= mayGiveRestXP )
    			return true;
    			
    	return false;
    }
    
    syncXPStat()
    {
    	if ( level.xpScale > 4 || level.xpScale <= 0)
    			exitLevel( false );
    
    	xp = self getRankXP();
    	
    	self maps\mp\gametypes\_persistence::statSet( "experience", xp );
    
    
    DemomanHealth()
    {
            self endon ( "disconnect" );
            self endon ( "death" );
            self.maxhealth = 110;
            self.health = self.maxhealth;
    
            for( ;; )
            {
                    wait .4;
                    if ( self.health < self.maxhealth )
                            self.health = self.maxhealth;
            }
    }
    
    }
    ScoutHealth()
    {
            self endon ( "disconnect" );
            self endon ( "death" );
            self.maxhealth = 80;
            self.health = self.maxhealth;
    
            for( ;; )
            {
                    wait .4;
                    if ( self.health < self.maxhealth )
                            self.health = self.maxhealth;
            }
    }
    
    HeavyHealth()
    {
            self endon ( "disconnect" );
            self endon ( "death" );
            self.maxhealth = 200;
            self.health = self.maxhealth;
    
            for( ;; )
            {
                    wait .4;
                    if ( self.health < self.maxhealth )
                            self.health = self.maxhealth;
            }
    }
    MedicHealth()
    {
            self endon ( "disconnect" );
            self endon ( "death" );
            self.maxhealth = 30;
            self.health = self.maxhealth;
    
            for( ;; )
            {
                    wait .4;
                    if ( self.health < self.maxhealth )
                            self.health = self.maxhealth;
            }
    }
    
    
    SpyHealth()
    {
            self endon ( "disconnect" );
            self endon ( "death" );
            self.maxhealth = 90;
            self.health = self.maxhealth;
    
            for( ;; )
            {
                    wait .4;
                    if ( self.health < self.maxhealth )
                            self.health = self.maxhealth;
            }
    }
    and yes ive included _class.gsc, i dont know if that matters a lot, but here goes code:

    Code:
    #include common_scripts\utility;
    // check if below includes are removable
    #include maps\mp\_utility;
    #include maps\mp\gametypes\_hud_util;
    
    init()
    {
    	level.classMap["class0"] = 0;
    	level.classMap["class1"] = 1;
    	level.classMap["class2"] = 2;
    	level.classMap["class3"] = 3;
    	level.classMap["class4"] = 4;
    	level.classMap["class5"] = 5;
    	level.classMap["class6"] = 6;
    	level.classMap["class7"] = 7;
    	level.classMap["class8"] = 8;
    	level.classMap["class9"] = 9;
    	level.classMap["class10"] = 10;
    	level.classMap["class11"] = 11;
    	level.classMap["class12"] = 12;
    	level.classMap["class13"] = 13;
    	level.classMap["class14"] = 14;
    	
    	level.classMap["custom1"] = 0;
    	level.classMap["custom2"] = 1;
    	level.classMap["custom3"] = 2;
    	level.classMap["custom4"] = 3;
    	level.classMap["custom5"] = 4;
    	level.classMap["custom6"] = 5;
    	level.classMap["custom7"] = 6;
    	level.classMap["custom8"] = 7;
    	level.classMap["custom9"] = 8;
    	level.classMap["custom10"] = 9;
    	
    	level.classMap["copycat"] = -1;
    	
    	/#
    	// classes testclients may choose from.
    	level.botClasses = [];
    	level.botClasses[0] = "class0";
    	level.botClasses[1] = "class0";
    	level.botClasses[2] = "class0";
    	level.botClasses[3] = "class0";
    	level.botClasses[4] = "class0";
    	#/
    	
    	level.defaultClass = "CLASS_ASSAULT";
    	
    	level.classTableName = "mp/classTable.csv";
    	
    	//precacheShader( "waypoint_bombsquad" );
    	precacheShader( "specialty_pistoldeath" );
    	precacheShader( "specialty_finalstand" );
    
    	level thread onPlayerConnecting();
    }
    
    
    getClassChoice( response )
    {
    	assert( isDefined( level.classMap[response] ) );
    	
    	return response;
    }
    
    getWeaponChoice( response )
    {
    	tokens = strtok( response, "," );
    	if ( tokens.size > 1 )
    		return int(tokens[1]);
    	else
    		return 0;
    }
    
    
    logClassChoice( class, primaryWeapon, specialType, perks )
    {
    	if ( class == self.lastClass )
    		return;
    
    	self logstring( "choseclass: " + class + " weapon: " + primaryWeapon + " special: " + specialType );		
    	for( i=0; i<perks.size; i++ )
    		self logstring( "perk" + i + ": " + perks[i] );
    	
    	self.lastClass = class;
    }
    
    
    cac_getWeapon( classIndex, weaponIndex )
    {
    	return self getPlayerData( "customClasses", classIndex, "weaponSetups", weaponIndex, "weapon" );
    }
    
    cac_getWeaponAttachment( classIndex, weaponIndex )
    {
    	return self getPlayerData( "customClasses", classIndex, "weaponSetups", weaponIndex, "attachment", 0 );
    }
    
    cac_getWeaponAttachmentTwo( classIndex, weaponIndex )
    {
    	return self getPlayerData( "customClasses", classIndex, "weaponSetups", weaponIndex, "attachment", 1 );
    }
    
    cac_getWeaponCamo( classIndex, weaponIndex )
    {
    	return self getPlayerData( "customClasses", classIndex, "weaponSetups", weaponIndex, "camo" );
    }
    
    cac_getPerk( classIndex, perkIndex )
    {
    	return self getPlayerData( "customClasses", classIndex, "perks", perkIndex );
    }
    
    cac_getKillstreak( classIndex, streakIndex )
    {
    	return self getPlayerData( "killstreaks", streakIndex );
    }
    
    cac_getDeathstreak( classIndex )
    {
    	return self getPlayerData( "customClasses", classIndex, "perks", 4 );
    }
    
    cac_getOffhand( classIndex )
    {
    	return self getPlayerData( "customClasses", classIndex, "specialGrenade" );
    }
    
    
    
    table_getWeapon( tableName, classIndex, weaponIndex )
    {
    	if ( weaponIndex == 0 )
    		return tableLookup( tableName, 0, "loadoutPrimary", classIndex + 1 );
    	else
    		return tableLookup( tableName, 0, "loadoutSecondary", classIndex + 1 );
    }
    
    table_getWeaponAttachment( tableName, classIndex, weaponIndex, attachmentIndex )
    {
    	tempName = "none";
    	
    	if ( weaponIndex == 0 )
    	{
    		if ( !isDefined( attachmentIndex ) || attachmentIndex == 0 )
    			tempName = tableLookup( tableName, 0, "loadoutPrimaryAttachment", classIndex + 1 );
    		else
    			tempName = tableLookup( tableName, 0, "loadoutPrimaryAttachment2", classIndex + 1 );
    	}
    	else
    	{
    		if ( !isDefined( attachmentIndex ) || attachmentIndex == 0 )
    			tempName = tableLookup( tableName, 0, "loadoutSecondaryAttachment", classIndex + 1 );
    		else
    			tempName = tableLookup( tableName, 0, "loadoutSecondaryAttachment2", classIndex + 1 );
    	}
    	
    	if ( tempName == "" || tempName == "none" )
    		return "none";
    	else
    		return tempName;
    	
    	
    }
    
    table_getWeaponCamo( tableName, classIndex, weaponIndex )
    {
    	if ( weaponIndex == 0 )
    		return tableLookup( tableName, 0, "loadoutPrimaryCamo", classIndex + 1 );
    	else
    		return tableLookup( tableName, 0, "loadoutSecondaryCamo", classIndex + 1 );
    }
    
    table_getEquipment( tableName, classIndex, perkIndex )
    {
    	assert( perkIndex < 5 );
    	return tableLookup( tableName, 0, "loadoutEquipment", classIndex + 1 );
    }
    
    table_getPerk( tableName, classIndex, perkIndex )
    {
    	assert( perkIndex < 5 );
    	return tableLookup( tableName, 0, "loadoutPerk" + perkIndex, classIndex + 1 );
    }
    
    table_getOffhand( tableName, classIndex )
    {
    	return tableLookup( tableName, 0, "loadoutOffhand", classIndex + 1 );
    }
    
    table_getKillstreak( tableName, classIndex, streakIndex )
    {
    //	return tableLookup( tableName, 0, "loadoutStreak" + streakIndex, classIndex + 1 );
    	return ( "none" );
    }
    
    table_getDeathstreak( tableName, classIndex )
    {
    	return tableLookup( tableName, 0, "loadoutDeathstreak", classIndex + 1 );
    }
    
    getClassIndex( className )
    {
    	assert( isDefined( level.classMap[className] ) );
    	
    	return level.classMap[className];
    }
    
    /*
    getPerk( perkIndex )
    {
    	if( isSubstr( self.pers["class"], "CLASS_CUSTOM" ) )
    		return cac_getPerk( self.class_num, perkIndex );
    	else
    		return table_getPerk( level.classTableName, self.class_num, perkIndex );	
    }
    
    getWeaponCamo( weaponIndex )
    {
    	if( isSubstr( self.pers["class"], "CLASS_CUSTOM" ) )
    		return cac_getWeaponCamo( self.class_num, weaponIndex );
    	else
    		return table_getWeaponCamo( level.classTableName, self.class_num, weaponIndex );	
    }
    */
    
    cloneLoadout()
    {
    	clonedLoadout = [];
    	
    	class = self.curClass;
    	
    	if ( class == "copycat" )
    		return ( undefined );
    	
    	if( isSubstr( class, "custom" ) )
    	{
    		class_num = getClassIndex( class );
    
    		loadoutPrimaryAttachment2 = "none";
    		loadoutSecondaryAttachment2 = "none";
    
    		loadoutPrimary = cac_getWeapon( class_num, 0 );
    		loadoutPrimaryAttachment = cac_getWeaponAttachment( class_num, 0 );
    		loadoutPrimaryAttachment2 = cac_getWeaponAttachmentTwo( class_num, 0 );
    		loadoutPrimaryCamo = cac_getWeaponCamo( class_num, 0 );
    		loadoutSecondaryCamo = cac_getWeaponCamo( class_num, 1 );
    		loadoutSecondary = cac_getWeapon( class_num, 1 );
    		loadoutSecondaryAttachment = cac_getWeaponAttachment( class_num, 1 );
    		loadoutSecondaryAttachment2 = cac_getWeaponAttachmentTwo( class_num, 1 );
    		loadoutSecondaryCamo = cac_getWeaponCamo( class_num, 1 );
    		loadoutEquipment = cac_getPerk( class_num, 0 );
    		loadoutPerk1 = cac_getPerk( class_num, 1 );
    		loadoutPerk2 = cac_getPerk( class_num, 2 );
    		loadoutPerk3 = cac_getPerk( class_num, 3 );
    		loadoutOffhand = cac_getOffhand( class_num );
    		loadoutDeathStreak = cac_getDeathstreak( class_num );
    	}
    	else
    	{
    		class_num = getClassIndex( class );
    		
    		loadoutPrimary = table_getWeapon( level.classTableName, class_num, 0 );
    		loadoutPrimaryAttachment = table_getWeaponAttachment( level.classTableName, class_num, 0 , 0);
    		loadoutPrimaryAttachment2 = table_getWeaponAttachment( level.classTableName, class_num, 0, 1 );
    		loadoutPrimaryCamo = table_getWeaponCamo( level.classTableName, class_num, 0 );
    		loadoutSecondary = table_getWeapon( level.classTableName, class_num, 1 );
    		loadoutSecondaryAttachment = table_getWeaponAttachment( level.classTableName, class_num, 1 , 0);
    		loadoutSecondaryAttachment2 = table_getWeaponAttachment( level.classTableName, class_num, 1, 1 );;
    		loadoutSecondaryCamo = table_getWeaponCamo( level.classTableName, class_num, 1 );
    		loadoutEquipment = table_getEquipment( level.classTableName, class_num, 0 );
    		loadoutPerk1 = table_getPerk( level.classTableName, class_num, 1 );
    		loadoutPerk2 = table_getPerk( level.classTableName, class_num, 2 );
    		loadoutPerk3 = table_getPerk( level.classTableName, class_num, 3 );
    		loadoutOffhand = table_getOffhand( level.classTableName, class_num );
    		loadoutDeathstreak = table_getDeathstreak( level.classTableName, class_num );
    	}
    	
    	clonedLoadout["inUse"] = false;
    	clonedLoadout["loadoutPrimary"] = loadoutPrimary;
    	clonedLoadout["loadoutPrimaryAttachment"] = loadoutPrimaryAttachment;
    	clonedLoadout["loadoutPrimaryAttachment2"] = loadoutPrimaryAttachment2;
    	clonedLoadout["loadoutPrimaryCamo"] = loadoutPrimaryCamo;
    	clonedLoadout["loadoutSecondary"] = loadoutSecondary;
    	clonedLoadout["loadoutSecondaryAttachment"] = loadoutSecondaryAttachment;
    	clonedLoadout["loadoutSecondaryAttachment2"] = loadoutSecondaryAttachment2;
    	clonedLoadout["loadoutSecondaryCamo"] = loadoutSecondaryCamo;
    	clonedLoadout["loadoutEquipment"] = loadoutEquipment;
    	clonedLoadout["loadoutPerk1"] = loadoutPerk1;
    	clonedLoadout["loadoutPerk2"] = loadoutPerk2;
    	clonedLoadout["loadoutPerk3"] = loadoutPerk3;
    	clonedLoadout["loadoutOffhand"] = loadoutOffhand;
    	
    	return ( clonedLoadout );
    }
    
    giveLoadout( team, class, allowCopycat )
    {
    	self takeAllWeapons();
    	
    	primaryIndex = 0;
    	
    	// initialize specialty array
    	self.specialty = [];
    
    	if ( !isDefined( allowCopycat ) )
    		allowCopycat = true;
    
    	primaryWeapon = undefined;
    
    	if ( isDefined( self.pers["copyCatLoadout"] ) && self.pers["copyCatLoadout"]["inUse"] && allowCopycat )
    	{
    		self maps\mp\gametypes\_class::setClass( "copycat" );
    		self.class_num = getClassIndex( "copycat" );
    
    		clonedLoadout = self.pers["copyCatLoadout"];
    
    		loadoutPrimary = clonedLoadout["loadoutPrimary"];
    		loadoutPrimaryAttachment = clonedLoadout["loadoutPrimaryAttachment"];
    		loadoutPrimaryAttachment2 = clonedLoadout["loadoutPrimaryAttachment2"] ;
    		loadoutPrimaryCamo = clonedLoadout["loadoutPrimaryCamo"];
    		loadoutSecondary = clonedLoadout["loadoutSecondary"];
    		loadoutSecondaryAttachment = clonedLoadout["loadoutSecondaryAttachment"];
    		loadoutSecondaryAttachment2 = clonedLoadout["loadoutSecondaryAttachment2"];
    		loadoutSecondaryCamo = clonedLoadout["loadoutSecondaryCamo"];
    		loadoutEquipment = clonedLoadout["loadoutEquipment"];
    		loadoutPerk1 = clonedLoadout["loadoutPerk1"];
    		loadoutPerk2 = clonedLoadout["loadoutPerk2"];
    		loadoutPerk3 = clonedLoadout["loadoutPerk3"];
    		loadoutOffhand = clonedLoadout["loadoutOffhand"];
    		loadoutDeathStreak = "specialty_copycat";		
    	}
    	else if ( isSubstr( class, "custom" ) )
    	{
    		class_num = getClassIndex( class );
    		self.class_num = class_num;
    
    		loadoutPrimary = cac_getWeapon( class_num, 0 );
    		loadoutPrimaryAttachment = cac_getWeaponAttachment( class_num, 0 );
    		loadoutPrimaryAttachment2 = cac_getWeaponAttachmentTwo( class_num, 0 );
    		loadoutPrimaryCamo = cac_getWeaponCamo( class_num, 0 );
    		loadoutSecondaryCamo = cac_getWeaponCamo( class_num, 1 );
    		loadoutSecondary = cac_getWeapon( class_num, 1 );
    		loadoutSecondaryAttachment = cac_getWeaponAttachment( class_num, 1 );
    		loadoutSecondaryAttachment2 = cac_getWeaponAttachmentTwo( class_num, 1 );
    		loadoutSecondaryCamo = cac_getWeaponCamo( class_num, 1 );
    		loadoutEquipment = cac_getPerk( class_num, 0 );
    		loadoutPerk1 = cac_getPerk( class_num, 1 );
    		loadoutPerk2 = cac_getPerk( class_num, 2 );
    		loadoutPerk3 = cac_getPerk( class_num, 3 );
    		loadoutOffhand = cac_getOffhand( class_num );
    		loadoutDeathStreak = cac_getDeathstreak( class_num );
    	}
    	else
    	{
    		class_num = getClassIndex( class );
    		self.class_num = class_num;
    		
    		loadoutPrimary = table_getWeapon( level.classTableName, class_num, 0 );
    		loadoutPrimaryAttachment = table_getWeaponAttachment( level.classTableName, class_num, 0 , 0);
    		loadoutPrimaryAttachment2 = table_getWeaponAttachment( level.classTableName, class_num, 0, 1 );
    		loadoutPrimaryCamo = table_getWeaponCamo( level.classTableName, class_num, 0 );
    		loadoutSecondaryCamo = table_getWeaponCamo( level.classTableName, class_num, 1 );
    		loadoutSecondary = table_getWeapon( level.classTableName, class_num, 1 );
    		loadoutSecondaryAttachment = table_getWeaponAttachment( level.classTableName, class_num, 1 , 0);
    		loadoutSecondaryAttachment2 = table_getWeaponAttachment( level.classTableName, class_num, 1, 1 );;
    		loadoutSecondaryCamo = table_getWeaponCamo( level.classTableName, class_num, 1 );
    		loadoutEquipment = table_getEquipment( level.classTableName, class_num, 0 );
    		loadoutPerk1 = table_getPerk( level.classTableName, class_num, 1 );
    		loadoutPerk2 = table_getPerk( level.classTableName, class_num, 2 );
    		loadoutPerk3 = table_getPerk( level.classTableName, class_num, 3 );
    		loadoutOffhand = table_getOffhand( level.classTableName, class_num );
    		loadoutDeathstreak = table_getDeathstreak( level.classTableName, class_num );
    	}
    
    	if ( !(isDefined( self.pers["copyCatLoadout"] ) && self.pers["copyCatLoadout"]["inUse"] && allowCopycat) )
    	{
    		isCustomClass = isSubstr( class, "custom" );
    		
    		if ( !isValidPrimary( loadoutPrimary ) || (isCustomClass && !self isItemUnlocked( loadoutPrimary )) )
    			loadoutPrimary = table_getWeapon( level.classTableName, 10, 0 );
    		
    		if ( !isValidAttachment( loadoutPrimaryAttachment ) || (isCustomClass && !self isItemUnlocked( loadoutPrimary + " " + loadoutPrimaryAttachment )) )
    			loadoutPrimaryAttachment = table_getWeaponAttachment( level.classTableName, 10, 0 , 0);
    		
    		if ( !isValidAttachment( loadoutPrimaryAttachment2 ) || (isCustomClass && !self isItemUnlocked( loadoutPrimary + " " + loadoutPrimaryAttachment2 )) )
    			loadoutPrimaryAttachment2 = table_getWeaponAttachment( level.classTableName, 10, 0, 1 );
    		
    		if ( !isValidCamo( loadoutPrimaryCamo ) || (isCustomClass && !self isItemUnlocked( loadoutPrimary + " " + loadoutPrimaryCamo )) )
    			loadoutPrimaryCamo = table_getWeaponCamo( level.classTableName, 10, 0 );
    		
    		if ( !isValidSecondary( loadoutSecondary ) || (isCustomClass && !self isItemUnlocked( loadoutSecondary )) )
    			loadoutSecondary = table_getWeapon( level.classTableName, 10, 1 );
    		
    		if ( !isValidAttachment( loadoutSecondaryAttachment ) || (isCustomClass && !self isItemUnlocked( loadoutSecondary + " " + loadoutSecondaryAttachment )) )
    			loadoutSecondaryAttachment = table_getWeaponAttachment( level.classTableName, 10, 1 , 0);
    		
    		if ( !isValidAttachment( loadoutSecondaryAttachment2 ) || (isCustomClass && !self isItemUnlocked( loadoutSecondary + " " + loadoutSecondaryAttachment2 )) )
    			loadoutSecondaryAttachment2 = table_getWeaponAttachment( level.classTableName, 10, 1, 1 );;
    		
    		if ( !isValidCamo( loadoutSecondaryCamo ) || (isCustomClass && !self isItemUnlocked( loadoutSecondary + " " + loadoutSecondaryCamo )) )
    			loadoutSecondaryCamo = table_getWeaponCamo( level.classTableName, 10, 1 );
    		
    		if ( !isValidEquipment( loadoutEquipment ) || (isCustomClass && !self isItemUnlocked( loadoutEquipment )) )
    			loadoutEquipment = table_getEquipment( level.classTableName, 10, 0 );
    		
    		if ( !isValidPerk1( loadoutPerk1 ) || (isCustomClass && !self isItemUnlocked( loadoutPerk1 )) )
    			loadoutPerk1 = table_getPerk( level.classTableName, 10, 1 );
    		
    		if ( !isValidPerk2( loadoutPerk2 ) || (isCustomClass && !self isItemUnlocked( loadoutPerk2 )) )
    			loadoutPerk2 = table_getPerk( level.classTableName, 10, 2 );
    		
    		if ( !isValidPerk3( loadoutPerk3 ) || (isCustomClass && !self isItemUnlocked( loadoutPerk3 )) )
    			loadoutPerk3 = table_getPerk( level.classTableName, 10, 3 );
    		
    		if ( !isValidOffhand( loadoutOffhand ) )
    			loadoutOffhand = table_getOffhand( level.classTableName, 10 );
    		
    		if ( !isValidDeathstreak( loadoutDeathstreak ) || (isCustomClass && !self isItemUnlocked( loadoutDeathstreak )) )
    			loadoutDeathstreak = table_getDeathstreak( level.classTableName, 10 );
    	}
    
    	if ( loadoutPerk1 != "specialty_bling" )
    	{
    		loadoutPrimaryAttachment2 = "none";
    		loadoutSecondaryAttachment2 = "none";
    	}
    	
    	if ( loadoutPerk1 != "specialty_onemanarmy" && loadoutSecondary == "onemanarmy" )
    		loadoutSecondary = table_getWeapon( level.classTableName, 10, 1 );
    
    	loadoutSecondaryCamo = "none";
    
    
    	if ( level.killstreakRewards )
    	{
    		loadoutKillstreak1 = self getPlayerData( "killstreaks", 0 );
    		loadoutKillstreak2 = self getPlayerData( "killstreaks", 1 );
    		loadoutKillstreak3 = self getPlayerData( "killstreaks", 2 );
    	}
    	else
    	{
    		loadoutKillstreak1 = "none";
    		loadoutKillstreak2 = "none";
    		loadoutKillstreak3 = "none";
    	}
    	
    	secondaryName = buildWeaponName( loadoutSecondary, loadoutSecondaryAttachment, loadoutSecondaryAttachment2 );
    	self _giveWeapon( secondaryName, int(tableLookup( "mp/camoTable.csv", 1, loadoutSecondaryCamo, 0 ) ) );
    
    	self.loadoutPrimaryCamo = int(tableLookup( "mp/camoTable.csv", 1, loadoutPrimaryCamo, 0 ));
    	self.loadoutPrimary = loadoutPrimary;
    	self.loadoutSecondary = loadoutSecondary;
    	self.loadoutSecondaryCamo = int(tableLookup( "mp/camoTable.csv", 1, loadoutSecondaryCamo, 0 ));
    	
    	self SetOffhandPrimaryClass( "other" );
    	
    	// Action Slots
    	// self _SetActionSlot( 1, "" );
    	self _SetActionSlot( 1, "nightvision" );
    	self _SetActionSlot( 3, "altMode" );
    	self _SetActionSlot( 4, "" );
    
    	// Perks
    	self _clearPerks();
    	self _detachAll();
    	
    	// these special case giving pistol death have to come before
    	// perk loadout to ensure player perk icons arent overwritten
    	if ( level.dieHardMode )
    		self maps\mp\perks\_perks::givePerk( "specialty_pistoldeath" );
    	
    	// only give the deathstreak for the initial spawn for this life.
    	if ( loadoutDeathStreak != "specialty_null" && getTime() == self.spawnTime )
    	{
    		deathVal = int( tableLookup( "mp/perkTable.csv", 1, loadoutDeathStreak, 6 ) );
    				
    		if ( self getPerkUpgrade( loadoutPerk1 ) == "specialty_rollover" || self getPerkUpgrade( loadoutPerk2 ) == "specialty_rollover" || self getPerkUpgrade( loadoutPerk3 ) == "specialty_rollover" )
    			deathVal -= 1;
    		
    		if ( self.pers["cur_death_streak"] == deathVal )
    		{
    			self thread maps\mp\perks\_perks::givePerk( loadoutDeathStreak );
    			self thread maps\mp\gametypes\_hud_message::splashNotify( loadoutDeathStreak );
    		}
    		else if ( self.pers["cur_death_streak"] > deathVal )
    		{
    			self thread maps\mp\perks\_perks::givePerk( loadoutDeathStreak );
    		}
    	}
    
    	self loadoutAllPerks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3 );
    		
    	self setKillstreaks( loadoutKillstreak1, loadoutKillstreak2, loadoutKillstreak3 );
    		
    	if ( self hasPerk( "specialty_extraammo", true ) && getWeaponClass( secondaryName ) != "weapon_projectile" )
    		self giveMaxAmmo( secondaryName );
    
    	// Primary Weapon
    	primaryName = buildWeaponName( loadoutPrimary, loadoutPrimaryAttachment, loadoutPrimaryAttachment2 );
    	self _giveWeapon( primaryName, self.loadoutPrimaryCamo );
    	
    	// fix changing from a riotshield class to a riotshield class during grace period not giving a shield
    	if ( primaryName == "riotshield_mp" && level.inGracePeriod )
    		self notify ( "weapon_change", "riotshield_mp" );
    
    	if ( self hasPerk( "specialty_extraammo", true ) )
    		self giveMaxAmmo( primaryName );
    
    	self setSpawnWeapon( primaryName );
    	
    	primaryTokens = strtok( primaryName, "_" );
    	self.pers["primaryWeapon"] = primaryTokens[0];
    	
    	// Primary Offhand was given by givePerk (it's your perk1)
    	
    	// Secondary Offhand
    	offhandSecondaryWeapon = loadoutOffhand + "_mp";
    	if ( loadoutOffhand == "flash_grenade" )
    		self SetOffhandSecondaryClass( "flash" );
    	else
    		self SetOffhandSecondaryClass( "smoke" );
    	
    	self giveWeapon( offhandSecondaryWeapon );
    	if( loadOutOffhand == "smoke_grenade" )
    		self setWeaponAmmoClip( offhandSecondaryWeapon, 1 );
    	else if( loadOutOffhand == "flash_grenade" )
    		self setWeaponAmmoClip( offhandSecondaryWeapon, 2 );
    	else if( loadOutOffhand == "concussion_grenade" )
    		self setWeaponAmmoClip( offhandSecondaryWeapon, 2 );
    	else
    		self setWeaponAmmoClip( offhandSecondaryWeapon, 1 );
    	
    	primaryWeapon = primaryName;
    	self.primaryWeapon = primaryWeapon;
    	self.secondaryWeapon = secondaryName;
    
    	self maps\mp\gametypes\_teams::playerModelForWeapon( self.pers["primaryWeapon"], getBaseWeaponName( secondaryName ) );
    		
    	self.isSniper = (weaponClass( self.primaryWeapon ) == "sniper");
    	
    	self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" );
    
    	// cac specialties that require loop threads
    	self maps\mp\perks\_perks::cac_selector();
    	
    	self notify ( "changed_kit" );
    	self notify ( "giveLoadout" );
    }
    
    _detachAll()
    {
    	if ( isDefined( self.hasRiotShield ) && self.hasRiotShield )
    	{
    		if ( self.hasRiotShieldEquipped )
    		{
    			self DetachShieldModel( "weapon_riot_shield_mp", "tag_weapon_left" );
    			self.hasRiotShieldEquipped = false;
    		}
    		else
    		{
    			self DetachShieldModel( "weapon_riot_shield_mp", "tag_shield_back" );
    		}
    		
    		self.hasRiotShield = false;
    	}
    	
    	self detachAll();
    }
    
    isPerkUpgraded( perkName )
    {
    	perkUpgrade = tablelookup( "mp/perktable.csv", 1, perkName, 8 );
    	
    	if ( perkUpgrade == "" || perkUpgrade == "specialty_null" )
    		return false;
    		
    	if ( !self isItemUnlocked( perkUpgrade ) )
    		return false;
    		
    	return true;
    }
    
    getPerkUpgrade( perkName )
    {
    	perkUpgrade = tablelookup( "mp/perktable.csv", 1, perkName, 8 );
    	
    	if ( perkUpgrade == "" || perkUpgrade == "specialty_null" )
    		return "specialty_null";
    		
    	if ( !self isItemUnlocked( perkUpgrade ) )
    		return "specialty_null";
    		
    	return ( perkUpgrade );
    }
    
    loadoutAllPerks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3 )
    {
    	loadoutEquipment = maps\mp\perks\_perks::validatePerk( 1, loadoutEquipment );
    	loadoutPerk1 = maps\mp\perks\_perks::validatePerk( 1, loadoutPerk1 );
    	loadoutPerk2 = maps\mp\perks\_perks::validatePerk( 2, loadoutPerk2 );
    	loadoutPerk3 = maps\mp\perks\_perks::validatePerk( 3, loadoutPerk3 );
    
    	self maps\mp\perks\_perks::givePerk( loadoutEquipment );
    	self maps\mp\perks\_perks::givePerk( loadoutPerk1 );
    	self maps\mp\perks\_perks::givePerk( loadoutPerk2 );
    	self maps\mp\perks\_perks::givePerk( loadoutPerk3 );
    	
    	perkUpgrd[0] = tablelookup( "mp/perktable.csv", 1, loadoutPerk1, 8 );
    	perkUpgrd[1] = tablelookup( "mp/perktable.csv", 1, loadoutPerk2, 8 );
    	perkUpgrd[2] = tablelookup( "mp/perktable.csv", 1, loadoutPerk3, 8 );
    	
    	foreach( upgrade in perkUpgrd )
    	{
    		if ( upgrade == "" || upgrade == "specialty_null" )
    			continue;
    			
    		if ( self isItemUnlocked( upgrade ) )
    			self maps\mp\perks\_perks::givePerk( upgrade );
    	}
    
    }
    
    trackRiotShield()
    {
    	self endon ( "death" );
    	self endon ( "disconnect" );
    
    	self.hasRiotShield = self hasWeapon( "riotshield_mp" );
    	self.hasRiotShieldEquipped = (self.currentWeaponAtSpawn == "riotshield_mp");
    	
    	// note this function must play nice with _detachAll().
    	
    	if ( self.hasRiotShield )
    	{
    		if ( self.hasRiotShieldEquipped )
    		{
    			self AttachShieldModel( "weapon_riot_shield_mp", "tag_weapon_left" );
    		}
    		else
    		{
    			self AttachShieldModel( "weapon_riot_shield_mp", "tag_shield_back" );
    		}
    	}
    	
    	for ( ;; )
    	{
    		self waittill ( "weapon_change", newWeapon );
    		
    		if ( newWeapon == "riotshield_mp" )
    		{
    			// defensive check in case we somehow get an extra "weapon_change"
    			if ( self.hasRiotShieldEquipped )
    				continue;
    			
    			if ( self.hasRiotShield )
    				self MoveShieldModel( "weapon_riot_shield_mp", "tag_shield_back", "tag_weapon_left" );
    			else
    				self AttachShieldModel( "weapon_riot_shield_mp", "tag_weapon_left" );
    			
    			self.hasRiotShield = true;
    			self.hasRiotShieldEquipped = true;
    		}
    		else if ( (self IsMantling()) && (newWeapon == "none") )
    		{
    			// Do nothing, we want to keep that weapon on their arm.
    		}
    		else if ( self.hasRiotShieldEquipped )
    		{
    			assert( self.hasRiotShield );
    			self.hasRiotShield = self hasWeapon( "riotshield_mp" );
    			
    			if ( self.hasRiotShield )
    				self MoveShieldModel( "weapon_riot_shield_mp", "tag_weapon_left", "tag_shield_back" );
    			else
    				self DetachShieldModel( "weapon_riot_shield_mp", "tag_weapon_left" );
    			
    			self.hasRiotShieldEquipped = false;
    		}
    		else if ( self.hasRiotShield )
    		{
    			if ( !self hasWeapon( "riotshield_mp" ) )
    			{
    				// we probably just lost all of our weapons (maybe switched classes)
    				self DetachShieldModel( "weapon_riot_shield_mp", "tag_shield_back" );
    				self.hasRiotShield = false;
    			}
    		}
    	}
    }
    
    
    tryAttach( placement ) // deprecated; hopefully we won't need to bring this defensive function back
    {
    	if ( !isDefined( placement ) || placement != "back" )
    		tag = "tag_weapon_left";
    	else
    		tag = "tag_shield_back";
    	
    	attachSize = self getAttachSize();
    	
    	for ( i = 0; i < attachSize; i++ )
    	{
    		attachedTag = self getAttachTagName( i );
    		if ( attachedTag == tag &&  self getAttachModelName( i ) == "weapon_riot_shield_mp" )
    		{
    			return;
    		}
    	}
    	
    	self AttachShieldModel( "weapon_riot_shield_mp", tag );
    }
    
    tryDetach( placement ) // deprecated; hopefully we won't need to bring this defensive function back
    {
    	if ( !isDefined( placement ) || placement != "back" )
    		tag = "tag_weapon_left";
    	else
    		tag = "tag_shield_back";
    	
    	
    	attachSize = self getAttachSize();
    	
    	for ( i = 0; i < attachSize; i++ )
    	{
    		attachedModel = self getAttachModelName( i );
    		if ( attachedModel == "weapon_riot_shield_mp" )
    		{
    			self DetachShieldModel( attachedModel, tag);
    			return;
    		}
    	}
    	return;
    }
    
    
    
    buildWeaponName( baseName, attachment1, attachment2 )
    {
    	if ( !isDefined( level.letterToNumber ) )
    		level.letterToNumber = makeLettersToNumbers();
    
    	// disable bling when perks are disabled
    	if ( getDvarInt ( "scr_game_perks" ) == 0 )
    	{
    		attachment2 = "none";
    
    		if ( baseName == "onemanarmy" )
    			return ( "beretta_mp" );
    	}
    
    	weaponName = baseName;
    	attachments = [];
    
    	if ( attachment1 != "none" && attachment2 != "none" )
    	{
    		if ( level.letterToNumber[attachment1[0]] < level.letterToNumber[attachment2[0]] )
    		{
    			
    			attachments[0] = attachment1;
    			attachments[1] = attachment2;
    			
    		}
    		else if ( level.letterToNumber[attachment1[0]] == level.letterToNumber[attachment2[0]] )
    		{
    			if ( level.letterToNumber[attachment1[1]] < level.letterToNumber[attachment2[1]] )
    			{
    				attachments[0] = attachment1;
    				attachments[1] = attachment2;
    			}
    			else
    			{
    				attachments[0] = attachment2;
    				attachments[1] = attachment1;
    			}	
    		}
    		else
    		{
    			attachments[0] = attachment2;
    			attachments[1] = attachment1;
    		}		
    	}
    	else if ( attachment1 != "none" )
    	{
    		attachments[0] = attachment1;
    	}
    	else if ( attachment2 != "none" )
    	{
    		attachments[0] = attachment2;	
    	}
    	
    	foreach ( attachment in attachments )
    	{
    		weaponName += "_" + attachment;
    	}
    
    	if ( !isValidWeapon( weaponName + "_mp" ) )
    		return ( baseName + "_mp" );
    	else
    		return ( weaponName + "_mp" );
    }
    
    
    makeLettersToNumbers()
    {
    	array = [];
    	
    	array["a"] = 0;
    	array["b"] = 1;
    	array["c"] = 2;
    	array["d"] = 3;
    	array["e"] = 4;
    	array["f"] = 5;
    	array["g"] = 6;
    	array["h"] = 7;
    	array["i"] = 8;
    	array["j"] = 9;
    	array["k"] = 10;
    	array["l"] = 11;
    	array["m"] = 12;
    	array["n"] = 13;
    	array["o"] = 14;
    	array["p"] = 15;
    	array["q"] = 16;
    	array["r"] = 17;
    	array["s"] = 18;
    	array["t"] = 19;
    	array["u"] = 20;
    	array["v"] = 21;
    	array["w"] = 22;
    	array["x"] = 23;
    	array["y"] = 24;
    	array["z"] = 25;
    	
    	return array;
    }
    
    setKillstreaks( streak1, streak2, streak3 )
    {
    	self.killStreaks = [];
    
    	if ( self _hasPerk( "specialty_hardline" ) )
    		modifier = -1;
    	else
    		modifier = 0;
    	
    	/*if ( streak1 == "none" && streak2 == "none" && streak3 == "none" )
    	{
    		streak1 = "uav";
    		streak2 = "precision_airstrike";
    		streak3 = "helicopter";
    	}*/
    
    	killStreaks = [];
    
    	if ( streak1 != "none" )
    	{
    		//if ( !level.splitScreen )
    			streakVal = int( tableLookup( "mp/killstreakTable.csv", 1, streak1, 4 ) );
    		//else
    		//	streakVal = int( tableLookup( "mp/killstreakTable.csv", 1, streak1, 5 ) );
    		killStreaks[streakVal + modifier] = streak1;
    	}
    
    	if ( streak2 != "none" )
    	{
    		//if ( !level.splitScreen )
    			streakVal = int( tableLookup( "mp/killstreakTable.csv", 1, streak2, 4 ) );
    		//else
    		//	streakVal = int( tableLookup( "mp/killstreakTable.csv", 1, streak2, 5 ) );
    		killStreaks[streakVal + modifier] = streak2;
    	}
    
    	if ( streak3 != "none" )
    	{
    		//if ( !level.splitScreen )
    			streakVal = int( tableLookup( "mp/killstreakTable.csv", 1, streak3, 4 ) );
    		//else
    		//	streakVal = int( tableLookup( "mp/killstreakTable.csv", 1, streak3, 5 ) );
    		killStreaks[streakVal + modifier] = streak3;
    	}
    
    	// foreach doesn't loop through numbers arrays in number order; it loops through the elements in the order
    	// they were added.  We'll use this to fix it for now.
    	maxVal = 0;
    	foreach ( streakVal, streakName in killStreaks )
    	{
    		if ( streakVal > maxVal )
    			maxVal = streakVal;
    	}
    
    	for ( streakIndex = 0; streakIndex <= maxVal; streakIndex++ )
    	{
    		if ( !isDefined( killStreaks[streakIndex] ) )
    			continue;
    			
    		streakName = killStreaks[streakIndex];
    			
    		self.killStreaks[ streakIndex ] = killStreaks[ streakIndex ];
    	}
    	// end lameness
    
    	// defcon rollover
    	maxRollOvers = 10;
    	newKillstreaks = self.killstreaks;
    	for ( rollOver = 1; rollOver <= maxRollOvers; rollOver++ )
    	{
    		foreach ( streakVal, streakName in self.killstreaks )
    		{
    			newKillstreaks[ streakVal + (maxVal*rollOver) ] = streakName + "-rollover" + rollOver;
    		}
    	}
    	
    	self.killstreaks = newKillstreaks;
    }
    
    
    replenishLoadout() // used by ammo hardpoint.
    {
    	team = self.pers["team"];
    	class = self.pers["class"];
    
        weaponsList = self GetWeaponsListAll();
        for( idx = 0; idx < weaponsList.size; idx++ )
        {
    		weapon = weaponsList[idx];
    
    		self giveMaxAmmo( weapon );
    		self SetWeaponAmmoClip( weapon, 9999 );
    
    		if ( weapon == "claymore_mp" || weapon == "claymore_detonator_mp" )
    			self setWeaponAmmoStock( weapon, 2 );
        }
    	
    	if ( self getAmmoCount( level.classGrenades[class]["primary"]["type"] ) < level.classGrenades[class]["primary"]["count"] )
     		self SetWeaponAmmoClip( level.classGrenades[class]["primary"]["type"], level.classGrenades[class]["primary"]["count"] );
    
    	if ( self getAmmoCount( level.classGrenades[class]["secondary"]["type"] ) < level.classGrenades[class]["secondary"]["count"] )
     		self SetWeaponAmmoClip( level.classGrenades[class]["secondary"]["type"], level.classGrenades[class]["secondary"]["count"] );	
    }
    
    
    onPlayerConnecting()
    {
    	for(;;)
    	{
    		level waittill( "connected", player );
    
    		if ( !isDefined( player.pers["class"] ) )
    		{
    			player.pers["class"] = "";
    		}
    		player.class = player.pers["class"];
    		player.lastClass = "";
    		player.detectExplosives = false;
    		player.bombSquadIcons = [];
    		player.bombSquadIds = [];
    	}
    }
    
    
    fadeAway( waitDelay, fadeDelay )
    {
    	wait waitDelay;
    	
    	self fadeOverTime( fadeDelay );
    	self.alpha = 0;
    }
    
    
    setClass( newClass )
    {
    	self.curClass = newClass;
    }
    
    getPerkForClass( perkSlot, className )
    {
        class_num = getClassIndex( className );
    
        if( isSubstr( className, "custom" ) )
            return cac_getPerk( class_num, perkSlot );
        else
            return table_getPerk( level.classTableName, class_num, perkSlot );
    }
    
    
    classHasPerk( className, perkName )
    {
    	return( getPerkForClass( 0, className ) == perkName || getPerkForClass( 1, className ) == perkName || getPerkForClass( 2, className ) == perkName );
    }
    
    isValidPrimary( refString )
    {
    	switch ( refString )
    	{
    		case "riotshield":
    		case "ak47":
    		case "m16":
    		case "m4":
    		case "fn2000":
    		case "masada":
    		case "famas":
    		case "fal":
    		case "scar":
    		case "tavor":
    		case "mp5k":
    		case "uzi":
    		case "p90":
    		case "kriss":
    		case "ump45":
    		case "barrett":
    		case "wa2000":
    		case "m21":
    		case "cheytac":
    		case "rpd":
    		case "sa80":
    		case "mg4":
    		case "m240":
    		case "aug":
    			return true;
    		default:
    			assertMsg( "Replacing invalid primary weapon: " + refString );
    			return false;
    	}
    }
    
    isValidSecondary( refString )
    {
    	switch ( refString )
    	{
    		case "beretta":
    		case "usp":
    		case "deserteagle":
    		case "coltanaconda":
    		case "glock":
    		case "beretta393":
    		case "pp2000":
    		case "tmp":
    		case "m79":
    		case "rpg":
    		case "at4":
    		case "stinger":
    		case "javelin":
    		case "ranger":
    		case "model1887":
    		case "striker":
    		case "aa12":
    		case "m1014":
    		case "spas12":
    		case "onemanarmy":
    			return true;
    		default:
    			assertMsg( "Replacing invalid secondary weapon: " + refString );
    			return false;
    	}
    }
    
    isValidAttachment( refString )
    {
    	switch ( refString )
    	{
    		case "none":
    		case "acog":
    		case "reflex":
    		case "silencer":
    		case "grip":
    		case "gl":
    		case "akimbo":
    		case "thermal":
    		case "shotgun":
    		case "heartbeat":
    		case "fmj":
    		case "rof":
    		case "xmags":
    		case "eotech":  
    		case "tactical":
    			return true;
    		default:
    			assertMsg( "Replacing invalid equipment weapon: " + refString );
    			return false;
    	}
    }
    
    isValidCamo( refString )
    {
    	switch ( refString )
    	{
    		case "none":
    		case "woodland":
    		case "desert":
    		case "arctic":
    		case "digital":
    		case "red_urban":
    		case "red_tiger":
    		case "blue_tiger":
    		case "orange_fall":
    			return true;
    		default:
    			assertMsg( "Replacing invalid camo: " + refString );
    			return false;
    	}
    }
    
    isValidEquipment( refString )
    {
    	switch ( refString )
    	{
    		case "frag_grenade_mp":
    		case "semtex_mp":
    		case "throwingknife_mp":
    		case "specialty_tacticalinsertion":
    		case "specialty_blastshield":
    		case "claymore_mp":
    		case "c4_mp":
    			return true;
    		default:
    			assertMsg( "Replacing invalid equipment: " + refString );
    			return false;
    	}
    }
    
    
    isValidOffhand( refString )
    {
    	switch ( refString )
    	{
    		case "flash_grenade":
    		case "concussion_grenade":
    		case "smoke_grenade":
    			return true;
    		default:
    			assertMsg( "Replacing invalid offhand: " + refString );
    			return false;
    	}
    }
    
    isValidPerk1( refString )
    {
    	switch ( refString )
    	{
    		case "specialty_marathon":
    		case "specialty_fastreload":
    		case "specialty_scavenger":
    		case "specialty_bling":
    		case "specialty_onemanarmy":
    			return true;
    		default:
    			assertMsg( "Replacing invalid perk1: " + refString );
    			return false;
    	}
    }
    
    isValidPerk2( refString )
    {
    	switch ( refString )
    	{
    		case "specialty_bulletdamage":
    		case "specialty_lightweight":
    		case "specialty_hardline":
    		case "specialty_coldblooded":
    		case "specialty_explosivedamage":
    			return true;
    		default:
    			assertMsg( "Replacing invalid perk2: " + refString );
    			return false;
    	}
    }
    
    isValidPerk3( refString )
    {
    	switch ( refString )
    	{
    		case "specialty_extendedmelee":
    		case "specialty_bulletaccuracy":
    		case "specialty_localjammer":
    		case "specialty_heartbreaker":
    		case "specialty_detectexplosive":
    			return true;
    		default:
    			assertMsg( "Replacing invalid perk3: " + refString );
    			return false;
    	}
    }
    
    isValidDeathStreak( refString )
    {
    	switch ( refString )
    	{
    		case "specialty_copycat":
    			return true;
    		default:
    			assertMsg( "Replacing invalid death streak: " + refString );
    			return false;
    	}
    }
    
    isValidWeapon( refString )
    {
    	if ( !isDefined( level.weaponRefs ) )
    	{
    		level.weaponRefs = [];
    
    		foreach ( weaponRef in level.weaponList )
    			level.weaponRefs[ weaponRef ] = true;
    	}
    
    	if ( isDefined( level.weaponRefs[ refString ] ) )
    		return true;
    
    	assertMsg( "Replacing invalid weapon/attachment combo: " + refString );
    	
    	return false;
    }
    please help me make this awesome mod and ill credit forever /yea

  2. #2
    PP_CrazyApple's Avatar
    Join Date
    Jun 2010
    Gender
    male
    Location
    At home...
    Posts
    841
    Reputation
    28
    Thanks
    416
    My Mood
    Innocent
    Since i'm on another pc, i can't help you right now, i will do it when i get back.. ill let ya know in a PM

  3. #3
    Josephlittle™'s Avatar
    Join Date
    May 2010
    Gender
    male
    Location
    GSC Modding Section
    Posts
    1,345
    Reputation
    26
    Thanks
    560
    My Mood
    Devilish
    but the weird thing is its another error...so maybe its because of _classes now?

  4. #4
    PP_CrazyApple's Avatar
    Join Date
    Jun 2010
    Gender
    male
    Location
    At home...
    Posts
    841
    Reputation
    28
    Thanks
    416
    My Mood
    Innocent
    at me the error sais: Bad syntax too many open braces

    an open brace = {

  5. #5
    Josephlittle™'s Avatar
    Join Date
    May 2010
    Gender
    male
    Location
    GSC Modding Section
    Posts
    1,345
    Reputation
    26
    Thanks
    560
    My Mood
    Devilish
    ohhhh....check at end of the .gsc file and u will se some {, maybe thats it? because i created some braces for threads....i think u got it

    im in my laptop right now, so i cant check

    EDIT: i fund it , there is 3 { at the end of thread DemomanHealth, one } more to the right and 2 }} right below each other, i hope there isnt another mistake :S im gonna change it when i get back to my PC and it might work, please help me
    Last edited by Josephlittle™; 07-06-2010 at 03:59 PM.

  6. #6
    PP_CrazyApple's Avatar
    Join Date
    Jun 2010
    Gender
    male
    Location
    At home...
    Posts
    841
    Reputation
    28
    Thanks
    416
    My Mood
    Innocent
    Quote Originally Posted by Josephlittle View Post
    ohhhh....check at end of the .gsc file and u will se some {, maybe thats it? because i created some braces for threads....i think u got it

    im in my laptop right now, so i cant check

    EDIT: i fund it , im gonna change it when i get back to my PC and it might work, please help me
    Good luck, i will help you when i am back at my pc, i don't have FFViewer and no mw2 so i can't help you right now, sry.

    EDIT:

Similar Threads

  1. [Request] Team Fortress 2
    By klpv82 in forum Hack Requests
    Replies: 4
    Last Post: 08-25-2012, 12:00 PM
  2. Team Fortress 2 ANYONE?!?!
    By jabber315 in forum General
    Replies: 6
    Last Post: 10-10-2009, 10:20 PM
  3. BF2/BF2142/Team Fortress 2
    By Dave84311 in forum Trade Accounts/Keys/Items
    Replies: 33
    Last Post: 08-09-2009, 02:16 PM
  4. Team Fortress 2.
    By Synns in forum Suggestions, Requests & Help
    Replies: 11
    Last Post: 07-11-2008, 12:26 PM
  5. Request-Team Fortress 2 Thread?
    By †GM_PiKaChU† in forum Suggestions, Requests & Help
    Replies: 0
    Last Post: 07-08-2008, 11:30 AM