Post: MW3: All GSC Files Extracted
11-16-2011, 03:14 AM #1
DEREKTROTTER
You're Goddamn Right
(adsbygoogle = window.adsbygoogle || []).push({}); Took me a while to extract all these, everything you need to create a patch/menu/gamemode etc....
Better to be prepared Winky Winky

Download - You must login or register to view this content.

GSC List
common_scripts/_artcommon.gsc
common_scripts/_createfx.gsc
common_scripts/_createfxmenu.gsc
common_scripts/_destructible.gsc
common_scripts/_destructible_types.gsc
common_scripts/_dynamic_world.gsc
common_scripts/_elevator.gsc
common_scripts/_fx.gsc
common_scripts/_pipes.gsc
common_scripts/utility.gsc
maps/mp/_animatedmodels.gsc
maps/mp/_areas.gsc
maps/mp/_art.gsc
maps/mp/_audio.gsc
maps/mp/_awards.gsc
maps/mp/_compass.gsc
maps/mp/_createfx.gsc
maps/mp/_crib.gsc
maps/mp/_defcon.gsc
maps/mp/_destructables.gsc
maps/mp/_empgrenade.gsc
maps/mp/_entityheadicons.gsc
maps/mp/_events.gsc
maps/mp/_flashgrenades.gsc
maps/mp/_fx.gsc
maps/mp/_global_fx.gsc
maps/mp/_highlights.gsc
maps/mp/_javelin.gsc
maps/mp/_load.gsc
maps/mp/_matchdata.gsc
maps/mp/_matchevents.gsc
maps/mp/_minefields.gsc
maps/mp/_radiation.gsc
maps/mp/_scoreboard.gsc
maps/mp/_shutter.gsc
maps/mp/_skill.gsc
maps/mp/_stinger.gsc
maps/mp/_utility.gsc
maps/mp/gametypes/_battlechatter_mp.gsc
maps/mp/gametypes/_callbacksetup.gsc
maps/mp/gametypes/_class.gsc
maps/mp/gametypes/_damage.gsc
maps/mp/gametypes/_damagefeedback.gsc
maps/mp/gametypes/_deathicons.gsc
maps/mp/gametypes/_dev.gsc
maps/mp/gametypes/_equipment.gsc
maps/mp/gametypes/_friendicons.gsc
maps/mp/gametypes/_gamelogic.gsc
maps/mp/gametypes/_gameobjects.gsc
maps/mp/gametypes/_globalentities.gsc
maps/mp/gametypes/_globallogic.gsc
maps/mp/gametypes/_healthoverlay.gsc
maps/mp/gametypes/_hostmigration.gsc
maps/mp/gametypes/_hud.gsc
maps/mp/gametypes/_hud_message.gsc
maps/mp/gametypes/_hud_util.gsc
maps/mp/gametypes/_killcam.gsc
maps/mp/gametypes/_menus.gsc
maps/mp/gametypes/_missions.gsc
maps/mp/gametypes/_music_and_dialog.gsc
maps/mp/gametypes/_objpoints.gsc
maps/mp/gametypes/_persistence.gsc
maps/mp/gametypes/_playercards.gsc
maps/mp/gametypes/_playerlogic.gsc
maps/mp/gametypes/_portable_radar.gsc
maps/mp/gametypes/_quickmessages.gsc
maps/mp/gametypes/_rank.gsc
maps/mp/gametypes/_scrambler.gsc
maps/mp/gametypes/_serversettings.gsc
maps/mp/gametypes/_shellshock.gsc
maps/mp/gametypes/_spawnlogic.gsc
maps/mp/gametypes/_spectating.gsc
maps/mp/gametypes/_teams.gsc
maps/mp/gametypes/_tweakables.gsc
maps/mp/gametypes/_weapons.gsc
maps/mp/gametypes/arena.gsc
maps/mp/gametypes/conf.gsc
maps/mp/gametypes/ctf.gsc
maps/mp/gametypes/ctfpro.gsc
maps/mp/gametypes/dd.gsc
maps/mp/gametypes/dm.gsc
maps/mp/gametypes/dom.gsc
maps/mp/gametypes/grnd.gsc
maps/mp/gametypes/gtnw.gsc
maps/mp/gametypes/gun.gsc
maps/mp/gametypes/infect.gsc
maps/mp/gametypes/jugg.gsc
maps/mp/gametypes/koth.gsc
maps/mp/gametypes/oic.gsc
maps/mp/gametypes/oneflag.gsc
maps/mp/gametypes/sab.gsc
maps/mp/gametypes/sd.gsc
maps/mp/gametypes/tdef.gsc
maps/mp/gametypes/tjugg.gsc
maps/mp/gametypes/vip.gsc
maps/mp/gametypes/war.gsc
maps/mp/killstreaks/_a10.gsc
maps/mp/killstreaks/_aamissile.gsc
maps/mp/killstreaks/_aastrike.gsc
maps/mp/killstreaks/_ac130.gsc
maps/mp/killstreaks/_airdrop.gsc
maps/mp/killstreaks/_airstrike.gsc
maps/mp/killstreaks/_autosentry.gsc
maps/mp/killstreaks/_autoshotgun.gsc
maps/mp/killstreaks/_deployablebox.gsc
maps/mp/killstreaks/_emp.gsc
maps/mp/killstreaks/_escortairdrop.gsc
maps/mp/killstreaks/_harrier.gsc
maps/mp/killstreaks/_helicopter.gsc
maps/mp/killstreaks/_helicopter_flock.gsc
maps/mp/killstreaks/_helicopter_guard.gsc
maps/mp/killstreaks/_ims.gsc
maps/mp/killstreaks/_juggernaut.gsc
maps/mp/killstreaks/_killstreaks.gsc
maps/mp/killstreaks/_mobilemortar.gsc
maps/mp/killstreaks/_nuke.gsc
maps/mp/killstreaks/_perkstreaks.gsc
maps/mp/killstreaks/_remotemissile.gsc
maps/mp/killstreaks/_remotemortar.gsc
maps/mp/killstreaks/_remotetank.gsc
maps/mp/killstreaks/_remoteturret.gsc
maps/mp/killstreaks/_remoteuav.gsc
maps/mp/killstreaks/_tank.gsc
maps/mp/killstreaks/_teamammorefill.gsc
maps/mp/killstreaks/_uav.gsc
maps/mp/perks/_perkfunctions.gsc
maps/mp/perks/_perks.gsc


