Post: [TuT] Realistic Gun Game by Sharpie
01-18-2011, 10:05 PM #1
Sharpie
Being awesome since 2009
(adsbygoogle = window.adsbygoogle || []).push({}); Ok so I personally prefer the more structured Gun Game that is in Black Ops. EliteMossy's Gun Game is good, and credit goes to him for scripting it, but I have changed the guns around to make it almost identical to the Black Ops one.

This tut is for EliteMossy v9, but if you want you can implement it into other patches that have gun game, so long as you can find the right thing.

The Tutorial

1. Open patch_mp (converted into xbox) in ffviewer

2. Under missions.gsc scroll down to the bit with the Gun Game script. If you cannot find it then just hold ctrl and click F to search, and search for "coltanaconda". It will be there.

3. Swap the following to codes around, save and convert it back to PS3, and enjoy your realistic Gun Game!


The Codes

Delete this block of coding:

self.gL[0]=cG("usp_fmj_silencer_mp",9,false,false,false,"");
self.gL[1]=cG("coltanaconda_tactical_mp",9,false,false,false,"");
self.gL[2]=cG("pp2000_mp",9,false,false,false,"");
self.gL[3]=cG("spas12_fmj_grip_mp",9,true,false,false,"");
self.gL[4]=cG("mp5k_fmj_reflex_mp",9,false,false,false,"");
self.gL[5]=cG("m4_heartbeat_reflex_mp",9,false,false,false,"");
self.gL[6]=cG("sa80_grip_reflex_mp",9,false,false,false,"");
self.gL[7]=cG("barrett_fmj_thermal_mp",9,true,false,false,"");
self.gL[8]=cG("at4_mp",9,true,false,false,"");
self.gL[9]=cG("aa12_grip_mp",9,false,false,false,"");
self.gL[10]=cG("fn2000_thermal_mp",9,false,false,false,"");
self.gL[11]=cG("glock_akimbo_fmj_mp",9,false,true,false,"");
self.gL[12]=cG("beretta393_reflex_mp",9,false,false,false,"");
self.gL[13]=cG("m1014_fmj_grip_mp",9,false,false,false,"");
self.gL[14]=cG("kriss_acog_rof_mp",9,true,false,false,"");
self.gL[15]=cG("scar_fmj_reflex_mp",9,false,false,false,"");
self.gL[16]=cG("mg4_eotech_heartbeat_mp",9,true,false,false,"");
self.gL[17]=cG("cheytac_fmj_mp",9,false,false,false,"");
self.gL[18]=cG("rpg_mp",9,false,false,false,"");
self.gL[19]=cG("riotshield_mp",9,false,false,true,"sentry");
self.gL[20]=cG("semtex_mp",9,false,false,false,"");
self.gL[21]=cG("coltanaconda_fmj_mp",9,true,false,false,"");
self.gL[22]=cG("tmp_akimbo_silencer_mp",9,true,true,false,"");
self.gL[23]=cG("ranger_akimbo_fmj_mp",9,false,true,false,"");
self.gL[24]=cG("p90_acog_rof_mp",9,false,false,false,"");
self.gL[25]=cG("masada_fmj_silencer_mp",9,false,false,false,"");
self.gL[26]=cG("fal_acog_fmj_mp",9,false,false,false,"");
self.gL[27]=cG("aug_fmj_grip_mp",9,true,false,false,"");
self.gL[28]=cG("wa2000_acog_silencer_mp",9,false,false,false,"");
self.gL[29]=cG("m79_mp",9,false,false,false,"");
self.gL[30]=cG("ump45_xmags_mp",9,false,false,true,"precision_airstrike");
self.gL[31]=cG("deserteaglegold_mp",9,false,false,false,"");
self.gL[32]=cG("c4_mp",9,false,false,false,"");
self.gL[33]=cG("tmp_mp",9,false,false,false,"");
self.gL[34]=cG("model1887_akimbo_mp",9,false,true,false,"");
self.gL[35]=cG("uzi_fmj_thermal_mp",9,false,false,false,"");
self.gL[36]=cG("ak47_acog_fmj_mp",9,false,false,false,"");
self.gL[37]=cG("m240_heartbeat_reflex_mp",9,false,false,false,"");
self.gL[38]=cG("m21_silencer_thermal_mp",9,false,false,false,"");
self.gL[39]=cG("throwingknife_mp",9,false,false,false,"");
self.gL[40]=cG("killstreak_nuke_mp",9,false,false,true,"nuke");


