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