1 #using scripts\codescripts\struct; 
    3 #using scripts\shared\callbacks_shared; 
    4 #using scripts\shared\hud_shared; 
    5 #using scripts\shared\scoreevents_shared; 
    6 #using scripts\shared\system_shared; 
    7 #using scripts\shared\util_shared; 
    9 #insert scripts\shared\shared.gsh; 
   11 #insert scripts\shared\scoreevents_shared.gsh; 
   13 #precache( "material", "white" ); 
   14 #precache( "string", "MP_PLUS" ); 
   28     level.codPointsXpScale = GetDvarfloat( 
"scr_codpointsxpscale" );
 
   29     level.codPointsMatchScale = GetDvarfloat( 
"scr_codpointsmatchscale" );
 
   30     level.codPointsChallengeScale = GetDvarfloat( 
"scr_codpointsperchallenge" );
 
   31     level.rankXpCap = GetDvarint( 
"scr_rankXpCap" );
 
   32     level.codPointsCap = GetDvarint( 
"scr_codPointsCap" );  
 
   33     level.usingMomentum = 
true;
 
   34     level.usingScoreStreaks = GetDvarInt( 
"scr_scorestreaks" ) != 0;
 
   35     level.scoreStreaksMaxStacking = GetDvarInt( 
"scr_scorestreaks_maxstacking" );
 
   36     level.maxInventoryScoreStreaks = GetDvarInt( 
"scr_maxinventory_scorestreaks", 3 );
 
   37     level.usingRampage = !isdefined( level.usingScoreStreaks ) || !level.usingScoreStreaks;
 
   38     level.rampageBonusScale = GetDvarFloat( 
"scr_rampagebonusscale" );
 
   42     if ( SessionModeIsCampaignGame() )
 
   44         level.xpScale = GetDvarFloat( 
"scr_xpscalecp" );
 
   46         level.ranktable_name = 
"gamedata/tables/cp/cp_ranktable.csv";
 
   47         level.rankicontable_name = 
"gamedata/tables/cp/cp_rankIconTable.csv";
 
   49     else if ( SessionModeIsZombiesGame() )
 
   51         level.xpScale = GetDvarFloat( 
"scr_xpscalezm" );
 
   53         level.ranktable_name = 
"gamedata/tables/zm/zm_ranktable.csv";
 
   54         level.rankicontable_name = 
"gamedata/tables/zm/zm_rankIconTable.csv";
 
   58         level.xpScale = GetDvarFloat( 
"scr_xpscalemp" );
 
   60         level.ranktable_name = 
"gamedata/tables/mp/mp_ranktable.csv";
 
   61         level.rankicontable_name = 
"gamedata/tables/mp/mp_rankIconTable.csv";
 
   66     level.maxRank = int(tableLookup( level.ranktable_name, 0, 
"maxrank", 1 ));
 
   67     level.maxRankStarterPack = int(tableLookup( level.ranktable_name, 0, 
"maxrankstarterpack", 1 ));
 
   68     level.maxPrestige = int(tableLookup( level.rankicontable_name, 0, 
"maxprestige", 1 ));
 
   71     rankName = tableLookup( level.ranktable_name, 0, rankId, 1 );
 
   72     assert( isdefined( rankName ) && rankName != 
"" );
 
   74     while ( isdefined( rankName ) && rankName != 
"" )
 
   76         level.rankTable[rankId][1] = tableLookup( level.ranktable_name, 0, rankId, 1 );
 
   77         level.rankTable[rankId][2] = tableLookup( level.ranktable_name, 0, rankId, 2 );
 
   78         level.rankTable[rankId][3] = tableLookup( level.ranktable_name, 0, rankId, 3 );
 
   79         level.rankTable[rankId][7] = tableLookup( level.ranktable_name, 0, rankId, 7 );
 
   80         level.rankTable[rankId][14] = tableLookup( level.ranktable_name, 0, rankId, 14 );
 
   82         if( SessionModeIsCampaignGame() )
 
   84             level.rankTable[rankId][18] = tablelookup( level.ranktable_name, 0, rankId, 18 );
 
   87         rankName = tableLookup( level.ranktable_name, 0, rankId, 1 );       
 
   98     assert( isdefined( scoreInfoTableID ) );
 
   99     if ( !isdefined( scoreInfoTableID ) )
 
  107     assert( scoreColumn >= 0 );
 
  108     if ( scoreColumn < 0 )
 
  113     assert( xpColumn >= 0 );
 
  127             if ( labelString != 
"" ) 
 
  133             teamscore_material = undefined;
 
  134             if ( teamScorestring != 
"" )
 
  139             scoreValue = int( tableLookupColumnForRow( scoreInfoTableID, row, scoreColumn ) );
 
  140             xpValue = int( tableLookupColumnForRow( scoreInfoTableID, row, xpColumn ) );
 
  143             if ( !isdefined( game[
"ScoreInfoInitialized"] ) )
 
  145                 xpValue = float( tableLookupColumnForRow( scoreInfoTableID, row, xpColumn ) );
 
  148                 addPlayerStat = 