Heres the _rank.gsc
    #include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;

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 = [];
level.weaponRankTable = [];

precacheShader("white");

precacheString( &"RANK_PLAYER_WAS_PROMOTED_N" );
precacheString( &"RANK_PLAYER_WAS_PROMOTED" );
precacheString( &"RANK_WEAPON_WAS_PROMOTED" );
precacheString( &"RANK_PROMOTED" );
precacheString( &"RANK_PROMOTED_WEAPON" );
precacheString( &"MP_PLUS" );
precacheString( &"RANK_ROMANI" );
precacheString( &"RANK_ROMANII" );
precacheString( &"RANK_ROMANIII" );

precacheString( &"SPLASHES_LONGSHOT" );
precacheString( &"SPLASHES_PROXIMITYASSIST" );
precacheString( &"SPLASHES_PROXIMITYKILL" );
precacheString( &"SPLASHES_EXECUTION" );
precacheString( &"SPLASHES_AVENGER" );
precacheString( &"SPLASHES_ASSISTEDSUICIDE" );
precacheString( &"SPLASHES_DEFENDER" );
precacheString( &"SPLASHES_POSTHUMOUS" );
precacheString( &"SPLASHES_REVENGE" );
precacheString( &"SPLASHES_DOUBLEKILL" );
precacheString( &"SPLASHES_TRIPLEKILL" );
precacheString( &"SPLASHES_MULTIKILL" );
precacheString( &"SPLASHES_BUZZKILL" );
precacheString( &"SPLASHES_COMEBACK" );
precacheString( &"SPLASHES_KNIFETHROW" );
precacheString( &"SPLASHES_ONE_SHOT_KILL" );

if ( level.teamBased )
{
registerScoreInfo( "kill", 999999 );
registerScoreInfo( "headshot", 999999 );
registerScoreInfo( "assist", 999999 );
registerScoreInfo( "proximityassist", 999999 );
registerScoreInfo( "proximitykill", 999999 );
registerScoreInfo( "suicide", 999999 );
registerScoreInfo( "teamkill", 999999 );
}
else
{
registerScoreInfo( "kill", 999999 );
registerScoreInfo( "headshot", 999999 );
registerScoreInfo( "assist", 999999 );
registerScoreInfo( "suicide", 999999 );
registerScoreInfo( "teamkill", 999999 );
}

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 );
}

weaponMaxRank = int(tableLookup( "mp/weaponRankTable.csv", 0, "maxrank", 1 ));
for( i = 0; i < weaponMaxRank + 1; i++ )
{
level.weaponRankTable[i][1] = tableLookup( "mp/weaponRankTable.csv", 0, i, 1 );
level.weaponRankTable[i][2] = tableLookup( "mp/weaponRankTable.csv", 0, i, 2 );
level.weaponRankTable[i][3] = tableLookup( "mp/weaponRankTable.csv", 0, i, 3 );
}

maps\mp\gametypes\_missions::buildChallegeInfo();

level thread patientZeroWaiter();

level thread onPlayerConnect();

/#
SetDevDvarIfUninitialized( "scr_devweaponxpmult", "0" );
SetDevDvarIfUninitialized( "scr_devsetweaponmaxrank", "0" );

