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