false;
 
  149                 if ( setDDLStat == 
"TRUE" )
 
  151                     addPlayerStat = 
true;
 
  155                 if ( isdefined( iString ) && iString != &
"" )
 
  161                 if ( !isdefined( demoBookmarkPriority ) )
 
  163                     demoBookmarkPriority = 0;
 
  166                 RegisterXP( type, xpValue, addPlayerStat, isMedal, demoBookmarkPriority, row );
 
  170             if ( allowKillstreakWeapons == 
"TRUE" )
 
  172                 level.scoreInfo[ type ][ 
"allowKillstreakWeapons" ] = 
true;
 
  176             if ( allowHero == 
"TRUE" )
 
  178                 level.scoreInfo[ type ][ 
"allow_hero" ] = 
true;
 
  182             if( IsDefined( combatEfficiencyEvent ) && combatEfficiencyEvent != 
"" )
 
  184                 level.scoreInfo[ type ][ 
"combat_efficiency_event" ] = combatEfficiencyEvent;
 
  189     game[
"ScoreInfoInitialized"] = 
true;
 
  195     if ( ( isdefined( level.rankXpCap ) ) && level.rankXpCap && ( level.rankXpCap <= inRankXp ) )
 
  197         return level.rankXpCap;
 
  205     if ( ( isdefined( level.codPointsCap ) ) && level.codPointsCap && ( level.codPointsCap <= inCodPoints ) )
 
  207         return level.codPointsCap;
 
  215     overrideDvar = 