level thread watchDevDvars();
#/
}

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]);
}

getWeaponRankInfoMinXP( rankId )
{
return int( level.weaponRankTable[ rankId ][ 1 ] );
}

getRankInfoXPAmt( rankId )
{
return int(level.rankTable[rankId][3]);
}

getWeaponRankInfoXPAmt( rankId )
{
return int( level.weaponRankTable[ rankId ][ 2 ] );
}

getRankInfoMaxXp( rankId )
{
return int(level.rankTable[rankId][7]);
}

getWeaponRankInfoMaxXp( rankId )
{
return int( level.weaponRankTable[ rankId ][ 3 ] );
}

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(;Winky Winky
{
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;

if ( player.clientid < level.MaxLogClients )
{
setMatchData( "players", player.clientid, "rank", rankId );
setMatchData( "players", player.clientid, "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 thread maps\mp\gametypes\_missions::updateChallenges();
player.explosiveKills[0] = 0;
player.xpGains = [];

player.hud_xpPointsPopup = player createXpPointsPopup();
player.hud_xpEventPopup = player createXpEventPopup();

player thread onPlayerSpawned();
player thread onJoinedTeam();
player thread onJoinedSpectators();
player thread setGamesPlayed();

//sets double XP on player var
if ( player getPlayerData("prestigeDoubleXp") )
player.prestigeDoubleXp = true;
else
player.prestigeDoubleXp = false;

//sets double Weapon XP on player var
if ( player getPlayerData("prestigeDoubleWeaponXp") )
player.prestigeDoubleWeaponXp = true;
else
player.prestigeDoubleWeaponXp = false;

}
}

setGamesPlayed()
{
self endon ( "disconnect" );

for( ;; )
{
wait(30);

if ( !self.hasDoneCombat )
continue;

self maps\mp\gametypes\_persistence::statAdd("gamesPlayed", 1 );
break;
}
}

onJoinedTeam()
{
self endon("disconnect");

for(;Winky Winky
{
self waittill( "joined_team" );
self thread removeRankHUD();
}
}


onJoinedSpectators()
{
self endon("disconnect");

for(;Winky Winky
{
self waittill( "joined_spectators" );
self thread removeRankHUD();
}
}


onPlayerSpawned()
{
self endon("disconnect");

for(;Winky Winky
{
self waittill("spawned_player");
}
}


roundUp( floatVal )
{
if ( int( floatVal ) != floatVal )
return int( floatVal+1 );
else
return int( floatVal );
}

giveRankXP( type, value, weapon, sMeansOfDeath, challengeName )
{
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":
case "kill_confirmed":
case "kill_denied":
case "tags_retrieved":
case "team_assist":
case "kill_bonus":
case "kill_carrier":
case "draft_rogue":
case "survivor":
case "final_rogue":
case "gained_gun_rank":
case "dropped_enemy_gun_rank":
case "got_juggernaut":
case "kill_as_juggernaut":
case "kill_juggernaut":
case "jugg_on_jugg":
if ( getGametypeNumLives() > 0 )
{
multiplier = max(1,int( 10/getGametypeNumLives() ));
value = int(value * multiplier);
}

// do we have an entitlement or prestige-award to give us an additional xp multiplier
entitlement_xp = 0;
prestigeBonus_xp = 0;

if ( self.prestigeDoubleXp )
{
howMuchTimePlayed = self getPlayerData( "prestigeDoubleXpTimePlayed" );
if ( howMuchTimePlayed >= self.bufferedStatsMax["prestigeDoubleXpMaxTimePlayed"] )
{
self setPlayerData( "prestigeDoubleXp", false );
self setPlayerData( "prestigeDoubleXpTimePlayed", 0 );
self setPlayerData( "prestigeDoubleXpMaxTimePlayed", 0 );
self.prestigeDoubleXp = false;
}
else
{
prestigeBonus_xp = 2;
}
}

for ( i = 0; i < 3; i++ )
{
if ( self getPlayerData( "xpMultiplierTimePlayed", i) < self.bufferedChildStatsMax[ "xpMaxMultiplierTimePlayed" ][ i ] )
{
entitlement_xp += int( self getPlayerData( "xpMultiplier", i) );
}
}

if ( entitlement_xp > 0 ) //we do have an entitlement xp multiplier
{
//adding prestige bonus to entitlement bonus
if ( prestigeBonus_xp > 0 )
entitlement_xp += prestigeBonus_xp;

value = int( ( value * level.xpScale ) * entitlement_xp );
}
else if ( prestigeBonus_xp > 0 ) //no entitlement xp multiplier, just prestige bonus
{
value = int( value * level.xpScale * prestigeBonus_xp );
}
else //no entitlement xp multiplier, or prestige bonus
{
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;
case "challenge":
entitlement_xp = 0;
if ( self getPlayerData( "challengeXPMultiplierTimePlayed", 0 ) < self.bufferedChildStatsMax[

"challengeXPMaxMultiplierTimePlayed" ][ 0 ] )
{
entitlement_xp += int( self getPlayerData( "challengeXPMultiplier", 0 ) );
if ( entitlement_xp > 0 )
value = int( value * entitlement_xp );
}

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 this is a weapon challenge then set the weapon
weaponChallenge = maps\mp\gametypes\_missions::isWeaponChallenge( challengeName );
if( weaponChallenge )
weapon = self GetCurrentWeapon();

// riot shield gives xp for taking shield damage
if( type == "shield_damage" )
{
weapon = self GetCurrentWeapon();
sMeansOfDeath = "MOD_MELEE";
}

//////////////////////////////////////////////////////////////
// WEAPON SHIT
// check for weapon xp gains, they need to have cac unlocked before we start weapon xp gains
if( weaponShouldGetXP( weapon, sMeansOfDeath ) || weaponChallenge )
{
// we just want the weapon name up to the first underscore
weaponTokens = StrTok( weapon, "_" );
//curWeapon = self GetCurrentWeapon();

if ( weaponTokens[0] == "iw5" )
weaponName = weaponTokens[0] + "_" + weaponTokens[1];
else if ( weaponTokens[0] == "alt" )
weaponName = weaponTokens[1] + "_" + weaponTokens[2];
else
weaponName = weaponTokens[0];

if( weaponTokens[0] == "gl" )
weaponName = weaponTokens[1];

if( /*IsDefined( curWeapon ) && curWeapon == weapon &&*/ self IsItemUnlocked( weaponName ) )
{
// is the weapon their class loadout weapon or a weapon they picked up?
if( self.primaryWeapon == weapon ||
self.secondaryWeapon == weapon ||
WeaponAltWeaponName( self.primaryWeapon ) == weapon ||
( IsDefined( self.tookWeaponFrom ) && IsDefined( self.tookWeaponFrom[ weapon ] ) ) )
{
oldWeaponXP = self getWeaponRankXP( weaponName );

// we want normalized weapon xp kill points regardless of game mode
switch( type )
{
case "kill":
modifiedValue = WEAPONXP_KILL;
break;
default:
modifiedValue = value;
break;
}
/#
if( GetDvarInt( "scr_devweaponxpmult" ) > 0 )
modifiedValue *= GetDvarInt( "scr_devweaponxpmult" );
#/
//IW5 Prestige bonus weapon XP
if ( self.prestigeDoubleWeaponXp )
{
howMuchWeaponXPTimePlayed = self getPlayerData( "prestigeDoubleWeaponXpTimePlayed" );
if ( howMuchWeaponXPTimePlayed >= self.bufferedStatsMax["prestigeDoubleWeaponXpMaxTimePlayed"] )
{
self setPlayerData( "prestigeDoubleWeaponXp", true );
self setPlayerData( "prestigeDoubleWeaponXpTimePlayed", 0 );
self setPlayerData( "prestigeDoubleWeaponXpMaxTimePlayed", 0 );
self.prestigeDoubleWeaponXp = true;
}
else
{
modifiedValue *= 2;
}
}

if ( self getPlayerData( "weaponXPMultiplierTimePlayed", 999999 ) < self.bufferedChildStatsMax[

"weaponXPMaxMultiplierTimePlayed" ][ 0 ] )
{
weaponXPMult = int( self getPlayerData( "weaponXPMultiplier", 999999 ) );
if ( weaponXPMult > 0 )
modifiedValue *= weaponXPMult;
}

newWeaponXP = oldWeaponXP + modifiedValue;

if( !isWeaponMaxRank( weaponName ) )
{
// make sure we don't give more than the max.
weaponMaxRankXP = getWeaponMaxRankXP( weaponName );
if( newWeaponXP > weaponMaxRankXP )
{
newWeaponXP = weaponMaxRankXP;
modifiedValue = weaponMaxRankXP - oldWeaponXP;
}

//for tracking weaponXP earned on a weapon per game
if ( !isDefined( self.weaponsUsed ) )
{
self.weaponsUsed = [];
self.weaponXpEarned = [];
}

weaponFound = false;
foundIndex = 999;
for( i = 0; i < self.weaponsUsed.size; i++ )
{
if ( self.weaponsUsed[i] == weaponName )
{
weaponFound = true;
foundIndex = i;
}
}

if ( weaponFound )
{
self.weaponXpEarned[foundIndex] += modifiedValue;
}
else
{
self.weaponsUsed[self.weaponsUsed.size] = weaponName;
self.weaponXpEarned[self.weaponXpEarned.size] = modifiedValue;
}

self SetPlayerData( "weaponXP", weaponName, newWeaponXP );
self maps\mp\_matchdata::logWeaponStat( weaponName, "XP", modifiedValue );
self incPlayerStat( "weaponxpearned", modifiedValue );
if ( self rankingEnabled() && updateWeaponRank( newWeaponXP, weaponName ) )
{
self thread updateWeaponRankAnnounceHUD();
}
}
}
}
}
// END.
//////////////////////////////////////////////////////////////

if ( !level.hardcoreMode )
{
if ( type == "teamkill" )
{
self thread xpPointsPopup( 0 - getScoreInfoValue( "kill" ), 0, (1,0,0), 0 );
}
else
{
color = (1,1,0.5);
if ( gotRestXP )
color = (1,.65,0);
self thread xpPointsPopup( value, momentumBonus, color, 0 );
if ( type == "assist" )
{
assist_string = &"MP_ASSIST";
if( self _hasPerk( "specialty_assists" ) )
{
if( !( self.pers["assistsToKill"] % 2 ) )
{
assist_string = &"MP_ASSIST_TO_KILL";
}
}
self thread maps\mp\gametypes\_rank::xpEventPopup( assist_string );
}
}
}

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":
case "kill_confirmed":
case "kill_denied":
case "tags_retrieved":
case "team_assist":
case "kill_bonus":
case "kill_carrier":
case "draft_rogue":
case "survivor":
case "final_rogue":
case "gained_gun_rank":
case "dropped_enemy_gun_rank":
case "got_juggernaut":
case "kill_as_juggernaut":
case "kill_juggernaut":
case "jugg_on_jugg":
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;
}
}

weaponShouldGetXP( weapon, meansOfDeath )
{
if( self IsItemUnlocked( "cac" ) &&
!self isJuggernaut() &&
IsDefined( weapon ) &&
IsDefined( meansOfDeath ) &&
!isKillstreakWeapon( weapon ) )
{
if( isBulletDamage( meansOfDeath ) )
{
return true;
}
if( IsExplosiveDamageMOD( meansOfDeath ) || meansOfDeath == "MOD_IMPACT" )
{
if( getWeaponClass( weapon ) == "weapon_projectile" || getWeaponClass( weapon ) == "weapon_assault" )
return true;
}
if( meansOfDeath == "MOD_MELEE" )
{
if( getWeaponClass( weapon ) == "weapon_riot" )
return true;
}
}

return false;
}

updateRank( oldxp )
{
newRankId = self getRank();
if ( newRankId == self.pers["rank"] )
return false;

oldRank = 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;
}

updateWeaponRank( oldxp, weapon )
{
// NOTE: weapon is already coming in tokenized, so it should be the weapon without attachments and _mp
newRankId = self getWeaponRank( weapon );
if ( newRankId == self.pers[ "weaponRank" ] )
return false;

oldRank = self.pers[ "weaponRank" ];
self.pers[ "weaponRank" ] = newRankId;
self SetPlayerData( "weaponRank", weapon, newRankId );

//self logString( "promoted from " + oldRank + " to " + newRankId + " timeplayed: " + self maps\mp\gametypes\_persistence::statGet(

"timePlayedTotal" ) );
println( "promoted " + self.name + "'s weapon from rank " + oldRank + " to " + newRankId + ". Experience went from " + oldxp + " to " + self

getWeaponRankXP( weapon ) + "." );

// now that we've ranked up, process the mastery challenge
self thread maps\mp\gametypes\_missions::masteryChallengeProcess( weapon );

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 );
}
}
}