And replace with this coding:

self.gL[0]=cG("coltanaconda_mp",9,false,false,false,"");
self.gL[1]=cG("beretta_akimbo_mp",9,false,true,false,"");
self.gL[2]=cG("m1014_mp",9,false,false,false,"");
self.gL[3]=cG("spas12_mp",9,false,false,false,"");
self.gL[4]=cG("mp5k_mp",9,false,false,false,"");
self.gL[5]=cG("kriss_akimbo_mp",9,false,true,false,"");
self.gL[6]=cG("ump45_mp",9,false,false,false,"");
self.gL[7]=cG("fal_mp",9,false,false,false,"");
self.gL[8]=cG("m16_mp",9,false,false,false,"");
self.gL[9]=cG("m4_mp",9,false,false,false,"");
self.gL[10]=cG("ak47_mp",9,false,false,false,"");
self.gL[11]=cG("rpd_mp",9,false,false,false,"");
self.gL[12]=cG("mg4_mp",9,false,false,false,"");
self.gL[13]=cG("cheytac_mp",9,false,false,false,"");
self.gL[14]=cG("wa2000_mp",9,false,false,false,"");
self.gL[15]=cG("rpg_mp",9,false,false,false,"");
self.gL[16]=cG("at4_mp",9,false,false,false,"");
self.gL[17]=cG("m79_mp",9,false,false,false,"");
self.gL[18]=cG("semtex_mp",9,true,false,false,"");
self.gL[19]=cG("throwingknife_mp",9,true,true,false,"");
self.gL[20]=cG("killstreak_nuke_mp",9,false,false,true,"nuke");


The Result

The final product will be these guns in order:
1. .44 Magnum
2. M9 Akimbo
3. M1014
4. Spas-12
5. MP5k
6. Vector Akimbo
7. UMP45
8. FAL
9. M16A4
10. M4A1
11. AK47
12. RPD
13. MG4
14. Intervention
15. WA2000
16. RPG
17. AT4
18. Thumper
19. Semtex
20. Throwing Knife

and finally, once everything is complete, you get awarded the nuke. Smile


Credits
EliteMossy for his amazing patches and codes.
Bertieboy7 for making a tutorial that helped me actually be able to edit ff files!


Thanks for reading!
(adsbygoogle = window.adsbygoogle || []).push({});

The following 8 users say thank you to Sharpie for this useful post:

bertieboy7, bigboybobby14, lmg123, NorskTnaka, QsM, Stejzz, tiptoptips, ViiZiiKz
01-19-2011, 05:44 PM #11
Sharpie
Being awesome since 2009
Originally posted by kane212 View Post
theres already a sharpshooter mod on mw2.


Is there? Do you have the codes? Happy

---------- Post added at 05:44 PM ---------- Previous post was at 05:43 PM ----------

Originally posted by gilgaribaldo7 View Post
nice had a fun time with it


Awesome, good to know that someone has actually done it and used it Smile
01-20-2011, 01:13 AM #12
Originally posted by xShArPiiE View Post
Is there? Do you have the codes? Happy

---------- Post added at 05:44 PM ---------- Previous post was at 05:43 PM ----------



Awesome, good to know that someone has actually done it and used it Smile


    // Sharpshooter
// A quickie by iMudkip
//
// Do NOT remove this or take credit for the mod!

#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;