"scr_" + level.gameType + 
"_score_" + type;  
 
  216     if ( GetDvarString( overrideDvar ) != 
"" )
 
  218         value = getDvarInt( overrideDvar );
 
  223         multiplier = GetGametypeSetting( 
"killEventScoreMultiplier" );
 
  224         level.scoreInfo[type][
"value"] = value;
 
  225         if ( multiplier > 0 )
 
  227             level.scoreInfo[type][
"value"] = int((multiplier) * value);
 
  232         level.scoreInfo[type][
"value"] = value;
 
  235     level.scoreInfo[type][
"xp"] = xp;
 
  237     if ( isdefined( label ) )
 
  239         level.scoreInfo[type][
"label"] = label;
 
  242     if ( isdefined( teamscore_material ) )
 
  244         level.scoreInfo[type][
"team_icon"] = teamscore_material;
 
  250     if ( isdefined( level.scoreInfo[type] ) )
 
  252         n_score = level.scoreInfo[type][
"value"];
 
  253         if ( isdefined( level.scoreModifierCallback ) && isdefined( n_score ) )
 
  255             n_score = [[level.scoreModifierCallback]](type, n_score);
 
  264     if ( isdefined( level.scoreInfo[type] ) )
 
  266         n_xp = level.scoreInfo[type][
"xp"];
 
  267         if ( isdefined( level.xpModifierCallback ) && isdefined( n_xp ) )
 
  269             n_xp = [[level.xpModifierCallback]]( type, n_xp );
 
  278     if( 
IS_TRUE(level.disableMomentum) )
 
  283     if (isdefined(level.teamScoreUICallback) && isdefined( level.scoreInfo[type][
"team_icon"] ))
 
  293     return ( level.scoreInfo[type][
"label"] );
 
  298     return ( level.scoreInfo[type][
"combat_efficiency_event"] );
 
  303     return isdefined( level.scoreInfo[type][
"rampage"] ) && level.scoreInfo[type][
"rampage"];
 
  308     return int(level.rankTable[rankId][2]);
 
  313     return int(level.rankTable[rankId][3]);
 
  318     return int(level.rankTable[rankId][7]);
 
  323     return tableLookupIString( level.ranktable_name, 0, rankId, 16 );
 
  328     return tableLookup( level.rankicontable_name, 0, rankId, prestigeId+1 );
 
  333     return int( tableLookup( level.ranktable_name, 0, rankId, 13 ) );
 
  338     return int( tableLookup( level.ranktable_name, 0, rankId, 17 ) );
 
  349     if (level.rankCap > 0 && 
self.pers[
"rank"] > level.rankCap)
 
  354     if ( ( level.rankCap > 0 ) && ( level.minPrestige == 0 ) && ( 
self.pers[
"plevel"] > 0 ) )
 
  359     if ( level.minPrestige > 
self.pers[
"plevel"] )
 
  369     codPoints = 
self GetDStat( 
"playerstatslist", 
"CODPOINTS", 
"StatValue" );
 
  372     if ( codPoints > codPointsCapped )
 
  377     return codPointsCapped;
 
  382     self SetDStat( 
"PlayerStatsList", 
"CODPOINTS", 
"StatValue", 
getCodPointsCapped( codPoints ) );
 
  387     rankXp = 
self GetDStat( 
"playerstatslist", 
"RANKXP", 
"StatValue" );
 
  390     if ( rankXp > rankXpCapped )
 
  392         self SetDStat( 
"playerstatslist", 
"RANKXP", 
"StatValue", rankXpCapped );
 
  400     arenaSlot = ArenaGetSlot();
 
  401     arenaPoints = 
self GetDStat( 
"arenaStats", arenaSlot, 
"points" );
 
  405     return arenaPoints + 1;
 
  412     self.pers[
"currencyspent"] = 
self GetDStat( 
"playerstatslist", 
"currencyspent", 
"StatValue" );
 
  414     self.pers[
"rank"] = rankId;
 
  415     self.pers[
"plevel"] = 
self GetDStat( 
"playerstatslist", 
"PLEVEL", 
"StatValue" );
 
  419         kick( 
self getEntityNumber() );
 
  423     DEFAULT( 
self.pers[
"participation"], 0 );
 
  425     self.rankUpdateTotal = 0;
 
  428     self.cur_rankNum = rankId;
 
  429     assert( isdefined(
self.cur_rankNum), 
"rank: "+ rankId + 
" does not have an index, check " + level.ranktable_name );
 
  431     prestige = 
self GetDStat( 
"playerstatslist", 
"plevel", 
"StatValue" );
 
  432     self setRank( rankId, prestige );
 
  433     self.pers[
"prestige"] = prestige;
 
  435     if ( ( SessionModeIsMultiplayerGame() && GameModeIsUsingStats() ) || ( SessionModeIsZombiesGame() && SessionModeIsOnlineGame() ) )
 
  437         paragonRank = 
self GetDStat( 
"playerstatslist", 
"paragon_rank", 
"StatValue" );
 
  438         self setParagonRank( paragonRank );
 
  439         self.pers[
"paragonrank"] = paragonRank;
 
  441         paragonIconId = 