updateWeaponRankAnnounceHUD()
{
self endon("disconnect");

self notify("update_weapon_rank");
self endon("update_weapon_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 );

thread maps\mp\gametypes\_hud_message::weaponPromotionSplashNotify();

//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_WEAPON_WAS_PROMOTED", self );
// }
//}
}

endGameUpdate()
{
player = self;
}

createXpPointsPopup()
{
hud_xpPointsPopup = newClientHudElem( self );
hud_xpPointsPopup.horzAlign = "center";
hud_xpPointsPopup.vertAlign = "middle";
hud_xpPointsPopup.alignX = "center";
hud_xpPointsPopup.alignY = "middle";
hud_xpPointsPopup.x = 30;
if ( level.splitScreen )
hud_xpPointsPopup.y = -30;
else
hud_xpPointsPopup.y = -50;
hud_xpPointsPopup.font = "hudbig";
hud_xpPointsPopup.fontscale = 0.65;
hud_xpPointsPopup.archived = false;
hud_xpPointsPopup.color = (0.5,0.5,0.5);
hud_xpPointsPopup.sort = 10000;
hud_xpPointsPopup maps\mp\gametypes\_hud::fontPulseInit( 3.0 );
return hud_xpPointsPopup;
}

xpPointsPopup( amount, bonus, hudColor, glowAlpha )
{
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "joined_spectators" );

if ( amount == 0 )
return;

self notify( "xpPointsPopup" );
self endon( "xpPointsPopup" );

self.xpUpdateTotal += amount;
self.bonusUpdateTotal += bonus;

wait ( 0.05 );

if ( self.xpUpdateTotal < 0 )
self.hud_xpPointsPopup.label = &"";
else
self.hud_xpPointsPopup.label = &"MP_PLUS";

self.hud_xpPointsPopup.color = hudColor;
self.hud_xpPointsPopup.glowColor = hudColor;
self.hud_xpPointsPopup.glowAlpha = glowAlpha;

self.hud_xpPointsPopup setValue(self.xpUpdateTotal);
self.hud_xpPointsPopup.alpha = 0.85;
self.hud_xpPointsPopup 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_xpPointsPopup setValue( self.xpUpdateTotal );

wait ( 0.05 );
}
}
else
{
wait ( 1.0 );
}

