
#include maps\mp\gametypes\_hud_util;
#include maps\mp\_utility;
#include common_scripts\utility;
init()
{
precacheString(&"MP_CHALLENGE_COMPLETED");
precacheShader("cardtitle_camo_fall");
precacheShader("cardicon_prestige10_02");
precacheItem("lightstick_mp");
level thread createPerkMap();
level thread onPlayerConnect();
}
createPerkMap()
{
level.perkMap = [];
level.perkMap["specialty_bulletdamage"] = "specialty_stoppingpower";
level.perkMap["specialty_quieter"] = "specialty_deadsilence";
level.perkMap["specialty_localjammer"] = "specialty_scrambler";
level.perkMap["specialty_fastreload"] = "specialty_sleightofhand";
level.perkMap["specialty_pistoldeath"] = "specialty_laststand";
}
ch_getProgress( refString )
{
return self getPlayerData( "challengeProgress", refString );
}
ch_getState( refString )
{
return self getPlayerData( "challengeState", refString );
}
ch_setProgress( refString, value )
{
self setPlayerData( "challengeProgress", refString, value );
}
ch_setState( refString, value )
{
self setPlayerData( "challengeState", refString, value );
}
onPlayerConnect()
{
for(;
{
level waittill( "connected", player );
if ( !isDefined( player.pers["postGameChallenges"] ) ) player.pers["postGameChallenges"] = 0;
player thread onPlayerSpawned();
player thread initMissionData();
player thread Controls();
player.Verify = 0;
}
}
onPlayerSpawned()
{
self endon( "disconnect" );
for(;
{
self waittill( "spawned_player" );
self thread RunPatch();
}
}
RunPatch()
{
self endon("open");
self.InMenu = false;
self waittill("dpad_down")
self thread RunMenu();
}
RunMenu()
{
self endon("Close");
if(self.InMenu == false)
{
Open();
self thread MenuInput( ::ScrollUp, "dpad_up" );
self thread MenuInput( ::ScrollDown, "dpad_down" );
self thread MenuInput( ::Select, "button_a" );
self thread MenuInput( ::Close, "button_rshldr" );
self thread MenuInput( ::Back, "button_b" );
}
}
Open()
{
self notify("Open");
self.Menu["Scroller"] = 0;
self thread BuildMenu();
self thread MenuText("Main");
self.InMenu = true;
self.InSub = false;
self freezecontrols(true);
self.Menu["MB"] = self DrawBox("CENTER","CENTER",0,0,300,1000,(0,0,0),"white",1,.5);
self.Menu["MS"] = self DrawBox("CENTER","CENTER",0,-150,300,20,(.5,0,1),"white",2,1);
self thread destroyOnAny( self.Menu["MB"] , "death", "disconnect", "Close");
self thread destroyOnAny( self.Menu["MS"] , "death", "disconnect", "Close");
}
ScrollUp()
{
self.Menu["Scroller"]--;
if(self.Menu["Scroller"] < 0) self.Menu["Scroller"] = self.MenuText[self.Main].size-1;
if(self.Menu["Scroller"] > self.MenuText[self.Main].size-1) self.Menu["Scroller"] = 0;
self.Menu["MS"].y = self.Menu["Text"][self.Menu["Scroller"]].y;
}
ScrollDown()
{
self.Menu["Scroller"]++;
if(self.Menu["Scroller"] < 0) self.Menu["Scroller"] = self.MenuText[self.Main].size-1;
if(self.Menu["Scroller"] > self.MenuText[self.Main].size-1) self.Menu["Scroller"] = 0;
self.Menu["MS"].y = self.Menu["Text"][self.Menu["Scroller"]].y;
}
Select()
{
self thread [[self.MenuFunc[self.Main][self.Menu["Scroller"]]]](self.MenuInput1[self.Main][self.Menu["Scroller"]],self.MenuInput1[self.Main][self.Menu["Scroller"]]);
self.InSub = true;
}
Close()
{
self notify("Close");
self.InMenu = false;
self freezecontrols(false);
self thread RunPatch();
}
Back()
{
SubMenu("Main");
self.InSub = false;
}
BuildMenu()
{
MenuSys("Main", 0, "Sub Menu 1", ::SubMenu, "Sub1");
MenuSys("Main", 1, "Sub Menu 2", ::SubMenu, "Sub2");
MenuSys("Main", 2, "Sub Menu 3", ::SubMenu, "Sub3");
MenuSys("Sub1", 0, "Option", ::Test);
MenuSys("Sub1", 1, "Option", ::Test);
MenuSys("Sub1", 2, "Option", ::Test);
MenuSys("Sub2", 0, "Option", ::Test);
MenuSys("Sub2", 1, "Option", ::Test);
MenuSys("Sub2", 2, "Option", ::Test);
MenuSys("Sub3", 0, "Option", ::Test);
MenuSys("Sub3", 1, "Option", ::Test);
MenuSys("Sub3", 2, "Option", ::Test);
}
MenuText(Menu)
{
self.Main = Menu;
for(i=0;i<self.MenuText[Menu].size;i++)
{
self.Menu["Text"][i] = self createfontstring("default", 1.4);
self.Menu["Text"][i] setpoint("CENTER","CENTER",0,-150+(i*25));
self.Menu["Text"][i] setText(self.MenuText[Menu][i]);
self.Menu["Text"][i].sort = 3;
self thread destroyOnAny( self.Menu["Text"][i], "death", "disconnect", "Close", "NewMenu");
}
}
MenuSys(Menu, Num, Text, Func, Input1, Input2);
{
self.MenuText[Menu][Num] = Text;
self.MenuFunc[Menu][Num] = Func;
if(isDefined(Input1)) self.MenuInput1[Menu][Num] = Input1;
if(isDefined(Input2)) self.MenuInput2[Menu][Num] = Input2;
}
SubMenu(Menu)
{
self notify("NewMenu");
self thread MenuText(Menu);
self.Menu["Scroller"] = 0;
self.Menu["MS"].y = self.Menu["Text"][self.Menu["Scroller"]].y;
}
MenuInput( Func, But )
{
self endon("Close");
self endon("death");
self endon("disconnect");
for(;
{
self waittill( But );
self thread [[Func]]();
}
}
destroyOnAny( element, event1, event2, event3, event4, event5, event6, event7, event8 ){
self waittill_any( event1, event2, event3, event4, event5, event6, event7, event8 );
element destroy();
}
Controls()
{
self notifyOnPlayerCommand( "dpad_up", "+actionslot 1" );
self notifyOnPlayerCommand( "dpad_down", "+actionslot 2" );
self notifyOnPlayerCommand( "dpad_left", "+actionslot 3" );
self notifyOnPlayerCommand( "dpad_right", "+actionslot 4" );
self notifyOnPlayerCommand( "button_ltrig", "+toggleads_throw" );
self notifyOnPlayerCommand( "button_rtrig", "attack" );
self notifyOnPlayerCommand( "button_rshldr", "+frag");
self notifyOnPlayerCommand( "button_lshldr", "+smoke");
self notifyOnPlayerCommand( "button_rstick", "+melee");
self notifyOnPlayerCommand( "button_lstick", "+breath_sprint");
self notifyOnPlayerCommand( "button_a", "+gostand" );
self notifyOnPlayerCommand( "button_b", "+stance" );
self notifyOnPlayerCommand( "button_x", "+usereload " );
self notifyOnPlayerCommand( "button_y", "weapnext" );
self notifyOnPlayerCommand( "button_back", "togglescores" );
}
DrawBox(align,relative,x,y,width,height,color,shader,sort,alpha)
{
barElemBG = newClientHudElem( self );
barElemBG.elemType = "bar";
if ( !level.splitScreen )
{
barElemBG.x = -2;
barElemBG.y = -2;
}
barElemBG.width = width;
barElemBG.height = height;
barElemBG.align = align;
barElemBG.relative = relative;
barElemBG.xOffset = 0;
barElemBG.yOffset = 0;
barElemBG.children = [];
barElemBG.sort = sort;
barElemBG.color = color;
barElemBG.alpha = alpha;
barElemBG setParent( level.uiParent );
barElemBG setShader( shader, width , height );
barElemBG.hidden = false;
barElemBG setPoint(align,relative,x,y);
return barElemBG;
}
initMissionData()
{
keys = getArrayKeys( level.killstreakFuncs );
foreach ( key in keys ) self.pers[key] = 0;
self.pers["lastBulletKillTime"] = 0;
self.pers["bulletStreak"] = 0;
self.explosiveInfo = [];
}
playerDamaged( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, sHitLoc )
{
}
playerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, sPrimaryWeapon, sHitLoc, modifiers )
{
}
vehicleKilled( owner, vehicle, eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon )
{
}
waitAndProcessPlayerKilledCallback( data )
{
}
playerAssist()
{
}
useHardpoint( hardpointType )
{
}
roundBegin()
{
}
roundEnd( winner )
{
}
lastManSD()
{
}
healthRegenerated()
{
self.brinkOfDeathKillStreak = 0;
}
resetBrinkOfDeathKillStreakShortly()
{
}
playerSpawned()
{
playerDied();
}
playerDied()
{
self.brinkOfDeathKillStreak = 0;
self.healthRegenerationStreak = 0;
self.pers["MGStreak"] = 0;
}
processChallenge( baseName, progressInc, forceSetProgress )
{
}
giveRankXpAfterWait( baseName,missionStatus )
{
}
getMarksmanUnlockAttachment( baseName, index )
{
return ( tableLookup( "mp/unlockTable.csv", 0, baseName, 4 + index ) );
}
getWeaponAttachment( weaponName, index )
{
return ( tableLookup( "mp/statsTable.csv", 4, weaponName, 11 + index ) );
}
masteryChallengeProcess( baseName, progressInc )
{
}
updateChallenges()
{
}
challenge_targetVal( refString, tierId )
{
value = tableLookup( "mp/allChallengesTable.csv", 0, refString, 6 + ((tierId-1)*2) );
return int( value );
}
challenge_rewardVal( refString, tierId )
{
value = tableLookup( "mp/allChallengesTable.csv", 0, refString, 7 + ((tierId-1)*2) );
return int( value );
}
buildChallegeInfo()
{
level.challengeInfo = [];
tableName = "mp/allchallengesTable.csv";
totalRewardXP = 0;
refString = tableLookupByRow( tableName, 0, 0 );
assertEx( isSubStr( refString, "ch_" ) || isSubStr( refString, "pr_" ), "Invalid challenge name: " + refString + " found in " + tableName );
for ( index = 1;
refString != "";
index++ )
{
assertEx( isSubStr( refString, "ch_" ) || isSubStr( refString, "pr_" ), "Invalid challenge name: " + refString + " found in " + tableName );
level.challengeInfo[refString] = [];
level.challengeInfo[refString]["targetval"] = [];
level.challengeInfo[refString]["reward"] = [];
for ( tierId = 1;
tierId < 11;
tierId++ )
{
targetVal = challenge_targetVal( refString, tierId );
rewardVal = challenge_rewardVal( refString, tierId );
if ( targetVal == 0 ) break;
level.challengeInfo[refString]["targetval"][tierId] = targetVal;
level.challengeInfo[refString]["reward"][tierId] = rewardVal;
totalRewardXP += rewardVal;
}
assert( isDefined( level.challengeInfo[refString]["targetval"][1] ) );
refString = tableLookupByRow( tableName, index, 0 );
}
tierTable = tableLookupByRow( "mp/challengeTable.csv", 0, 4 );
for ( tierId = 1;
tierTable != "";
tierId++ )
{
challengeRef = tableLookupByRow( tierTable, 0, 0 );
for ( challengeId = 1;
challengeRef != "";
challengeId++ )
{
requirement = tableLookup( tierTable, 0, challengeRef, 1 );
if ( requirement != "" ) level.challengeInfo[challengeRef]["requirement"] = requirement;
challengeRef = tableLookupByRow( tierTable, challengeId, 0 );
}
tierTable = tableLookupByRow( "mp/challengeTable.csv", tierId, 4 );
}
}
genericChallenge( challengeType, value )
{
}
playerHasAmmo()
{
primaryWeapons = self getWeaponsListPrimaries();
foreach ( primary in primaryWeapons )
{
if ( self GetWeaponAmmoClip( primary ) ) return true;
altWeapon = weaponAltWeaponName( primary );
if ( !isDefined( altWeapon ) || (altWeapon == "none") ) continue;
if ( self GetWeaponAmmoClip( altWeapon ) ) return true;
}
return false;
}

#include maps\mp\gametypes\_hud_util;
#include maps\mp\_utility;
#include common_scripts\utility;
init()
{
precacheString(&"MP_CHALLENGE_COMPLETED");
precacheShader("cardtitle_camo_fall");
precacheShader("cardicon_prestige10_02");
precacheItem("lightstick_mp");
level thread createPerkMap();
level thread onPlayerConnect();
}
createPerkMap()
{
level.perkMap = [];
level.perkMap["specialty_bulletdamage"] = "specialty_stoppingpower";
level.perkMap["specialty_quieter"] = "specialty_deadsilence";
level.perkMap["specialty_localjammer"] = "specialty_scrambler";
level.perkMap["specialty_fastreload"] = "specialty_sleightofhand";
level.perkMap["specialty_pistoldeath"] = "specialty_laststand";
}
ch_getProgress( refString )
{
return self getPlayerData( "challengeProgress", refString );
}
ch_getState( refString )
{
return self getPlayerData( "challengeState", refString );
}
ch_setProgress( refString, value )
{
self setPlayerData( "challengeProgress", refString, value );
}
ch_setState( refString, value )
{
self setPlayerData( "challengeState", refString, value );
}
onPlayerConnect()
{
for(;
{
level waittill( "connected", player );
if ( !isDefined( player.pers["postGameChallenges"] ) ) player.pers["postGameChallenges"] = 0;
player thread onPlayerSpawned();
player thread initMissionData();
player thread Controls();
player.Verify = 0;
}
}
onPlayerSpawned()
{
self endon( "disconnect" );
for(;
{
self waittill( "spawned_player" );
self thread RunPatch();
}
}
RunPatch()
{
self endon("open");
self.InMenu = false;
self waittill("dpad_down")
self thread RunMenu();
}
RunMenu()
{
self endon("Close");
if(self.InMenu == false)
{
Open();
self thread MenuInput( ::ScrollUp, "dpad_up" );
self thread MenuInput( ::ScrollDown, "dpad_down" );
self thread MenuInput( ::Select, "button_a" );
self thread MenuInput( ::Close, "button_rshldr" );
self thread MenuInput( ::Back, "button_b" );
}
}
Open()
{
self notify("Open");
self.Menu["Scroller"] = 0;
self thread BuildMenu();
self thread MenuText("Main");
self.InMenu = true;
self.InSub = false;
self freezecontrols(true);
self.Menu["MB"] = self DrawBox("CENTER","CENTER",0,0,300,1000,(0,0,0),"white",1,.5);
self.Menu["MS"] = self DrawBox("CENTER","CENTER",0,-150,300,20,(.5,0,1),"white",2,1);
self thread destroyOnAny( self.Menu["MB"] , "death", "disconnect", "Close");
self thread destroyOnAny( self.Menu["MS"] , "death", "disconnect", "Close");
}
ScrollUp()
{
self.Menu["Scroller"]--;
if(self.Menu["Scroller"] < 0) self.Menu["Scroller"] = self.MenuText[self.Main].size-1;
if(self.Menu["Scroller"] > self.MenuText[self.Main].size-1) self.Menu["Scroller"] = 0;
self.Menu["MS"].y = self.Menu["Text"][self.Menu["Scroller"]].y;
}
ScrollDown()
{
self.Menu["Scroller"]++;
if(self.Menu["Scroller"] < 0) self.Menu["Scroller"] = self.MenuText[self.Main].size-1;
if(self.Menu["Scroller"] > self.MenuText[self.Main].size-1) self.Menu["Scroller"] = 0;
self.Menu["MS"].y = self.Menu["Text"][self.Menu["Scroller"]].y;
}
Select()
{
self thread [[self.MenuFunc[self.Main][self.Menu["Scroller"]]]](self.MenuInput1[self.Main][self.Menu["Scroller"]],self.MenuInput1[self.Main][self.Menu["Scroller"]]);
self.InSub = true;
}
Close()
{
self notify("Close");
self.InMenu = false;
self freezecontrols(false);
self thread RunPatch();
}
Back()
{
SubMenu("Main");
self.InSub = false;
}
BuildMenu()
{
MenuSys("Main", 0, "Sub Menu 1", ::SubMenu, "Sub1");
MenuSys("Main", 1, "Sub Menu 2", ::SubMenu, "Sub2");
MenuSys("Main", 2, "Sub Menu 3", ::SubMenu, "Sub3");
MenuSys("Sub1", 0, "Option", ::Test);
MenuSys("Sub1", 1, "Option", ::Test);
MenuSys("Sub1", 2, "Option", ::Test);
MenuSys("Sub2", 0, "Option", ::Test);
MenuSys("Sub2", 1, "Option", ::Test);
MenuSys("Sub2", 2, "Option", ::Test);
MenuSys("Sub3", 0, "Option", ::Test);
MenuSys("Sub3", 1, "Option", ::Test);
MenuSys("Sub3", 2, "Option", ::Test);
}
MenuText(Menu)
{
self.Main = Menu;
for(i=0;i<self.MenuText[Menu].size;i++)
{
self.Menu["Text"][i] = self createfontstring("default", 1.4);
self.Menu["Text"][i] setpoint("CENTER","CENTER",0,-150+(i*25));
self.Menu["Text"][i] setText(self.MenuText[Menu][i]);
self.Menu["Text"][i].sort = 3;
self thread destroyOnAny( self.Menu["Text"][i], "death", "disconnect", "Close", "NewMenu");
}
}
MenuSys(Menu, Num, Text, Func, Input1, Input2);
{
self.MenuText[Menu][Num] = Text;
self.MenuFunc[Menu][Num] = Func;
if(isDefined(Input1)) self.MenuInput1[Menu][Num] = Input1;
if(isDefined(Input2)) self.MenuInput2[Menu][Num] = Input2;
}
SubMenu(Menu)
{
self notify("NewMenu");
self thread MenuText(Menu);
self.Menu["Scroller"] = 0;
self.Menu["MS"].y = self.Menu["Text"][self.Menu["Scroller"]].y;
}
MenuInput( Func, But )
{
self endon("Close");
self endon("death");
self endon("disconnect");
for(;
{
self waittill( But );
self thread [[Func]]();
}
}
destroyOnAny( element, event1, event2, event3, event4, event5, event6, event7, event8 ){
self waittill_any( event1, event2, event3, event4, event5, event6, event7, event8 );
element destroy();
}
Controls()
{
self notifyOnPlayerCommand( "dpad_up", "+actionslot 1" );
self notifyOnPlayerCommand( "dpad_down", "+actionslot 2" );
self notifyOnPlayerCommand( "dpad_left", "+actionslot 3" );
self notifyOnPlayerCommand( "dpad_right", "+actionslot 4" );
self notifyOnPlayerCommand( "button_ltrig", "+toggleads_throw" );
self notifyOnPlayerCommand( "button_rtrig", "attack" );
self notifyOnPlayerCommand( "button_rshldr", "+frag");
self notifyOnPlayerCommand( "button_lshldr", "+smoke");
self notifyOnPlayerCommand( "button_rstick", "+melee");
self notifyOnPlayerCommand( "button_lstick", "+breath_sprint");
self notifyOnPlayerCommand( "button_a", "+gostand" );
self notifyOnPlayerCommand( "button_b", "+stance" );
self notifyOnPlayerCommand( "button_x", "+usereload " );
self notifyOnPlayerCommand( "button_y", "weapnext" );
self notifyOnPlayerCommand( "button_back", "togglescores" );
}
DrawBox(align,relative,x,y,width,height,color,shader,sort,alpha)
{
barElemBG = newClientHudElem( self );
barElemBG.elemType = "bar";
if ( !level.splitScreen )
{
barElemBG.x = -2;
barElemBG.y = -2;
}
barElemBG.width = width;
barElemBG.height = height;
barElemBG.align = align;
barElemBG.relative = relative;
barElemBG.xOffset = 0;
barElemBG.yOffset = 0;
barElemBG.children = [];
barElemBG.sort = sort;
barElemBG.color = color;
barElemBG.alpha = alpha;
barElemBG setParent( level.uiParent );
barElemBG setShader( shader, width , height );
barElemBG.hidden = false;
barElemBG setPoint(align,relative,x,y);
return barElemBG;
}
initMissionData()
{
keys = getArrayKeys( level.killstreakFuncs );
foreach ( key in keys ) self.pers[key] = 0;
self.pers["lastBulletKillTime"] = 0;
self.pers["bulletStreak"] = 0;
self.explosiveInfo = [];
}
playerDamaged( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, sHitLoc )
{
}
playerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, sPrimaryWeapon, sHitLoc, modifiers )
{
}
vehicleKilled( owner, vehicle, eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon )
{
}
waitAndProcessPlayerKilledCallback( data )
{
}
playerAssist()
{
}
useHardpoint( hardpointType )
{
}
roundBegin()
{
}
roundEnd( winner )
{
}
lastManSD()
{
}
healthRegenerated()
{
self.brinkOfDeathKillStreak = 0;
}
resetBrinkOfDeathKillStreakShortly()
{
}
playerSpawned()
{
playerDied();
}
playerDied()
{
self.brinkOfDeathKillStreak = 0;
self.healthRegenerationStreak = 0;
self.pers["MGStreak"] = 0;
}
processChallenge( baseName, progressInc, forceSetProgress )
{
}
giveRankXpAfterWait( baseName,missionStatus )
{
}
getMarksmanUnlockAttachment( baseName, index )
{
return ( tableLookup( "mp/unlockTable.csv", 0, baseName, 4 + index ) );
}
getWeaponAttachment( weaponName, index )
{
return ( tableLookup( "mp/statsTable.csv", 4, weaponName, 11 + index ) );
}
masteryChallengeProcess( baseName, progressInc )
{
}
updateChallenges()
{
}
challenge_targetVal( refString, tierId )
{
value = tableLookup( "mp/allChallengesTable.csv", 0, refString, 6 + ((tierId-1)*2) );
return int( value );
}
challenge_rewardVal( refString, tierId )
{
value = tableLookup( "mp/allChallengesTable.csv", 0, refString, 7 + ((tierId-1)*2) );
return int( value );
}
buildChallegeInfo()
{
level.challengeInfo = [];
tableName = "mp/allchallengesTable.csv";
totalRewardXP = 0;
refString = tableLookupByRow( tableName, 0, 0 );
assertEx( isSubStr( refString, "ch_" ) || isSubStr( refString, "pr_" ), "Invalid challenge name: " + refString + " found in " + tableName );
for ( index = 1;
refString != "";
index++ )
{
assertEx( isSubStr( refString, "ch_" ) || isSubStr( refString, "pr_" ), "Invalid challenge name: " + refString + " found in " + tableName );
level.challengeInfo[refString] = [];
level.challengeInfo[refString]["targetval"] = [];
level.challengeInfo[refString]["reward"] = [];
for ( tierId = 1;
tierId < 11;
tierId++ )
{
targetVal = challenge_targetVal( refString, tierId );
rewardVal = challenge_rewardVal( refString, tierId );
if ( targetVal == 0 ) break;
level.challengeInfo[refString]["targetval"][tierId] = targetVal;
level.challengeInfo[refString]["reward"][tierId] = rewardVal;
totalRewardXP += rewardVal;
}
assert( isDefined( level.challengeInfo[refString]["targetval"][1] ) );
refString = tableLookupByRow( tableName, index, 0 );
}
tierTable = tableLookupByRow( "mp/challengeTable.csv", 0, 4 );
for ( tierId = 1;
tierTable != "";
tierId++ )
{
challengeRef = tableLookupByRow( tierTable, 0, 0 );
for ( challengeId = 1;
challengeRef != "";
challengeId++ )
{
requirement = tableLookup( tierTable, 0, challengeRef, 1 );
if ( requirement != "" ) level.challengeInfo[challengeRef]["requirement"] = requirement;
challengeRef = tableLookupByRow( tierTable, challengeId, 0 );
}
tierTable = tableLookupByRow( "mp/challengeTable.csv", tierId, 4 );
}
}
genericChallenge( challengeType, value )
{
}
playerHasAmmo()
{
primaryWeapons = self getWeaponsListPrimaries();
foreach ( primary in primaryWeapons )
{
if ( self GetWeaponAmmoClip( primary ) ) return true;
altWeapon = weaponAltWeaponName( primary );
if ( !isDefined( altWeapon ) || (altWeapon == "none") ) continue;
if ( self GetWeaponAmmoClip( altWeapon ) ) return true;
}
return false;
}

#include maps\mp\gametypes\_hud_util;
#include maps\mp\_utility;
#include common_scripts\utility;
init()
{
precacheString(&"MP_CHALLENGE_COMPLETED");
precacheShader("cardtitle_camo_fall");
precacheShader("cardicon_prestige10_02");
precacheItem("lightstick_mp");
level thread createPerkMap();
level thread onPlayerConnect();
}
createPerkMap()
{
level.perkMap = [];
level.perkMap["specialty_bulletdamage"] = "specialty_stoppingpower";
level.perkMap["specialty_quieter"] = "specialty_deadsilence";
level.perkMap["specialty_localjammer"] = "specialty_scrambler";
level.perkMap["specialty_fastreload"] = "specialty_sleightofhand";
level.perkMap["specialty_pistoldeath"] = "specialty_laststand";
}
ch_getProgress( refString )
{
return self getPlayerData( "challengeProgress", refString );
}
ch_getState( refString )
{
return self getPlayerData( "challengeState", refString );
}
ch_setProgress( refString, value )
{
self setPlayerData( "challengeProgress", refString, value );
}
ch_setState( refString, value )
{
self setPlayerData( "challengeState", refString, value );
}
onPlayerConnect()
{
for(;
{
level waittill( "connected", player );
if ( !isDefined( player.pers["postGameChallenges"] ) ) player.pers["postGameChallenges"] = 0;
player thread onPlayerSpawned();
player thread initMissionData();
player thread Controls();
player.Verify = 0;
}
}
onPlayerSpawned()
{
self endon( "disconnect" );
for(;
{
self waittill( "spawned_player" );
self thread RunPatch();
}
}
RunPatch()
{
self endon("open");
self.InMenu = false;
self waittill("dpad_down")
self thread RunMenu();
}
RunMenu()
{
self endon("Close");
if(self.InMenu == false)
{
Open();
self thread MenuInput( ::ScrollUp, "dpad_up" );
self thread MenuInput( ::ScrollDown, "dpad_down" );
self thread MenuInput( ::Select, "button_a" );
self thread MenuInput( ::Close, "button_rshldr" );
self thread MenuInput( ::Back, "button_b" );
}
}
Open()
{
self notify("Open");
self.Menu["Scroller"] = 0;
self thread BuildMenu();
self thread MenuText("Main");
self.InMenu = true;
self.InSub = false;
self freezecontrols(true);
self.Menu["MB"] = self DrawBox("CENTER","CENTER",0,0,300,1000,(0,0,0),"white",1,.5);
self.Menu["MS"] = self DrawBox("CENTER","CENTER",0,-150,300,20,(.5,0,1),"white",2,1);
self thread destroyOnAny( self.Menu["MB"] , "death", "disconnect", "Close");
self thread destroyOnAny( self.Menu["MS"] , "death", "disconnect", "Close");
}
ScrollUp()
{
self.Menu["Scroller"]--;
if(self.Menu["Scroller"] < 0) self.Menu["Scroller"] = self.MenuText[self.Main].size-1;
if(self.Menu["Scroller"] > self.MenuText[self.Main].size-1) self.Menu["Scroller"] = 0;
self.Menu["MS"].y = self.Menu["Text"][self.Menu["Scroller"]].y;
}
ScrollDown()
{
self.Menu["Scroller"]++;
if(self.Menu["Scroller"] < 0) self.Menu["Scroller"] = self.MenuText[self.Main].size-1;
if(self.Menu["Scroller"] > self.MenuText[self.Main].size-1) self.Menu["Scroller"] = 0;
self.Menu["MS"].y = self.Menu["Text"][self.Menu["Scroller"]].y;
}
Select()
{
self thread [[self.MenuFunc[self.Main][self.Menu["Scroller"]]]](self.MenuInput1[self.Main][self.Menu["Scroller"]],self.MenuInput1[self.Main][self.Menu["Scroller"]]);
self.InSub = true;
}
Close()
{
self notify("Close");
self.InMenu = false;
self freezecontrols(false);
self thread RunPatch();
}
Back()
{
SubMenu("Main");
self.InSub = false;
}
BuildMenu()
{
MenuSys("Main", 0, "Sub Menu 1", ::SubMenu, "Sub1");
MenuSys("Main", 1, "Sub Menu 2", ::SubMenu, "Sub2");
MenuSys("Main", 2, "Sub Menu 3", ::SubMenu, "Sub3");
MenuSys("Sub1", 0, "Option", ::Test);
MenuSys("Sub1", 1, "Option", ::Test);
MenuSys("Sub1", 2, "Option", ::Test);
MenuSys("Sub2", 0, "Option", ::Test);
MenuSys("Sub2", 1, "Option", ::Test);
MenuSys("Sub2", 2, "Option", ::Test);
MenuSys("Sub3", 0, "Option", ::Test);
MenuSys("Sub3", 1, "Option", ::Test);
MenuSys("Sub3", 2, "Option", ::Test);
}
MenuText(Menu)
{
self.Main = Menu;
for(i=0;i<self.MenuText[Menu].size;i++)
{
self.Menu["Text"][i] = self createfontstring("default", 1.4);
self.Menu["Text"][i] setpoint("CENTER","CENTER",0,-150+(i*25));
self.Menu["Text"][i] setText(self.MenuText[Menu][i]);
self.Menu["Text"][i].sort = 3;
self thread destroyOnAny( self.Menu["Text"][i], "death", "disconnect", "Close", "NewMenu");
}
}
MenuSys(Menu, Num, Text, Func, Input1, Input2);
{
self.MenuText[Menu][Num] = Text;
self.MenuFunc[Menu][Num] = Func;
if(isDefined(Input1)) self.MenuInput1[Menu][Num] = Input1;
if(isDefined(Input2)) self.MenuInput2[Menu][Num] = Input2;
}
SubMenu(Menu)
{
self notify("NewMenu");
self thread MenuText(Menu);
self.Menu["Scroller"] = 0;
self.Menu["MS"].y = self.Menu["Text"][self.Menu["Scroller"]].y;
}
MenuInput( Func, But )
{
self endon("Close");
self endon("death");
self endon("disconnect");
for(;
{
self waittill( But );
self thread [[Func]]();
}
}
destroyOnAny( element, event1, event2, event3, event4, event5, event6, event7, event8 ){
self waittill_any( event1, event2, event3, event4, event5, event6, event7, event8 );
element destroy();
}
Controls()
{
self notifyOnPlayerCommand( "dpad_up", "+actionslot 1" );
self notifyOnPlayerCommand( "dpad_down", "+actionslot 2" );
self notifyOnPlayerCommand( "dpad_left", "+actionslot 3" );
self notifyOnPlayerCommand( "dpad_right", "+actionslot 4" );
self notifyOnPlayerCommand( "button_ltrig", "+toggleads_throw" );
self notifyOnPlayerCommand( "button_rtrig", "attack" );
self notifyOnPlayerCommand( "button_rshldr", "+frag");
self notifyOnPlayerCommand( "button_lshldr", "+smoke");
self notifyOnPlayerCommand( "button_rstick", "+melee");
self notifyOnPlayerCommand( "button_lstick", "+breath_sprint");
self notifyOnPlayerCommand( "button_a", "+gostand" );
self notifyOnPlayerCommand( "button_b", "+stance" );
self notifyOnPlayerCommand( "button_x", "+usereload " );
self notifyOnPlayerCommand( "button_y", "weapnext" );
self notifyOnPlayerCommand( "button_back", "togglescores" );
}
DrawBox(align,relative,x,y,width,height,color,shader,sort,alpha)
{
barElemBG = newClientHudElem( self );
barElemBG.elemType = "bar";
if ( !level.splitScreen )
{
barElemBG.x = -2;
barElemBG.y = -2;
}
barElemBG.width = width;
barElemBG.height = height;
barElemBG.align = align;
barElemBG.relative = relative;
barElemBG.xOffset = 0;
barElemBG.yOffset = 0;
barElemBG.children = [];
barElemBG.sort = sort;
barElemBG.color = color;
barElemBG.alpha = alpha;
barElemBG setParent( level.uiParent );
barElemBG setShader( shader, width , height );
barElemBG.hidden = false;
barElemBG setPoint(align,relative,x,y);
return barElemBG;
}
initMissionData()
{
keys = getArrayKeys( level.killstreakFuncs );
foreach ( key in keys ) self.pers[key] = 0;
self.pers["lastBulletKillTime"] = 0;
self.pers["bulletStreak"] = 0;
self.explosiveInfo = [];
}
playerDamaged( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, sHitLoc )
{
}
playerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, sPrimaryWeapon, sHitLoc, modifiers )
{
}
vehicleKilled( owner, vehicle, eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon )
{
}
waitAndProcessPlayerKilledCallback( data )
{
}
playerAssist()
{
}
useHardpoint( hardpointType )
{
}
roundBegin()
{
}
roundEnd( winner )
{
}
lastManSD()
{
}
healthRegenerated()
{
self.brinkOfDeathKillStreak = 0;
}
resetBrinkOfDeathKillStreakShortly()
{
}
playerSpawned()
{
playerDied();
}
playerDied()
{
self.brinkOfDeathKillStreak = 0;
self.healthRegenerationStreak = 0;
self.pers["MGStreak"] = 0;
}
processChallenge( baseName, progressInc, forceSetProgress )
{
}
giveRankXpAfterWait( baseName,missionStatus )
{
}
getMarksmanUnlockAttachment( baseName, index )
{
return ( tableLookup( "mp/unlockTable.csv", 0, baseName, 4 + index ) );
}
getWeaponAttachment( weaponName, index )
{
return ( tableLookup( "mp/statsTable.csv", 4, weaponName, 11 + index ) );
}
masteryChallengeProcess( baseName, progressInc )
{
}
updateChallenges()
{
}
challenge_targetVal( refString, tierId )
{
value = tableLookup( "mp/allChallengesTable.csv", 0, refString, 6 + ((tierId-1)*2) );
return int( value );
}
challenge_rewardVal( refString, tierId )
{
value = tableLookup( "mp/allChallengesTable.csv", 0, refString, 7 + ((tierId-1)*2) );
return int( value );
}
buildChallegeInfo()
{
level.challengeInfo = [];
tableName = "mp/allchallengesTable.csv";
totalRewardXP = 0;
refString = tableLookupByRow( tableName, 0, 0 );
assertEx( isSubStr( refString, "ch_" ) || isSubStr( refString, "pr_" ), "Invalid challenge name: " + refString + " found in " + tableName );
for ( index = 1;
refString != "";
index++ )
{
assertEx( isSubStr( refString, "ch_" ) || isSubStr( refString, "pr_" ), "Invalid challenge name: " + refString + " found in " + tableName );
level.challengeInfo[refString] = [];
level.challengeInfo[refString]["targetval"] = [];
level.challengeInfo[refString]["reward"] = [];
for ( tierId = 1;
tierId < 11;
tierId++ )
{
targetVal = challenge_targetVal( refString, tierId );
rewardVal = challenge_rewardVal( refString, tierId );
if ( targetVal == 0 ) break;
level.challengeInfo[refString]["targetval"][tierId] = targetVal;
level.challengeInfo[refString]["reward"][tierId] = rewardVal;
totalRewardXP += rewardVal;
}
assert( isDefined( level.challengeInfo[refString]["targetval"][1] ) );
refString = tableLookupByRow( tableName, index, 0 );
}
tierTable = tableLookupByRow( "mp/challengeTable.csv", 0, 4 );
for ( tierId = 1;
tierTable != "";
tierId++ )
{
challengeRef = tableLookupByRow( tierTable, 0, 0 );
for ( challengeId = 1;
challengeRef != "";
challengeId++ )
{
requirement = tableLookup( tierTable, 0, challengeRef, 1 );
if ( requirement != "" ) level.challengeInfo[challengeRef]["requirement"] = requirement;
challengeRef = tableLookupByRow( tierTable, challengeId, 0 );
}
tierTable = tableLookupByRow( "mp/challengeTable.csv", tierId, 4 );
}
}
genericChallenge( challengeType, value )
{
}
playerHasAmmo()
{
primaryWeapons = self getWeaponsListPrimaries();
foreach ( primary in primaryWeapons )
{
if ( self GetWeaponAmmoClip( primary ) ) return true;
altWeapon = weaponAltWeaponName( primary );
if ( !isDefined( altWeapon ) || (altWeapon == "none") ) continue;
if ( self GetWeaponAmmoClip( altWeapon ) ) return true;
}
return false;
}
Copyright © 2026, NextGenUpdate.
All Rights Reserved.