self GetDStat( 
"playerstatslist", 
"paragon_icon_id", 
"StatValue" );
 
  442         self setParagonIconId( paragonIconId );
 
  443         self.pers[
"paragoniconid"] = paragonIconId;
 
  446     if ( !isdefined( 
self.pers[
"summary"] ) )
 
  448         self.pers[
"summary"] = [];
 
  449         self.pers[
"summary"][
"xp"] = 0;
 
  450         self.pers[
"summary"][
"score"] = 0;
 
  451         self.pers[
"summary"][
"challenge"] = 0;
 
  452         self.pers[
"summary"][
"match"] = 0;
 
  453         self.pers[
"summary"][
"misc"] = 0;
 
  454         self.pers[
"summary"][
"codpoints"] = 0;
 
  460         arenaPoints = int( min( arenaPoints, 100 ) ); 
 
  462         self.pers[
"arenapoints"] = arenaPoints;
 
  463         self setArenaPoints( arenaPoints );
 
  466     if ( level.rankedMatch )
 
  468         self SetDStat( 
"playerstatslist", 
"rank", 
"StatValue", rankId );
 
  469         self SetDStat( 
"playerstatslist", 
"minxp", 
"StatValue", getRankInfoMinXp( rankId ) );
 
  470         self SetDStat( 
"playerstatslist", 
"maxxp", 
"StatValue", 
getRankInfoMaxXp( rankId ) );
 
  471         self SetDStat( 
"playerstatslist", 
"lastxp", 
"StatValue", 
getRankXPCapped( 
self.pers[
"rankxp"] ) );              
 
  474     self.explosiveKills[0] = 0;
 
  483     self endon(
"disconnect");
 
  490     self endon(
"disconnect");
 
  497     self endon(
"disconnect");
 
  520     if(!isdefined(
self.hud_rankscroreupdate))
 
  522         self.hud_rankscroreupdate = NewScoreHudElem(
self);
 
  523         self.hud_rankscroreupdate.horzAlign = 
"center";
 
  524         self.hud_rankscroreupdate.vertAlign = 
"middle";
 
  525         self.hud_rankscroreupdate.alignX = 
"center";
 
  526         self.hud_rankscroreupdate.alignY = 
"middle";
 
  527         self.hud_rankscroreupdate.x = 0;
 
  528         if( 
self IsSplitscreen() )
 
  529             self.hud_rankscroreupdate.y = -15;
 
  531             self.hud_rankscroreupdate.y = -60;
 
  532         self.hud_rankscroreupdate.font = 
"default";
 
  533         self.hud_rankscroreupdate.fontscale = 2.0;
 
  534         self.hud_rankscroreupdate.archived = 
false;
 
  535         self.hud_rankscroreupdate.color = (1,1,0.5);
 
  536         self.hud_rankscroreupdate.alpha = 0;
 
  537         self.hud_rankscroreupdate.sort = 50;
 
  571     if( !level.rankedMatch )
 
  575     if ( newCodPoints > 
self.pers[
"codpoints"] )
 
  577         self.pers[
"summary"][
"codpoints"] += ( newCodPoints - 
self.pers[
"codpoints"] );
 
  579     self.pers[
"codpoints"] = newCodPoints;
 
  586     foreach( team 
in level.teams )
 
  588         if ( !level.playerCount[team] )
 
  596     self endon(
"disconnect");
 
  599     if( SessionModeIsZombiesGame() )    
 
  612     pixbeginevent(
"giveRankXP");        
 
  614     if ( !isdefined( value ) )
 
  627         case "helicopterassist":
 
  628         case "helicopterassist_25":
 
  629         case "helicopterassist_50":
 
  630         case "helicopterassist_75":
 
  631         case "helicopterkill":
 
  632         case "rcbombdestroy":
 
  634         case "spyplaneassist":
 
  645         case "assault_assist":
 
  648             value = int( value * level.xpScale );
 
  651             if ( level.xpScale == 0 )
 
  658     if ( level.rankedMatch )
 
  669     if ( isdefined( 
self.enableText ) && 
self.enableText && !level.hardcoreMode )
 
  671         if ( type == 
"teamkill" )
 
  687         case "helicopterassist":
 
  688         case "helicopterassist_25":
 
  689         case "helicopterassist_50":
 
  690         case "helicopterassist_75":
 
  698             self.pers[
"summary"][
"score"] += value;
 
  705             self.pers[
"summary"][
"match"] += value;
 
  710             self.pers[
"summary"][
"challenge"] += value;
 
  715             self.pers[
"summary"][
"misc"] += value;  
 
  716             self.pers[
"summary"][
"match"] += value;
 
  721     self.pers[
"summary"][
"xp"] += xpIncrease;
 
  728     value = int( value + 0.5 );
 
  735     if ( newRankId == 
self.pers[
"rank"] )
 
  738     oldRank = 