self.hud_xpPointsPopup fadeOverTime( 0.75 );
self.hud_xpPointsPopup.alpha = 0;

self.xpUpdateTotal = 0;
}

createXpEventPopup()
{
hud_xpEventPopup = newClientHudElem( self );
hud_xpEventPopup.children = [];
hud_xpEventPopup.horzAlign = "center";
hud_xpEventPopup.vertAlign = "middle";
hud_xpEventPopup.alignX = "center";
hud_xpEventPopup.alignY = "middle";
hud_xpEventPopup.x = 55;
if ( level.splitScreen )
hud_xpEventPopup.y = -20;
else
hud_xpEventPopup.y = -35;
hud_xpEventPopup.font = "hudbig";
hud_xpEventPopup.fontscale = 0.65;
hud_xpEventPopup.archived = false;
hud_xpEventPopup.color = (0.5,0.5,0.5);
hud_xpEventPopup.sort = 10000;
hud_xpEventPopup.elemType = "msgText";
hud_xpEventPopup maps\mp\gametypes\_hud::fontPulseInit( 3.0 );
return hud_xpEventPopup;
}

xpEventPopup( event, hudColor, glowAlpha )
{
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "joined_spectators" );

self notify( "xpEventPopup" );
self endon( "xpEventPopup" );

