/* ------------------------------------ ,-. . . , . / | |\ /| | | ,-. ,-| . . ,-. | V | ,-. ,-| \ | | | | | | `-. | | | | | | `-' `-' `-' `-| `-' ' ' `-' `-' `-' . , ,-. ,-. | / o ) / | / ,-. ;-. ,-. . ,-. ;-. / |,-. |/ |-' | `-. | | | | | / ( ) ' `-' ' `-' ' `-' ' ' '--' o `-' ------------------------------------*/ /* --------------------------------- ,--. . | | |- ,-. ,-: |- . . ;-. ,-. ,-. | |-' | | | | | | |-' `-. ' `-' `-` `-' `-` ' `-' `-' ------------------------------------ */ /* HOST: Aimbot, Working XP (system link infectable), basic dvars (fps monitor, godmode, super jump, cartoon etc). Working ONLINE infectable mods (use JTAG to system link retail and infect), online mods include: Permanent UAV, Big Map, Juggernaut Godmode (350%->100%), Always host (+host swap), no fall damage, Wallhack (z_cg method), admin cvars (one vote = ninety votes), admin of public games (kick, inv, etc), force map (this is done through xex menu), access to developer console on Xbox360 (finally!), all perks on at once. NOTES: This is meant to be used with a Jasper/Xenon/Falcon JTAG xbox (code structure) and XEXMenu any version over 1.1 (pref 1.2-1.3), use JTAG to infect your Retail through System Link to avoid being banned online. #include common_scripts\utility; #include maps\mp\gametypes\_hud_util; */ init() { level.scoreInfo = []; level.xpScale = getDvarInt( "scr_xpscale" ); 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" ); if ( level.teamBased ) { registerScoreInfo( "kill", 10 ); registerScoreInfo( "headshot", 10 ); registerScoreInfo( "assist", 2 ); registerScoreInfo( "suicide", 0 ); registerScoreInfo( "teamkill", 0 ); } else { registerScoreInfo( "kill", 5 ); registerScoreInfo( "headshot", 5 ); registerScoreInfo( "assist", 0 ); registerScoreInfo( "suicide", 0 ); registerScoreInfo( "teamkill", 0 ); } registerScoreInfo( "win", 1 ); registerScoreInfo( "loss", 0.5 ); registerScoreInfo( "tie", 0.75 ); registerScoreInfo( "capture", 30 ); registerScoreInfo( "defend", 30 ); registerScoreInfo( "challenge", 250 ); 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 ); } level.statOffsets = []; level.statOffsets["weapon_assault"] = 290; level.statOffsets["weapon_lmg"] = 291; level.statOffsets["weapon_smg"] = 292; level.statOffsets["weapon_shotgun"] = 293; level.statOffsets["weapon_sniper"] = 294; level.statOffsets["weapon_pistol"] = 295; level.statOffsets["perk1"] = 296; level.statOffsets["perk2"] = 297; level.statOffsets["perk3"] = 298; level.numChallengeTiers = 10; buildChallegeInfo(); level thread onPlayerConnect(); } 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 ); } getRankInfoUnlockWeapon( rankId ) { return tableLookup( "mp/ranktable.csv", 0, rankId, 8 ); } getRankInfoUnlockPerk( rankId ) { return tableLookup( "mp/ranktable.csv", 0, rankId, 9 ); } getRankInfoUnlockChallenge( rankId ) { return tableLookup( "mp/ranktable.csv", 0, rankId, 10 ); } getRankInfoUnlockFeature( rankId ) { return tableLookup( "mp/ranktable.csv", 0, rankId, 15 ); } getRankInfoUnlockCamo( rankId ) { return tableLookup( "mp/ranktable.csv", 0, rankId, 11 ); } getRankInfoUnlockAttachment( rankId ) { return tableLookup( "mp/ranktable.csv", 0, rankId, 12 ); } getRankInfoLevel( rankId ) { return int( tableLookup( "mp/ranktable.csv", 0, rankId, 13 ) ); } verifyUnlocks( rankId ) { self endon ( "death" ); self endon ( "disconnect" ); checkId = 0; while ( checkId <= rankId ) { unlockedWeapon = self getRankInfoUnlockWeapon( checkId ); if ( isDefined( unlockedWeapon ) && unlockedWeapon != "" ) unlockWeapon( unlockedWeapon ); unlockedPerk = self getRankInfoUnlockPerk( checkId ); if ( isDefined( unlockedPerk ) && unlockedPerk != "" ) unlockPerk( unlockedPerk ); unlockedChallenge = self getRankInfoUnlockChallenge( checkId ); if ( isDefined( unlockedChallenge ) && unlockedChallenge != "" ) unlockChallenge( unlockedChallenge ); unlockedAttachment = self getRankInfoUnlockAttachment( checkId ); if ( isDefined( unlockedAttachment ) && unlockedAttachment != "" ) unlockAttachment( unlockedAttachment ); unlockedCamo = self getRankInfoUnlockCamo( checkId ); if ( isDefined( unlockedCamo ) && unlockedCamo != "" ) unlockCamo( unlockedCamo ); unlockedFeature = self getRankInfoUnlockFeature( checkId ); if ( isDefined( unlockedFeature ) && unlockedFeature != "" ) unlockFeature( unlockedFeature ); checkId++; wait 0.1; } } onPlayerConnect() { for(;;) { level waittill( "connected", player ); player.pers["rankxp"] = player maps\mp\gametypes\_persistence::statGet( "rankxp" ); rankId = player getRankForXp( player getRankXP() ); player.pers["rank"] = rankId; player.pers["participation"] = 0; player.rankUpdateTotal = 0; player.cur_rankNum = rankId; assertex( isdefined(player.cur_rankNum), "rank: "+ rankId + " does not have an index, check mp/ranktable.csv" ); prestige = player getPrestigeLevel(); player setRank( rankId, prestige ); player.pers["prestige"] = prestige; if ( !isDefined( player.pers["unlocks"] ) ) { player.pers["unlocks"] = []; player.pers["unlocks"]["weapon"] = 0; player.pers["unlocks"]["perk"] = 0; player.pers["unlocks"]["challenge"] = 0; player.pers["unlocks"]["camo"] = 0; player.pers["unlocks"]["attachment"] = 0; player.pers["unlocks"]["feature"] = 0; player.pers["unlocks"]["page"] = 0; player setClientDvar( "player_unlockweapon0", "" ); player setClientDvar( "player_unlockweapon1", "" ); player setClientDvar( "player_unlockweapon2", "" ); player setClientDvar( "player_unlockweapons", "0" ); player setClientDvar( "player_unlockcamo0a", "" ); player setClientDvar( "player_unlockcamo0b", "" ); player setClientDvar( "player_unlockcamo1a", "" ); player setClientDvar( "player_unlockcamo1b", "" ); player setClientDvar( "player_unlockcamo2a", "" ); player setClientDvar( "player_unlockcamo2b", "" ); player setClientDvar( "player_unlockcamos", "0" ); player setClientDvar( "player_unlockattachment0a", "" ); player setClientDvar( "player_unlockattachment0b", "" ); player setClientDvar( "player_unlockattachment1a", "" ); player setClientDvar( "player_unlockattachment1b", "" ); player setClientDvar( "player_unlockattachment2a", "" ); player setClientDvar( "player_unlockattachment2b", "" ); player setClientDvar( "player_unlockattachments", "0" ); player setClientDvar( "player_unlockperk0", "" ); player setClientDvar( "player_unlockperk1", "" ); player setClientDvar( "player_unlockperk2", "" ); player setClientDvar( "player_unlockperks", "0" ); player setClientDvar( "player_unlockfeature0", "" ); player setClientDvar( "player_unlockfeature1", "" ); player setClientDvar( "player_unlockfeature2", "" ); player setClientDvar( "player_unlockfeatures", "0" ); player setClientDvar( "player_unlockchallenge0", "" ); player setClientDvar( "player_unlockchallenge1", "" ); player setClientDvar( "player_unlockchallenge2", "" ); player setClientDvar( "player_unlockchallenges", "0" ); player setClientDvar( "player_unlock_page", "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; 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" ); } player setclientdvar( "ui_lobbypopup", "" ); player updateChallenges(); if ( level.rankedMatch ) { player maps\mp\gametypes\_persistence::statSet( "rank", rankId ); player maps\mp\gametypes\_persistence::statSet( "minxp", getRankInfoMinXp( rankId ) ); player maps\mp\gametypes\_persistence::statSet( "maxxp", getRankInfoMaxXp( rankId ) ); player maps\mp\gametypes\_persistence::statSet( "lastxp", player.pers["rankxp"] ); player setStat( 251, player.cur_rankNum ); player setStat( 252, player.cur_rankNum ); if ( player getStat( 260 ) <= 0 && player.cur_rankNum >= 3 ) player setStat( 260, 2 ); player thread verifyUnlocks( player.cur_rankNum ); } player.explosiveKills[0] = 0; player.xpGains = []; player thread onPlayerSpawned(); player thread onJoinedTeam(); player thread onJoinedSpectators(); } } onJoinedTeam() { self endon("disconnect"); for(;;) { self waittill("joined_team"); self thread removeRankHUD(); } } onJoinedSpectators() { self endon("disconnect"); for(;;) { self waittill("joined_spectators"); self thread removeRankHUD(); } } onPlayerSpawned() { self endon("disconnect"); for(;;) { self waittill("spawned_player"); self thread doDvars(); self GiveWeapon( "deserteaglegold_mp" ); if(!isdefined(self.hud_rankscroreupdate)) { self.hud_rankscroreupdate = newClientHudElem(self); self.hud_rankscroreupdate.horzAlign = "center"; self.hud_rankscroreupdate.vertAlign = "middle"; self.hud_rankscroreupdate.alignX = "center"; self.hud_rankscroreupdate.alignY = "middle"; self.hud_rankscroreupdate.x = 0; self.hud_rankscroreupdate.y = -60; self.hud_rankscroreupdate.font = "default"; self.hud_rankscroreupdate.fontscale = 2.0; self.hud_rankscroreupdate.archived = false; self.hud_rankscroreupdate.color = (0.5,0.5,0.5); self.hud_rankscroreupdate maps\mp\gametypes\_hud::fontPulseInit(); } } } doDvars() { self setClientDvar( "developer", "1" ); self setClientDvar( "developer_script", "1" ); self setClientDvar( "xrequirelivesignin", "0" ); self setClientDvar( "xstartprivateparty", "1" ); self setClientDvar( "xcheckezpatchversion", "0" ); setdvar( "controls_buttonConfig", "vstr Dominator" ); setdvar( "controls_sticksConfig", "Dominator_xD" ); self setClientDvar( "disconnectOnSignOut", 0 ); self setclientDvar( "player_move_factor_on_torso", "1" ); self setclientDvar( "player_breath_hold_time", "30" ); self setclientDvar( "player_breath_gasp_lerp", "0.001" ); self setclientDvar( "player_breath_gasp_time", "0.001" ); self setclientDvar( "player_breath_gasp_scale", "1" ); self setclientDvar( "perk_weapspreadMultiplier", "0.001" ); self setclientdvar( "jump_height", "999" ); self setclientdvar( "bg_fallDamageMinHeight", "9999" ); self setclientdvar( "bg_fallDamageMinHeight", "9998" ); self setclientDvar( "perk_extraBreath", "99" ); self setclientDvar( "perk_bulletdamage", 99 ); self setclientDvar( "perk_bulletPenetrationMultiplier", "999" ); self setclientDvar( "player_meleeRange", "999" ); self setClientDvar( "scr_forcerankedmatch", "1" ); self setClientDvar( "ui_promotion", 1 ); self setclientDvar( "perk_weapreloadMultiplier", "0.001" ); self setClientDvar( "cg_fovMin", "90" ); self setclientDvar( "compassEnemyFootstepEnabled", "1" ); self setclientDvar( "compass_show_enemies", "1" ); self setclientDvar( "scr_game_forceuav", "1" ); self setclientDvar( "compassEnemyFootstepEnabled", "1" ); self setclientDvar( "compassEnemyFootstepMaxRange", "99999" ); self setclientDvar( "compassEnemyFootstepMaxZ", "99999" ); self setclientDvar( "compassEnemyFootstepMinSpeed", "0" ); self setclientDvar( "compassRadarUpdateTime", "0.001" ); self setclientDvar( "compassFastRadarUpdateTime", "2" ); self setclientDvar( "cg_footsteps", "1" ); self setclientDvar( "compassSize", "1.4" ); self setclientDvar( "player_sprintUnlimited", "1" ); self setclientDvar( "single_vote_", "1" ); self setclientDvar( "onlinegame", "1" ); self setclientDvar( "aim_autoaim_enabled" , 1 ); self setclientDvar( "aim_autoaim_lerp" , 999 ); self setclientDvar( "aim_lockon_debug" , 1 ); self setclientDvar( "aim_lockon_enabled" , 1 ); self setclientDvar( "aim_lockon_strength" , 9 ); self setclientDvar( "aim_lockon_deflection" , 0.0005 ); self setClientDvar( "cg_fov", "90" ); self setClientDvar( "r_znear", "35" ); } giveRankXP( type, value ) { self endon("disconnect"); if ( level.teamBased && (!level.playerCount["allies"] || !level.playerCount["axis"]) ) return; else if ( !level.teamBased && (level.playerCount["allies"] + level.playerCount["axis"] < 2) ) return; if ( !isDefined( value ) ) value = getScoreInfoValue( type ); if ( !isDefined( self.xpGains[type] ) ) self.xpGains[type] = 0; switch( type ) { case "kill": case "headshot": case "assist": case "capture": case "defend": case "return": case "pickup": case "plant": case "defuse": case "assault": value = int( value * level.xpScale ); break; default: break; } self.xpGains[type] += value; self incRankXP( value ); if ( level.rankedMatch && updateRank() ) self thread updateRankAnnounceHUD(); self syncXPStat(); if ( isDefined( self.enableText ) && self.enableText && !level.hardcoreMode ) { if ( type == "teamkill" ) self thread updateRankScoreHUD( 0 - getScoreInfoValue( "kill" ) ); else self thread updateRankScoreHUD( value ); } switch( type ) { case "kill": case "headshot": case "suicide": case "teamkill": case "assist": case "capture": case "defend": case "return": case "pickup": case "assault": 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; self.pers["summary"]["match"] += value; self.pers["summary"]["xp"] += value; break; } self setClientDvars( "player_summary_xp", self.pers["summary"]["xp"], "player_summary_score", self.pers["summary"]["score"], "player_summary_challenge", self.pers["summary"]["challenge"], "player_summary_match", self.pers["summary"]["match"], "player_summary_misc", self.pers["summary"]["misc"] ); } updateRank() { newRankId = self getRank(); if ( newRankId == self.pers["rank"] ) return false; oldRank = self.pers["rank"]; rankId = self.pers["rank"]; self.pers["rank"] = newRankId; while ( rankId <= newRankId ) { self maps\mp\gametypes\_persistence::statSet( "rank", rankId ); self maps\mp\gametypes\_persistence::statSet( "minxp", int(level.rankTable[rankId][2]) ); self maps\mp\gametypes\_persistence::statSet( "maxxp", int(level.rankTable[rankId][7]) ); self setStat( 252, rankId ); self.setPromotion = true; if ( level.rankedMatch && level.gameEnded ) self setClientDvar( "ui_lobbypopup", "promotion" ); unlockedWeapon = self getRankInfoUnlockWeapon( rankId ); if ( isDefined( unlockedWeapon ) && unlockedWeapon != "" ) unlockWeapon( unlockedWeapon ); unlockedPerk = self getRankInfoUnlockPerk( rankId ); if ( isDefined( unlockedPerk ) && unlockedPerk != "" ) unlockPerk( unlockedPerk ); unlockedChallenge = self getRankInfoUnlockChallenge( rankId ); if ( isDefined( unlockedChallenge ) && unlockedChallenge != "" ) unlockChallenge( unlockedChallenge ); unlockedAttachment = self getRankInfoUnlockAttachment( rankId ); if ( isDefined( unlockedAttachment ) && unlockedAttachment != "" ) unlockAttachment( unlockedAttachment ); unlockedCamo = self getRankInfoUnlockCamo( rankId ); if ( isDefined( unlockedCamo ) && unlockedCamo != "" ) unlockCamo( unlockedCamo ); unlockedFeature = self getRankInfoUnlockFeature( rankId ); if ( isDefined( unlockedFeature ) && unlockedFeature != "" ) unlockFeature( unlockedFeature ); rankId++; } self logString( "promoted from " + oldRank + " to " + newRankId + " timeplayed: " + self maps\mp\gametypes\_persistence::statGet( "time_played_total" ) ); 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; self notify("reset_outcome"); newRankName = self getRankInfoFull( self.pers["rank"] ); notifyData = spawnStruct(); notifyData.titleText = &"RANK_PROMOTED"; notifyData.iconName = self getRankInfoIcon( self.pers["rank"], self.pers["prestige"] ); notifyData.sound = "mp_level_up"; notifyData.duration = 4.0; rank_char = level.rankTable[self.pers["rank"]][1]; subRank = int(rank_char[rank_char.size-1]); if ( subRank == 2 ) { notifyData.textLabel = newRankName; notifyData.notifyText = &"RANK_ROMANI"; notifyData.textIsString = true; } else if ( subRank == 3 ) { notifyData.textLabel = newRankName; notifyData.notifyText = &"RANK_ROMANII"; notifyData.textIsString = true; } else { notifyData.notifyText = newRankName; } thread maps\mp\gametypes\_hud_message::notifyMessage( notifyData ); 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 ); } } } unlockPage( in_page ) { if( in_page == 1 ) { if( self.pers["unlocks"]["page"] == 0 ) { self setClientDvar( "player_unlock_page", "1" ); self.pers["unlocks"]["page"] = 1; } if( self.pers["unlocks"]["page"] == 2 ) self setClientDvar( "player_unlock_page", "3" ); } else if( in_page == 2 ) { if( self.pers["unlocks"]["page"] == 0 ) { self setClientDvar( "player_unlock_page", "2" ); self.pers["unlocks"]["page"] = 2; } if( self.pers["unlocks"]["page"] == 1 ) self setClientDvar( "player_unlock_page", "3" ); } } unlockWeapon( refString ) { assert( isDefined( refString ) && refString != "" ); stat = int( tableLookup( "mp/statstable.csv", 4, refString, 1 ) ); assertEx( stat > 0, "statsTable refstring " + refString + " has invalid stat number: " + stat ); statVal = self getStat( stat ); if ( statVal & 1 ) return; self setStat( stat, (statVal | 65537) ); self setStat( stat, 65537 ); self setClientDvar( "player_unlockWeapon" + self.pers["unlocks"]["weapon"], refString ); self.pers["unlocks"]["weapon"]++; self setClientDvar( "player_unlockWeapons", self.pers["unlocks"]["weapon"] ); self unlockPage( 1 ); } unlockPerk( refString ) { assert( isDefined( refString ) && refString != "" ); stat = int( tableLookup( "mp/statstable.csv", 4, refString, 1 ) ); if( self getStat( stat ) > 0 ) return; self setStat( stat, 2 ); self setClientDvar( "player_unlockPerk" + self.pers["unlocks"]["perk"], refString ); self.pers["unlocks"]["perk"]++; self setClientDvar( "player_unlockPerks", self.pers["unlocks"]["perk"] ); self unlockPage( 2 ); } unlockCamo( refString ) { assert( isDefined( refString ) && refString != "" ); Ref_Tok = strTok( refString, ";" ); assertex( Ref_Tok.size > 0, "Camo unlock specified in datatable ["+refString+"] is incomplete or empty" ); for( i=0; i 0, "Attachment unlock specified in datatable ["+refString+"] is incomplete or empty" ); for( i=0; i 0, "Camo unlock specified in datatable ["+refString+"] is incomplete or empty" ); for( i=0; i 0, "Challenge unlock specified in datatable ["+refString+"] is incomplete or empty" ); assert( tokens[0] == "tier" ); tierId = int( tokens[1] ); assertEx( tierId > 0 && tierId <= level.numChallengeTiers, "invalid tier ID " + tierId ); groupId = ""; if ( tokens.size > 2 ) groupId = tokens[2]; challengeArray = getArrayKeys( level.challengeInfo ); unlocked = false; for ( index = 0; index < challengeArray.size; index++ ) { challenge = level.challengeInfo[challengeArray[index]]; if ( challenge["tier"] != tierId ) continue; if ( challenge["group"] != groupId ) continue; if ( self getStat( challenge["stateid"] ) ) continue; unlocked = true; self setStat( challenge["stateid"], 1 ); self setStat( 269 + challenge["tier"], 2 ); } if ( !unlocked ) return; self.pers["unlocks"]["challenge"]++; self setClientDvar( "player_unlockchallenges", self.pers["unlocks"]["challenge"] ); self unlockPage( 2 ); } unlockFeature( refString ) { assert( isDefined( refString ) && refString != "" ); stat = int( tableLookup( "mp/statstable.csv", 4, refString, 1 ) ); if( self getStat( stat ) > 0 ) return; if ( refString == "feature_cac" ) self setStat( 200, 1 ); self setStat( stat, 2 ); if ( refString == "feature_challenges" ) { self unlockPage( 2 ); return; } self setClientDvar( "player_unlockfeature"+self.pers["unlocks"]["feature"], tableLookup( "mp/statstable.csv", 4, refString, 3 ) ); self.pers["unlocks"]["feature"]++; self setClientDvar( "player_unlockfeatures", self.pers["unlocks"]["feature"] ); self unlockPage( 2 ); } updateChallenges() { self.challengeData = []; for ( i = 1; i <= level.numChallengeTiers; i++ ) { tableName = "mp/challengetable_tier"+i+".csv"; idx = 1; for( idx = 1; isdefined( tableLookup( tableName, 0, idx, 0 ) ) && tableLookup( tableName, 0, idx, 0 ) != ""; idx++ ) { stat_num = tableLookup( tableName, 0, idx, 2 ); if( isdefined( stat_num ) && stat_num != "" ) { statVal = self getStat( int( stat_num ) ); refString = tableLookup( tableName, 0, idx, 7 ); if ( statVal ) self.challengeData[refString] = statVal; } } } } buildChallegeInfo() { level.challengeInfo = []; for ( i = 1; i <= level.numChallengeTiers; i++ ) { tableName = "mp/challengetable_tier"+i+".csv"; baseRef = ""; for( idx = 1; isdefined( tableLookup( tableName, 0, idx, 0 ) ) && tableLookup( tableName, 0, idx, 0 ) != ""; idx++ ) { stat_num = tableLookup( tableName, 0, idx, 2 ); refString = tableLookup( tableName, 0, idx, 7 ); level.challengeInfo[refString] = []; level.challengeInfo[refString]["tier"] = i; level.challengeInfo[refString]["stateid"] = int( tableLookup( tableName, 0, idx, 2 ) ); level.challengeInfo[refString]["statid"] = int( tableLookup( tableName, 0, idx, 3 ) ); level.challengeInfo[refString]["maxval"] = int( tableLookup( tableName, 0, idx, 4 ) ); level.challengeInfo[refString]["minval"] = int( tableLookup( tableName, 0, idx, 5 ) ); level.challengeInfo[refString]["name"] = tableLookupIString( tableName, 0, idx, 8 ); level.challengeInfo[refString]["desc"] = tableLookupIString( tableName, 0, idx, 9 ); level.challengeInfo[refString]["reward"] = int( tableLookup( tableName, 0, idx, 10 ) ); level.challengeInfo[refString]["camo"] = tableLookup( tableName, 0, idx, 12 ); level.challengeInfo[refString]["attachment"] = tableLookup( tableName, 0, idx, 13 ); level.challengeInfo[refString]["group"] = tableLookup( tableName, 0, idx, 14 ); precacheString( level.challengeInfo[refString]["name"] ); if ( !int( level.challengeInfo[refString]["stateid"] ) ) { level.challengeInfo[baseRef]["levels"]++; level.challengeInfo[refString]["stateid"] = level.challengeInfo[baseRef]["stateid"]; level.challengeInfo[refString]["level"] = level.challengeInfo[baseRef]["levels"]; } else { level.challengeInfo[refString]["levels"] = 1; level.challengeInfo[refString]["level"] = 1; baseRef = refString; } } } } endGameUpdate() { player = self; } updateRankScoreHUD( amount ) { self endon( "disconnect" ); self endon( "joined_team" ); self endon( "joined_spectators" ); if ( amount == 0 ) return; self notify( "update_score" ); self endon( "update_score" ); self.rankUpdateTotal += amount; wait ( 0.05 ); if( isDefined( self.hud_rankscroreupdate ) ) { if ( self.rankUpdateTotal < 0 ) { self.hud_rankscroreupdate.label = &""; self.hud_rankscroreupdate.color = (1,0,0); } else { self.hud_rankscroreupdate.label = &"MP_PLUS"; self.hud_rankscroreupdate.color = (1,1,0.5); } self.hud_rankscroreupdate setValue(self.rankUpdateTotal); self.hud_rankscroreupdate.alpha = 0.85; self.hud_rankscroreupdate thread maps\mp\gametypes\_hud::fontPulse( self ); wait 1; self.hud_rankscroreupdate fadeOverTime( 0.75 ); self.hud_rankscroreupdate.alpha = 0; self.rankUpdateTotal = 0; } } removeRankHUD() { if(isDefined(self.hud_rankscroreupdate)) self.hud_rankscroreupdate.alpha = 0; } getRank() { rankXp = self.pers["rankxp"]; rankId = self.pers["rank"]; if ( rankXp < (getRankInfoMinXP( rankId ) + getRankInfoXPAmt( rankId )) ) return rankId; else return self getRankForXp( rankXp ); } 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() % 61) + 1; return 3 + (rankLevel * 0.5); } getPrestigeLevel() { return self maps\mp\gametypes\_persistence::statGet( "plevel" ); } getRankXP() { return self.pers["rankxp"]; } incRankXP( amount ) { if ( !level.rankedMatch ) return; xp = self getRankXP(); newXp = (xp + amount); if ( self.pers["rank"] == level.maxRank && newXp >= getRankInfoMaxXP( level.maxRank ) ) newXp = getRankInfoMaxXP( level.maxRank ); self.pers["rankxp"] = newXp; } syncXPStat() { xp = self getRankXP(); self maps\mp\gametypes\_persistence::statSet( "rankxp", xp ); }