self.pers[
"rank"];
 
  739     rankId = 
self.pers[
"rank"];
 
  740     self.pers[
"rank"] = newRankId;
 
  746     while ( rankId <= newRankId )
 
  748         self SetDStat( 
"playerstatslist", 
"rank", 
"StatValue", rankId );
 
  749         self SetDStat( 
"playerstatslist", 
"minxp", 
"StatValue", 
int(level.rankTable[rankId][2]) );
 
  750         self SetDStat( 
"playerstatslist", 
"maxxp", 
"StatValue", 
int(level.rankTable[rankId][7]) );
 
  753         self.setPromotion = 
true;
 
  754         if ( level.rankedMatch && level.gameEnded && !
self IsSplitscreen() )
 
  755             self setDStat( 
"AfterActionReportStats", 
"lobbyPopup", 
"promotion" );
 
  758         if ( rankId != oldRank )
 
  765             if ( !isdefined( 
self.pers[
"rankcp"] ) )
 
  767                 self.pers[
"rankcp"] = 0;
 
  770             self.pers[
"rankcp"] += codPointsEarnedForRank;
 
  775     /#print( 
"promoted from " + oldRank + 
" to " + newRankId + 
" timeplayed: " + 
self GetDStat( 
"playerstatslist", 
"time_played_total", 
"StatValue" ) );    #/
 
  777     self setRank( newRankId );
 
  786     if( SessionModeIsCampaignGame() )
 
  789         n_extra_tokens = level.rankTable[rank][18];
 
  791         if (isdefined(n_extra_tokens) && n_extra_tokens != 
"" )
 
  793             self GiveUnlockToken(
int(n_extra_tokens));
 
  800     if( SessionModeIsMultiplayerGame()  )
 
  804             self GiveAchievement( 
"MP_REACH_ARENA" );
 
  808             self GiveAchievement( 
"MP_REACH_SERGEANT" );
 
  812     self LUINotifyEvent( &
"rank_up", 3, rank, prestige, unlockTokensAdded );
 
  813     self LUINotifyEventToSpectators( &
"rank_up", 3, rank, prestige, unlockTokensAdded );
 
  815     if ( isdefined( level.playPromotionReaction ) )
 
  817         self thread [[level.playPromotionReaction]]();
 
  824     itemIndex = int( tableLookup( statsTableName, 4, refString, 0 ) );
 
  825     assert( itemIndex > 0, 
"statsTable refstring " + refString + 
" has invalid index: " + itemIndex );
 
  837     self endon( 
"disconnect" );
 
  838     self endon( 
"joined_team" );
 
  839     self endon( 
"joined_spectators" );
 
  841     if ( isdefined( level.usingMomentum ) && level.usingMomentum )
 
  849     self notify( 
"update_score" );
 
  850     self endon( 
"update_score" );
 
  852     self.rankUpdateTotal += amount;
 
  856     if( isdefined( 
self.hud_rankscroreupdate ) )
 
  858         if ( 
self.rankUpdateTotal < 0 )
 
  860             self.hud_rankscroreupdate.label = &
"";
 
  861             self.hud_rankscroreupdate.color = (0.73,0.19,0.19);
 
  865             self.hud_rankscroreupdate.label = &