wait ( 0.05 );

/*if ( self.spUpdateTotal < 0 )
self.hud_xpEventPopup.label = &"";
else
self.hud_xpEventPopup.label = &"MP_PLUS";*/

if ( !isDefined( hudColor ) )
hudColor = (1,1,0.5);
if ( !isDefined( glowAlpha ) )
glowAlpha = 0;

self.hud_xpEventPopup.color = hudColor;
self.hud_xpEventPopup.glowColor = hudColor;
self.hud_xpEventPopup.glowAlpha = glowAlpha;

self.hud_xpEventPopup setText(event);
self.hud_xpEventPopup.alpha = 0.85;

wait ( 1.0 );

self.hud_xpEventPopup fadeOverTime( 0.75 );
self.hud_xpEventPopup.alpha = 0;
}

removeRankHUD()
{
self.hud_xpPointsPopup.alpha = 0;
}

getRank()
{
rankXp = self.pers["rankxp"];
rankId = self.pers["rank"];

if ( rankXp < (getRankInfoMinXP( rankId ) + getRankInfoXPAmt( rankId )) )
return rankId;
else
return self getRankForXp( rankXp );
}

getWeaponRank( weapon )
{
// NOTE: weapon is already coming in tokenized, so it should be the weapon without attachments and _mp
rankXp = self GetPlayerData( "weaponXP", weapon );
return self getWeaponRankForXp( rankXp, weapon );
}

levelForExperience( experience )
{
return getRankForXP( experience );
}

weaponLevelForExperience( experience )
{
return getWeaponRankForXP( experience );
}

getCurrentWeaponXP()
{
weapon = self GetCurrentWeapon();
if( IsDefined( weapon ) )
{
return self GetPlayerData( "weaponXP", weapon );
}

return 0;
}

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;
}

getWeaponRankForXp( xpVal, weapon )
{
// NOTE: weapon is already coming in tokenized, so it should be the weapon without attachments and _mp
if( !IsDefined( xpVal ) )
xpVal = 0;

weaponClass = tablelookup( "mp/statstable.csv", 4, weapon, 2 );
weaponMaxRank = int( tableLookup( "mp/weaponRankTable.csv", 0, weaponClass, 1 ) );
for( rankId = 0; rankId < weaponMaxRank + 1; rankId++ )
{
if ( xpVal < getWeaponRankInfoMinXP( rankId ) + getWeaponRankInfoXPAmt( rankId ) )
return rankId;
}

return ( rankId - 1 );
}

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"];
}

getWeaponRankXP( weapon )
{
return self GetPlayerData( "weaponXP", weapon );
}