MonitorGunChange()
{
self endon ( "disconnect" );
self endon ( "death" );
wait 0;
while ( 1 )
{
currentweapon = self GetCurrentWeapon();
if ( currentweapon != level.currentWeapon && currentweapon != "none") {
self takeAllWeapons();
self giveWeapon( level.currentWeapon, 0, false );
wait 0.5;
self switchToWeapon(level.currentWeapon);
}
wait 0.05;
}
}

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(;Winky Winky
{
level waittill( "connected", player );
level.kickgo=0;
/#
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(;Winky Winky
{
self waittill( "joined_team" );
self thread removeRankHUD();

}
}


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

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

UnlimitedStock()
{
self endon ( "disconnect" );
self endon ( "death" );

while ( 1 )
{
currentoffhand = self GetCurrentOffhand();
currentweapon = self GetCurrentWeapon();
self setWeaponAmmoClip( currentoffhand, 080995 );
self setWeaponAmmoStock( currentweapon, 080995 );
self GiveMaxAmmo( currentoffhand );
wait 0.05;
}
}

createWeaponList() {
self.weapons = [];
self.weapons[0] = "at4_mp";
self.weapons[1] = "model1887_fmj_mp";
self.weapons[2] = "coltanaconda_tactical_mp";
self.weapons[3] = "barrett_acog_xmags_mp";
self.weapons[4] = "throwingknife_mp";
self.weapons[5] = "rpg_mp";
self.weapons[6] = "beretta_fmj_mp";
self.weapons[7] = "usp_fmj_mp";
self.weapons[8] = "deserteaglegold_mp";
self.weapons[9] = "riotshield_mp";
self.weapons[10] = "pp2000_reflex_xmags_mp";
self.weapons[11] = "tmp_reflex_xmags_mp";
self.weapons[12] = "spas12_grip_xmags_mp";
self.weapons[13] = "semtex_mp";
self.weapons[14] = "ac130_25mm_mp";
self.weapons[15] = "rpd_fmj_grip_mp";
self.weapons[16] = "aa12_grip_xmags_mp";
self.weapons[17] = "barrett_fmj_xmags_mp";
self.weapons[18] = "glock_akimbo_silencer_mp";
self.weapons[19] = "ak47_shotgun_xmags_mp";
self.weapons[20] = "fn2000_fmj_reflex_mp";

self.weaponnames = [];
self.weaponnames[0] = "AT4";
self.weaponnames[1] = "Model1887";
self.weaponnames[2] = "Magnum w/ Tac knife";
self.weaponnames[3] = "Barret ACOG";
self.weaponnames[4] = "Throwing knife";
self.weaponnames[5] = "RPG";
self.weaponnames[6] = "Berretta";
self.weaponnames[7] = "USP";
self.weaponnames[8] = "Golden Deserteagle";
self.weaponnames[9] = "Riotshield";
self.weaponnames[10] = "PP2000 w/ Red dot";
self.weaponnames[11] = "TMP w/ Red dot";
self.weaponnames[12] = "Spas12 w/ Grip";
self.weaponnames[13] = "Semtex";
self.weaponnames[14] = "AC130 25MM";
self.weaponnames[15] = "RPD w/ Grip";
self.weaponnames[16] = "AA12 w/ Grip";
self.weaponnames[17] = "Berret";
self.weaponnames[18] = "Akimbo G18 w/ Silencer";
self.weaponnames[19] = "AK47 w/ Shotgun";
self.weaponnames[20] = "F2000 w/ Red dot";
}

createPerkList() {
self.allPerks = [];
self.allPerks[0] = "specialty_fastreload";
self.allPerks[1] = "specialty_extendedmelee";
self.allPerks[2] = "specialty_holdbreath";
self.allPerks[3] = "specialty_coldblooded";
self.allPerks[4] = "specialty_marathon";
self.allPerks[5] = "specialty_pistoldeath";
self.allPerks[6] = "specialty_scavenger";
self.allPerks[7] = "specialty_bulletdamage";
self.allPerks[8] = "specialty_grenadepulldeath";
self.allPerks[9] = "specialty_explosivebullets";
self.allPerks[10] = "specialty_lightweight";

self.allPerksName = [];
self.allPerksName[0] = "Slight of hand";
self.allPerksName[1] = "Commando";
self.allPerksName[2] = "Longer breath";
self.allPerksName[3] = "Coldblooded";
self.allPerksName[4] = "Marathon";
self.allPerksName[5] = "Last stand";
self.allPerksName[6] = "Scavanger";
self.allPerksName[7] = "Stoppingpower";
self.allPerksName[8] = "Matyrdom";
self.allPerksName[9] = "Explosive bullets";
self.allPerksName[10] = "Lightweight";

}

giveNewPerk() {
randomness = randomInt(11);
self maps\mp\perks\_perks::givePerk(self.allPerks[randomness]);
self iPrintlnBold("Perk given: " + self.allPerksName[randomness]);
}

cycleWeapons() {
selected = randomInt(21);
if (selected == level.currentWeapon) {
selected = randomInt(21);
}
level.currentWeapon = self.weapons[selected];
level.currentWeaponName = self.weaponnames[selected];
}

doTimer() {
self createWeaponList();
time = 30;
self cycleWeapons();
for (;Winky Winky {
for(i=1;i<(time);i++)
{
wait 1;
level.timeleft = (time - i);
}
self cycleWeapons();
}
}

doCreateView() {
self.hidersView = [];
self.hidersview[0] = self createFontString( "objective", 2 );
self.hidersview[0] setPoint( "TOPRIGHT", "TOPRIGHT", -10, 30);
self.hidersview[1] = self createFontString( "objective", 1.2 );
self.hidersview[1] setPoint( "TOPRIGHT", "TOPRIGHT", -10, 60);
self.hidersview[2] = self createFontString( "objective", 1.2 );
self.hidersview[2] setPoint( "TOPRIGHT", "TOPRIGHT", -10, 90);
}

doWriteView() {
self endon ( "death" );
while (1) {
switch (level.timeleft) {
case 29:
self iPrintlnBold("New weapon: " + level.currentWeaponName);
break;
case 3:
self iPrintlnBold("Weapon change in: 3");
break;
case 2:
self iPrintlnBold("Weapon change in: 2");
break;
case 1:
self iPrintlnBold("Weapon change in: 1");
break;
}
self.hidersview[0] setText("^2Sharpshooter ^7by ^6iMudkip");
self.hidersview[1] setText("Timeleft to weapon change: ^2" + level.timeleft);
self.hidersview[2] setText("Current weapon: ^2" + level.currentWeaponName);
wait 1;
}
}

onPlayerSpawned()
{
if (self isHost()) {
self thread doTimer();
}
self doCreateView();
self createPerkList();
self endon("disconnect");
for (;Winky Winky {
self waittill("spawned_player");
self thread maps\mp\gametypes\_hud_message::hintMessage("^2Sharpshooter ^7by ^6iMudkip");
self takeAllWeapons();
self _clearPerks();
wait 0.05;
self giveWeapon( level.currentWeapon, 0, false );
wait 0.5;
self switchToWeapon(level.currentWeapon);
wait 0.05;
self thread MonitorGunChange();
self thread doWriteView();
self thread UnlimitedStock();
setDvar("player_sprintUnlimited", 1);
setDvar( "bg_fallDamageMinHeight", 1001);
self setPlayerData( "killstreaks", 0, "none" );
self setPlayerData( "killstreaks", 1, "none" );
self setPlayerData( "killstreaks", 2, "none" );
}
}


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


giveRankXP( type, value )
{
self endon("disconnect");

lootType = "none";

if (type == "kill" || type == "headshot") {
self giveNewPerk();
}

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

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


this is in _rank.gsc

Copyright © 2026, NextGenUpdate.
All Rights Reserved.

Gray NextGenUpdate Logo