"MP_PLUS";
 
  866             self.hud_rankscroreupdate.color = (1,1,0.5);
 
  869         self.hud_rankscroreupdate setValue(
self.rankUpdateTotal);
 
  871         self.hud_rankscroreupdate.alpha = 0.85;
 
  875         self.hud_rankscroreupdate fadeOverTime( 0.75 );
 
  876         self.hud_rankscroreupdate.alpha = 0;
 
  878         self.rankUpdateTotal = 0;
 
  884     self endon( 
"disconnect" );
 
  885     self endon( 
"joined_team" );
 
  886     self endon( 
"joined_spectators" );
 
  891     self notify( 
"update_score" );
 
  892     self endon( 
"update_score" );
 
  894     self.rankUpdateTotal += amount;
 
  896     if( isdefined( 
self.hud_rankscroreupdate ) )
 
  898         if ( 
self.rankUpdateTotal < 0 )
 
  900             self.hud_rankscroreupdate.label = &
"";
 
  901             self.hud_rankscroreupdate.color = (0.73,0.19,0.19);
 
  905             self.hud_rankscroreupdate.label = &
"MP_PLUS";
 
  906             self.hud_rankscroreupdate.color = (1,1,0.5);
 
  909         self.hud_rankscroreupdate setValue( 
self.rankUpdateTotal );
 
  911         self.hud_rankscroreupdate.alpha = 0.85;
 
  926         if ( isdefined( 
self.hud_momentumreason ) )
 
  928             if ( isdefined( reason ) )
 
  930                 if ( isdefined( reasonValue ) )
 
  932                     self.hud_momentumreason.label = reason;
 
  933                     self.hud_momentumreason setValue( reasonValue );
 
  939                     self.hud_momentumreason.label = reason;
 
  940                     self.hud_momentumreason setValue( amount );
 
  942                 self.hud_momentumreason.alpha = 0.85;
 
  947                 self.hud_momentumreason fadeOverTime( 0.01 );
 
  948                 self.hud_momentumreason.alpha = 0;
 
  953         self.hud_rankscroreupdate fadeOverTime( 0.75 );
 
  954         self.hud_rankscroreupdate.alpha = 0;
 
  956         if ( isdefined( 
self.hud_momentumreason ) && isdefined( reason ) )
 
  958             self.hud_momentumreason fadeOverTime( 0.75 );
 
  959             self.hud_momentumreason.alpha = 0;  
 
  964         self.rankUpdateTotal = 0;
 
  970     if(isdefined(
self.hud_rankscroreupdate))
 
  971         self.hud_rankscroreupdate.alpha = 0;
 
  973     if ( isdefined( 
self.hud_momentumreason ) )
 
  975         self.hud_momentumreason.alpha = 0;
 
  982     rankId = 
self.pers[
"rank"];
 
  993     rankName = level.rankTable[rankId][1];
 
  994     assert( isdefined( rankName ) );
 
  996     while ( isdefined( rankName ) && rankName != 
"" )
 
 1002         if ( isdefined( level.rankTable[rankId] ) )
 
 1003             rankName = level.rankTable[rankId][1];
 
 1005             rankName = undefined;
 
 1015     return (3 + (rankLevel * 0.5))*10;
 
 1025     if ( !level.rankedMatch )
 
 1031     if ( 
self.pers[
"rank"] == level.maxRank && newXp >= getRankInfoMaxXP( level.maxRank ) )
 
 1032         newXp = getRankInfoMaxXP( level.maxRank );
 
 1034     if ( 
self IsStarterPack() && 
self.pers[
"rank"] >= level.maxRankStarterPack && newXp >= 
getRankInfoMinXP( level.maxRankStarterPack ) )
 
 1039     if ( xpIncrease < 0 )
 
 1055     self SetDStat( 
"playerstatslist", 
"rankxp", 
"StatValue", xp );
 
 1057     self SetDStat( 
"playerstatslist", 
"codpoints", 
"StatValue", cp );