getWeaponMaxRankXP( weapon )
{
// NOTE: weapon is already coming in tokenized, so it should be the weapon without attachments and _mp
weaponClass = tablelookup( "mp/statstable.csv", 4, weapon, 2 );
weaponMaxRank = int( tableLookup( "mp/weaponRankTable.csv", 0, weaponClass, 1 ) );
weaponMaxRankXP = getWeaponRankInfoMaxXp( weaponMaxRank );

return weaponMaxRankXP;
}

isWeaponMaxRank( weapon )
{
// NOTE: weapon is already coming in tokenized, so it should be the weapon without attachments and _mp
weaponRankXP = self GetPlayerData( "weaponXP", weapon );
weaponMaxRankXP = getWeaponMaxRankXP( weapon );

return ( weaponRankXP >= weaponMaxRankXP );
}

// TODO: waiting to see how we decide to do this
//checkWeaponUnlocks( weapon )
//{
// // see if the weapon has unlocked anything new
// // NOTE: weapon is already coming in tokenized, so it should be the weapon without attachments and _mp
// weaponClass = tablelookup( "mp/statstable.csv", 4, weapon, 2 );
//
// weaponAttachmentCol = tablelookup( "mp/statstable.csv", 0, weaponClass, 2 );
// weaponCamoCol = tablelookup( "mp/statstable.csv", 0, weaponClass, 3 );
// weaponBuffCol = tablelookup( "mp/statstable.csv", 0, weaponClass, 4 );
// weaponCustomCol = tablelookup( "mp/statstable.csv", 0, weaponClass, 5 );
//
// weaponRank = self getWeaponRank( weapon );
//
// attachment = tablelookup( "mp/statstable.csv", 0, weaponRank, weaponAttachmentCol );
// if( attachment != "" )
// {
// // unlocked a new attachment
// self SetPlayerData( "attachmentNew", weapon, attachment, true );
// }
//
// // TODO: when we get camos online
// //camo = tablelookup( "mp/statstable.csv", 0, weaponRank, weaponCamoCol );
// //if( camo != "" )
// //{
// // // unlocked a new camo
// // self SetPlayerData( "camoNew", weapon, camo, true );
// //}
//
// buff = tablelookup( "mp/statstable.csv", 0, weaponRank, weaponBuffCol );
// if( buff != "" )
// {
// // unlocked a new buff
// self SetPlayerData( "perkNew", weapon, buff, true );
// }
//
// // TODO: when we get customs online
// //custom = tablelookup( "mp/statstable.csv", 0, weaponRank, weaponCustomCol );
// //if( custom != "" )
// //{
// // // unlocked a new custom
// // self SetPlayerData( "customNew", weapon, custom, true );
// //}
//}

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();

/#
// Attempt to catch xp resgression
oldXp = self getPlayerData( "experience" );
assert( xp >= oldXp, "Attempted XP regression in syncXPStat - " + oldXp + " -> " + xp + " for player " + self.name );
#/

self maps\mp\gametypes\_persistence::statSet( "experience", xp );
}

/#
watchDevDvars()
{
level endon( "game_ended" );

while( true )
{
if( GetDvarInt( "scr_devsetweaponmaxrank" ) > 0 )
{
// grab all of the players and max their current weapon rank
foreach( player in level.players )
{
if( IsDefined( player.pers[ "isBot" ] ) && player.pers[ "isBot" ] )
continue;

weapon = player GetCurrentWeapon();

// we just want the weapon name up to the first underscore
weaponTokens = StrTok( weapon, "_" );

if ( weaponTokens[0] == "iw5" )
weaponName = weaponTokens[0] + "_" + weaponTokens[1];
else if ( weaponTokens[0] == "alt" )
weaponName = weaponTokens[1] + "_" + weaponTokens[2];
else
weaponName = weaponTokens[0];

if( weaponTokens[0] == "gl" )
weaponName = weaponTokens[1];

weaponMaxRankXP = getWeaponMaxRankXP( weaponName );
player SetPlayerData( "weaponXP", weaponName, weaponMaxRankXP );
player updateWeaponRank( weaponMaxRankXP, weaponName );
}
SetDevDvar( "scr_devsetweaponmaxrank", 0 );
}

wait( 0.05 );
}
}
#/


:lol: guess IW didnt think we'd see this
You must login or register to view this content.

and looks like they didnt finish /facepalm
    ]
// TODO: waiting to see how we decide to do this
//checkWeaponUnlocks( weapon )
//{
// // see if the weapon has unlocked anything new
// // NOTE: weapon is already coming in tokenized, so it should be the weapon without attachments and _mp
// weaponClass = tablelookup( "mp/statstable.csv", 4, weapon, 2 );
//
// weaponAttachmentCol = tablelookup( "mp/statstable.csv", 0, weaponClass, 2 );
// weaponCamoCol = tablelookup( "mp/statstable.csv", 0, weaponClass, 3 );
// weaponBuffCol = tablelookup( "mp/statstable.csv", 0, weaponClass, 4 );
// weaponCustomCol = tablelookup( "mp/statstable.csv", 0, weaponClass, 5 );
//
// weaponRank = self getWeaponRank( weapon );
//
// attachment = tablelookup( "mp/statstable.csv", 0, weaponRank, weaponAttachmentCol );
// if( attachment != "" )
// {
// // unlocked a new attachment
// self SetPlayerData( "attachmentNew", weapon, attachment, true );
// }
//
// // TODO: when we get camos online
// //camo = tablelookup( "mp/statstable.csv", 0, weaponRank, weaponCamoCol );
// //if( camo != "" )
// //{
// // // unlocked a new camo
// // self SetPlayerData( "camoNew", weapon, camo, true );
// //}
//
// buff = tablelookup( "mp/statstable.csv", 0, weaponRank, weaponBuffCol );
// if( buff != "" )
// {
// // unlocked a new buff
// self SetPlayerData( "perkNew", weapon, buff, true );
// }
//
// // TODO: when we get customs online
// //custom = tablelookup( "mp/statstable.csv", 0, weaponRank, weaponCustomCol );
// //if( custom != "" )
// //{
// // // unlocked a new custom
// // self SetPlayerData( "customNew", weapon, custom, true );
// //}
//}

The following 95 users say thank you to DEREKTROTTER for this useful post:

04jberry, AgentSexyPig, Amanda, AMNE, angelpig1, Arman M., AtlasK, b0snian, BiGGiE_BiGz, bnader, Brentdevent, BriceC, BuC-ShoTz, BvB-09r-_-N!c0, Correy, d7w7z, DARK-LEGEND_GR, dela_tiges12, DezMode2, DiogoPT7, Insight, Docko412, Ehhx, Encopresis, EnD*, SweatyMidgets, FAKA_ELITE, firefox7, FrOzTi, GE90, Holleeder, I Need $, Hawk, Beats, iMCSx, InSaNe-xPWEEx, INSURRECTION1ST, Jakob, JamesSwagger, Joel, Kakashii, KCxFTW, l)ickToo$hort, lbalancel, legitmod, ljjp, lobbyhax, LOKOTE, LordOlliee, manster, MPGH, MV-rockers, Ned Flanders, Neff, Pauly, Press ►, Rainbow Gravity, Rea, Reaper, remi06, robot6527, Sakata, Savant, sciz0r, Solid Snake, Strike Venom, STyLe_JapaN, sunce99, TehNoob2010, Testozter0n, TEXAS24_ReStEr, The Open Minded, The_Platypus, TheFallen, tokzikate, Top_Dog_Uk, UnboundUser, Vectriixx, w8t4it, Wild., x-Roniie-x., xChronicModz, xd366, xMrCheatVisionx, xNinjaMoDz, xRafiq-, XSnIpEriSBaCk, xSOADx, xVz, Xx--AIDAN--xX, xXQUiiCKNiiCKXx, xxshredgnarxx, xzxero
11-16-2011, 11:54 PM #56
Im on my ipad and cant see the image :/ what is it use seem to be trollin at
11-17-2011, 12:10 AM #57
Originally posted by DEREKTROTTER View Post
open with notepad :rolleyes:

ya ur a badass derek thanks for all the hard work
11-17-2011, 12:15 AM #58
I'm gonna guess these are from the Wii. I know for a fact you couldn't of did this on a PS3 yet or at all. Not much accomplished here.
11-17-2011, 12:30 AM #59
How did you get all the gsc files
11-17-2011, 12:58 AM #60
BuC-ShoTz
TeamMvKâ?¢
Originally posted by DEREKTROTTER View Post
BuC cut quote


you should have contacted me we could have done it in 3 seconds.
11-17-2011, 01:02 AM #61
DEREKTROTTER
You're Goddamn Right
Originally posted by ShoTz View Post
you should have contacted me we could have done it in 3 seconds.


ye lol, i was looking for your asset dumper
but found out now the gsc's would open in xbox ffviewer Happy
11-17-2011, 01:03 AM #62
BuC-ShoTz
TeamMvKâ?¢
Originally posted by DEREKTROTTER View Post
ye lol, i was looking for your asset dumper
but found out now the gsc's would open in xbox ffviewer Happy


get on aim ill give you all compiled gsc's to compare

msn my bad...
11-17-2011, 01:08 AM #63
DEREKTROTTER
You're Goddamn Right
Originally posted by ShoTz View Post
get on aim ill give you all compiled gsc's to compare

msn my bad...


im off to bed m8, late here
dont u use msn anymore? ill have to get aim
11-17-2011, 01:36 AM #64
Joey Essex
Maggbot timeout!
Gold star for you.

Copyright © 2024, NextGenUpdate.
All Rights Reserved.

Gray NextGenUpdate Logo