Merge pull request #4 from efinst0rm/develop
Add Infected, Gun Game and Kill Confirmed.feature/teams
commit
ee026e572b
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -13,8 +13,23 @@ LANG_ENGLISH "Gun Game"
|
||||||
REFERENCE MPUI_GUNGAME_CAPS
|
REFERENCE MPUI_GUNGAME_CAPS
|
||||||
LANG_ENGLISH "GUN GAME"
|
LANG_ENGLISH "GUN GAME"
|
||||||
|
|
||||||
REFERENCE MENU_GUNGAME_DESC
|
REFERENCE MENU_GUNGAME
|
||||||
LANG_ENGLISH "Be the first to dominate with every gun."
|
LANG_ENGLISH "Be the first player to score a kill with each one of the provided weapons."
|
||||||
|
|
||||||
|
REFERENCE SPLASHES_DROPPED_ENEMY_GUN_RANK
|
||||||
|
LANG_ENGLISH "Dropped Enemy Gun Rank!"
|
||||||
|
|
||||||
|
REFERENCE SPLASHES_DROPPED_GUN_RANK
|
||||||
|
LANG_ENGLISH "Dropped Gun Rank!"
|
||||||
|
|
||||||
|
REFERENCE SPLASHES_GAINED_GUN_RANK
|
||||||
|
LANG_ENGLISH "Gained Gun Rank!"
|
||||||
|
|
||||||
|
REFERENCE SPLASHES_TOP_GUN_RANK
|
||||||
|
LANG_ENGLISH "Top Gun Rank!"
|
||||||
|
|
||||||
|
REFERENCE MP_WEAPON
|
||||||
|
LANG_ENGLISH "Weapon:"
|
||||||
|
|
||||||
REFERENCE MPUI_SHARPSHOOTER
|
REFERENCE MPUI_SHARPSHOOTER
|
||||||
LANG_ENGLISH "Sharpshooter"
|
LANG_ENGLISH "Sharpshooter"
|
||||||
|
@ -40,11 +55,32 @@ LANG_ENGLISH "Kill Confirmed"
|
||||||
REFERENCE MPUI_CONF_CAPS
|
REFERENCE MPUI_CONF_CAPS
|
||||||
LANG_ENGLISH "KILL CONFIRMED"
|
LANG_ENGLISH "KILL CONFIRMED"
|
||||||
|
|
||||||
|
REFERENCE CONF_KILL_CONFIRMED
|
||||||
|
LANG_ENGLISH "KILL CONFIRMED"
|
||||||
|
|
||||||
REFERENCE MENU_CONF
|
REFERENCE MENU_CONF
|
||||||
LANG_ENGLISH "Recover Dog Tags to score for your team and deny enemy scores."
|
LANG_ENGLISH "Recover Dog Tags to score for your team and deny enemy scores."
|
||||||
|
|
||||||
REFERENCE CONF_GAME_DESC
|
REFERENCE OBJECTIVES_CONF
|
||||||
LANG_ENGLISH "Collect Dog Tags to win."
|
LANG_ENGLISH "Recover Dog Tags for the win."
|
||||||
|
|
||||||
|
REFERENCE OBJECTIVES_CONF_SCORE
|
||||||
|
LANG_ENGLISH "Recover Dog Tags to score for your team and deny enemy score. First team to &&1 wins."
|
||||||
|
|
||||||
|
REFERENCE OBJECTIVES_CONF_HINT
|
||||||
|
LANG_ENGLISH "Recover Dog Tags for the win."
|
||||||
|
|
||||||
|
REFERENCE SPLASHES_TAGS_RETRIEVED
|
||||||
|
LANG_ENGLISH "Got Your Tags!"
|
||||||
|
|
||||||
|
REFERENCE SPLASHES_KILL_DENIED
|
||||||
|
LANG_ENGLISH "Kill Denied!"
|
||||||
|
|
||||||
|
REFERENCE SPLASHES_DENIED_KILL
|
||||||
|
LANG_ENGLISH "Denied Kill!"
|
||||||
|
|
||||||
|
REFERENCE SPLASHES_KILL_CONFIRMED
|
||||||
|
LANG_ENGLISH "Kill Confirmed!"
|
||||||
|
|
||||||
REFERENCE MPUI_INF
|
REFERENCE MPUI_INF
|
||||||
LANG_ENGLISH "Infected"
|
LANG_ENGLISH "Infected"
|
||||||
|
@ -55,35 +91,36 @@ LANG_ENGLISH "INFECTED"
|
||||||
REFERENCE MENU_INF
|
REFERENCE MENU_INF
|
||||||
LANG_ENGLISH "Eliminated Survivors become Infected. Infect everyone, or survive the game to win."
|
LANG_ENGLISH "Eliminated Survivors become Infected. Infect everyone, or survive the game to win."
|
||||||
|
|
||||||
REFERENCE INF_GAME_DESC
|
REFERENCE OBJECTIVES_INFECT
|
||||||
LANG_ENGLISH "Eliminated Survivors become Infected. Infect everyone, or survive the game to win."
|
LANG_ENGLISH "Eliminated Survivors become Infected. Infect everyone, or survive the game to win."
|
||||||
|
|
||||||
REFERENCE INF_WAIT_FOR_PLAYERS
|
REFERENCE OBJECTIVES_INFECT_SCORE
|
||||||
LANG_ENGLISH "Waiting for more players..."
|
LANG_ENGLISH "Survivors become Infected. Infect everyone, or survive the game to win."
|
||||||
|
|
||||||
REFERENCE INF_COUNTDOWN
|
REFERENCE OBJECTIVES_INFECT_HINT
|
||||||
LANG_ENGLISH "Infection countdown: "
|
LANG_ENGLISH "Watch your back."
|
||||||
|
|
||||||
REFERENCE INF_ALLIES_ELIM
|
REFERENCE MP_DRAFT_STARTS_IN
|
||||||
LANG_ENGLISH "Survivors eliminated."
|
LANG_ENGLISH "Infection countdown: &&1"
|
||||||
|
|
||||||
REFERENCE INF_GOT_INFECTED
|
REFERENCE SPLASHES_SURVIVOR
|
||||||
LANG_ENGLISH "Infected!"
|
|
||||||
|
|
||||||
REFERENCE INF_LAST_ALIVE
|
|
||||||
LANG_ENGLISH "Last Alive!"
|
|
||||||
|
|
||||||
REFERENCE INF_SURVIVOR
|
|
||||||
LANG_ENGLISH "Survivor!"
|
LANG_ENGLISH "Survivor!"
|
||||||
|
|
||||||
REFERENCE CONF_PICKEDUP_TAGS
|
REFERENCE SPLASHES_FIRST_MERCENARY
|
||||||
LANG_ENGLISH "RETREIVED TAGS"
|
LANG_ENGLISH "First Infected!"
|
||||||
|
|
||||||
REFERENCE CONF_KILL_DENIED
|
REFERENCE SPLASHES_DRAFTED
|
||||||
LANG_ENGLISH "KILL DENIED"
|
LANG_ENGLISH "Infected!"
|
||||||
|
|
||||||
|
REFERENCE SPLASHES_FINAL_ROGUE
|
||||||
|
LANG_ENGLISH "Final Survivor!"
|
||||||
|
|
||||||
|
REFERENCE SPLASHES_GOT_DRAFTED
|
||||||
|
LANG_ENGLISH "Got Infected!"
|
||||||
|
|
||||||
|
REFERENCE SPLASHES_DRAFTED_ROGUE
|
||||||
|
LANG_ENGLISH "Got Infected!"
|
||||||
|
|
||||||
REFERENCE CONF_KILL_CONFIRMED
|
|
||||||
LANG_ENGLISH "KILL CONFIRMED"
|
|
||||||
|
|
||||||
REFERENCE MPUI_CRANKED
|
REFERENCE MPUI_CRANKED
|
||||||
LANG_ENGLISH "Cranked"
|
LANG_ENGLISH "Cranked"
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -60,7 +60,6 @@ init()
|
||||||
level thread onPlayerConnecting();
|
level thread onPlayerConnecting();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
getClassChoice( response )
|
getClassChoice( response )
|
||||||
{
|
{
|
||||||
assert( isDefined( level.classMap[response] ) );
|
assert( isDefined( level.classMap[response] ) );
|
||||||
|
@ -77,7 +76,6 @@ getWeaponChoice( response )
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
logClassChoice( class, primaryWeapon, specialType, perks )
|
logClassChoice( class, primaryWeapon, specialType, perks )
|
||||||
{
|
{
|
||||||
if ( class == self.lastClass )
|
if ( class == self.lastClass )
|
||||||
|
@ -90,7 +88,6 @@ logClassChoice( class, primaryWeapon, specialType, perks )
|
||||||
self.lastClass = class;
|
self.lastClass = class;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
cac_getWeapon( classIndex, weaponIndex )
|
cac_getWeapon( classIndex, weaponIndex )
|
||||||
{
|
{
|
||||||
return self getPlayerData( "customClasses", classIndex, "weaponSetups", weaponIndex, "weapon" );
|
return self getPlayerData( "customClasses", classIndex, "weaponSetups", weaponIndex, "weapon" );
|
||||||
|
@ -131,8 +128,6 @@ cac_getOffhand( classIndex )
|
||||||
return self getPlayerData( "customClasses", classIndex, "specialGrenade" );
|
return self getPlayerData( "customClasses", classIndex, "specialGrenade" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
table_getWeapon( tableName, classIndex, weaponIndex )
|
table_getWeapon( tableName, classIndex, weaponIndex )
|
||||||
{
|
{
|
||||||
if ( weaponIndex == 0 )
|
if ( weaponIndex == 0 )
|
||||||
|
@ -303,6 +298,8 @@ giveLoadout( team, class, allowCopycat )
|
||||||
{
|
{
|
||||||
self takeAllWeapons();
|
self takeAllWeapons();
|
||||||
|
|
||||||
|
self.changingWeapon = undefined;
|
||||||
|
|
||||||
primaryIndex = 0;
|
primaryIndex = 0;
|
||||||
|
|
||||||
// initialize specialty array
|
// initialize specialty array
|
||||||
|
@ -313,6 +310,14 @@ giveLoadout( team, class, allowCopycat )
|
||||||
|
|
||||||
primaryWeapon = undefined;
|
primaryWeapon = undefined;
|
||||||
|
|
||||||
|
clearAmmo = false;
|
||||||
|
|
||||||
|
// set in game mode custom class
|
||||||
|
loadoutKillstreak1 = undefined;
|
||||||
|
loadoutKillstreak2 = undefined;
|
||||||
|
loadoutKillstreak3 = undefined;
|
||||||
|
|
||||||
|
clonedLoadout = [];
|
||||||
if ( isDefined( self.pers["copyCatLoadout"] ) && self.pers["copyCatLoadout"]["inUse"] && allowCopycat )
|
if ( isDefined( self.pers["copyCatLoadout"] ) && self.pers["copyCatLoadout"]["inUse"] && allowCopycat )
|
||||||
{
|
{
|
||||||
self maps\mp\gametypes\_class::setClass( "copycat" );
|
self maps\mp\gametypes\_class::setClass( "copycat" );
|
||||||
|
@ -356,6 +361,64 @@ giveLoadout( team, class, allowCopycat )
|
||||||
loadoutOffhand = cac_getOffhand( class_num );
|
loadoutOffhand = cac_getOffhand( class_num );
|
||||||
loadoutDeathStreak = cac_getDeathstreak( class_num );
|
loadoutDeathStreak = cac_getDeathstreak( class_num );
|
||||||
}
|
}
|
||||||
|
else if ( class == "gamemode" )
|
||||||
|
{
|
||||||
|
gamemodeLoadout = self.pers["gamemodeLoadout"];
|
||||||
|
|
||||||
|
loadoutPrimary = gamemodeLoadout["loadoutPrimary"];
|
||||||
|
loadoutPrimaryAttachment = gamemodeLoadout["loadoutPrimaryAttachment"];
|
||||||
|
loadoutPrimaryAttachment2 = gamemodeLoadout["loadoutPrimaryAttachment2"] ;
|
||||||
|
loadoutPrimaryCamo = gamemodeLoadout["loadoutPrimaryCamo"];
|
||||||
|
loadoutSecondary = gamemodeLoadout["loadoutSecondary"];
|
||||||
|
loadoutSecondaryAttachment = gamemodeLoadout["loadoutSecondaryAttachment"];
|
||||||
|
loadoutSecondaryAttachment2 = gamemodeLoadout["loadoutSecondaryAttachment2"];
|
||||||
|
loadoutSecondaryCamo = gamemodeLoadout["loadoutSecondaryCamo"];
|
||||||
|
|
||||||
|
// replace the placeholder throwing knife with the valid secondary if there is one
|
||||||
|
if ( loadoutPrimary == "throwingknife" && loadoutSecondary != "none" )
|
||||||
|
{
|
||||||
|
loadoutPrimary = loadoutSecondary;
|
||||||
|
loadoutPrimaryAttachment = loadoutSecondaryAttachment;
|
||||||
|
loadoutPrimaryAttachment2 = loadoutSecondaryAttachment2;
|
||||||
|
loadoutPrimaryCamo = loadoutSecondaryCamo;
|
||||||
|
|
||||||
|
loadoutSecondary = "none";
|
||||||
|
loadoutSecondaryAttachment = "none";
|
||||||
|
loadoutSecondaryAttachment2 = "none";
|
||||||
|
loadoutSecondaryCamo = "none";
|
||||||
|
}
|
||||||
|
// otherwise replace with normal default for invalid class
|
||||||
|
else if ( loadoutPrimary == "throwingknife" && loadoutSecondary == "none" )
|
||||||
|
{
|
||||||
|
clearAmmo = true;
|
||||||
|
loadoutPrimary = "usp";
|
||||||
|
loadoutPrimaryAttachment = "tactical";
|
||||||
|
}
|
||||||
|
|
||||||
|
loadoutEquipment = gamemodeLoadout["loadoutEquipment"];
|
||||||
|
loadoutOffhand = gamemodeLoadout["loadoutOffhand"];
|
||||||
|
// hack, until game mode default class data can be reset
|
||||||
|
if ( loadoutOffhand == "specialty_null" )
|
||||||
|
loadoutOffhand = "none";
|
||||||
|
loadoutPerk1 = gamemodeLoadout["loadoutPerk1"];
|
||||||
|
loadoutPerk2 = gamemodeLoadout["loadoutPerk2"];
|
||||||
|
loadoutPerk3 = gamemodeLoadout["loadoutPerk3"];
|
||||||
|
|
||||||
|
if ( level.killstreakRewards )
|
||||||
|
{
|
||||||
|
loadoutKillstreak1 = gamemodeLoadout["loadoutKillstreak1"];
|
||||||
|
loadoutKillstreak2 = gamemodeLoadout["loadoutKillstreak2"];
|
||||||
|
loadoutKillstreak3 = gamemodeLoadout["loadoutKillstreak3"];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
loadoutKillstreak1 = "none";
|
||||||
|
loadoutKillstreak2 = "none";
|
||||||
|
loadoutKillstreak3 = "none";
|
||||||
|
}
|
||||||
|
|
||||||
|
loadoutDeathStreak = gamemodeLoadout["loadoutDeathstreak"];
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
class_num = getClassIndex( class );
|
class_num = getClassIndex( class );
|
||||||
|
@ -378,7 +441,9 @@ giveLoadout( team, class, allowCopycat )
|
||||||
loadoutDeathstreak = table_getDeathstreak( level.classTableName, class_num );
|
loadoutDeathstreak = table_getDeathstreak( level.classTableName, class_num );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !(isDefined( self.pers["copyCatLoadout"] ) && self.pers["copyCatLoadout"]["inUse"] && allowCopycat) )
|
isGameModeClass = ( class == "gamemode" );
|
||||||
|
|
||||||
|
if ( !isGameModeClass && !(isDefined( self.pers["copyCatLoadout"] ) && self.pers["copyCatLoadout"]["inUse"] && allowCopycat) )
|
||||||
{
|
{
|
||||||
isCustomClass = isSubstr( class, "custom" );
|
isCustomClass = isSubstr( class, "custom" );
|
||||||
|
|
||||||
|
@ -436,6 +501,31 @@ giveLoadout( team, class, allowCopycat )
|
||||||
|
|
||||||
//loadoutSecondaryCamo = "none";
|
//loadoutSecondaryCamo = "none";
|
||||||
|
|
||||||
|
self.loadoutPrimaryCamo = int(tableLookup( "mp/camoTable.csv", 1, loadoutPrimaryCamo, 0 ));
|
||||||
|
self.loadoutPrimary = loadoutPrimary;
|
||||||
|
self.loadoutSecondary = loadoutSecondary;
|
||||||
|
self.loadoutSecondaryCamo = int(tableLookup( "mp/camoTable.csv", 1, loadoutSecondaryCamo, 0 ));
|
||||||
|
|
||||||
|
if ( loadoutSecondary == "none" )
|
||||||
|
secondaryName = "none";
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
secondaryName = buildWeaponName( loadoutSecondary, loadoutSecondaryAttachment, loadoutSecondaryAttachment2 );
|
||||||
|
self _giveWeapon( secondaryName, int(tableLookup( "mp/camoTable.csv", 1, loadoutSecondaryCamo, 0 ) ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
self SetOffhandPrimaryClass( "other" );
|
||||||
|
|
||||||
|
// Action Slots
|
||||||
|
//self _SetActionSlot( 1, "" );
|
||||||
|
self _SetActionSlot( 1, "nightvision" );
|
||||||
|
self _SetActionSlot( 3, "altMode" );
|
||||||
|
self _SetActionSlot( 4, "" );
|
||||||
|
|
||||||
|
// Perks
|
||||||
|
self _clearPerks();
|
||||||
|
self _detachAll();
|
||||||
|
|
||||||
if ( level.killstreakRewards )
|
if ( level.killstreakRewards )
|
||||||
{
|
{
|
||||||
|
@ -459,50 +549,11 @@ giveLoadout( team, class, allowCopycat )
|
||||||
loadoutKillstreak3 = "none";
|
loadoutKillstreak3 = "none";
|
||||||
}
|
}
|
||||||
|
|
||||||
secondaryName = buildWeaponName( loadoutSecondary, loadoutSecondaryAttachment, loadoutSecondaryAttachment2 );
|
|
||||||
self _giveWeapon( secondaryName, int(tableLookup( "mp/camoTable.csv", 1, loadoutSecondaryCamo, 0 ) ) );
|
|
||||||
|
|
||||||
self.loadoutPrimaryCamo = int(tableLookup( "mp/camoTable.csv", 1, loadoutPrimaryCamo, 0 ));
|
|
||||||
self.loadoutPrimary = loadoutPrimary;
|
|
||||||
self.loadoutSecondary = loadoutSecondary;
|
|
||||||
self.loadoutSecondaryCamo = int(tableLookup( "mp/camoTable.csv", 1, loadoutSecondaryCamo, 0 ));
|
|
||||||
|
|
||||||
self SetOffhandPrimaryClass( "other" );
|
|
||||||
|
|
||||||
// Action Slots
|
|
||||||
//self _SetActionSlot( 1, "" );
|
|
||||||
self _SetActionSlot( 1, "nightvision" );
|
|
||||||
self _SetActionSlot( 3, "altMode" );
|
|
||||||
self _SetActionSlot( 4, "" );
|
|
||||||
|
|
||||||
// Perks
|
|
||||||
self _clearPerks();
|
|
||||||
self _detachAll();
|
|
||||||
|
|
||||||
// these special case giving pistol death have to come before
|
// these special case giving pistol death have to come before
|
||||||
// perk loadout to ensure player perk icons arent overwritten
|
// perk loadout to ensure player perk icons arent overwritten
|
||||||
if ( level.dieHardMode )
|
if ( level.dieHardMode )
|
||||||
self maps\mp\perks\_perks::givePerk( "specialty_pistoldeath" );
|
self maps\mp\perks\_perks::givePerk( "specialty_pistoldeath" );
|
||||||
|
|
||||||
// only give the deathstreak for the initial spawn for this life.
|
|
||||||
if ( loadoutDeathStreak != "specialty_null" && getTime() == self.spawnTime )
|
|
||||||
{
|
|
||||||
deathVal = int( tableLookup( "mp/perkTable.csv", 1, loadoutDeathStreak, 6 ) );
|
|
||||||
|
|
||||||
if ( self getPerkUpgrade( loadoutPerk1 ) == "specialty_rollover" || self getPerkUpgrade( loadoutPerk2 ) == "specialty_rollover" || self getPerkUpgrade( loadoutPerk3 ) == "specialty_rollover" )
|
|
||||||
deathVal -= 1;
|
|
||||||
|
|
||||||
if ( self.pers["cur_death_streak"] == deathVal )
|
|
||||||
{
|
|
||||||
self thread maps\mp\perks\_perks::givePerk( loadoutDeathStreak );
|
|
||||||
self thread maps\mp\gametypes\_hud_message::splashNotify( loadoutDeathStreak );
|
|
||||||
}
|
|
||||||
else if ( self.pers["cur_death_streak"] > deathVal )
|
|
||||||
{
|
|
||||||
self thread maps\mp\perks\_perks::givePerk( loadoutDeathStreak );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self loadoutAllPerks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3 );
|
self loadoutAllPerks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3 );
|
||||||
|
|
||||||
self setKillstreaks( loadoutKillstreak1, loadoutKillstreak2, loadoutKillstreak3 );
|
self setKillstreaks( loadoutKillstreak1, loadoutKillstreak2, loadoutKillstreak3 );
|
||||||
|
@ -510,6 +561,28 @@ giveLoadout( team, class, allowCopycat )
|
||||||
if ( self hasPerk( "specialty_extraammo", true ) && getWeaponClass( secondaryName ) != "weapon_projectile" )
|
if ( self hasPerk( "specialty_extraammo", true ) && getWeaponClass( secondaryName ) != "weapon_projectile" )
|
||||||
self giveMaxAmmo( secondaryName );
|
self giveMaxAmmo( secondaryName );
|
||||||
|
|
||||||
|
// only give the deathstreak for the initial spawn for this life.
|
||||||
|
if( self.pers["cur_death_streak"] > 0 )
|
||||||
|
{
|
||||||
|
if ( loadoutDeathStreak != "specialty_null" )
|
||||||
|
{
|
||||||
|
deathVal = int( tableLookup( "mp/perkTable.csv", 1, loadoutDeathStreak, 6 ) );
|
||||||
|
|
||||||
|
if ( self getPerkUpgrade( loadoutPerk1 ) == "specialty_rollover" || self getPerkUpgrade( loadoutPerk2 ) == "specialty_rollover" || self getPerkUpgrade( loadoutPerk3 ) == "specialty_rollover" )
|
||||||
|
deathVal -= 1;
|
||||||
|
|
||||||
|
if ( self.pers["cur_death_streak"] == deathVal )
|
||||||
|
{
|
||||||
|
self thread maps\mp\perks\_perks::givePerk( loadoutDeathStreak );
|
||||||
|
self thread maps\mp\gametypes\_hud_message::splashNotify( loadoutDeathStreak );
|
||||||
|
}
|
||||||
|
else if ( self.pers["cur_death_streak"] > deathVal )
|
||||||
|
{
|
||||||
|
self thread maps\mp\perks\_perks::givePerk( loadoutDeathStreak );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Primary Weapon
|
// Primary Weapon
|
||||||
primaryName = buildWeaponName( loadoutPrimary, loadoutPrimaryAttachment, loadoutPrimaryAttachment2 );
|
primaryName = buildWeaponName( loadoutPrimary, loadoutPrimaryAttachment, loadoutPrimaryAttachment2 );
|
||||||
self _giveWeapon( primaryName, self.loadoutPrimaryCamo );
|
self _giveWeapon( primaryName, self.loadoutPrimaryCamo );
|
||||||
|
@ -530,25 +603,43 @@ giveLoadout( team, class, allowCopycat )
|
||||||
|
|
||||||
// Secondary Offhand
|
// Secondary Offhand
|
||||||
offhandSecondaryWeapon = loadoutOffhand + "_mp";
|
offhandSecondaryWeapon = loadoutOffhand + "_mp";
|
||||||
if ( loadoutOffhand == "flash_grenade" )
|
|
||||||
self SetOffhandSecondaryClass( "flash" );
|
|
||||||
else
|
|
||||||
self SetOffhandSecondaryClass( "smoke" );
|
|
||||||
|
|
||||||
self giveWeapon( offhandSecondaryWeapon );
|
if ( loadoutOffhand == "none" )
|
||||||
if( loadOutOffhand == "smoke_grenade" )
|
self SetOffhandSecondaryClass( "none" );
|
||||||
self setWeaponAmmoClip( offhandSecondaryWeapon, 1 );
|
else if ( loadoutOffhand == "flash_grenade" )
|
||||||
else if( loadOutOffhand == "flash_grenade" )
|
self SetOffhandSecondaryClass( "flash" );
|
||||||
self setWeaponAmmoClip( offhandSecondaryWeapon, 2 );
|
else if ( loadoutOffhand == "smoke_grenade" || loadoutOffhand == "concussion_grenade" )
|
||||||
else if( loadOutOffhand == "concussion_grenade" )
|
self SetOffhandSecondaryClass( "smoke" );
|
||||||
self setWeaponAmmoClip( offhandSecondaryWeapon, 2 );
|
|
||||||
else
|
else
|
||||||
self setWeaponAmmoClip( offhandSecondaryWeapon, 1 );
|
self SetOffhandSecondaryClass( "flash" );
|
||||||
|
|
||||||
|
switch( loadoutOffhand )
|
||||||
|
{
|
||||||
|
case "none":
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
self giveWeapon( offhandSecondaryWeapon );
|
||||||
|
|
||||||
|
if ( loadOutOffhand == "flash_grenade" )
|
||||||
|
self setWeaponAmmoClip( offhandSecondaryWeapon, 2 );
|
||||||
|
else if( loadOutOffhand == "concussion_grenade" )
|
||||||
|
self setWeaponAmmoClip( offhandSecondaryWeapon, 2 );
|
||||||
|
else
|
||||||
|
self setWeaponAmmoClip( offhandSecondaryWeapon, 1 );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
primaryWeapon = primaryName;
|
primaryWeapon = primaryName;
|
||||||
self.primaryWeapon = primaryWeapon;
|
self.primaryWeapon = primaryWeapon;
|
||||||
self.secondaryWeapon = secondaryName;
|
self.secondaryWeapon = secondaryName;
|
||||||
|
|
||||||
|
// clear ammo for created default classes using placeholder gun when primary and secondary was set to none
|
||||||
|
if ( clearAmmo )
|
||||||
|
{
|
||||||
|
self SetWeaponAmmoClip( self.primaryWeapon, 0 );
|
||||||
|
self SetWeaponAmmoStock( self.primaryWeapon, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
self maps\mp\gametypes\_teams::playerModelForWeapon( self.pers["primaryWeapon"], getBaseWeaponName( secondaryName ) );
|
self maps\mp\gametypes\_teams::playerModelForWeapon( self.pers["primaryWeapon"], getBaseWeaponName( secondaryName ) );
|
||||||
|
|
||||||
self.isSniper = (weaponClass( self.primaryWeapon ) == "sniper");
|
self.isSniper = (weaponClass( self.primaryWeapon ) == "sniper");
|
||||||
|
@ -703,7 +794,6 @@ trackRiotShield()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
tryAttach( placement ) // deprecated; hopefully we won't need to bring this defensive function back
|
tryAttach( placement ) // deprecated; hopefully we won't need to bring this defensive function back
|
||||||
{
|
{
|
||||||
if ( !isDefined( placement ) || placement != "back" )
|
if ( !isDefined( placement ) || placement != "back" )
|
||||||
|
@ -747,8 +837,6 @@ tryDetach( placement ) // deprecated; hopefully we won't need to bring this defe
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
buildWeaponName( baseName, attachment1, attachment2 )
|
buildWeaponName( baseName, attachment1, attachment2 )
|
||||||
{
|
{
|
||||||
if ( !isDefined( level.letterToNumber ) )
|
if ( !isDefined( level.letterToNumber ) )
|
||||||
|
@ -814,7 +902,6 @@ buildWeaponName( baseName, attachment1, attachment2 )
|
||||||
return ( weaponName + "_mp" );
|
return ( weaponName + "_mp" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
makeLettersToNumbers()
|
makeLettersToNumbers()
|
||||||
{
|
{
|
||||||
array = [];
|
array = [];
|
||||||
|
@ -934,7 +1021,6 @@ setKillstreaks( streak1, streak2, streak3 )
|
||||||
self.killstreaks = newKillstreaks;
|
self.killstreaks = newKillstreaks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
replenishLoadout() // used by ammo hardpoint.
|
replenishLoadout() // used by ammo hardpoint.
|
||||||
{
|
{
|
||||||
team = self.pers["team"];
|
team = self.pers["team"];
|
||||||
|
@ -959,7 +1045,6 @@ replenishLoadout() // used by ammo hardpoint.
|
||||||
self SetWeaponAmmoClip( level.classGrenades[class]["secondary"]["type"], level.classGrenades[class]["secondary"]["count"] );
|
self SetWeaponAmmoClip( level.classGrenades[class]["secondary"]["type"], level.classGrenades[class]["secondary"]["count"] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
onPlayerConnecting()
|
onPlayerConnecting()
|
||||||
{
|
{
|
||||||
for(;;)
|
for(;;)
|
||||||
|
@ -970,14 +1055,18 @@ onPlayerConnecting()
|
||||||
{
|
{
|
||||||
player.pers["class"] = "";
|
player.pers["class"] = "";
|
||||||
}
|
}
|
||||||
|
if ( !isDefined( player.pers["lastClass"] ) )
|
||||||
|
{
|
||||||
|
player.pers["lastClass"] = "";
|
||||||
|
}
|
||||||
player.class = player.pers["class"];
|
player.class = player.pers["class"];
|
||||||
player.lastClass = "";
|
player.lastClass = player.pers["lastClass"];
|
||||||
player.detectExplosives = false;
|
player.detectExplosives = false;
|
||||||
player.bombSquadIcons = [];
|
player.bombSquadIcons = [];
|
||||||
player.bombSquadIds = [];
|
player.bombSquadIds = [];
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
fadeAway( waitDelay, fadeDelay )
|
fadeAway( waitDelay, fadeDelay )
|
||||||
{
|
{
|
||||||
|
@ -987,7 +1076,6 @@ fadeAway( waitDelay, fadeDelay )
|
||||||
self.alpha = 0;
|
self.alpha = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
setClass( newClass )
|
setClass( newClass )
|
||||||
{
|
{
|
||||||
self.curClass = newClass;
|
self.curClass = newClass;
|
||||||
|
@ -1003,7 +1091,6 @@ getPerkForClass( perkSlot, className )
|
||||||
return table_getPerk( level.classTableName, class_num, perkSlot );
|
return table_getPerk( level.classTableName, class_num, perkSlot );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
classHasPerk( className, perkName )
|
classHasPerk( className, perkName )
|
||||||
{
|
{
|
||||||
return( getPerkForClass( 0, className ) == perkName || getPerkForClass( 1, className ) == perkName || getPerkForClass( 2, className ) == perkName );
|
return( getPerkForClass( 0, className ) == perkName || getPerkForClass( 1, className ) == perkName || getPerkForClass( 2, className ) == perkName );
|
||||||
|
|
|
@ -0,0 +1,416 @@
|
||||||
|
#include maps\mp\_utility;
|
||||||
|
#include maps\mp\gametypes\_hud_util;
|
||||||
|
#include common_scripts\utility;
|
||||||
|
|
||||||
|
|
||||||
|
getHighestScoringPlayer()
|
||||||
|
{
|
||||||
|
updatePlacement();
|
||||||
|
|
||||||
|
if ( !level.placement["all"].size )
|
||||||
|
return ( undefined );
|
||||||
|
else
|
||||||
|
return ( level.placement["all"][0] );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getLosingPlayers()
|
||||||
|
{
|
||||||
|
updatePlacement();
|
||||||
|
|
||||||
|
players = level.placement["all"];
|
||||||
|
losingPlayers = [];
|
||||||
|
|
||||||
|
foreach ( player in players )
|
||||||
|
{
|
||||||
|
if ( player == level.placement["all"][0] )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
losingPlayers[losingPlayers.size] = player;
|
||||||
|
}
|
||||||
|
|
||||||
|
return losingPlayers;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
givePlayerScore( event, player, victim, overridePointsPopup )
|
||||||
|
{
|
||||||
|
if ( isDefined( level.nukeIncoming ) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ( !isDefined( overridePointsPopup ) )
|
||||||
|
overridePointsPopup = false;
|
||||||
|
|
||||||
|
score = player.pers["score"];
|
||||||
|
onPlayerScore( event, player, victim );
|
||||||
|
|
||||||
|
if ( score == player.pers["score"] )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ( !player rankingEnabled() && !level.hardcoreMode && !overridePointsPopup )
|
||||||
|
player thread maps\mp\gametypes\_rank::scorePopup( (player.pers["score"] - score), false, (0.85,0.85,0.85), 0 );
|
||||||
|
|
||||||
|
player maps\mp\gametypes\_persistence::statAdd( "score", (player.pers["score"] - score) );
|
||||||
|
|
||||||
|
player.score = player.pers["score"];
|
||||||
|
player maps\mp\gametypes\_persistence::statSetChild( "round", "score", player.score );
|
||||||
|
|
||||||
|
if ( !level.teambased )
|
||||||
|
thread sendUpdatedDMScores();
|
||||||
|
|
||||||
|
player maps\mp\gametypes\_gamelogic::checkPlayerScoreLimitSoon();
|
||||||
|
scoreEndedMatch = player maps\mp\gametypes\_gamelogic::checkScoreLimit();
|
||||||
|
|
||||||
|
if ( scoreEndedMatch && event == "kill" )
|
||||||
|
player.finalKill = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
onPlayerScore( event, player, victim )
|
||||||
|
{
|
||||||
|
score = maps\mp\gametypes\_rank::getScoreInfoValue( event );
|
||||||
|
|
||||||
|
assert( isDefined( score ) );
|
||||||
|
|
||||||
|
player.pers["score"] += score * level.objectivePointsMod;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Seems to only be used for reducing a player's score due to suicide
|
||||||
|
_setPlayerScore( player, score )
|
||||||
|
{
|
||||||
|
if ( score == player.pers["score"] )
|
||||||
|
return;
|
||||||
|
|
||||||
|
player.pers["score"] = score;
|
||||||
|
player.score = player.pers["score"];
|
||||||
|
|
||||||
|
player thread maps\mp\gametypes\_gamelogic::checkScoreLimit();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
_getPlayerScore( player )
|
||||||
|
{
|
||||||
|
return player.pers["score"];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
giveTeamScoreForObjective( team, score )
|
||||||
|
{
|
||||||
|
if ( isDefined( level.nukeIncoming ) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
score *= level.objectivePointsMod;
|
||||||
|
|
||||||
|
teamScore = game["teamScores"][team];
|
||||||
|
|
||||||
|
otherTeam = level.otherTeam[team];
|
||||||
|
|
||||||
|
if ( game["teamScores"][team] > game["teamScores"][otherTeam] )
|
||||||
|
level.wasWinning = team;
|
||||||
|
else if ( game["teamScores"][otherTeam] > game["teamScores"][team] )
|
||||||
|
level.wasWinning = otherTeam;
|
||||||
|
|
||||||
|
_setTeamScore( team, _getTeamScore( team ) + score );
|
||||||
|
|
||||||
|
isWinning = "none";
|
||||||
|
if ( game["teamScores"][team] > game["teamScores"][otherTeam] )
|
||||||
|
isWinning = team;
|
||||||
|
else if ( game["teamScores"][otherTeam] > game["teamScores"][team] )
|
||||||
|
isWinning = otherTeam;
|
||||||
|
|
||||||
|
if ( !level.splitScreen && isWinning != "none" && isWinning != level.wasWinning && getTime() - level.lastStatusTime > 5000 && getScoreLimit() != 1 )
|
||||||
|
{
|
||||||
|
level.lastStatusTime = getTime();
|
||||||
|
leaderDialog( "lead_taken", isWinning, "status" );
|
||||||
|
if ( level.wasWinning != "none")
|
||||||
|
leaderDialog( "lead_lost", level.wasWinning, "status" );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( isWinning != "none" )
|
||||||
|
level.wasWinning = isWinning;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getWinningTeam()
|
||||||
|
{
|
||||||
|
if ( game["teamScores"]["allies"] > game["teamScores"]["axis"] )
|
||||||
|
return ( "allies" );
|
||||||
|
else if ( game["teamScores"]["allies"] < game["teamScores"]["axis"] )
|
||||||
|
return ( "axis" );
|
||||||
|
|
||||||
|
return ( "none" );
|
||||||
|
}
|
||||||
|
|
||||||
|
_setTeamScore( team, teamScore )
|
||||||
|
{
|
||||||
|
if ( teamScore == game["teamScores"][team] )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ( isDefined( level.nukeIncoming ) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
game["teamScores"][team] = teamScore;
|
||||||
|
|
||||||
|
updateTeamScore( team );
|
||||||
|
|
||||||
|
if ( game["status"] == "overtime" )
|
||||||
|
thread maps\mp\gametypes\_gamelogic::onScoreLimit();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
thread maps\mp\gametypes\_gamelogic::checkTeamScoreLimitSoon( team );
|
||||||
|
thread maps\mp\gametypes\_gamelogic::checkScoreLimit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
updateTeamScore( team )
|
||||||
|
{
|
||||||
|
assert( level.teamBased );
|
||||||
|
|
||||||
|
teamScore = 0;
|
||||||
|
if ( !isRoundBased() || !isObjectiveBased() )
|
||||||
|
teamScore = _getTeamScore( team );
|
||||||
|
else
|
||||||
|
teamScore = game["roundsWon"][team];
|
||||||
|
|
||||||
|
setTeamScore( team, teamScore );
|
||||||
|
|
||||||
|
//thread sendUpdatedTeamScores();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
_getTeamScore( team )
|
||||||
|
{
|
||||||
|
return game["teamScores"][team];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sendUpdatedTeamScores()
|
||||||
|
{
|
||||||
|
level notify("updating_scores");
|
||||||
|
level endon("updating_scores");
|
||||||
|
wait .05;
|
||||||
|
|
||||||
|
WaitTillSlowProcessAllowed();
|
||||||
|
|
||||||
|
foreach ( player in level.players )
|
||||||
|
player updateScores();
|
||||||
|
}
|
||||||
|
|
||||||
|
sendUpdatedDMScores()
|
||||||
|
{
|
||||||
|
level notify("updating_dm_scores");
|
||||||
|
level endon("updating_dm_scores");
|
||||||
|
wait .05;
|
||||||
|
|
||||||
|
WaitTillSlowProcessAllowed();
|
||||||
|
|
||||||
|
for ( i = 0; i < level.players.size; i++ )
|
||||||
|
{
|
||||||
|
level.players[i] updateDMScores();
|
||||||
|
level.players[i].updatedDMScores = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
removeDisconnectedPlayerFromPlacement()
|
||||||
|
{
|
||||||
|
offset = 0;
|
||||||
|
numPlayers = level.placement["all"].size;
|
||||||
|
found = false;
|
||||||
|
for ( i = 0; i < numPlayers; i++ )
|
||||||
|
{
|
||||||
|
if ( level.placement["all"][i] == self )
|
||||||
|
found = true;
|
||||||
|
|
||||||
|
if ( found )
|
||||||
|
level.placement["all"][i] = level.placement["all"][ i + 1 ];
|
||||||
|
}
|
||||||
|
if ( !found )
|
||||||
|
return;
|
||||||
|
|
||||||
|
level.placement["all"][ numPlayers - 1 ] = undefined;
|
||||||
|
assert( level.placement["all"].size == numPlayers - 1 );
|
||||||
|
|
||||||
|
if ( level.teamBased )
|
||||||
|
{
|
||||||
|
updateTeamPlacement();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
numPlayers = level.placement["all"].size;
|
||||||
|
for ( i = 0; i < numPlayers; i++ )
|
||||||
|
{
|
||||||
|
player = level.placement["all"][i];
|
||||||
|
player notify( "update_outcome" );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
updatePlacement()
|
||||||
|
{
|
||||||
|
prof_begin("updatePlacement");
|
||||||
|
|
||||||
|
placementAll = [];
|
||||||
|
foreach ( player in level.players )
|
||||||
|
{
|
||||||
|
if ( isDefined( player.connectedPostGame ) || (player.pers["team"] != "allies" && player.pers["team"] != "axis") )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
placementAll[placementAll.size] = player;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( i = 1; i < placementAll.size; i++ )
|
||||||
|
{
|
||||||
|
player = placementAll[i];
|
||||||
|
playerScore = player.score;
|
||||||
|
// for ( j = i - 1; j >= 0 && (player.score > placementAll[j].score || (player.score == placementAll[j].score && player.deaths < placementAll[j].deaths)); j-- )
|
||||||
|
for ( j = i - 1; j >= 0 && getBetterPlayer( player, placementAll[j] ) == player; j-- )
|
||||||
|
placementAll[j + 1] = placementAll[j];
|
||||||
|
placementAll[j + 1] = player;
|
||||||
|
}
|
||||||
|
|
||||||
|
level.placement["all"] = placementAll;
|
||||||
|
|
||||||
|
if ( level.teamBased )
|
||||||
|
updateTeamPlacement();
|
||||||
|
|
||||||
|
prof_end("updatePlacement");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getBetterPlayer( playerA, playerB )
|
||||||
|
{
|
||||||
|
if ( playerA.score > playerB.score )
|
||||||
|
return playerA;
|
||||||
|
|
||||||
|
if ( playerB.score > playerA.score )
|
||||||
|
return playerB;
|
||||||
|
|
||||||
|
if ( playerA.deaths < playerB.deaths )
|
||||||
|
return playerA;
|
||||||
|
|
||||||
|
if ( playerB.deaths < playerA.deaths )
|
||||||
|
return playerB;
|
||||||
|
|
||||||
|
// TODO: more metrics for getting the better player
|
||||||
|
|
||||||
|
if ( cointoss() )
|
||||||
|
return playerA;
|
||||||
|
else
|
||||||
|
return playerB;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
updateTeamPlacement()
|
||||||
|
{
|
||||||
|
placement["allies"] = [];
|
||||||
|
placement["axis"] = [];
|
||||||
|
placement["spectator"] = [];
|
||||||
|
|
||||||
|
assert( level.teamBased );
|
||||||
|
|
||||||
|
placementAll = level.placement["all"];
|
||||||
|
placementAllSize = placementAll.size;
|
||||||
|
|
||||||
|
for ( i = 0; i < placementAllSize; i++ )
|
||||||
|
{
|
||||||
|
player = placementAll[i];
|
||||||
|
team = player.pers["team"];
|
||||||
|
|
||||||
|
placement[team][ placement[team].size ] = player;
|
||||||
|
}
|
||||||
|
|
||||||
|
level.placement["allies"] = placement["allies"];
|
||||||
|
level.placement["axis"] = placement["axis"];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
initialDMScoreUpdate()
|
||||||
|
{
|
||||||
|
// the first time we call updateDMScores on a player, we have to send them the whole scoreboard.
|
||||||
|
// by calling updateDMScores on each player one at a time,
|
||||||
|
// we can avoid having to send the entire scoreboard to every single player
|
||||||
|
// the first time someone kills someone else.
|
||||||
|
wait .2;
|
||||||
|
numSent = 0;
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
didAny = false;
|
||||||
|
|
||||||
|
players = level.players;
|
||||||
|
for ( i = 0; i < players.size; i++ )
|
||||||
|
{
|
||||||
|
player = players[i];
|
||||||
|
|
||||||
|
if ( !isdefined( player ) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if ( isdefined( player.updatedDMScores ) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
player.updatedDMScores = true;
|
||||||
|
player updateDMScores();
|
||||||
|
|
||||||
|
didAny = true;
|
||||||
|
wait .5;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !didAny )
|
||||||
|
wait 3; // let more players connect
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
processAssist( killedplayer )
|
||||||
|
{
|
||||||
|
self endon("disconnect");
|
||||||
|
killedplayer endon("disconnect");
|
||||||
|
|
||||||
|
wait .05; // don't ever run on the same frame as the playerkilled callback.
|
||||||
|
WaitTillSlowProcessAllowed();
|
||||||
|
|
||||||
|
if ( self.pers["team"] != "axis" && self.pers["team"] != "allies" )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ( self.pers["team"] == killedplayer.pers["team"] )
|
||||||
|
return;
|
||||||
|
|
||||||
|
self thread [[level.onXPEvent]]( "assist" );
|
||||||
|
self incPersStat( "assists", 1 );
|
||||||
|
self.assists = self getPersStat( "assists" );
|
||||||
|
self incPlayerStat( "assists", 1 );
|
||||||
|
|
||||||
|
givePlayerScore( "assist", self, killedplayer );
|
||||||
|
self thread giveAdrenaline( "assist" );
|
||||||
|
|
||||||
|
self thread maps\mp\gametypes\_missions::playerAssist();
|
||||||
|
}
|
||||||
|
|
||||||
|
processShieldAssist( killedPlayer )
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
killedPlayer endon( "disconnect" );
|
||||||
|
|
||||||
|
wait .05; // don't ever run on the same frame as the playerkilled callback.
|
||||||
|
WaitTillSlowProcessAllowed();
|
||||||
|
|
||||||
|
if ( self.pers["team"] != "axis" && self.pers["team"] != "allies" )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ( self.pers["team"] == killedplayer.pers["team"] )
|
||||||
|
return;
|
||||||
|
|
||||||
|
self thread [[level.onXPEvent]]( "assist" );
|
||||||
|
self thread [[level.onXPEvent]]( "assist" );
|
||||||
|
self incPersStat( "assists", 1 );
|
||||||
|
self.assists = self getPersStat( "assists" );
|
||||||
|
self incPlayerStat( "assists", 1 );
|
||||||
|
|
||||||
|
givePlayerScore( "assist", self, killedplayer );
|
||||||
|
|
||||||
|
self thread maps\mp\gametypes\_hud_message::SplashNotifyDelayed( "shield_assist" );
|
||||||
|
|
||||||
|
self thread maps\mp\gametypes\_missions::playerAssist();
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
dm
|
||||||
|
dom
|
||||||
|
sd
|
||||||
|
sab
|
||||||
|
war
|
||||||
|
koth
|
||||||
|
oneflag
|
||||||
|
arena
|
||||||
|
dd
|
||||||
|
ctf
|
||||||
|
gtnw
|
||||||
|
conf
|
||||||
|
gun
|
||||||
|
infect
|
|
@ -123,9 +123,9 @@ onMenuResponse()
|
||||||
{
|
{
|
||||||
self endon("disconnect");
|
self endon("disconnect");
|
||||||
|
|
||||||
for (;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
self waittill( "menuresponse", menu, response );
|
self waittill("menuresponse", menu, response);
|
||||||
|
|
||||||
if ( response == "back" )
|
if ( response == "back" )
|
||||||
{
|
{
|
||||||
|
@ -142,21 +142,20 @@ onMenuResponse()
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response == "changeteam")
|
if(response == "changeteam")
|
||||||
{
|
{
|
||||||
self closepopupMenu();
|
self closepopupMenu();
|
||||||
self closeInGameMenu();
|
self closeInGameMenu();
|
||||||
self openpopupMenu(game["menu_team"]);
|
self openpopupMenu(game["menu_team"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response == "changeclass_marines")
|
if(response == "changeclass_marines" )
|
||||||
{
|
{
|
||||||
self closepopupMenu();
|
self closepopupMenu();
|
||||||
self closeInGameMenu();
|
self closeInGameMenu();
|
||||||
if ( getDvar( "g_gametype" ) != "oitc" && getDvar( "g_gametype" ) != "gg" && getDvar( "g_gametype" ) != "ss" && !isDefined(level.customClassCB) )
|
if ( allowClassChoice() )
|
||||||
{
|
|
||||||
self openpopupMenu( game["menu_changeclass_allies"] );
|
self openpopupMenu( game["menu_changeclass_allies"] );
|
||||||
}
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,17 +163,17 @@ onMenuResponse()
|
||||||
{
|
{
|
||||||
self closepopupMenu();
|
self closepopupMenu();
|
||||||
self closeInGameMenu();
|
self closeInGameMenu();
|
||||||
if ( getDvar( "g_gametype" ) != "oitc" && getDvar( "g_gametype" ) != "gg" && getDvar( "g_gametype" ) != "ss" && !isDefined(level.customClassCB) )
|
|
||||||
{
|
if ( allowClassChoice() )
|
||||||
self openpopupMenu( game["menu_changeclass_axis"] );
|
self openpopupMenu( game["menu_changeclass_axis"] );
|
||||||
}
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response == "changeclass_marines_splitscreen" )
|
if(response == "changeclass_marines_splitscreen" )
|
||||||
self openpopupMenu( "changeclass_marines_splitscreen" );
|
self openpopupMenu( "changeclass_marines_splitscreen" );
|
||||||
|
|
||||||
if (response == "changeclass_opfor_splitscreen" )
|
if(response == "changeclass_opfor_splitscreen" )
|
||||||
self openpopupMenu( "changeclass_opfor_splitscreen" );
|
self openpopupMenu( "changeclass_opfor_splitscreen" );
|
||||||
|
|
||||||
if ( response == "endround" )
|
if ( response == "endround" )
|
||||||
|
@ -186,7 +185,7 @@ onMenuResponse()
|
||||||
|
|
||||||
if ( !level.gameEnded )
|
if ( !level.gameEnded )
|
||||||
{
|
{
|
||||||
setDvar( "sv_dontRotate", 1 );
|
setDvar("sv_dontrotate", 1);
|
||||||
level thread maps\mp\gametypes\_gamelogic::forceEnd();
|
level thread maps\mp\gametypes\_gamelogic::forceEnd();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -198,9 +197,9 @@ onMenuResponse()
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (menu == game["menu_team"])
|
if(menu == game["menu_team"])
|
||||||
{
|
{
|
||||||
switch (response)
|
switch(response)
|
||||||
{
|
{
|
||||||
case "allies":
|
case "allies":
|
||||||
self [[level.allies]]();
|
self [[level.allies]]();
|
||||||
|
@ -321,28 +320,29 @@ beginClassChoice( forceNewChoice )
|
||||||
{
|
{
|
||||||
assert( self.pers["team"] == "axis" || self.pers["team"] == "allies" );
|
assert( self.pers["team"] == "axis" || self.pers["team"] == "allies" );
|
||||||
|
|
||||||
if ( getDvar( "g_gametype" ) == "oitc" || getDvar( "g_gametype" ) == "gg" || getDvar( "g_gametype" ) == "ss" || isDefined(level.customClassCB) )
|
|
||||||
{
|
|
||||||
if ( !isAlive( self ) )
|
|
||||||
self thread maps\mp\gametypes\_playerlogic::predictAboutToSpawnPlayerOverTime( 0.1 );
|
|
||||||
|
|
||||||
self.selectedClass = true;
|
|
||||||
self menuClass( "assault_mp,0" );
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
team = self.pers["team"];
|
team = self.pers["team"];
|
||||||
|
|
||||||
// menu_changeclass_team is the one where you choose one of the n classes to play as.
|
// menu_changeclass_team is the one where you choose one of the n classes to play as.
|
||||||
// menu_class_team is where you can choose to change your team, class, controls, or leave game.
|
// menu_class_team is where you can choose to change your team, class, controls, or leave game.
|
||||||
self openpopupMenu( game[ "menu_changeclass_" + team ] );
|
|
||||||
|
// if game mode allows class choice
|
||||||
|
if ( allowClassChoice() )
|
||||||
|
self openpopupMenu( game[ "menu_changeclass_" + team ] );
|
||||||
|
else
|
||||||
|
self thread bypassClassChoice();
|
||||||
|
|
||||||
if ( !isAlive( self ) )
|
if ( !isAlive( self ) )
|
||||||
self thread maps\mp\gametypes\_playerlogic::predictAboutToSpawnPlayerOverTime( 0.1 );
|
self thread maps\mp\gametypes\_playerlogic::predictAboutToSpawnPlayerOverTime( 0.1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bypassClassChoice()
|
||||||
|
{
|
||||||
|
self.selectedClass = true;
|
||||||
|
self [[level.class]]("class0");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
beginTeamChoice()
|
beginTeamChoice()
|
||||||
{
|
{
|
||||||
if ( getDvarInt( "scr_player_forceautoassign" ) != 0 )
|
if ( getDvarInt( "scr_player_forceautoassign" ) != 0 )
|
||||||
|
@ -538,7 +538,7 @@ addToTeam( team, firstConnect )
|
||||||
self.team = team;
|
self.team = team;
|
||||||
|
|
||||||
// session team is readonly in ranked matches on console
|
// session team is readonly in ranked matches on console
|
||||||
if ( !matchMakingGame() || isDefined( self.pers["isBot"] ) )
|
if ( !matchMakingGame() || isDefined( self.pers["isBot"] ) || !allowTeamChoice() )
|
||||||
{
|
{
|
||||||
if ( level.teamBased )
|
if ( level.teamBased )
|
||||||
{
|
{
|
||||||
|
|
|
@ -116,6 +116,12 @@ maySpawn()
|
||||||
|
|
||||||
spawnClient()
|
spawnClient()
|
||||||
{
|
{
|
||||||
|
if ( isDefined( self.addtoteam ) )
|
||||||
|
{
|
||||||
|
maps\mp\gametypes\_menus::addToTeam( self.addtoteam );
|
||||||
|
self.addtoteam = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
assert( isDefined( self.team ) );
|
assert( isDefined( self.team ) );
|
||||||
assert( isValidClass( self.class ) );
|
assert( isValidClass( self.class ) );
|
||||||
|
|
||||||
|
@ -504,13 +510,16 @@ tiValidationCheck()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
spawnPlayer()
|
spawnPlayer( fauxSpawn )
|
||||||
{
|
{
|
||||||
self endon( "disconnect" );
|
self endon( "disconnect" );
|
||||||
self endon( "joined_spectators" );
|
self endon( "joined_spectators" );
|
||||||
self notify( "spawned" );
|
self notify( "spawned" );
|
||||||
self notify( "end_respawn" );
|
self notify( "end_respawn" );
|
||||||
|
|
||||||
|
if ( !isDefined( fauxSpawn ) )
|
||||||
|
fauxSpawn = false;
|
||||||
|
|
||||||
if ( isDefined( self.setSpawnPoint ) && self tiValidationCheck() )
|
if ( isDefined( self.setSpawnPoint ) && self tiValidationCheck() )
|
||||||
{
|
{
|
||||||
spawnPoint = self.setSpawnPoint;
|
spawnPoint = self.setSpawnPoint;
|
||||||
|
@ -559,62 +568,69 @@ spawnPlayer()
|
||||||
|
|
||||||
self.fauxDead = undefined;
|
self.fauxDead = undefined;
|
||||||
|
|
||||||
self.killsThisLife = [];
|
if ( !fauxSpawn )
|
||||||
|
{
|
||||||
|
self.killsThisLife = [];
|
||||||
|
|
||||||
self updateSessionState( "playing", "" );
|
self updateSessionState( "playing", "" );
|
||||||
self ClearKillcamState();
|
self ClearKillcamState();
|
||||||
self.cancelkillcam = 1;
|
self.cancelkillcam = 1;
|
||||||
self openMenu( "killedby_card_hide" );
|
self openMenu( "killedby_card_hide" );
|
||||||
|
|
||||||
self.maxhealth = maps\mp\gametypes\_tweakables::getTweakableValue( "player", "maxhealth" );
|
self.maxhealth = maps\mp\gametypes\_tweakables::getTweakableValue( "player", "maxhealth" );
|
||||||
|
|
||||||
self.health = self.maxhealth;
|
self.health = self.maxhealth;
|
||||||
|
|
||||||
self.friendlydamage = undefined;
|
self.friendlydamage = undefined;
|
||||||
self.hasSpawned = true;
|
self.hasSpawned = true;
|
||||||
self.spawnTime = getTime();
|
self.spawnTime = getTime();
|
||||||
self.wasTI = !isDefined( spawnPoint );
|
self.wasTI = !isDefined( spawnPoint );
|
||||||
self.afk = false;
|
self.afk = false;
|
||||||
self.lastStand = undefined;
|
self.lastStand = undefined;
|
||||||
self.infinalStand = undefined;
|
self.infinalStand = undefined;
|
||||||
self.inC4Death = undefined;
|
self.inC4Death = undefined;
|
||||||
self.damagedPlayers = [];
|
self.damagedPlayers = [];
|
||||||
self.moveSpeedScaler = 1;
|
self.moveSpeedScaler = 1;
|
||||||
self.killStreakScaler = 1;
|
self.killStreakScaler = 1;
|
||||||
self.xpScaler = 1;
|
self.xpScaler = 1;
|
||||||
self.objectiveScaler = 1;
|
self.objectiveScaler = 1;
|
||||||
self.inLastStand = false;
|
self.inLastStand = false;
|
||||||
self.clampedHealth = undefined;
|
self.clampedHealth = undefined;
|
||||||
self.shieldDamage = 0;
|
self.shieldDamage = 0;
|
||||||
self.shieldBulletHits = 0;
|
self.shieldBulletHits = 0;
|
||||||
self.recentShieldXP = 0;
|
self.recentShieldXP = 0;
|
||||||
|
}
|
||||||
|
|
||||||
self.disabledWeapon = 0;
|
self.disabledWeapon = 0;
|
||||||
self.disabledWeaponSwitch = 0;
|
self.disabledWeaponSwitch = 0;
|
||||||
self.disabledOffhandWeapons = 0;
|
self.disabledOffhandWeapons = 0;
|
||||||
self resetUsability();
|
self resetUsability();
|
||||||
|
|
||||||
if ( self.pers["lives"] == getGametypeNumLives() )
|
if ( !fauxSpawn )
|
||||||
{
|
{
|
||||||
maps\mp\gametypes\_playerlogic::addToLivesCount();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( self.pers["lives"] )
|
if ( self.pers["lives"] == getGametypeNumLives() )
|
||||||
self.pers["lives"]--;
|
{
|
||||||
|
maps\mp\gametypes\_playerlogic::addToLivesCount();
|
||||||
|
}
|
||||||
|
|
||||||
self maps\mp\gametypes\_playerlogic::addToAliveCount();
|
if ( self.pers["lives"] )
|
||||||
|
self.pers["lives"]--;
|
||||||
|
|
||||||
if ( !hadSpawned || gameHasStarted() || (gameHasStarted() && level.inGracePeriod && self.hasDoneCombat) )
|
self maps\mp\gametypes\_playerlogic::addToAliveCount();
|
||||||
self maps\mp\gametypes\_playerlogic::removeFromLivesCount();
|
|
||||||
|
|
||||||
if ( !self.wasAliveAtMatchStart )
|
if ( !hadSpawned || gameHasStarted() || (gameHasStarted() && level.inGracePeriod && self.hasDoneCombat) )
|
||||||
{
|
self maps\mp\gametypes\_playerlogic::removeFromLivesCount();
|
||||||
acceptablePassedTime = 20;
|
|
||||||
if ( getTimeLimit() > 0 && acceptablePassedTime < getTimeLimit() * 60 / 4 )
|
|
||||||
acceptablePassedTime = getTimeLimit() * 60 / 4;
|
|
||||||
|
|
||||||
if ( level.inGracePeriod || getTimePassed() < acceptablePassedTime * 1000 )
|
if ( !self.wasAliveAtMatchStart )
|
||||||
self.wasAliveAtMatchStart = true;
|
{
|
||||||
|
acceptablePassedTime = 20;
|
||||||
|
if ( getTimeLimit() > 0 && acceptablePassedTime < getTimeLimit() * 60 / 4 )
|
||||||
|
acceptablePassedTime = getTimeLimit() * 60 / 4;
|
||||||
|
|
||||||
|
if ( level.inGracePeriod || getTimePassed() < acceptablePassedTime * 1000 )
|
||||||
|
self.wasAliveAtMatchStart = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self setClientDvar( "cg_thirdPerson", "0" );
|
self setClientDvar( "cg_thirdPerson", "0" );
|
||||||
|
@ -636,6 +652,14 @@ spawnPlayer()
|
||||||
self.spawnPos = spawnOrigin;
|
self.spawnPos = spawnOrigin;
|
||||||
|
|
||||||
self spawn( spawnOrigin, spawnAngles );
|
self spawn( spawnOrigin, spawnAngles );
|
||||||
|
|
||||||
|
// immediately fix our stance if we were spawned in place so we don't get stuck in geo
|
||||||
|
if ( fauxSpawn && isDefined( self.faux_spawn_stance ) )
|
||||||
|
{
|
||||||
|
self setStance( self.faux_spawn_stance );
|
||||||
|
self.faux_spawn_stance = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
[[level.onSpawnPlayer]]();
|
[[level.onSpawnPlayer]]();
|
||||||
|
|
||||||
// Don't do this stuff for TI spawn points
|
// Don't do this stuff for TI spawn points
|
||||||
|
@ -684,7 +708,7 @@ spawnPlayer()
|
||||||
|
|
||||||
prof_end( "spawnPlayer_postUTS" );
|
prof_end( "spawnPlayer_postUTS" );
|
||||||
|
|
||||||
self logstring( "S " + self.origin[0] + " " + self.origin[1] + " " + self.origin[2] );
|
//self logstring( "S " + self.origin[0] + " " + self.origin[1] + " " + self.origin[2] );
|
||||||
|
|
||||||
// give "connected" handlers a chance to start
|
// give "connected" handlers a chance to start
|
||||||
// many of these start onPlayerSpawned handlers which rely on the "spawned_player"
|
// many of these start onPlayerSpawned handlers which rely on the "spawned_player"
|
||||||
|
@ -1122,17 +1146,21 @@ Callback_PlayerConnect()
|
||||||
|
|
||||||
logPrint("J;" + self.guid + ";" + self getEntityNumber() + ";" + self.name + "\n");
|
logPrint("J;" + self.guid + ";" + self getEntityNumber() + ";" + self.name + "\n");
|
||||||
|
|
||||||
if ( matchMakingGame() && game["clientid"] <= 24 && game["clientid"] != getMatchData( "playerCount" ) )
|
if ( game["clientid"] <= 24 && game["clientid"] != getMatchData( "playerCount" ) )
|
||||||
{
|
{
|
||||||
setMatchData( "playerCount", game["clientid"] );
|
setMatchData( "playerCount", game["clientid"] );
|
||||||
setMatchData( "players", self.clientid, "xuid", self getXuid() );
|
setMatchData( "players", self.clientid, "xuid", self getXuid() );
|
||||||
/#
|
|
||||||
if ( ( getDvarInt( "scr_forcerankedmatch" ) && level.teamBased ) || ( isDefined( self.pers["isBot"] ) && level.teamBased ) )
|
if( matchMakingGame() && allowTeamChoice() )
|
||||||
self.sessionteam = maps\mp\gametypes\_menus::getTeamAssignment();
|
{
|
||||||
#/
|
/#
|
||||||
assert( getdvarint( "scr_runlevelandquit" ) == 1 || (level.teamBased && (self.sessionteam == "allies" || self.sessionteam == "axis")) || (!level.teamBased && self.sessionteam == "none" ) );
|
if ( ( getDvarInt( "scr_forcerankedmatch" ) && level.teamBased ) || ( isDefined( self.pers["isBot"] ) && level.teamBased ) )
|
||||||
//assert( (level.teamBased && self.sessionteam == self.team) || (!level.teamBased && self.sessionteam == "none") );
|
self.sessionteam = maps\mp\gametypes\_menus::getTeamAssignment();
|
||||||
setMatchData( "players", self.clientid, "team", self.sessionteam );
|
#/
|
||||||
|
assert( getdvarint( "scr_runlevelandquit" ) == 1 || (level.teamBased && (self.sessionteam == "allies" || self.sessionteam == "axis")) || (!level.teamBased && self.sessionteam == "none" ) );
|
||||||
|
//assert( (level.teamBased && self.sessionteam == self.team) || (!level.teamBased && self.sessionteam == "none") );
|
||||||
|
setMatchData( "players", self.clientid, "team", self.sessionteam );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !level.teamBased )
|
if ( !level.teamBased )
|
||||||
|
@ -1236,9 +1264,16 @@ Callback_PlayerConnect()
|
||||||
self thread kickIfDontSpawn();
|
self thread kickIfDontSpawn();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if ( allowTeamChoice() )
|
||||||
self [[level.spectator]]();
|
{
|
||||||
self maps\mp\gametypes\_menus::beginTeamChoice();
|
self [[level.spectator]]();
|
||||||
|
self maps\mp\gametypes\_menus::beginTeamChoice();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self [[ level.spectator ]]();
|
||||||
|
self [[level.autoassign]]();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1253,7 +1288,12 @@ Callback_PlayerConnect()
|
||||||
self thread spawnSpectator();
|
self thread spawnSpectator();
|
||||||
|
|
||||||
if ( self.pers["team"] == "spectator" )
|
if ( self.pers["team"] == "spectator" )
|
||||||
self maps\mp\gametypes\_menus::beginTeamChoice();
|
{
|
||||||
|
if ( allowTeamChoice() )
|
||||||
|
self maps\mp\gametypes\_menus::beginTeamChoice();
|
||||||
|
else
|
||||||
|
self [[level.autoassign]]();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
self maps\mp\gametypes\_menus::beginClassChoice();
|
self maps\mp\gametypes\_menus::beginClassChoice();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,763 @@
|
||||||
|
#include common_scripts\utility;
|
||||||
|
#include maps\mp\_utility;
|
||||||
|
#include maps\mp\gametypes\_hud_util;
|
||||||
|
|
||||||
|
|
||||||
|
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(;;)
|
||||||
|
{
|
||||||
|
level waittill( "connected", player );
|
||||||
|
|
||||||
|
/#
|
||||||
|
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.hud_xpEventPopup = player createXpEventPopup();
|
||||||
|
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
roundUp( floatVal )
|
||||||
|
{
|
||||||
|
if ( int( floatVal ) != floatVal )
|
||||||
|
return int( floatVal+1 );
|
||||||
|
else
|
||||||
|
return int( floatVal );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
giveRankXP( type, value )
|
||||||
|
{
|
||||||
|
self endon("disconnect");
|
||||||
|
|
||||||
|
lootType = "none";
|
||||||
|
|
||||||
|
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 * multiplier);
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
createXpEventPopup()
|
||||||
|
{
|
||||||
|
hud_xpEventPopup = newClientHudElem( self );
|
||||||
|
hud_xpEventPopup.children = [];
|
||||||
|
hud_xpEventPopup.horzAlign = "center";
|
||||||
|
hud_xpEventPopup.vertAlign = "middle";
|
||||||
|
hud_xpEventPopup.alignX = "center";
|
||||||
|
hud_xpEventPopup.alignY = "middle";
|
||||||
|
hud_xpEventPopup.x = 55;
|
||||||
|
hud_xpEventPopup.y = -35;
|
||||||
|
hud_xpEventPopup.font = "hudbig";
|
||||||
|
hud_xpEventPopup.fontscale = 0.65;
|
||||||
|
hud_xpEventPopup.archived = false;
|
||||||
|
hud_xpEventPopup.color = (0.5,0.5,0.5);
|
||||||
|
hud_xpEventPopup.sort = 10000;
|
||||||
|
hud_xpEventPopup.elemType = "msgText";
|
||||||
|
hud_xpEventPopup maps\mp\gametypes\_hud::fontPulseInit( 3.0 );
|
||||||
|
return hud_xpEventPopup;
|
||||||
|
}
|
||||||
|
|
||||||
|
xpEventPopupFinalize( event, hudColor, glowAlpha )
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
self endon( "joined_team" );
|
||||||
|
self endon( "joined_spectators" );
|
||||||
|
|
||||||
|
self notify( "xpEventPopup" );
|
||||||
|
self endon( "xpEventPopup" );
|
||||||
|
|
||||||
|
if ( level.hardcoremode )
|
||||||
|
return;
|
||||||
|
|
||||||
|
wait ( 0.05 );
|
||||||
|
|
||||||
|
if ( !isDefined( hudColor ) )
|
||||||
|
hudColor = (1,1,0.5);
|
||||||
|
if ( !isDefined( glowAlpha ) )
|
||||||
|
glowAlpha = 0;
|
||||||
|
|
||||||
|
if ( !isDefined( self ) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
self.hud_xpEventPopup.color = hudColor;
|
||||||
|
self.hud_xpEventPopup.glowColor = hudColor;
|
||||||
|
self.hud_xpEventPopup.glowAlpha = glowAlpha;
|
||||||
|
|
||||||
|
self.hud_xpEventPopup setText(event);
|
||||||
|
self.hud_xpEventPopup.alpha = 0.85;
|
||||||
|
|
||||||
|
wait ( 1.0 );
|
||||||
|
|
||||||
|
if ( !isDefined( self ) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
self.hud_xpEventPopup fadeOverTime( 0.75 );
|
||||||
|
self.hud_xpEventPopup.alpha = 0;
|
||||||
|
self notify( "PopComplete" );
|
||||||
|
}
|
||||||
|
|
||||||
|
xpEventPopupTerminate()
|
||||||
|
{
|
||||||
|
self endon( "PopComplete" );
|
||||||
|
|
||||||
|
waittill_any( "joined_team", "joined_spectators" );
|
||||||
|
|
||||||
|
self.hud_xpEventPopup fadeOverTime( 0.05 );
|
||||||
|
self.hud_xpEventPopup .alpha = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
xpEventPopup( event, hudColor, glowAlpha )
|
||||||
|
{
|
||||||
|
thread xpEventPopupFinalize( event, hudColor, glowAlpha );
|
||||||
|
thread xpEventPopupTerminate();
|
||||||
|
}
|
||||||
|
|
||||||
|
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 );
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,398 @@
|
||||||
|
#include maps\mp\_utility;
|
||||||
|
#include maps\mp\gametypes\_hud_util;
|
||||||
|
#include common_scripts\utility;
|
||||||
|
/*
|
||||||
|
Confirmed Kill
|
||||||
|
Objective: Score points for your team by eliminating players on the opposing team.
|
||||||
|
Score bonus points for picking up dogtags from downed enemies.
|
||||||
|
Map ends: When one team reaches the score limit, or time limit is reached
|
||||||
|
Respawning: No wait / Near teammates
|
||||||
|
|
||||||
|
Level requirementss
|
||||||
|
------------------
|
||||||
|
Spawnpoints:
|
||||||
|
classname mp_tdm_spawn
|
||||||
|
All players spawn from these. The spawnpoint chosen is dependent on the current locations of teammates and enemies
|
||||||
|
at the time of spawn. Players generally spawn behind their teammates relative to the direction of enemies.
|
||||||
|
|
||||||
|
Spectator Spawnpoints:
|
||||||
|
classname mp_global_intermission
|
||||||
|
Spectators spawn from these and intermission is viewed from these positions.
|
||||||
|
Atleast one is required, any more and they are randomly chosen between.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
if(getdvar("mapname") == "mp_background")
|
||||||
|
return;
|
||||||
|
|
||||||
|
maps\mp\gametypes\_globallogic::init();
|
||||||
|
maps\mp\gametypes\_callbacksetup::SetupCallbacks();
|
||||||
|
maps\mp\gametypes\_globallogic::SetupCallbacks();
|
||||||
|
|
||||||
|
registerRoundSwitchDvar( level.gameType, 0, 0, 9 );
|
||||||
|
registerTimeLimitDvar( level.gameType, 5, 0, 20 );
|
||||||
|
registerScoreLimitDvar( level.gameType, 65, 0, 100 );
|
||||||
|
registerRoundLimitDvar( level.gameType, 1, 0, 10 );
|
||||||
|
registerWinLimitDvar( level.gameType, 1, 0, 10 );
|
||||||
|
registerRoundSwitchDvar( level.gameType, 3, 0, 30 );
|
||||||
|
registerNumLivesDvar( level.gameType, 0, 0, 10 );
|
||||||
|
registerHalfTimeDvar( level.gameType, 0, 0, 1 );
|
||||||
|
|
||||||
|
level.teamBased = true;
|
||||||
|
level.onStartGameType = ::onStartGameType;
|
||||||
|
level.getSpawnPoint = ::getSpawnPoint;
|
||||||
|
level.onNormalDeath = ::onNormalDeath;
|
||||||
|
level.onPrecacheGameType = ::onPrecacheGameType;
|
||||||
|
|
||||||
|
game["dialog"]["gametype"] = "kill_confirmed";
|
||||||
|
|
||||||
|
level.conf_fx["vanish"] = loadFx( "impacts/small_snowhit" );
|
||||||
|
}
|
||||||
|
|
||||||
|
onPrecacheGameType()
|
||||||
|
{
|
||||||
|
precachemodel( "prop_dogtags_friend" );
|
||||||
|
precachemodel( "prop_dogtags_foe" );
|
||||||
|
precacheshader( "waypoint_dogtags" );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
onStartGameType()
|
||||||
|
{
|
||||||
|
setClientNameMode("auto_change");
|
||||||
|
|
||||||
|
if ( !isdefined( game["switchedsides"] ) )
|
||||||
|
game["switchedsides"] = false;
|
||||||
|
|
||||||
|
if ( game["switchedsides"] )
|
||||||
|
{
|
||||||
|
oldAttackers = game["attackers"];
|
||||||
|
oldDefenders = game["defenders"];
|
||||||
|
game["attackers"] = oldDefenders;
|
||||||
|
game["defenders"] = oldAttackers;
|
||||||
|
}
|
||||||
|
|
||||||
|
setObjectiveText( "allies", &"OBJECTIVES_CONF" );
|
||||||
|
setObjectiveText( "axis", &"OBJECTIVES_CONF" );
|
||||||
|
|
||||||
|
setObjectiveScoreText( "allies", &"OBJECTIVES_CONF_SCORE" );
|
||||||
|
setObjectiveScoreText( "axis", &"OBJECTIVES_CONF_SCORE" );
|
||||||
|
|
||||||
|
setObjectiveHintText( "allies", &"OBJECTIVES_CONF_HINT" );
|
||||||
|
setObjectiveHintText( "axis", &"OBJECTIVES_CONF_HINT" );
|
||||||
|
|
||||||
|
level.spawnMins = ( 0, 0, 0 );
|
||||||
|
level.spawnMaxs = ( 0, 0, 0 );
|
||||||
|
maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_tdm_spawn_allies_start" );
|
||||||
|
maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_tdm_spawn_axis_start" );
|
||||||
|
maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_tdm_spawn" );
|
||||||
|
maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_tdm_spawn" );
|
||||||
|
|
||||||
|
level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs );
|
||||||
|
setMapCenter( level.mapCenter );
|
||||||
|
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "kill", 50 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "kill_confirmed", 50 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "kill_denied", 50 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "tags_retrieved", 250 );
|
||||||
|
|
||||||
|
level.dogtags = [];
|
||||||
|
|
||||||
|
allowed[0] = level.gameType;
|
||||||
|
|
||||||
|
maps\mp\gametypes\_gameobjects::main(allowed);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getSpawnPoint()
|
||||||
|
{
|
||||||
|
spawnteam = self.pers["team"];
|
||||||
|
if ( game["switchedsides"] )
|
||||||
|
spawnteam = getOtherTeam( spawnteam );
|
||||||
|
|
||||||
|
if ( level.inGracePeriod )
|
||||||
|
{
|
||||||
|
spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_tdm_spawn_" + spawnteam + "_start" );
|
||||||
|
spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( spawnteam );
|
||||||
|
spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( spawnPoints );
|
||||||
|
}
|
||||||
|
|
||||||
|
return spawnPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
onNormalDeath( victim, attacker, lifeId )
|
||||||
|
{
|
||||||
|
level thread spawnDogTags( victim, attacker );
|
||||||
|
|
||||||
|
if ( game["state"] == "postgame" && game["teamScores"][attacker.team] > game["teamScores"][level.otherTeam[attacker.team]] )
|
||||||
|
attacker.finalKill = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
spawnDogTags( victim, attacker )
|
||||||
|
{
|
||||||
|
if ( isDefined( level.dogtags[victim.guid] ) )
|
||||||
|
{
|
||||||
|
PlayFx( level.conf_fx["vanish"], level.dogtags[victim.guid].curOrigin );
|
||||||
|
level.dogtags[victim.guid] notify( "reset" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
visuals[0] = spawn( "script_model", (0,0,0) );
|
||||||
|
visuals[0] setModel( "prop_dogtags_foe" );
|
||||||
|
visuals[1] = spawn( "script_model", (0,0,0) );
|
||||||
|
visuals[1] setModel( "prop_dogtags_friend" );
|
||||||
|
|
||||||
|
trigger = spawn( "trigger_radius", (0,0,0), 0, 32, 32 );
|
||||||
|
|
||||||
|
level.dogtags[victim.guid] = maps\mp\gametypes\_gameobjects::createUseObject( "any", trigger, visuals, (0,0,16) );
|
||||||
|
|
||||||
|
// we don't need these
|
||||||
|
_objective_delete( level.dogtags[victim.guid].objIDAllies );
|
||||||
|
_objective_delete( level.dogtags[victim.guid].objIDAxis );
|
||||||
|
maps\mp\gametypes\_objpoints::deleteObjPoint( level.dogtags[victim.guid].objPoints["allies"] );
|
||||||
|
maps\mp\gametypes\_objpoints::deleteObjPoint( level.dogtags[victim.guid].objPoints["axis"] );
|
||||||
|
|
||||||
|
level.dogtags[victim.guid] maps\mp\gametypes\_gameobjects::setUseTime( 0 );
|
||||||
|
level.dogtags[victim.guid].onUse = ::onUse;
|
||||||
|
level.dogtags[victim.guid].victim = victim;
|
||||||
|
level.dogtags[victim.guid].victimTeam = victim.pers["team"];
|
||||||
|
|
||||||
|
level.dogtags[victim.guid].objId = maps\mp\gametypes\_gameobjects::getNextObjID();
|
||||||
|
objective_add( level.dogtags[victim.guid].objId, "invisible", (0,0,0) );
|
||||||
|
objective_icon( level.dogtags[victim.guid].objId, "waypoint_dogtags" );
|
||||||
|
|
||||||
|
level thread clearOnVictimDisconnect( victim );
|
||||||
|
victim thread tagTeamUpdater( level.dogtags[victim.guid] );
|
||||||
|
}
|
||||||
|
|
||||||
|
pos = victim.origin + (0,0,14);
|
||||||
|
level.dogtags[victim.guid].curOrigin = pos;
|
||||||
|
level.dogtags[victim.guid].trigger.origin = pos;
|
||||||
|
level.dogtags[victim.guid].visuals[0].origin = pos;
|
||||||
|
level.dogtags[victim.guid].visuals[1].origin = pos;
|
||||||
|
|
||||||
|
level.dogtags[victim.guid] maps\mp\gametypes\_gameobjects::allowUse( "any" );
|
||||||
|
|
||||||
|
level.dogtags[victim.guid].visuals[0] thread showToTeam( level.dogtags[victim.guid], getOtherTeam( victim.pers["team"] ) );
|
||||||
|
level.dogtags[victim.guid].visuals[1] thread showToTeam( level.dogtags[victim.guid], victim.pers["team"] );
|
||||||
|
|
||||||
|
level.dogtags[victim.guid].attacker = attacker;
|
||||||
|
//level.dogtags[victim.guid] thread timeOut( victim );
|
||||||
|
|
||||||
|
objective_position( level.dogtags[victim.guid].objId, pos );
|
||||||
|
objective_state( level.dogtags[victim.guid].objId, "active" );
|
||||||
|
//objective_player( level.dogtags[victim.guid].objId, attacker getEntityNumber() );
|
||||||
|
|
||||||
|
playSoundAtPos( pos, "mp_killconfirm_tags_drop" );
|
||||||
|
|
||||||
|
level.dogtags[victim.guid] thread bounce();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
showToTeam( gameObject, team )
|
||||||
|
{
|
||||||
|
gameObject endon ( "death" );
|
||||||
|
gameObject endon( "reset" );
|
||||||
|
|
||||||
|
self hide();
|
||||||
|
|
||||||
|
foreach ( player in level.players )
|
||||||
|
{
|
||||||
|
if( player.team == team )
|
||||||
|
self ShowToPlayer( player );
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
level waittill ( "joined_team" );
|
||||||
|
|
||||||
|
self hide();
|
||||||
|
foreach ( player in level.players )
|
||||||
|
{
|
||||||
|
if ( player.team == team )
|
||||||
|
self ShowToPlayer( player );
|
||||||
|
|
||||||
|
if ( gameObject.victimTeam == player.team && player == gameObject.attacker )
|
||||||
|
objective_state( gameObject.objId, "invisible" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
onUse( player )
|
||||||
|
{
|
||||||
|
// friendly pickup
|
||||||
|
if ( player.pers["team"] == self.victimTeam )
|
||||||
|
{
|
||||||
|
self.trigger playSound( "mp_killconfirm_tags_deny" );
|
||||||
|
|
||||||
|
if ( self.victim == player )
|
||||||
|
{
|
||||||
|
event = "tags_retrieved";
|
||||||
|
splash = &"SPLASHES_TAGS_RETRIEVED";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
event = "kill_denied";
|
||||||
|
splash = &"SPLASHES_KILL_DENIED";
|
||||||
|
}
|
||||||
|
|
||||||
|
// tell the attacker their kill was denied
|
||||||
|
if ( isDefined( self.attacker ) )
|
||||||
|
self.attacker thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_DENIED_KILL", ( 1,0.5,0.5) );
|
||||||
|
}
|
||||||
|
// enemy pickup
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self.trigger playSound( "mp_killconfirm_tags_pickup" );
|
||||||
|
|
||||||
|
event = "kill_confirmed";
|
||||||
|
splash = &"SPLASHES_KILL_CONFIRMED";
|
||||||
|
|
||||||
|
// if not us, tell the attacker their kill was confirmed
|
||||||
|
if ( self.attacker != player )
|
||||||
|
self.attacker onPickup( event, splash );
|
||||||
|
|
||||||
|
self.trigger playSoundToPlayer( game["voice"][player.pers["team"]] + "kill_confirmed", player );
|
||||||
|
|
||||||
|
player maps\mp\gametypes\_gamescore::giveTeamScoreForObjective( player.pers["team"], 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
player onPickup( event, splash );
|
||||||
|
|
||||||
|
// do all this at the end now so the location doesn't change before playing the sound on the entity
|
||||||
|
self resetTags();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
onPickup( event, splash )
|
||||||
|
{
|
||||||
|
level endon( "game_ended" );
|
||||||
|
self endon( "disconnect" );
|
||||||
|
|
||||||
|
self thread maps\mp\gametypes\_rank::xpEventPopup( splash );
|
||||||
|
maps\mp\gametypes\_gamescore::givePlayerScore( event, self, undefined, true );
|
||||||
|
self thread maps\mp\gametypes\_rank::giveRankXP( event );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
resetTags()
|
||||||
|
{
|
||||||
|
self.attacker = undefined;
|
||||||
|
self notify( "reset" );
|
||||||
|
self.visuals[0] hide();
|
||||||
|
self.visuals[1] hide();
|
||||||
|
self.curOrigin = (0,0,1000);
|
||||||
|
self.trigger.origin = (0,0,1000);
|
||||||
|
self.visuals[0].origin = (0,0,1000);
|
||||||
|
self.visuals[1].origin = (0,0,1000);
|
||||||
|
self maps\mp\gametypes\_gameobjects::allowUse( "none" );
|
||||||
|
objective_state( self.objId, "invisible" );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bounce()
|
||||||
|
{
|
||||||
|
level endon( "game_ended" );
|
||||||
|
self endon( "reset" );
|
||||||
|
|
||||||
|
bottomPos = self.curOrigin;
|
||||||
|
topPos = self.curOrigin + (0,0,12);
|
||||||
|
|
||||||
|
while( true )
|
||||||
|
{
|
||||||
|
self.visuals[0] moveTo( topPos, 0.5, 0.15, 0.15 );
|
||||||
|
self.visuals[0] rotateYaw( 180, 0.5 );
|
||||||
|
self.visuals[1] moveTo( topPos, 0.5, 0.15, 0.15 );
|
||||||
|
self.visuals[1] rotateYaw( 180, 0.5 );
|
||||||
|
|
||||||
|
wait( 0.5 );
|
||||||
|
|
||||||
|
self.visuals[0] moveTo( bottomPos, 0.5, 0.15, 0.15 );
|
||||||
|
self.visuals[0] rotateYaw( 180, 0.5 );
|
||||||
|
self.visuals[1] moveTo( bottomPos, 0.5, 0.15, 0.15 );
|
||||||
|
self.visuals[1] rotateYaw( 180, 0.5 );
|
||||||
|
|
||||||
|
wait( 0.5 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
timeOut( victim )
|
||||||
|
{
|
||||||
|
level endon( "game_ended" );
|
||||||
|
victim endon( "disconnect" );
|
||||||
|
self notify( "timeout" );
|
||||||
|
self endon( "timeout" );
|
||||||
|
|
||||||
|
level maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( 30.0 );
|
||||||
|
|
||||||
|
self.visuals[0] hide();
|
||||||
|
self.visuals[1] hide();
|
||||||
|
self.curOrigin = (0,0,1000);
|
||||||
|
self.trigger.origin = (0,0,1000);
|
||||||
|
self.visuals[0].origin = (0,0,1000);
|
||||||
|
self.visuals[1].origin = (0,0,1000);
|
||||||
|
self maps\mp\gametypes\_gameobjects::allowUse( "none" );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
tagTeamUpdater( tags )
|
||||||
|
{
|
||||||
|
level endon( "game_ended" );
|
||||||
|
self endon( "disconnect" );
|
||||||
|
|
||||||
|
while( true )
|
||||||
|
{
|
||||||
|
self waittill( "joined_team" );
|
||||||
|
|
||||||
|
tags.victimTeam = self.pers["team"];
|
||||||
|
tags resetTags();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
clearOnVictimDisconnect( victim )
|
||||||
|
{
|
||||||
|
level endon( "game_ended" );
|
||||||
|
|
||||||
|
guid = victim.guid;
|
||||||
|
victim waittill( "disconnect" );
|
||||||
|
|
||||||
|
if ( isDefined( level.dogtags[guid] ) )
|
||||||
|
{
|
||||||
|
// block further use
|
||||||
|
level.dogtags[guid] maps\mp\gametypes\_gameobjects::allowUse( "none" );
|
||||||
|
|
||||||
|
// tell the attacker their kill was denied
|
||||||
|
if ( isDefined( level.dogtags[guid].attacker ) )
|
||||||
|
level.dogtags[guid].attacker thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_DENIED_KILL", (1,0.5,0.5) );
|
||||||
|
|
||||||
|
// play vanish effect, reset, and wait for reset to process
|
||||||
|
PlayFx( level.conf_fx["vanish"], level.dogtags[guid].curOrigin );
|
||||||
|
level.dogtags[guid] notify( "reset" );
|
||||||
|
wait( 0.05 );
|
||||||
|
|
||||||
|
// sanity check before removal
|
||||||
|
if ( isDefined( level.dogtags[guid] ) )
|
||||||
|
{
|
||||||
|
// delete objective and visuals
|
||||||
|
objective_delete( level.dogtags[guid].objId );
|
||||||
|
level.dogtags[guid].trigger delete();
|
||||||
|
for ( i=0; i<level.dogtags[guid].visuals.size; i++ )
|
||||||
|
level.dogtags[guid].visuals[i] delete();
|
||||||
|
level.dogtags[guid] notify ( "deleted" );
|
||||||
|
|
||||||
|
// remove from list
|
||||||
|
level.dogtags[guid] = undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
"MPUI_CONF"
|
|
@ -0,0 +1,577 @@
|
||||||
|
#include maps\mp\_utility;
|
||||||
|
#include maps\mp\gametypes\_hud_util;
|
||||||
|
#include maps\mp\gametypes\_class;
|
||||||
|
#include common_scripts\utility;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Gun Game
|
||||||
|
Objective: Progress through all weapon tiers by killing enemy players
|
||||||
|
Map ends: When a player progresses through all weapon tiers
|
||||||
|
Respawning: No wait / Away from other players
|
||||||
|
|
||||||
|
Level requirements
|
||||||
|
------------------
|
||||||
|
Spawnpoints:
|
||||||
|
classname mp_dm_spawn
|
||||||
|
All players spawn from these. The spawnpoint chosen is dependent on the current locations of enemies at the time of spawn.
|
||||||
|
Players generally spawn away from enemies.
|
||||||
|
|
||||||
|
Spectator Spawnpoints:
|
||||||
|
classname mp_global_intermission
|
||||||
|
Spectators spawn from these and intermission is viewed from these positions.
|
||||||
|
Atleast one is required, any more and they are randomly chosen between.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*QUAKED mp_dm_spawn (1.0 0.5 0.0) (-16 -16 0) (16 16 72)
|
||||||
|
Players spawn away from enemies at one of these positions.*/
|
||||||
|
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
|
||||||
|
maps\mp\gametypes\_globallogic::init();
|
||||||
|
maps\mp\gametypes\_callbacksetup::SetupCallbacks();
|
||||||
|
maps\mp\gametypes\_globallogic::SetupCallbacks();
|
||||||
|
|
||||||
|
// must be done before scorelimit is set
|
||||||
|
setGuns();
|
||||||
|
|
||||||
|
registerTimeLimitDvar( level.gameType, 10 );
|
||||||
|
scoreLimit = level.gun_guns.size;
|
||||||
|
SetDvar( "scr_gun_scorelimit", scoreLimit );
|
||||||
|
registerScoreLimitDvar( level.gametype, level.gun_guns.size );
|
||||||
|
registerRoundLimitDvar( level.gameType, 1, 0, 10 );
|
||||||
|
registerWinLimitDvar( level.gameType, 1, 0, 10 );
|
||||||
|
registerNumLivesDvar( level.gameType, 0, 0, 10 );
|
||||||
|
registerHalfTimeDvar( level.gameType, 0, 0, 1 );
|
||||||
|
|
||||||
|
setSpecialLoadout();
|
||||||
|
|
||||||
|
level.teamBased = false;
|
||||||
|
|
||||||
|
level.doPrematch = true;
|
||||||
|
level.killstreakRewards = false;
|
||||||
|
level.onPrecacheGameType = ::onPrecacheGameType;
|
||||||
|
level.onStartGameType = ::onStartGameType;
|
||||||
|
level.onSpawnPlayer = ::onSpawnPlayer;
|
||||||
|
level.getSpawnPoint = ::getSpawnPoint;
|
||||||
|
level.onPlayerKilled = ::onPlayerKilled;
|
||||||
|
level.onTimeLimit = ::onTimeLimit;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
onprecachegametype()
|
||||||
|
{
|
||||||
|
precachestring( &"MP_GUN" );
|
||||||
|
}
|
||||||
|
|
||||||
|
onStartGameType()
|
||||||
|
{
|
||||||
|
setClientNameMode("auto_change");
|
||||||
|
|
||||||
|
setObjectiveText( "allies", &"OBJECTIVES_DM" );
|
||||||
|
setObjectiveText( "axis", &"OBJECTIVES_DM" );
|
||||||
|
|
||||||
|
setObjectiveScoreText( "allies", &"OBJECTIVES_DM_SCORE" );
|
||||||
|
setObjectiveScoreText( "axis", &"OBJECTIVES_DM_SCORE" );
|
||||||
|
|
||||||
|
setObjectiveHintText( "allies", &"OBJECTIVES_DM_HINT" );
|
||||||
|
setObjectiveHintText( "axis", &"OBJECTIVES_DM_HINT" );
|
||||||
|
|
||||||
|
level.spawnMins = ( 0, 0, 0 );
|
||||||
|
level.spawnMaxs = ( 0, 0, 0 );
|
||||||
|
|
||||||
|
maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_dm_spawn" );
|
||||||
|
maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_dm_spawn" );
|
||||||
|
|
||||||
|
level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs );
|
||||||
|
setMapCenter( level.mapCenter );
|
||||||
|
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "kill", 0 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "assist", 0 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "suicide", 0 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "teamkill", 0 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "headshot", 0 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "execution", 0 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "avenger", 0 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "defender", 0 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "posthumous", 0 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "revenge", 0 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "double", 0 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "triple", 0 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "multi", 0 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "buzzkill", 0 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "firstblood", 0 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "comeback", 0 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "longshot", 0 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "assistedsuicide", 0 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "knifethrow", 0 );
|
||||||
|
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "gained_gun_score", 1 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "dropped_gun_score", -1 );
|
||||||
|
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "gained_gun_rank", 100 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "dropped_enemy_gun_rank", 100 );
|
||||||
|
|
||||||
|
allowed = [];
|
||||||
|
maps\mp\gametypes\_gameobjects::main(allowed);
|
||||||
|
|
||||||
|
// Prevent class and team change
|
||||||
|
setDvar( "ui_allow_classchange", 0 );
|
||||||
|
setdvar( "ui_allow_teamchange", 0 );
|
||||||
|
|
||||||
|
level.QuickMessageToAll = true;
|
||||||
|
level.blockWeaponDrops = true;
|
||||||
|
|
||||||
|
// set index on enter
|
||||||
|
level thread onPlayerConnect();
|
||||||
|
|
||||||
|
level.killstreakRewards = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
onPlayerConnect()
|
||||||
|
{
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
level waittill( "connected", player );
|
||||||
|
|
||||||
|
player.gun_firstSpawn = true;
|
||||||
|
|
||||||
|
player.gunGameGunIndex = 0;
|
||||||
|
player.gunGamePrevGunIndex = 0;
|
||||||
|
player initGunHUD();
|
||||||
|
|
||||||
|
player thread refillAmmo();
|
||||||
|
player thread refillSingleCountAmmo();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getSpawnPoint()
|
||||||
|
{
|
||||||
|
// first time here?
|
||||||
|
if ( self.gun_firstSpawn )
|
||||||
|
{
|
||||||
|
self.gun_firstSpawn = false;
|
||||||
|
|
||||||
|
// everyone is a gamemode class in gun, no class selection
|
||||||
|
self.pers["class"] = "gamemode";
|
||||||
|
self.pers["lastClass"] = "";
|
||||||
|
self.class = self.pers["class"];
|
||||||
|
self.lastClass = self.pers["lastClass"];
|
||||||
|
|
||||||
|
// random team
|
||||||
|
if ( cointoss() )
|
||||||
|
self maps\mp\gametypes\_menus::addToTeam( "axis", true );
|
||||||
|
else
|
||||||
|
self maps\mp\gametypes\_menus::addToTeam( "allies", true );
|
||||||
|
}
|
||||||
|
|
||||||
|
spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( self.pers["team"] );
|
||||||
|
spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_DM( spawnPoints );
|
||||||
|
|
||||||
|
return spawnPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
onSpawnPlayer()
|
||||||
|
{
|
||||||
|
// level.onSpawnPlayer() gets called before giveLoadout()
|
||||||
|
// so wait until it is done then override weapons
|
||||||
|
self.pers["gamemodeLoadout"] = level.gun_loadouts[self.pers["team"]];
|
||||||
|
self thread waitLoadoutDone();
|
||||||
|
|
||||||
|
level notify ( "spawned_player" );
|
||||||
|
}
|
||||||
|
|
||||||
|
waitLoadoutDone()
|
||||||
|
{
|
||||||
|
level endon( "game_ended" );
|
||||||
|
self endon( "disconnect" );
|
||||||
|
|
||||||
|
self waittill( "spawned_player" );
|
||||||
|
|
||||||
|
self _setPerk( "specialty_bling" );
|
||||||
|
self giveNextGun( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
|
||||||
|
{
|
||||||
|
if ( sMeansOfDeath == "MOD_FALLING" || ( isDefined( attacker ) && isPlayer( attacker ) ) )
|
||||||
|
{
|
||||||
|
isMeleeWeapon = maps\mp\gametypes\_weapons::isRiotShield( sWeapon );
|
||||||
|
|
||||||
|
if ( sMeansOfDeath == "MOD_FALLING" || attacker == self || ( sMeansOfDeath == "MOD_MELEE" && !isMeleeWeapon ) )
|
||||||
|
{
|
||||||
|
self playLocalSound( "mp_war_objective_lost" );
|
||||||
|
|
||||||
|
// drop level for suicide and getting knifed
|
||||||
|
self.gunGamePrevGunIndex = self.gunGameGunIndex;
|
||||||
|
self.gunGameGunIndex = int( max( 0, self.gunGameGunIndex-1 ) );
|
||||||
|
|
||||||
|
if ( self.gunGamePrevGunIndex > self.gunGameGunIndex )
|
||||||
|
{
|
||||||
|
self thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_DROPPED_GUN_RANK" );
|
||||||
|
maps\mp\gametypes\_gamescore::givePlayerScore( "dropped_gun_score", self, undefined, true, true );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( sMeansOfDeath == "MOD_MELEE" )
|
||||||
|
{
|
||||||
|
if ( self.gunGamePrevGunIndex )
|
||||||
|
{
|
||||||
|
attacker thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_DROPPED_ENEMY_GUN_RANK" );
|
||||||
|
attacker thread maps\mp\gametypes\_rank::giveRankXP( "dropped_enemy_gun_rank" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( ( sMeansOfDeath == "MOD_PISTOL_BULLET" )
|
||||||
|
|| ( sMeansOfDeath == "MOD_RIFLE_BULLET" )
|
||||||
|
|| ( sMeansOfDeath == "MOD_HEAD_SHOT" )
|
||||||
|
|| ( sMeansOfDeath == "MOD_PROJECTILE" ) || ( sMeansOfDeath == "MOD_PROJECTILE_SPLASH" )
|
||||||
|
|| ( sMeansOfDeath == "MOD_IMPACT" )
|
||||||
|
|| ( sMeansOfDeath == "MOD_GRENADE" ) || ( sMeansOfDeath == "MOD_GRENADE_SPLASH" )
|
||||||
|
|| ( sMeansOfDeath == "MOD_MELEE" && isMeleeWeapon )
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Prevent sequential kills from counting by validating the primary weapon
|
||||||
|
// Let throwing knife kills count even though they're not the primary weapon
|
||||||
|
if ( sWeapon != attacker.primaryWeapon )
|
||||||
|
return;
|
||||||
|
|
||||||
|
attacker.gunGamePrevGunIndex = attacker.gunGameGunIndex;
|
||||||
|
attacker.gunGameGunIndex++;
|
||||||
|
|
||||||
|
attacker thread maps\mp\gametypes\_rank::giveRankXP( "gained_gun_rank" );
|
||||||
|
maps\mp\gametypes\_gamescore::givePlayerScore( "gained_gun_score", attacker, self, true, true );
|
||||||
|
|
||||||
|
if ( attacker.gunGameGunIndex == level.gun_guns.size-1 )
|
||||||
|
{
|
||||||
|
playSoundOnPlayers( "mp_enemy_obj_captured" );
|
||||||
|
level thread teamPlayerCardSplash( "callout_top_gun_rank", attacker );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( attacker.gunGameGunIndex < level.gun_guns.size )
|
||||||
|
{
|
||||||
|
attacker thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_GAINED_GUN_RANK" );
|
||||||
|
attacker playLocalSound( "mp_war_objective_taken" );
|
||||||
|
attacker giveNextGun();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
giveNextGun( doSetSpawnWeapon )
|
||||||
|
{
|
||||||
|
// get the next one
|
||||||
|
newWeapon = level.gun_guns[self.gunGameGunIndex];
|
||||||
|
|
||||||
|
// add attachments
|
||||||
|
newWeapon = addAttachments( newWeapon );
|
||||||
|
|
||||||
|
// give gun
|
||||||
|
self takeAllWeapons();
|
||||||
|
_giveWeapon( newWeapon );
|
||||||
|
|
||||||
|
// set vars
|
||||||
|
if ( isDefined( doSetSpawnWeapon ) )
|
||||||
|
self setSpawnWeapon( newWeapon );
|
||||||
|
weaponTokens = StrTok( newWeapon, "_" );
|
||||||
|
weaponName = weaponTokens[0];
|
||||||
|
|
||||||
|
self.pers["primaryWeapon"] = weaponName;
|
||||||
|
self.primaryWeapon = newWeapon;
|
||||||
|
|
||||||
|
// use it!
|
||||||
|
self GiveStartAmmo( newWeapon );
|
||||||
|
self switchToWeapon( newWeapon );
|
||||||
|
|
||||||
|
// gain/drop scoring/messaging
|
||||||
|
if ( self.gunGamePrevGunIndex > self.gunGameGunIndex )
|
||||||
|
{
|
||||||
|
// we dropped :(
|
||||||
|
self thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_DROPPED_GUN_RANK" );
|
||||||
|
}
|
||||||
|
else if ( self.gunGamePrevGunIndex < self.gunGameGunIndex )
|
||||||
|
{
|
||||||
|
// we gained :)
|
||||||
|
self thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_GAINED_GUN_RANK" );
|
||||||
|
}
|
||||||
|
self.gunGamePrevGunIndex = self.gunGameGunIndex;
|
||||||
|
|
||||||
|
// update the personal gun progress hud
|
||||||
|
self updateGunHUD();
|
||||||
|
}
|
||||||
|
|
||||||
|
addAttachments( weaponName )
|
||||||
|
{
|
||||||
|
if ( isDefined( level.gun_attachments[weaponName] ) && isDefined( level.gun_attachments[weaponName]["attach1"] ) )
|
||||||
|
attach1 = level.gun_attachments[weaponName]["attach1"];
|
||||||
|
else
|
||||||
|
attach1 = "none";
|
||||||
|
|
||||||
|
if ( isDefined( level.gun_attachments[weaponName] ) && isDefined( level.gun_attachments[weaponName]["attach2"] ) )
|
||||||
|
attach2 = level.gun_attachments[weaponName]["attach2"];
|
||||||
|
else
|
||||||
|
attach2 = "none";
|
||||||
|
|
||||||
|
fullWeaponName = buildWeaponName( weaponName, attach1, attach2 );
|
||||||
|
return fullWeaponName;
|
||||||
|
}
|
||||||
|
|
||||||
|
onTimeLimit()
|
||||||
|
{
|
||||||
|
level.finalKillCam_winner = "none";
|
||||||
|
winners = getHighestProgressedPlayers();
|
||||||
|
|
||||||
|
if ( !isDefined( winners ) || !winners.size )
|
||||||
|
thread maps\mp\gametypes\_gamelogic::endGame( "tie", game[ "end_reason" ][ "time_limit_reached" ] );
|
||||||
|
else if ( winners.size == 1 )
|
||||||
|
thread maps\mp\gametypes\_gamelogic::endGame( winners[0], game[ "end_reason" ][ "time_limit_reached" ] );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( winners[winners.size-1].gunGameGunIndex > winners[winners.size-2].gunGameGunIndex )
|
||||||
|
thread maps\mp\gametypes\_gamelogic::endGame( winners[winners.size-1], game[ "end_reason" ][ "time_limit_reached" ] );
|
||||||
|
else
|
||||||
|
thread maps\mp\gametypes\_gamelogic::endGame( "tie", game[ "end_reason" ][ "time_limit_reached" ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getHighestProgressedPlayers()
|
||||||
|
{
|
||||||
|
highestProgress = -1;
|
||||||
|
highestProgressedPlayers = [];
|
||||||
|
foreach( player in level.players )
|
||||||
|
{
|
||||||
|
if ( isDefined( player.gunGameGunIndex ) && player.gunGameGunIndex >= highestProgress )
|
||||||
|
{
|
||||||
|
highestProgress = player.gunGameGunIndex;
|
||||||
|
highestProgressedPlayers[highestProgressedPlayers.size] = player;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return highestProgressedPlayers;
|
||||||
|
}
|
||||||
|
|
||||||
|
refillAmmo()
|
||||||
|
{
|
||||||
|
level endon( "game_ended" );
|
||||||
|
self endon( "disconnect" );
|
||||||
|
|
||||||
|
while ( true )
|
||||||
|
{
|
||||||
|
self waittill( "reload" );
|
||||||
|
self GiveStartAmmo( self.primaryWeapon );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
refillSingleCountAmmo()
|
||||||
|
{
|
||||||
|
level endon( "game_ended" );
|
||||||
|
self endon( "disconnect" );
|
||||||
|
|
||||||
|
while ( true )
|
||||||
|
{
|
||||||
|
if ( isReallyAlive( self ) && self.team != "spectator" && isDefined( self.primaryWeapon ) && self getAmmoCount( self.primaryWeapon ) == 0 )
|
||||||
|
{
|
||||||
|
// fake a reload time
|
||||||
|
wait( 2 );
|
||||||
|
self notify( "reload" );
|
||||||
|
wait( 1 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
wait( 0.05 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
initGunHUD()
|
||||||
|
{
|
||||||
|
self.gun_progressDisplay[0] = self createFontString( "small", 1.6 );
|
||||||
|
self.gun_progressDisplay[0] setPoint( "TOP LEFT", "TOP LEFT", 115, 5 );
|
||||||
|
self.gun_progressDisplay[0] setText( &"MP_WEAPON" );
|
||||||
|
self.gun_progressDisplay[0].alpha = 1;
|
||||||
|
self.gun_progressDisplay[0].archived = false;
|
||||||
|
self.gun_progressDisplay[0].hideWhenInMenu = true;
|
||||||
|
|
||||||
|
self.gun_progressDisplay[1] = self createFontString( "small", 1.6 );
|
||||||
|
self.gun_progressDisplay[1] setPoint( "TOP LEFT", "TOP LEFT", 115, 23 );
|
||||||
|
self.gun_progressDisplay[1] setText( "1 / " + level.gun_guns.size );
|
||||||
|
self.gun_progressDisplay[1].alpha = 1;
|
||||||
|
self.gun_progressDisplay[1].archived = false;
|
||||||
|
self.gun_progressDisplay[1].hideWhenInMenu = true;
|
||||||
|
|
||||||
|
thread hideOnGameEnd();
|
||||||
|
thread hideInKillCam();
|
||||||
|
}
|
||||||
|
|
||||||
|
updateGunHUD()
|
||||||
|
{
|
||||||
|
self.gun_progressDisplay[1] setText( (self.gunGameGunIndex+1) + " / " + level.gun_guns.size );
|
||||||
|
}
|
||||||
|
|
||||||
|
hideInKillCam()
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
var_0 = 1;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if ( var_0 && ( !isalive( self ) || isinkillcam() ) )
|
||||||
|
{
|
||||||
|
self.gun_progressdisplay[0].alpha = 0;
|
||||||
|
self.gun_progressdisplay[1].alpha = 0;
|
||||||
|
var_0 = 0;
|
||||||
|
}
|
||||||
|
else if ( !var_0 && ( isalive( self ) && !isinkillcam() ) )
|
||||||
|
{
|
||||||
|
self.gun_progressdisplay[0].alpha = 1;
|
||||||
|
self.gun_progressdisplay[1].alpha = 1;
|
||||||
|
var_0 = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
wait 0.05;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hideOnGameEnd()
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
level waittill( "game_ended" );
|
||||||
|
|
||||||
|
self.gun_progressDisplay[0].alpha = 0;
|
||||||
|
self.gun_progressDisplay[1].alpha = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
setGuns()
|
||||||
|
{
|
||||||
|
level.gun_guns = [];
|
||||||
|
|
||||||
|
// hand guns
|
||||||
|
level.gun_guns[0] = "deserteagle";
|
||||||
|
// machine pistols
|
||||||
|
level.gun_guns[1] = "glock";
|
||||||
|
level.gun_guns[2] = "tmp";
|
||||||
|
// sub
|
||||||
|
level.gun_guns[3] = "mp5k";
|
||||||
|
level.gun_guns[4] = "p90";
|
||||||
|
level.gun_guns[5] = "kriss";
|
||||||
|
// assault - auto
|
||||||
|
level.gun_guns[6] = "ak47";
|
||||||
|
level.gun_guns[7] = "masada";
|
||||||
|
level.gun_guns[8] = "scar";
|
||||||
|
// lmg
|
||||||
|
level.gun_guns[9] = "sa80";
|
||||||
|
level.gun_guns[10] = "aug";
|
||||||
|
// shotgun
|
||||||
|
level.gun_guns[11] = "spas12";
|
||||||
|
level.gun_guns[12] = "aa12";
|
||||||
|
level.gun_guns[13] = "model1887";
|
||||||
|
// assault - burst
|
||||||
|
level.gun_guns[14] = "famas";
|
||||||
|
level.gun_guns[15] = "m16";
|
||||||
|
// sniper
|
||||||
|
level.gun_guns[16] = "barrett";
|
||||||
|
level.gun_guns[17] = "cheytac";
|
||||||
|
// launcher
|
||||||
|
level.gun_guns[18] = "m79";
|
||||||
|
level.gun_guns[19] = "javelin";
|
||||||
|
|
||||||
|
// default attachments for all guns that take them
|
||||||
|
level.gun_attachments = [];
|
||||||
|
// pistol
|
||||||
|
level.gun_attachments["coltanaconda"]["attach1"] = "tactical";
|
||||||
|
level.gun_attachments["usp"]["attach1"] = "tactical";
|
||||||
|
level.gun_attachments["deserteagle"]["attach1"] = "tactical";
|
||||||
|
level.gun_attachments["deserteaglegold"]["attach1"] = "tactical";
|
||||||
|
level.gun_attachments["beretta"]["attach1"] = "tactical";
|
||||||
|
// machine pistol
|
||||||
|
level.gun_attachments["tmp"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["glock"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["pp2000"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["beretta393"]["attach1"] = "reflex";
|
||||||
|
// smg
|
||||||
|
level.gun_attachments["mp5k"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["mp5k"]["attach2"] = "xmags";
|
||||||
|
level.gun_attachments["uzi"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["uzi"]["attach2"] = "xmags";
|
||||||
|
level.gun_attachments["p90"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["p90"]["attach2"] = "xmags";
|
||||||
|
level.gun_attachments["kriss"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["kriss"]["attach2"] = "xmags";
|
||||||
|
level.gun_attachments["ump45"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["ump45"]["attach2"] = "xmags";
|
||||||
|
level.gun_attachments["ak74u"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["ak74u"]["attach2"] = "xmags";
|
||||||
|
// assault
|
||||||
|
level.gun_attachments["ak47"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["ak47"]["attach2"] = "xmags";
|
||||||
|
level.gun_attachments["ak47classic"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["ak47classic"]["attach2"] = "xmags";
|
||||||
|
level.gun_attachments["m16"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["m16"]["attach2"] = "xmags";
|
||||||
|
level.gun_attachments["m4"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["m4"]["attach2"] = "xmags";
|
||||||
|
level.gun_attachments["fn2000"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["fn2000"]["attach2"] = "xmags";
|
||||||
|
level.gun_attachments["masada"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["masada"]["attach2"] = "xmags";
|
||||||
|
level.gun_attachments["famas"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["famas"]["attach2"] = "xmags";
|
||||||
|
level.gun_attachments["fal"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["fal"]["attach2"] = "xmags";
|
||||||
|
level.gun_attachments["scar"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["scar"]["attach2"] = "xmags";
|
||||||
|
level.gun_attachments["tavor"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["tavor"]["attach2"] = "xmags";
|
||||||
|
level.gun_attachments["tavor"]["attach1"] = "reflex";
|
||||||
|
level.gun_attachments["tavor"]["attach2"] = "xmags";
|
||||||
|
// sniper
|
||||||
|
level.gun_attachments["barrett"]["attach1"] = "xmags";
|
||||||
|
level.gun_attachments["wa2000"]["attach1"] = "xmags";
|
||||||
|
level.gun_attachments["m21"]["attach1"] = "xmags";
|
||||||
|
level.gun_attachments["cheytac"]["attach1"] = "xmags";
|
||||||
|
level.gun_attachments["dragunov"]["attach1"] = "xmags";
|
||||||
|
level.gun_attachments["m40a3"]["attach1"] = "xmags";
|
||||||
|
// shotgun
|
||||||
|
level.gun_attachments["ranger"]["attach1"] = "akimbo";
|
||||||
|
level.gun_attachments["model1887"]["attach1"] = "akimbo";
|
||||||
|
level.gun_attachments["striker"]["attach1"] = "grip";
|
||||||
|
level.gun_attachments["striker"]["attach2"] = "xmags";
|
||||||
|
level.gun_attachments["aa12"]["attach1"] = "grip";
|
||||||
|
level.gun_attachments["aa12"]["attach2"] = "xmags";
|
||||||
|
level.gun_attachments["m1014"]["attach1"] = "grip";
|
||||||
|
level.gun_attachments["m1014"]["attach2"] = "xmags";
|
||||||
|
level.gun_attachments["spas12"]["attach1"] = "grip";
|
||||||
|
level.gun_attachments["spas12"]["attach2"] = "xmags";
|
||||||
|
// lmg
|
||||||
|
level.gun_attachments["rpd"]["attach1"] = "grip";
|
||||||
|
level.gun_attachments["rpd"]["attach2"] = "reflex";
|
||||||
|
level.gun_attachments["sa80"]["attach1"] = "grip";
|
||||||
|
level.gun_attachments["sa80"]["attach2"] = "reflex";
|
||||||
|
level.gun_attachments["mg4"]["attach1"] = "grip";
|
||||||
|
level.gun_attachments["mg4"]["attach2"] = "reflex";
|
||||||
|
level.gun_attachments["m240"]["attach1"] = "grip";
|
||||||
|
level.gun_attachments["m240"]["attach2"] = "reflex";
|
||||||
|
level.gun_attachments["aug"]["attach1"] = "grip";
|
||||||
|
level.gun_attachments["aug"]["attach2"] = "reflex";
|
||||||
|
}
|
||||||
|
|
||||||
|
setSpecialLoadout()
|
||||||
|
{
|
||||||
|
// no killstreaks defined for special classes
|
||||||
|
level.gun_loadouts["axis"]["loadoutPrimary"] = "masada"; // can't use "none" for primary, this is replaced on spawn anyway
|
||||||
|
level.gun_loadouts["axis"]["loadoutPrimaryAttachment"] = "none";
|
||||||
|
level.gun_loadouts["axis"]["loadoutPrimaryAttachment2"] = "none";
|
||||||
|
level.gun_loadouts["axis"]["loadoutPrimaryCamo"] = "none";
|
||||||
|
|
||||||
|
level.gun_loadouts["axis"]["loadoutSecondary"] = "none";
|
||||||
|
level.gun_loadouts["axis"]["loadoutSecondaryAttachment"] = "none";
|
||||||
|
level.gun_loadouts["axis"]["loadoutSecondaryAttachment2"] = "none";
|
||||||
|
level.gun_loadouts["axis"]["loadoutSecondaryCamo"] = "none";
|
||||||
|
|
||||||
|
level.gun_loadouts["axis"]["loadoutEquipment"] = "specialty_null";
|
||||||
|
level.gun_loadouts["axis"]["loadoutOffhand"] = "none";
|
||||||
|
level.gun_loadouts["axis"]["loadoutPerk1"] = "specialty_null";
|
||||||
|
level.gun_loadouts["axis"]["loadoutPerk2"] = "specialty_null";
|
||||||
|
level.gun_loadouts["axis"]["loadoutPerk3"] = "specialty_null";
|
||||||
|
|
||||||
|
// FFA games don't have teams, but players are allowed to choose team on the way in
|
||||||
|
// just for character model and announcer voice variety. Same loadout for both.
|
||||||
|
level.gun_loadouts["allies"] = level.gun_loadouts["axis"];
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
"MPUI_GUNGAME"
|
|
@ -0,0 +1,839 @@
|
||||||
|
#include maps\mp\_utility;
|
||||||
|
#include maps\mp\gametypes\_hud_util;
|
||||||
|
#include common_scripts\utility;
|
||||||
|
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
maps\mp\gametypes\_globallogic::init();
|
||||||
|
maps\mp\gametypes\_callbacksetup::SetupCallbacks();
|
||||||
|
maps\mp\gametypes\_globallogic::SetupCallbacks();
|
||||||
|
|
||||||
|
registerTimeLimitDvar( level.gameType, 10 );
|
||||||
|
setOverrideWatchDvar( "scorelimit", 0 );
|
||||||
|
registerRoundLimitDvar( level.gameType, 1 );
|
||||||
|
registerWinLimitDvar( level.gameType, 1 );
|
||||||
|
registerNumLivesDvar( level.gameType, 0 );
|
||||||
|
registerHalfTimeDvar( level.gameType, 0 );
|
||||||
|
|
||||||
|
setSpecialLoadouts();
|
||||||
|
|
||||||
|
level.teamBased = true;
|
||||||
|
// don't sit there waiting for both teams to contain players,
|
||||||
|
// as everyone starts a survivor
|
||||||
|
level.prematchWaitForTeams = false;
|
||||||
|
level.onPrecacheGameType = ::onPrecacheGameType;
|
||||||
|
level.onStartGameType = ::onStartGameType;
|
||||||
|
level.onSpawnPlayer = ::onSpawnPlayer;
|
||||||
|
level.getSpawnPoint = ::getSpawnPoint;
|
||||||
|
level.onPlayerKilled = ::onPlayerKilled;
|
||||||
|
level.onTimeLimit = ::onTimeLimit;
|
||||||
|
|
||||||
|
level.infect_perks = [];
|
||||||
|
level.infect_perks[level.infect_perks.size] = "specialty_marathon";
|
||||||
|
level.infect_perks[level.infect_perks.size] = "specialty_fastreload";
|
||||||
|
level.infect_perks[level.infect_perks.size] = "specialty_scavenger";
|
||||||
|
level.infect_perks[level.infect_perks.size] = "specialty_fastmantle";
|
||||||
|
level.infect_perks[level.infect_perks.size] = "specialty_quickdraw";
|
||||||
|
level.infect_perks[level.infect_perks.size] = "specialty_lightweight";
|
||||||
|
level.infect_perks[level.infect_perks.size] = "specialty_hardline";
|
||||||
|
level.infect_perks[level.infect_perks.size] = "specialty_coldblooded";
|
||||||
|
level.infect_perks[level.infect_perks.size] = "specialty_explosivedamage";
|
||||||
|
level.infect_perks[level.infect_perks.size] = "specialty_bombsquad";
|
||||||
|
level.infect_perks[level.infect_perks.size] = "specialty_bulletaccuracy";
|
||||||
|
level.infect_perks[level.infect_perks.size] = "specialty_localjammer";
|
||||||
|
level.infect_perks[level.infect_perks.size] = "specialty_quieter";
|
||||||
|
|
||||||
|
level.determineWinningTeam = ::determineWinningTeam;
|
||||||
|
}
|
||||||
|
|
||||||
|
determineWinningTeam()
|
||||||
|
{
|
||||||
|
// if the game's still going on, the allies are winning since they're still alive
|
||||||
|
return "allies";
|
||||||
|
}
|
||||||
|
|
||||||
|
onPrecacheGameType()
|
||||||
|
{
|
||||||
|
precachestring( &"MP_CONSCRIPTION_STARTS_IN" );
|
||||||
|
}
|
||||||
|
|
||||||
|
onStartGameType()
|
||||||
|
{
|
||||||
|
setclientnamemode( "auto_change" );
|
||||||
|
setObjectiveText( "allies", &"OBJECTIVES_INFECT" );
|
||||||
|
setObjectiveText( "axis", &"OBJECTIVES_INFECT" );
|
||||||
|
|
||||||
|
setObjectiveScoreText( "allies", &"OBJECTIVES_INFECT_SCORE" );
|
||||||
|
setObjectiveScoreText( "axis", &"OBJECTIVES_INFECT_SCORE" );
|
||||||
|
|
||||||
|
setObjectiveHintText( "allies", &"OBJECTIVES_INFECT_HINT" );
|
||||||
|
setObjectiveHintText( "axis", &"OBJECTIVES_INFECT_HINT" );
|
||||||
|
|
||||||
|
level.spawnMins = ( 0, 0, 0 );
|
||||||
|
level.spawnMaxs = ( 0, 0, 0 );
|
||||||
|
maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_tdm_spawn" );
|
||||||
|
maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_tdm_spawn" );
|
||||||
|
level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs );
|
||||||
|
setMapCenter( level.mapCenter );
|
||||||
|
|
||||||
|
allowed = [];
|
||||||
|
maps\mp\gametypes\_gameobjects::main(allowed);
|
||||||
|
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "firstblood", 0 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "first_draft", 350 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "final_rogue", 200 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "kill", 50 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "draft_rogue", 200 );
|
||||||
|
maps\mp\gametypes\_rank::registerScoreInfo( "survivor", 50 );
|
||||||
|
|
||||||
|
level.QuickMessageToAll = true;
|
||||||
|
level.blockWeaponDrops = true;
|
||||||
|
level.infect_allowSuicide = false;
|
||||||
|
|
||||||
|
SetDvar( "ui_allow_teamchange", 0 );
|
||||||
|
SetDvar( "scr_teambalance", 0 );
|
||||||
|
|
||||||
|
level.infect_timerDisplay = createServerTimer( "objective", 1.4 );
|
||||||
|
level.infect_timerDisplay setPoint( "TOPLEFT", "TOPLEFT", 115, 5 );
|
||||||
|
level.infect_timerDisplay.label = &"MP_DRAFT_STARTS_IN";
|
||||||
|
level.infect_timerDisplay.alpha = 0;
|
||||||
|
level.infect_timerDisplay.archived = false;
|
||||||
|
level.infect_timerDisplay.hideWhenInMenu = true;
|
||||||
|
|
||||||
|
level.infect_choseFirstInfected = false;
|
||||||
|
level.infect_choosingFirstInfected = false;
|
||||||
|
level.infect_awardedFinalSurvivor = false;
|
||||||
|
level.infect_countdownInProgress = false;
|
||||||
|
|
||||||
|
level.infect_teamScores["axis"] = 0;
|
||||||
|
level.infect_teamScores["allies"] = 0;
|
||||||
|
level.infect_players = [];
|
||||||
|
|
||||||
|
level thread onPlayerConnect();
|
||||||
|
level thread watchInfectForfeit();
|
||||||
|
}
|
||||||
|
|
||||||
|
onPlayerConnect()
|
||||||
|
{
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
level waittill( "connected", player );
|
||||||
|
|
||||||
|
player.infect_firstSpawn = true;
|
||||||
|
player.infected_Rejoined = false;
|
||||||
|
player.infect_JoinedAtStart = true;
|
||||||
|
|
||||||
|
if( gameFlag( "prematch_done" ) )
|
||||||
|
{
|
||||||
|
player.infect_JoinedAtStart = false;
|
||||||
|
}
|
||||||
|
// infected who quit and rejoined same game
|
||||||
|
if( IsDefined( level.infect_players[player.name] ) )
|
||||||
|
{
|
||||||
|
player.infected_Rejoined = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getSpawnPoint()
|
||||||
|
{
|
||||||
|
// first time here?
|
||||||
|
if ( self.infect_firstSpawn )
|
||||||
|
{
|
||||||
|
self.infect_firstSpawn = false;
|
||||||
|
|
||||||
|
// everyone is a gamemode class in infect, no class selection
|
||||||
|
self.pers["class"] = "gamemode";
|
||||||
|
self.pers["lastClass"] = "";
|
||||||
|
self.class = self.pers["class"];
|
||||||
|
self.lastClass = self.pers["lastClass"];
|
||||||
|
|
||||||
|
// survivors are allies
|
||||||
|
teamChoice = "allies";
|
||||||
|
|
||||||
|
// everyone starts as survivors, unless an infected quit and rejoined same game
|
||||||
|
if( self.infected_Rejoined )
|
||||||
|
{
|
||||||
|
teamChoice = "axis";
|
||||||
|
}
|
||||||
|
|
||||||
|
self maps\mp\gametypes\_menus::addToTeam( teamChoice, true );
|
||||||
|
|
||||||
|
thread onPlayerDisconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( level.inGracePeriod )
|
||||||
|
{
|
||||||
|
spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_tdm_spawn" );
|
||||||
|
spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( self.pers["team"] );
|
||||||
|
spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( spawnPoints );
|
||||||
|
}
|
||||||
|
|
||||||
|
return spawnPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
onSpawnPlayer()
|
||||||
|
{
|
||||||
|
self.teamChangedThisFrame = undefined;
|
||||||
|
self.infect_spawnPos = self.origin;
|
||||||
|
|
||||||
|
// resynch teams
|
||||||
|
updateTeamScores();
|
||||||
|
|
||||||
|
// let the first spawned player kick this off
|
||||||
|
if ( !level.infect_choosingFirstInfected )
|
||||||
|
{
|
||||||
|
level.infect_choosingFirstInfected = true;
|
||||||
|
level thread chooseFirstInfected();
|
||||||
|
}
|
||||||
|
|
||||||
|
// infected who quit and rejoined same game?
|
||||||
|
if( self.infected_Rejoined )
|
||||||
|
{
|
||||||
|
self.infect_rejoined = undefined;
|
||||||
|
|
||||||
|
// stop initial infect countdown (if quit/join player was initial and a new coutdown is underway)
|
||||||
|
if ( !level.infect_allowSuicide )
|
||||||
|
{
|
||||||
|
level notify( "infect_stopCountdown" );
|
||||||
|
level.infect_choseFirstInfected = true;
|
||||||
|
level.infect_allowSuicide = true;
|
||||||
|
foreach( player in level.players )
|
||||||
|
{
|
||||||
|
if ( isDefined( player.infect_isBeingChosen ) )
|
||||||
|
player.infect_isBeingChosen = undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if an initial was already chosen while they were gone and they are still initial, set them to normal
|
||||||
|
foreach( player in level.players )
|
||||||
|
{
|
||||||
|
if ( isDefined( player.isInitialInfected ) )
|
||||||
|
player thread setInitialToNormalInfected();
|
||||||
|
}
|
||||||
|
|
||||||
|
// if they're the only infected, then set them as initial infected
|
||||||
|
if ( level.infect_teamScores["axis"] == 1 )
|
||||||
|
self.isInitialInfected = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// onSpawnPlayer() is called before giveLoadout()
|
||||||
|
// set self.pers["gamemodeLoadout"] for giveLoadout() to use
|
||||||
|
if ( isDefined( self.isInitialInfected ) )
|
||||||
|
self.pers["gamemodeLoadout"] = level.infect_loadouts["axis_initial"];
|
||||||
|
else
|
||||||
|
self.pers["gamemodeLoadout"] = level.infect_loadouts[self.pers["team"]];
|
||||||
|
|
||||||
|
self thread onSpawnFinished();
|
||||||
|
|
||||||
|
level notify ( "spawned_player" );
|
||||||
|
}
|
||||||
|
|
||||||
|
onSpawnFinished()
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
self endon( "disconnect" );
|
||||||
|
self waittill( "spawned_player" );
|
||||||
|
|
||||||
|
if ( self.pers["team"] == "axis" )
|
||||||
|
thread setInfectedMsg();
|
||||||
|
|
||||||
|
wait 0.05;
|
||||||
|
|
||||||
|
if ( self.pers["team"] == "axis" )
|
||||||
|
maps\mp\killstreaks\_killstreaks::clearKillstreaks();
|
||||||
|
|
||||||
|
if ( matchMakingGame() )
|
||||||
|
{
|
||||||
|
foreach ( player in level.infect_perks )
|
||||||
|
{
|
||||||
|
if ( _hasPerk( player ) )
|
||||||
|
{
|
||||||
|
var_2 = tablelookup( "mp/perktable.csv", 1, player, 8 );
|
||||||
|
|
||||||
|
if ( !_hasPerk( var_2 ) )
|
||||||
|
_setPerk( var_2, 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( self.pers["team"] == "allies" ) // SURVIVORS
|
||||||
|
{
|
||||||
|
if ( !_hasPerk( "specialty_scavenger" ) )
|
||||||
|
{
|
||||||
|
_setPerk( "specialty_scavenger", 0 );
|
||||||
|
var_2 = tablelookup( "mp/perktable.csv", 1, "specialty_scavenger", 8 );
|
||||||
|
|
||||||
|
if ( !_hasPerk( var_2 ) )
|
||||||
|
_setPerk( var_2, 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( self.pers["team"] == "axis" ) // INFECTED
|
||||||
|
{
|
||||||
|
if ( isDefined( self.isInitialInfected ) && !_hasPerk( "specialty_marathon" ) )
|
||||||
|
{
|
||||||
|
_setPerk( "specialty_marathon", 0 );
|
||||||
|
var_2 = tablelookup( "mp/perktable.csv", 1, "specialty_marathon", 8 );
|
||||||
|
|
||||||
|
if ( !_hasPerk( var_2 ) )
|
||||||
|
_setPerk( var_2, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !_hasPerk( "specialty_falldamage" ) )
|
||||||
|
_setPerk( "specialty_falldamage", 0 );
|
||||||
|
|
||||||
|
if ( _hasPerk( "specialty_marathon" ) )
|
||||||
|
{
|
||||||
|
_setPerk( "specialty_lightweight", 0 );
|
||||||
|
self setMoveSpeedScale( 1.2 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setInfectedMsg()
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( isDefined( self.isInitialInfected ) )
|
||||||
|
{
|
||||||
|
thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_FIRST_MERCENARY", ( 1, 0, 0 ), 0.3 );
|
||||||
|
}
|
||||||
|
else if ( isDefined( self.changingToRegularInfected ) )
|
||||||
|
{
|
||||||
|
self.changingToRegularInfected = undefined;
|
||||||
|
if ( isDefined( self.changingToRegularInfectedByKill ) )
|
||||||
|
{
|
||||||
|
self.changingToRegularInfectedByKill = undefined;
|
||||||
|
thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_FIRSTBLOOD" );
|
||||||
|
maps\mp\gametypes\_gamescore::givePlayerScore( "first_draft", self );
|
||||||
|
thread maps\mp\gametypes\_rank::giveRankXP( "first_draft" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_DRAFTED", ( 1, 0, 0 ), 0.3 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
chooseFirstInfected()
|
||||||
|
{
|
||||||
|
level endon( "game_ended" );
|
||||||
|
level endon( "infect_stopCountdown" );
|
||||||
|
|
||||||
|
level.infect_allowSuicide = false;
|
||||||
|
gameFlagWait( "prematch_done" );
|
||||||
|
|
||||||
|
level.infect_timerDisplay.label = &"MP_DRAFT_STARTS_IN";
|
||||||
|
level.infect_timerDisplay setTimer( 15 );
|
||||||
|
level.infect_timerDisplay.alpha = 1;
|
||||||
|
|
||||||
|
maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( 15.0 );
|
||||||
|
|
||||||
|
level.infect_timerDisplay.alpha = 0;
|
||||||
|
|
||||||
|
possibleInfected = [];
|
||||||
|
|
||||||
|
foreach( player in level.players )
|
||||||
|
{
|
||||||
|
if ( player.team == "spectator" )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if ( !player.hasSpawned )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
possibleInfected[possibleInfected.size] = player;
|
||||||
|
}
|
||||||
|
|
||||||
|
firstInfectedPlayer = possibleInfected[ randomInt( possibleInfected.size ) ];
|
||||||
|
firstInfectedPlayer setFirstInfected( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
setFirstInfected( wasChosen )
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
|
||||||
|
if ( wasChosen )
|
||||||
|
self.infect_isBeingChosen = true;
|
||||||
|
|
||||||
|
// wait alive
|
||||||
|
while( !isReallyAlive( self ) || self isUsingRemote() )
|
||||||
|
wait( 0.05 );
|
||||||
|
|
||||||
|
// remove placement item if carrying
|
||||||
|
if ( IsDefined( self.isCarrying ) && self.isCarrying == true )
|
||||||
|
{
|
||||||
|
self notify( "force_cancel_placement" );
|
||||||
|
wait( 0.05 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// not while mantling
|
||||||
|
while ( self IsMantling() )
|
||||||
|
wait( 0.05 );
|
||||||
|
|
||||||
|
// not while in air
|
||||||
|
while ( !self isOnGround() && !self IsOnLadder() )
|
||||||
|
wait( 0.05 );
|
||||||
|
|
||||||
|
// move to other team
|
||||||
|
if ( wasChosen )
|
||||||
|
{
|
||||||
|
self maps\mp\gametypes\_menus::addToTeam( "axis" );
|
||||||
|
level.infect_choseFirstInfected = true;
|
||||||
|
self.infect_isBeingChosen = undefined;
|
||||||
|
|
||||||
|
// resynch teams
|
||||||
|
level notify( "update_game_time" );
|
||||||
|
updateTeamScores();
|
||||||
|
|
||||||
|
// allow suicides now
|
||||||
|
level.infect_allowSuicide = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// store initial
|
||||||
|
self.isInitialInfected = true;
|
||||||
|
|
||||||
|
// set the gamemodeloadout for giveLoadout() to use
|
||||||
|
self.pers["gamemodeLoadout"] = level.infect_loadouts["axis_initial"];
|
||||||
|
|
||||||
|
// remove old TI if it exists
|
||||||
|
if ( isDefined ( self.setSpawnpoint ) )
|
||||||
|
self maps\mp\perks\_perkfunctions::deleteTI( self.setSpawnpoint );
|
||||||
|
|
||||||
|
// set faux TI to respawn in place
|
||||||
|
spawnPoint = spawn( "script_model", self.origin );
|
||||||
|
spawnPoint.angles = self.angles;
|
||||||
|
spawnPoint.playerSpawnPos = self.origin;
|
||||||
|
spawnPoint.notTI = true;
|
||||||
|
self.setSpawnPoint = spawnPoint;
|
||||||
|
|
||||||
|
// faux spawn
|
||||||
|
self notify( "faux_spawn" );
|
||||||
|
self.faux_spawn_stance = self getStance();
|
||||||
|
thread maps\mp\gametypes\_playerlogic::spawnPlayer( true );
|
||||||
|
|
||||||
|
// store infected
|
||||||
|
if ( wasChosen )
|
||||||
|
level.infect_players[self.name] = true;
|
||||||
|
|
||||||
|
// tell the world!
|
||||||
|
thread teamPlayerCardSplash( "callout_first_mercenary", self );
|
||||||
|
playSoundOnPlayers( "mp_enemy_obj_captured" );
|
||||||
|
}
|
||||||
|
|
||||||
|
setInitialToNormalInfected( gotKill )
|
||||||
|
{
|
||||||
|
level endon( "game_ended" );
|
||||||
|
|
||||||
|
self.isInitialInfected = undefined;
|
||||||
|
self.changingToRegularInfected = true;
|
||||||
|
if ( isDefined( gotKill ) )
|
||||||
|
self.changingToRegularInfectedByKill = true;
|
||||||
|
|
||||||
|
// wait till we spawn if we died at the same time
|
||||||
|
while ( !isReallyAlive( self ) )
|
||||||
|
wait( 0.05 );
|
||||||
|
|
||||||
|
// remove placement item if carrying
|
||||||
|
if ( IsDefined( self.isCarrying ) && self.isCarrying == true )
|
||||||
|
{
|
||||||
|
self notify( "force_cancel_placement" );
|
||||||
|
wait( 0.05 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// not while mantling
|
||||||
|
while ( self IsMantling() )
|
||||||
|
wait( 0.05 );
|
||||||
|
|
||||||
|
// not while in air
|
||||||
|
while ( !self isOnGround() )
|
||||||
|
wait( 0.05 );
|
||||||
|
|
||||||
|
// Gotta check again, more time has passed, wait till we spawn if we died at the same time
|
||||||
|
while ( !isReallyAlive( self ) )
|
||||||
|
wait( 0.05 );
|
||||||
|
|
||||||
|
// set the gamemodeloadout for giveLoadout() to use
|
||||||
|
self.pers["gamemodeLoadout"] = level.infect_loadouts["axis"];
|
||||||
|
|
||||||
|
// remove old TI if it exists
|
||||||
|
if ( isDefined ( self.setSpawnpoint ) )
|
||||||
|
self maps\mp\perks\_perkfunctions::deleteTI( self.setSpawnpoint );
|
||||||
|
|
||||||
|
// set faux TI to respawn in place
|
||||||
|
spawnPoint = spawn( "script_model", self.origin );
|
||||||
|
spawnPoint.angles = self.angles;
|
||||||
|
spawnPoint.playerSpawnPos = self.origin;
|
||||||
|
spawnPoint.notTI = true;
|
||||||
|
self.setSpawnPoint = spawnPoint;
|
||||||
|
|
||||||
|
// faux spawn
|
||||||
|
self notify( "faux_spawn" );
|
||||||
|
self.faux_spawn_stance = self getStance();
|
||||||
|
|
||||||
|
thread maps\mp\gametypes\_playerlogic::spawnPlayer( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
|
||||||
|
{
|
||||||
|
processKill = false;
|
||||||
|
wasSuicide = false;
|
||||||
|
|
||||||
|
if ( self.team == "allies" && isDefined( attacker ) )
|
||||||
|
{
|
||||||
|
if ( isPlayer( attacker ) && attacker != self )
|
||||||
|
processKill = true;
|
||||||
|
else if ( level.infect_allowSuicide && ( attacker == self || !isPlayer( attacker ) ) )
|
||||||
|
{
|
||||||
|
processKill = true;
|
||||||
|
wasSuicide = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( processKill )
|
||||||
|
{
|
||||||
|
// track team change for this frame (so explosives can't team kill, now that they changed teams)
|
||||||
|
self.teamChangedThisFrame = true;
|
||||||
|
|
||||||
|
// move victim to infected
|
||||||
|
self maps\mp\gametypes\_menus::addToTeam( "axis" );
|
||||||
|
|
||||||
|
// resynch teams
|
||||||
|
updateTeamScores();
|
||||||
|
|
||||||
|
// store infected
|
||||||
|
level.infect_players[self.name] = true;
|
||||||
|
|
||||||
|
if ( wasSuicide )
|
||||||
|
{
|
||||||
|
// set initial infected to regular infected since a survivor just commited suicide and initial infected is no longer alone
|
||||||
|
if ( level.infect_teamScores["axis"] > 1 )
|
||||||
|
{
|
||||||
|
foreach( player in level.players )
|
||||||
|
{
|
||||||
|
if ( isDefined( player.isInitialInfected ) )
|
||||||
|
player thread setInitialToNormalInfected();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// set attacker to regular infected if they were the first infected
|
||||||
|
if ( isDefined( attacker.isInitialInfected ) )
|
||||||
|
attacker thread setInitialToNormalInfected( true );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// regular attacker reward
|
||||||
|
attacker thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_DRAFTED" );
|
||||||
|
maps\mp\gametypes\_gamescore::givePlayerScore( "draft_rogue", attacker, self, true );
|
||||||
|
attacker thread maps\mp\gametypes\_rank::giveRankXP( "draft_rogue" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// generic messages/sounds, and reward survivors
|
||||||
|
if ( level.infect_teamScores["allies"] > 1 )
|
||||||
|
{
|
||||||
|
playSoundOnPlayers( "mp_enemy_obj_captured", "allies" );
|
||||||
|
playSoundOnPlayers( "mp_war_objective_taken", "axis" );
|
||||||
|
thread teamPlayerCardSplash( "callout_got_drafted", self, "allies" );
|
||||||
|
|
||||||
|
if ( !wasSuicide )
|
||||||
|
{
|
||||||
|
thread teamPlayerCardSplash( "callout_drafted_rogue", attacker, "axis" );
|
||||||
|
|
||||||
|
foreach ( player in level.players )
|
||||||
|
{
|
||||||
|
if( !isReallyAlive( player ) || self.sessionstate == "spectator" )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if ( player.team == "allies" && player != self && distance( player.infect_spawnPos, player.origin ) > 32 )
|
||||||
|
{
|
||||||
|
player thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_SURVIVOR" );
|
||||||
|
maps\mp\gametypes\_gamescore::givePlayerScore( "survivor", player, undefined, true );
|
||||||
|
player thread maps\mp\gametypes\_rank::giveRankXP( "survivor" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// inform/reward last
|
||||||
|
else if ( level.infect_teamScores["allies"] == 1 )
|
||||||
|
{
|
||||||
|
onFinalSurvivor();
|
||||||
|
}
|
||||||
|
// infected win
|
||||||
|
else if ( level.infect_teamScores["allies"] == 0 )
|
||||||
|
{
|
||||||
|
onSurvivorsEliminated();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onFinalSurvivor()
|
||||||
|
{
|
||||||
|
playSoundOnPlayers( "mp_obj_captured" );
|
||||||
|
foreach ( player in level.players )
|
||||||
|
{
|
||||||
|
if( !isDefined(player) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if ( player.team == "allies" )
|
||||||
|
{
|
||||||
|
player thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_FINAL_ROGUE" );
|
||||||
|
if ( !level.infect_awardedFinalSurvivor )
|
||||||
|
{
|
||||||
|
if ( player.gameModeJoinedAtStart && isDefined( player.infect_spawnPos ) && distance( player.infect_spawnPos, player.origin ) > 32 )
|
||||||
|
{
|
||||||
|
maps\mp\gametypes\_gamescore::givePlayerScore( "final_rogue", player, undefined, true );
|
||||||
|
player thread maps\mp\gametypes\_rank::giveRankXP( "final_rogue" );
|
||||||
|
}
|
||||||
|
|
||||||
|
level.infect_awardedFinalSurvivor = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
thread teamplayercardsplash( "callout_final_rogue", player );
|
||||||
|
|
||||||
|
if (matchMakingGame() )
|
||||||
|
level thread finalsurvivoruav( player );
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
finalSurvivorUAV( finalPlayer )
|
||||||
|
{
|
||||||
|
level endon( "game_ended" );
|
||||||
|
finalPlayer endon( "disconnect" );
|
||||||
|
finalPlayer endon( "eliminated" );
|
||||||
|
level endon( "infect_lateJoiner" );
|
||||||
|
level thread endUAVonLateJoiner( finalPlayer );
|
||||||
|
|
||||||
|
removeUAV = false;
|
||||||
|
level.radarMode["axis"] = "normal_radar";
|
||||||
|
foreach ( player in level.players )
|
||||||
|
{
|
||||||
|
if ( player.team == "axis" )
|
||||||
|
player.radarMode = "normal_radar";
|
||||||
|
}
|
||||||
|
|
||||||
|
//setTeamRadarStrength( "axis", 1 );
|
||||||
|
|
||||||
|
while( true )
|
||||||
|
{
|
||||||
|
prevPos = finalPlayer.origin;
|
||||||
|
|
||||||
|
wait( 4 );
|
||||||
|
if ( removeUAV )
|
||||||
|
{
|
||||||
|
setTeamRadar( "axis", 0 );
|
||||||
|
removeUAV = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
wait( 6 );
|
||||||
|
if ( distance( prevPos, finalPlayer.origin ) < 200 )
|
||||||
|
{
|
||||||
|
setTeamRadar( "axis", 1 );
|
||||||
|
removeUAV = true;
|
||||||
|
|
||||||
|
foreach ( player in level.players )
|
||||||
|
player playLocalSound( "recondrone_tag" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
endUAVonLateJoiner( finalPlayer )
|
||||||
|
{
|
||||||
|
level endon( "game_ended" );
|
||||||
|
finalPlayer endon( "disconnect" );
|
||||||
|
finalPlayer endon( "eliminated" );
|
||||||
|
|
||||||
|
while( true )
|
||||||
|
{
|
||||||
|
if ( level.infect_teamScores["allies"] > 1 )
|
||||||
|
{
|
||||||
|
level notify( "infect_lateJoiner" );
|
||||||
|
wait( 0.05 );
|
||||||
|
setTeamRadar( "axis", 0 );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
wait( 0.05 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onPlayerDisconnect()
|
||||||
|
{
|
||||||
|
level endon( "game_ended" );
|
||||||
|
self endon( "eliminated" );
|
||||||
|
|
||||||
|
self waittill( "disconnect" );
|
||||||
|
|
||||||
|
// resynch teams
|
||||||
|
updateTeamScores();
|
||||||
|
|
||||||
|
// team actions or win condition necessary?
|
||||||
|
if ( isDefined( self.infect_isBeingChosen ) || level.infect_choseFirstInfected )
|
||||||
|
{
|
||||||
|
if ( level.infect_teamScores["axis"] && level.infect_teamScores["allies"] )
|
||||||
|
{
|
||||||
|
if ( self.team == "allies" && level.infect_teamScores["allies"] == 1 )
|
||||||
|
{
|
||||||
|
// final survivor was abandoned: inform, reward, call uav
|
||||||
|
onFinalSurvivor();
|
||||||
|
}
|
||||||
|
else if ( self.team == "axis" && level.infect_teamScores["axis"] == 1 )
|
||||||
|
{
|
||||||
|
// final infected was abandoned: inform, set initial
|
||||||
|
foreach ( player in level.players )
|
||||||
|
{
|
||||||
|
if ( player != self && player.team == "axis" )
|
||||||
|
player setFirstInfected( false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( level.infect_teamScores["allies"] == 0 )
|
||||||
|
{
|
||||||
|
// no more survivors, infected win
|
||||||
|
onSurvivorsEliminated();
|
||||||
|
}
|
||||||
|
else if ( level.infect_teamScores["axis"] == 0 )
|
||||||
|
{
|
||||||
|
if ( level.infect_teamScores["allies"] == 1 )
|
||||||
|
{
|
||||||
|
// last survivor wins
|
||||||
|
level.finalKillCam_winner = "allies";
|
||||||
|
level thread maps\mp\gametypes\_gamelogic::endGame( "allies", game[ "end_reason" ][ "axis_eliminated" ] );
|
||||||
|
}
|
||||||
|
else if ( level.infect_teamScores["allies"] > 1 )
|
||||||
|
{
|
||||||
|
// pick a new infected and keep the game going
|
||||||
|
level.infect_choseFirstInfected = false;
|
||||||
|
level thread chooseFirstInfected();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear this regardless on the way out
|
||||||
|
self.isInitialInfected = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
watchInfectForfeit()
|
||||||
|
{
|
||||||
|
level endon( "game_ended" );
|
||||||
|
level.forfeitInProgress = true;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if ( !isDefined( level.forfeitInProgress ) )
|
||||||
|
level.forfeitInProgress = true;
|
||||||
|
|
||||||
|
wait 0.05;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onDeadEvent( team )
|
||||||
|
{
|
||||||
|
// override default to supress the normal game ending process
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
onTimeLimit()
|
||||||
|
{
|
||||||
|
// survivors win
|
||||||
|
level.finalKillCam_winner = "allies";
|
||||||
|
level thread maps\mp\gametypes\_gamelogic::endGame( "allies", game[ "end_reason" ][ "time_limit_reached" ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
onSurvivorsEliminated()
|
||||||
|
{
|
||||||
|
// infected win
|
||||||
|
level.finalKillCam_winner = "axis";
|
||||||
|
level thread maps\mp\gametypes\_gamelogic::endGame( "axis", game[ "end_reason" ][ "allies_eliminated" ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
getTeamSize( team )
|
||||||
|
{
|
||||||
|
size = 0;
|
||||||
|
|
||||||
|
foreach( player in level.players )
|
||||||
|
{
|
||||||
|
// Make sure we don't check for spectators
|
||||||
|
// Also need to check for if they are in killcam, because player session states are set to spectator when killcam happens
|
||||||
|
if ( player.sessionstate == "spectator" && !player.spectatekillcam )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if( player.team == team )
|
||||||
|
size++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateTeamScores()
|
||||||
|
{
|
||||||
|
// survivors
|
||||||
|
level.infect_teamScores["allies"] = getTeamSize( "allies" );
|
||||||
|
game["teamScores"]["allies"] = level.infect_teamScores["allies"];
|
||||||
|
setTeamScore( "allies", level.infect_teamScores["allies"] );
|
||||||
|
|
||||||
|
// infected
|
||||||
|
level.infect_teamScores["axis"] = getTeamSize( "axis" );
|
||||||
|
game["teamScores"]["axis"] = level.infect_teamScores["axis"];
|
||||||
|
setTeamScore( "axis", level.infect_teamScores["axis"] );
|
||||||
|
}
|
||||||
|
|
||||||
|
setSpecialLoadouts()
|
||||||
|
{
|
||||||
|
level.infect_loadouts["axis"]["loadoutPrimary"] = "throwingknife";
|
||||||
|
level.infect_loadouts["axis"]["loadoutPrimaryAttachment"] = "none";
|
||||||
|
level.infect_loadouts["axis"]["loadoutPrimaryAttachment2"] = "none";
|
||||||
|
level.infect_loadouts["axis"]["loadoutPrimaryCamo"] = "none";
|
||||||
|
level.infect_loadouts["axis"]["loadoutSecondary"] = "none";
|
||||||
|
level.infect_loadouts["axis"]["loadoutSecondaryAttachment"] = "none";
|
||||||
|
level.infect_loadouts["axis"]["loadoutSecondaryAttachment2"] = "none";
|
||||||
|
level.infect_loadouts["axis"]["loadoutSecondaryCamo"] = "none";
|
||||||
|
level.infect_loadouts["axis"]["loadoutEquipment"] = "throwingknife_mp";
|
||||||
|
level.infect_loadouts["axis"]["loadoutOffhand"] = "none";
|
||||||
|
level.infect_loadouts["axis"]["loadoutPerk1"] = "specialty_marathon";
|
||||||
|
level.infect_loadouts["axis"]["loadoutPerk2"] = "specialty_lightweight";
|
||||||
|
level.infect_loadouts["axis"]["loadoutPerk3"] = "specialty_heartbreaker";
|
||||||
|
level.infect_loadouts["axis"]["loadoutKillstreak1"] = "none";
|
||||||
|
level.infect_loadouts["axis"]["loadoutKillstreak2"] = "none";
|
||||||
|
level.infect_loadouts["axis"]["loadoutKillstreak3"] = "none";
|
||||||
|
level.infect_loadouts["axis"]["loadoutDeathstreak"] = "specialty_grenadepulldeath";
|
||||||
|
|
||||||
|
level.infect_loadouts["axis_initial"]["loadoutPrimary"] = "scar";
|
||||||
|
level.infect_loadouts["axis_initial"]["loadoutPrimaryAttachment"] = "reflex";
|
||||||
|
level.infect_loadouts["axis_initial"]["loadoutPrimaryAttachment2"] = "xmags";
|
||||||
|
level.infect_loadouts["axis_initial"]["loadoutPrimaryCamo"] = "none";
|
||||||
|
level.infect_loadouts["axis_initial"]["loadoutSecondary"] = "none";
|
||||||
|
level.infect_loadouts["axis_initial"]["loadoutSecondaryAttachment"] = "none";
|
||||||
|
level.infect_loadouts["axis_initial"]["loadoutSecondaryAttachment2"] = "none";
|
||||||
|
level.infect_loadouts["axis_initial"]["loadoutSecondaryCamo"] = "none";
|
||||||
|
level.infect_loadouts["axis_initial"]["loadoutEquipment"] = "throwingknife_mp";
|
||||||
|
level.infect_loadouts["axis_initial"]["loadoutOffhand"] = "none";
|
||||||
|
level.infect_loadouts["axis_initial"]["loadoutPerk1"] = "specialty_marathon";
|
||||||
|
level.infect_loadouts["axis_initial"]["loadoutPerk2"] = "specialty_lightweight";
|
||||||
|
level.infect_loadouts["axis_initial"]["loadoutPerk3"] = "specialty_bulletaccuracy";
|
||||||
|
level.infect_loadouts["axis_initial"]["loadoutKillstreak1"] = "none";
|
||||||
|
level.infect_loadouts["axis_initial"]["loadoutKillstreak2"] = "none";
|
||||||
|
level.infect_loadouts["axis_initial"]["loadoutKillstreak3"] = "none";
|
||||||
|
level.infect_loadouts["axis_initial"]["loadoutDeathstreak"] = "specialty_grenadepulldeath";
|
||||||
|
|
||||||
|
level.infect_loadouts["allies"]["loadoutPrimary"] = "spas12";
|
||||||
|
level.infect_loadouts["allies"]["loadoutPrimaryAttachment"] = "xmags";
|
||||||
|
level.infect_loadouts["allies"]["loadoutPrimaryAttachment2"] = "grip";
|
||||||
|
level.infect_loadouts["allies"]["loadoutPrimaryCamo"] = "none";
|
||||||
|
level.infect_loadouts["allies"]["loadoutSecondary"] = "pp2000";
|
||||||
|
level.infect_loadouts["allies"]["loadoutSecondaryAttachment"] = "reflex";
|
||||||
|
level.infect_loadouts["allies"]["loadoutSecondaryAttachment2"] = "xmags";
|
||||||
|
level.infect_loadouts["allies"]["loadoutSecondaryCamo"] = "none";
|
||||||
|
level.infect_loadouts["allies"]["loadoutEquipment"] = "claymore_mp";
|
||||||
|
level.infect_loadouts["allies"]["loadoutOffhand"] = "flash_grenade";
|
||||||
|
level.infect_loadouts["allies"]["loadoutPerk1"] = "specialty_scavenger";
|
||||||
|
level.infect_loadouts["allies"]["loadoutPerk2"] = "specialty_lightweight";
|
||||||
|
level.infect_loadouts["allies"]["loadoutPerk3"] = "specialty_heartbreaker";
|
||||||
|
level.infect_loadouts["allies"]["loadoutDeathstreak"] = "specialty_null";
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
"MPUI_INF"
|
|
@ -1,20 +1,19 @@
|
||||||
a0,b1,c2,d3
|
a0,b1,c2,d3,e4,f5
|
||||||
dm,MPUI_DEATHMATCH,MENU_KILL_EVERYONE_FIRST_PLAYER,weapon_missing_image
|
dm,MPUI_DEATHMATCH,MENU_KILL_EVERYONE_FIRST_PLAYER,weapon_missing_image,1,1
|
||||||
war,MPUI_TEAM_DEATHMATCH,MENU_KILL_PLAYERS_ON_THE_OPPOSING,weapon_missing_image
|
war,MPUI_TEAM_DEATHMATCH,MENU_KILL_PLAYERS_ON_THE_OPPOSING,weapon_missing_image,1,1
|
||||||
sd,MPUI_SEARCH_AND_DESTROY,MENU_TEAMS_TAKE_TURNS_DEFENDING,weapon_missing_image
|
sd,MPUI_SEARCH_AND_DESTROY,MENU_TEAMS_TAKE_TURNS_DEFENDING,weapon_missing_image,1,1
|
||||||
sab,MPUI_SABOTAGE,MENU_1_BOMB_IN_THE_CENTER,weapon_missing_image
|
sab,MPUI_SABOTAGE,MENU_1_BOMB_IN_THE_CENTER,weapon_missing_image,1,1
|
||||||
dom,MPUI_DOMINATION,MENU_CAPTURE_AND_HOLD_THE,weapon_missing_image
|
dom,MPUI_DOMINATION,MENU_CAPTURE_AND_HOLD_THE,weapon_missing_image,1,1
|
||||||
koth,MPUI_HEADQUARTERS,MENU_CAPTURE_THE_HEADQUARTERS,weapon_missing_image
|
koth,MPUI_HEADQUARTERS,MENU_CAPTURE_THE_HEADQUARTERS,weapon_missing_image,1,1
|
||||||
oneflag,MPUI_ONE_FLAG,MENU_TEAMS_TAKE_TURNS_CAPTURING,weapon_missing_image
|
oneflag,MPUI_ONE_FLAG,MENU_TEAMS_TAKE_TURNS_CAPTURING,weapon_missing_image,1,1
|
||||||
arena,MPUI_ARENA,MENU_ARENA,weapon_missing_image
|
arena,MPUI_ARENA,MENU_ARENA,weapon_missing_image,1,1
|
||||||
dd,MPUI_DD,MENU_DD,weapon_missing_image
|
dd,MPUI_DD,MENU_DD,weapon_missing_image,1,1
|
||||||
vip,MPUI_VIP,MENU_VIP,weapon_missing_image
|
vip,MPUI_VIP,MENU_VIP,weapon_missing_image,1,1
|
||||||
ctf,MPUI_CTF,MENU_CTF_DESC,weapon_missing_image
|
ctf,MPUI_CTF,MENU_CTF_DESC,weapon_missing_image,1,1
|
||||||
gtnw,MPUI_GTNW,MENU_GTNW_DESC,weapon_missing_image
|
gtnw,MPUI_GTNW,MENU_GTNW_DESC,weapon_missing_image,1,1
|
||||||
ss,MPUI_SHARPSHOOTER,MENU_SHARPSHOOTER,weapon_missing_image
|
gun,MPUI_GUNGAME,MENU_GUNGAME,weapon_missing_image,0,0
|
||||||
gg,MPUI_GUNGAME,MENU_GUNGAME,weapon_missing_image
|
oic,MPUI_OITC,MENU_OITC,weapon_missing_image,0,0
|
||||||
oitc,MPUI_OITC,MENU_OITC,weapon_missing_image
|
conf,MPUI_CONF,MENU_CONF,weapon_missing_image,1,1
|
||||||
conf,MPUI_CONF,MENU_CONF,weapon_missing_image
|
infect,MPUI_INF,MENU_INF,weapon_missing_image,0,0
|
||||||
infected,MPUI_INF,MENU_INF,weapon_missing_image
|
cranked,MPUI_CRANKED,MENU_CRANKED,weapon_missing_image,1,1
|
||||||
cranked,MPUI_CRANKED,MENU_CRANKED,weapon_missing_image
|
tdef,MPUI_TDEF,MENU_TDEF,weapon_missing_image,1,1
|
||||||
tdef,MPUI_TDEF,MENU_TDEF,weapon_missing_image
|
|
||||||
|
|
|
|
@ -0,0 +1,633 @@
|
||||||
|
headshot,SPLASHES_HEADSHOT,SPLASHES_HEADSHOT_DESC,crosshair_red,1.5,0.75,0.25,0.25,1,mp_last_stand,dummy,splash
|
||||||
|
assistedsuicide,SPLASHES_ASSISTEDSUICIDE,SPLASHES_ASSISTEDSUICIDE_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
longshot,SPLASHES_LONGSHOT,SPLASHES_LONGSHOT_DESC,crosshair_red,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
execution,SPLASHES_EXECUTION,SPLASHES_EXECUTION_DESC,crosshair_red,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
avenger,SPLASHES_AVENGER,SPLASHES_AVENGER_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
defender,SPLASHES_DEFENDER,SPLASHES_DEFENDER_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
posthumous,SPLASHES_POSTHUMOUS,SPLASHES_POSTHUMOUS_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
revenge,SPLASHES_REVENGE,SPLASHES_REVENGE_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
doublekill,SPLASHES_DOUBLEKILL,SPLASHES_DOUBLEKILL_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
triplekill,SPLASHES_TRIPLEKILL,SPLASHES_TRIPLEKILL_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
multikill,SPLASHES_MULTIKILL,SPLASHES_MULTIKILL_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
firstblood,SPLASHES_FIRSTBLOOD,SPLASHES_FIRSTBLOOD_DESC,crosshair_red,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
buzzkill,SPLASHES_BUZZKILL,SPLASHES_BUZZKILL_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
comeback,SPLASHES_COMEBACK,SPLASHES_COMEBACK_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
flagreturn,SPLASHES_FLAGRETURN,SPLASHES_FLAGRETURN_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
flagpickup,SPLASHES_FLAGPICKUP,SPLASHES_FLAGPICKUP_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
shield_assist,SPLASHES_SHIELDASSIST,SPLASHES_SHIELDASSIST_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
time_added,SPLASHES_TIME_ADDED,SPLASHES_TIME_ADDED_DESC,,4,1,0.8,0.4,1,mp_last_stand,,splash
|
||||||
|
uav,MP_KILLSTREAK_N,MP_EARNED_UAV,,2.5,0.25,0.75,0.25,1,mp_killstreak_radar,uavrecon,killstreak
|
||||||
|
airstrike,MP_KILLSTREAK_N,MP_EARNED_AIRSTRIKE,,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,airstrike,killstreak
|
||||||
|
helicopter,MP_KILLSTREAK_N,MP_EARNED_HELICOPTER,,2.5,0.25,0.75,0.25,1,mp_killstreak_heli,helisupport,killstreak
|
||||||
|
helicopter_minigun,MP_KILLSTREAK_N,MP_EARNED_HELICOPTER_MINIGUN,,2.5,0.25,0.75,0.25,1,mp_killstreak_heli,achieve_heli_mg,killstreak
|
||||||
|
helicopter_mk19,MP_KILLSTREAK_N,MP_EARNED_HELICOPTER_MK19,,2.5,0.25,0.75,0.25,1,mp_killstreak_heli,achieve_heli_gl,killstreak
|
||||||
|
helicopter_blackbox,MP_KILLSTREAK_N,MP_EARNED_HELICOPTER_BLACKBOX,,2.5,0.25,0.75,0.25,1,mp_killstreak_heli,helisupport,killstreak
|
||||||
|
helicopter_flares,MP_KILLSTREAK_N,MP_EARNED_HELICOPTER_FLARES,,2.5,0.25,0.75,0.25,1,mp_killstreak_heli,helisupport,killstreak
|
||||||
|
ac130,MP_KILLSTREAK_N,MP_EARNED_AC130,,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,achieve_ac130,killstreak
|
||||||
|
predator_missile,MP_KILLSTREAK_N,MP_EARNED_PREDATOR_MISSILE,,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,achieve_missile,killstreak
|
||||||
|
nuke,MP_KILLSTREAK_N,MP_EARNED_NUKE,,2.5,0.25,0.75,0.25,1,mp_killstreak_heli,achieve_nuke,killstreak
|
||||||
|
double_uav,MP_KILLSTREAK_N,MP_EARNED_DOUBLE_UAV,,2.5,0.25,0.75,0.25,1,mp_killstreak_radar,achieve_a_uav,killstreak
|
||||||
|
auto_shotgun,MP_KILLSTREAK_N,MP_EARNED_AUTO_SHOTGUN,,2.5,0.25,0.75,0.25,1,mp_killstreak_heli,achieve_autoshotgun,killstreak
|
||||||
|
precision_airstrike,MP_KILLSTREAK_N,MP_EARNED_PRECISION_AIRSTRIKE,,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,achieve_p_airstrike,killstreak
|
||||||
|
stealth_airstrike,MP_KILLSTREAK_N,MP_EARNED_STEALTH_AIRSTRIKE,,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,airstrike,killstreak
|
||||||
|
harrier_airstrike,MP_KILLSTREAK_N,MP_EARNED_HARRIER_AIRSTRIKE,,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,airstrike,killstreak
|
||||||
|
super_airstrike,MP_KILLSTREAK_N,MP_EARNED_SUPER_AIRSTRIKE,,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,airstrike,killstreak
|
||||||
|
counter_uav,MP_KILLSTREAK_N,MP_EARNED_COUNTER_UAV,,2.5,0.25,0.75,0.25,1,mp_killstreak_radar,achieve_c_uav,killstreak
|
||||||
|
sentry,MP_KILLSTREAK_N,MP_EARNED_AUTO_SENTRY,,2.5,0.25,0.75,0.25,1,mp_killstreak_radar,achieve_sentrygun,killstreak
|
||||||
|
sentry_gl,MP_KILLSTREAK_N,MP_EARNED_AUTO_SENTRY_GL,,2.5,0.25,0.75,0.25,1,mp_killstreak_radar,achieve_sentry_gl,killstreak
|
||||||
|
thumper,MP_KILLSTREAK_N,MP_EARNED_THUMPER,,2.5,0.25,0.75,0.25,1,mp_killstreak_heli,achieve_thumper,killstreak
|
||||||
|
airdrop,MP_KILLSTREAK_N,MP_EARNED_AIRDROP,,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,uavrecon,killstreak
|
||||||
|
tank,MP_KILLSTREAK_N,MP_EARNED_TANK,,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,achieve_tank,killstreak
|
||||||
|
emp,MP_KILLSTREAK_N,MP_EARNED_EMP,,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,achieve_tank,killstreak
|
||||||
|
airdrop_sentry_minigun,MP_KILLSTREAK_N,MP_EARNED_SENTRY_AIRDROP,,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,uavrecon,killstreak
|
||||||
|
airdrop_predator_missile,MP_KILLSTREAK_N,MP_EARNED_PREDATOR_AIRDROP,,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,uavrecon,killstreak
|
||||||
|
littlebird_support,MP_KILLSTREAK_N,MP_EARNED_LITTLEBIRD_SUPPORT,,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,uavrecon,killstreak
|
||||||
|
airdrop_mega,MP_KILLSTREAK_N,MP_EARNED_AIRDROP_MEGA,,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,uavrecon,killstreak
|
||||||
|
uav_pickup,KILLSTREAKS_UAV,MP_EARNED_UAV,specialty_uav,2.5,0.25,0.75,0.25,1,mp_killstreak_radar,uavrecon,killstreak_pickup
|
||||||
|
helicopter_pickup,KILLSTREAKS_HELICOPTER,MP_EARNED_HELICOPTER,specialty_helicopter_support,2.5,0.25,0.75,0.25,1,mp_killstreak_heli,helisupport,killstreak_pickup
|
||||||
|
helicopter_minigun_pickup,KILLSTREAKS_HELICOPTER_MINIGUN,MP_EARNED_HELICOPTER_MINIGUN,specialty_cobra_gunner,2.5,0.25,0.75,0.25,1,mp_killstreak_heli,achieve_heli_mg,killstreak_pickup
|
||||||
|
helicopter_flares_pickup,KILLSTREAKS_PAVELOW,MP_EARNED_HELICOPTER_FLARES,specialty_helicopter_flares,2.5,0.25,0.75,0.25,1,mp_killstreak_heli,helisupport,killstreak_pickup
|
||||||
|
ac130_pickup,KILLSTREAKS_AC130,MP_EARNED_AC130,specialty_ac130,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,achieve_ac130,killstreak_pickup
|
||||||
|
predator_missile_pickup,KILLSTREAKS_PREDATOR_MISSILE,MP_EARNED_PREDATOR_MISSILE,specialty_predator_missile,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,achieve_missile,killstreak_pickup
|
||||||
|
nuke_pickup,KILLSTREAKS_TACTICAL_NUKE,MP_EARNED_NUKE,specialty_nuke,2.5,0.25,0.75,0.25,1,mp_killstreak_heli,achieve_nuke,killstreak_pickup
|
||||||
|
precision_airstrike_pickup,KILLSTREAKS_PRECISION_AIRSTRIKE,MP_EARNED_PRECISION_AIRSTRIKE,specialty_precision_airstrike,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,achieve_p_airstrike,killstreak_pickup
|
||||||
|
stealth_airstrike_pickup,KILLSTREAKS_STEALTH_AIRSTRIKE,MP_EARNED_STEALTH_AIRSTRIKE,specialty_stealth_bomber,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,airstrike,killstreak_pickup
|
||||||
|
harrier_airstrike_pickup,KILLSTREAKS_HARRIER_AIRSTRIKE,MP_EARNED_HARRIER_AIRSTRIKE,specialty_harrier_strike,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,airstrike,killstreak_pickup
|
||||||
|
counter_uav_pickup,KILLSTREAKS_COUNTER_UAV,MP_EARNED_COUNTER_UAV,specialty_counter_uav,2.5,0.25,0.75,0.25,1,mp_killstreak_radar,achieve_c_uav,killstreak_pickup
|
||||||
|
sentry_pickup,KILLSTREAKS_SENTRY,MP_EARNED_AUTO_SENTRY,specialty_airdrop_sentry_minigun,2.5,0.25,0.75,0.25,1,mp_killstreak_radar,achieve_sentrygun,killstreak_pickup
|
||||||
|
airdrop_pickup,KILLSTREAKS_AIRDROP,MP_EARNED_AIRDROP,specialty_carepackage,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,uavrecon,killstreak_pickup
|
||||||
|
emp_pickup,KILLSTREAKS_EMP,MP_EARNED_EMP,specialty_emp,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,achieve_tank,killstreak_pickup
|
||||||
|
airdrop_sentry_minigun_pickup,KILLSTREAKS_AIRDROP_SENTRY,MP_EARNED_SENTRY_AIRDROP,specialty_airdrop_sentry_minigun,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,uavrecon,killstreak_pickup
|
||||||
|
airdrop_mega_pickup,KILLSTREAKS_AIRDROP_MEGA,MP_EARNED_AIRDROP_MEGA,specialty_carepackage,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,uavrecon,killstreak_pickup
|
||||||
|
caused_defcon,MP_CAUSED_DEFCON,MP_EARNED_MEGADROP,,2.5,0.25,0.75,0.25,1,mp_killstreak_jet,uavrecon,killstreak_pickup
|
||||||
|
captured_nuke,SPLASHES_CAPTURED_NUKE,SPLASHES_DESC_CAPTURED_NUKE,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
capture,SPLASHES_CAPTURE,SPLASHES_CAPTURE_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
defend,SPLASHES_DEFEND,SPLASHES_DEFEND_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
assault,SPLASHES_ASSAULT,SPLASHES_ASSAULT_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
flag_capture,SPLASHES_FLAG_CAPTURED,SPLASHES_FLAG_CAPTURED_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
flag_defend,SPLASHES_FLAG_DEFEND,SPLASHES_FLAG_DEFEND_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
flag_assault,SPLASHES_FLAG_ASSAULT,SPLASHES_FLAG_ASSAULT_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
plant,SPLASHES_PLANT,SPLASHES_PLANT_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
defuse,SPLASHES_DEFUSE,SPLASHES_DEFUSE_DESC,,1,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
sab_overtime,SPLASHES_SAB_OVERTIME,SPLASHES_SAB_OVERTIME_DESC,,3,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
gtnw_overtime,SPLASHES_GTNW_OVERTIME,SPLASHES_GTNW_OVERTIME_DESC,,3,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
specialty_grenadepulldeath,PERKS_MARTYRDOM,SPLASHES_MARTYRDOM_DESC,specialty_grenadepulldeath,2.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
specialty_finalstand,PERKS_FINALSTAND,SPLASHES_FINALSTAND_DESC,specialty_finalstand,2.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
specialty_combathigh,PERKS_COMBATHIGH,SPLASHES_COMBATHIGH_DESC,specialty_painkiller,2.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
specialty_endgame,PERKS_ENDGAME,SPLASHES_ENDGAME_DESC,specialty_endgame,2.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
specialty_c4death,PERKS_C4DEATH,SPLASHES_C4DEATH_DESC,specialty_c4_death,2.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
specialty_copycat,PERKS_COPYCAT,SPLASHES_COPYCAT_DESC,specialty_copycat,2.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
sudden_death,MP_SUDDEN_DEATH,MP_NO_RESPAWN,,3,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
knifethrow,SPLASHES_KNIFETHROW,SPLASHES_KNIFETHROW_DESC,crosshair_red,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
stuck_semtex,SPLASHES_STUCK_SEMTEX,SPLASHES_STUCK_SEMTEX_DESC,crosshair_red,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
hijacker,SPLASHES_HIJACKER,SPLASHES_HIJACKER_DESC,,2.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
sharepackage,SPLASHES_SHAREPACKAGE,SPLASHES_SHAREPACKAGE_DESC,,2.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
rested,SPLASHES_RESTED,SPLASHES_RESTED_DESC,,4,1,0.4,0,1,mp_bonus_start,,splash
|
||||||
|
rested_done,SPLASHES_RESTED_DONE,SPLASHES_RESTED_DONE_DESC,,2.5,1,0.4,0,1,mp_bonus_end,,splash
|
||||||
|
semtex_stuck,SPLASHES_SEMTEX_STUCK,SPLASHES_SEMTEX_STUCK,,2.5,0.6,0.6,1,1,mp_defcon_down,,playercard_splash
|
||||||
|
hijacked_airdrop,SPLASHES_HIJACKED_AIRDROP,SPLASHES_HIJACKED_AIRDROP,,2.5,0.6,0.6,1,1,mp_defcon_down,,playercard_splash
|
||||||
|
hijacked_sentry,SPLASHES_HIJACKED_SENTRY,SPLASHES_HIJACKED_SENTRY,,2.5,0.6,0.6,1,1,mp_defcon_down,,playercard_splash
|
||||||
|
giveaway_airdrop,SPLASHES_GIVEAWAY_AIRDROP,SPLASHES_GIVEAWAY_AIRDROP,,2.5,0.6,0.6,1,1,mp_bonus_start,,playercard_splash
|
||||||
|
giveaway_sentry,SPLASHES_GIVEAWAY_SENTRY,SPLASHES_GIVEAWAY_SENTRY,,2.5,0.6,0.6,1,1,mp_bonus_start,,playercard_splash
|
||||||
|
hijacked_emergency_airdrop,SPLASHES_HIJACKED_EMERGENCY_AIRDROP,SPLASHES_HIJACKED_EMERGENCY_AIRDROP,,2.5,0.6,0.6,1,1,mp_defcon_down,,playercard_splash
|
||||||
|
two_from_defcon,SPLASHES_TWO_FROM_DEFCON,SPLASHES_TWO_FROM_DEFCON,,4,0.6,0.6,1,1,null,,playercard_splash
|
||||||
|
one_from_defcon,SPLASHES_ONE_FROM_DEFCON,SPLASHES_ONE_FROM_DEFCON,,4,0.6,0.6,1,1,null,,playercard_splash
|
||||||
|
changed_defcon,SPLASHES_CHANGED_DEFCON,SPLASHES_CHANGED_DEFCON,,4,0.6,0.6,1,1,null,,playercard_splash
|
||||||
|
used_ac130,KILLSTREAKS_AC130,KILLSTREAKS_AC130,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
used_helicopter_minigun,KILLSTREAKS_HELICOPTER_MINIGUN,KILLSTREAKS_HELICOPTER_MINIGUN,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
used_emp,KILLSTREAKS_EMP,KILLSTREAKS_EMP,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
used_nuke,KILLSTREAKS_TACTICAL_NUKE,KILLSTREAKS_TACTICAL_NUKE,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
used_helicopter_flares,KILLSTREAKS_PAVELOW,KILLSTREAKS_PAVELOW,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
used_airdrop_mega,KILLSTREAKS_AIRDROP_MEGA,KILLSTREAKS_AIRDROP_MEGA,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
used_stealth_airstrike,KILLSTREAKS_STEALTH_AIRSTRIKE,KILLSTREAKS_STEALTH_AIRSTRIKE,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_3xkill,SPLASHES_TRIPLEKILL,SPLASHES_TRIPLEKILL,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_3xpluskill,SPLASHES_MULTIKILL,SPLASHES_MULTIKILL,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_bombplanted,SPLASHES_BOMB_PLANTED,SPLASHES_BOMB_PLANTED,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_bombdefused,SPLASHES_BOMB_DEFUSED,SPLASHES_BOMB_DEFUSED,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_firstblood,SPLASHES_FIRSTBLOOD,SPLASHES_FIRSTBLOOD,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_grabbedtheflag,SPLASHES_GRABBED_THE_FLAG,SPLASHES_GRABBED_THE_FLAG,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_lastenemyalive,SPLASHES_LAST_ENEMY_ALIVE,SPLASHES_LAST_ENEMY_ALIVE,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_lastteammemberalive,SPLASHES_LAST_TEAM_MEMBER_ALIVE,SPLASHES_LAST_TEAM_MEMBER_ALIVE,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_destroyed_helicopter_flares,SPLASHES_DESTROYED_PAVELOW,SPLASHES_DESTROYED_PAVELOW,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_destroyed_helicopter_minigun,SPLASHES_DESTROYED_MINIGUNNER,SPLASHES_DESTROYED_MINIGUNNER,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_destroyed_helicopter,SPLASHES_DESTROYED_HELICOPTER,SPLASHES_DESTROYED_HELICOPTER,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_destroyed_uav,SPLASHES_DESTROYED_UAV,SPLASHES_DESTROYED_UAV,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_destroyed_counter_uav,SPLASHES_DESTROYED_COUNTER_UAV,SPLASHES_DESTROYED_COUNTER_UAV,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_destroyed_harrier,SPLASHES_DESTROYED_HARRIER,SPLASHES_DESTROYED_HARRIER,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_destroyed_ac130,SPLASHES_DESTROYED_AC130,SPLASHES_DESTROYED_AC130,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_flagreturn,SPLASHES_FLAG_RETURN,SPLASHES_FLAG_RETURN,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_flagcapture,SPLASHES_FLAG_CAPTURE,SPLASHES_FLAG_CAPTURE,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_flagpickup_enemy,SPLASHES_FLAG_PICKUP_ENEMY,SPLASHES_FLAG_PICKUP_ENEMY,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_flagpickup_friendly,SPLASHES_FLAG_PICKUP_FRIENDLY,SPLASHES_FLAG_PICKUP_FRIENDLY,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_flagpickup,SPLASHES_FLAG_PICKUP,SPLASHES_FLAG_PICKUP,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_capturedhq,SPLASHES_CAPTURED_HQ,SPLASHES_CAPTURED_HQ,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_destroyedhq,SPLASHES_DESTROYED_HQ,SPLASHES_DESTROYED_HQ,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_bombtaken,SPLASHES_BOMB_TAKEN,SPLASHES_BOMB_TAKEN,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_bombdropped,SPLASHES_BOMB_DROPPED,SPLASHES_BOMB_DROPPED,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_securedposition,SPLASHES_SECURED_POSITION,SPLASHES_SECURED_POSITION,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_securedposition_a,SPLASHES_SECURED_POSITION_A,SPLASHES_SECURED_POSITION_A,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_securedposition_b,SPLASHES_SECURED_POSITION_B,SPLASHES_SECURED_POSITION_B,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_securedposition_c,SPLASHES_SECURED_POSITION_C,SPLASHES_SECURED_POSITION_C,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_killcarrier,SPLASHES_KILLED_CARRIER,SPLASHES_KILLED_CARRIER,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_got_drafted,SPLASHES_GOT_DRAFTED,SPLASHES_GOT_DRAFTED,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_drafted_rogue,SPLASHES_DRAFTED_ROGUE,SPLASHES_DRAFTED_ROGUE,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_final_rogue,SPLASHES_FINAL_ROGUE,SPLASHES_FINAL_ROGUE,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_first_mercenary,SPLASHES_FIRST_MERCENARY,SPLASHES_FIRST_MERCENARY,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_top_gun_rank,SPLASHES_TOP_GUN_RANK,SPLASHES_TOP_GUN_RANK,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
copied,SPLASHES_COPIED,SPLASHES_COPIED,,3,0.75,0.25,0.25,1,null,,playercard_splash
|
||||||
|
revived,SPLASHES_REVIVED,SPLASHES_REVIVED,,3,0.75,0.25,0.25,1,null,,playercard_splash
|
||||||
|
callout_time_added,SPLASHES_TIMEADDED,SPLASHES_TIMEADDED,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_destroyed_objective,SPLASHES_DESTROYED_OBJECTIVE,SPLASHES_DESTROYED_OBJECTIVE,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
callout_saved_objective,SPLASHES_SAVED_OBJECTIVE,SPLASHES_SAVED_OBJECTIVE,,4,1,1,1,1,null,,playercard_splash
|
||||||
|
heroic,SPLASHES_HEROIC,SPLASHES_HEROIC_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
denied,SPLASHES_DENIED,SPLASHES_DENIED_DESC,,2.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
destroyed_insertion,SPLASHES_DESTROYED_INSERTION,SPLASHES_DESTROYED_INSERTION,,2.5,0.75,0.25,0.25,1,mp_defcon_down,,playercard_splash
|
||||||
|
reviver,SPLASHES_REVIVER,SPLASHES_REVIVER_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
one_shot_kill,SPLASHES_ONE_SHOT_KILL,SPLASHES_ONE_SHOT_KILL_DESC,crosshair_red,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
ninja_defuse,SPLASHES_NINJA_DEFUSE,SPLASHES_NINJA_DEFUSE_DESC,,1.5,0.75,0.25,0.25,1,mp_last_stand,,splash
|
||||||
|
promotion,RANK_PROMOTED,RANK_PROMOTED,,4,0.75,0.25,0.25,1,mp_level_up,,promotion
|
||||||
|
ch_marksman_m16,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_m16,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_famas,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_famas,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_tavor,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_tavor,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_fal,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_fal,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_ak47,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_ak47,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_m4,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_m4,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_masada,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_masada,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_scar,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_scar,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_fn2000,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_fn2000,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_kriss,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_kriss,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_ump45,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_ump45,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_uzi,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_uzi,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_p90,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_p90,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_mp5k,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_mp5k,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_rpd,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_rpd,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_sa80,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_sa80,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_aug,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_aug,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_striker,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_striker,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_m1014,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_m1014,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_aa12,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_aa12,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_model1887,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_model1887,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_ranger,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_ranger,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_spas12,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_spas12,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_cheytac,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_cheytac,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_m21,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_m21,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_barrett,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_barrett,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_wa2000,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_wa2000,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_beretta,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_beretta,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_usp,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_usp,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_deserteagle,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_deserteagle,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_coltanaconda,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_coltanaconda,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_tmp,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_tmp,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_ump45,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_ump45,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_glock,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_glock,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_beretta393,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_beretta393,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_pp2000,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_pp2000,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_m240,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_m240,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_mg4,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_mg4,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_at4,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_rpg,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_javelin,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_m79,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marksman_stinger,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m16_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_famas_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_tavor_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_fal_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_ak47_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m4_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_masada_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_scar_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_fn2000_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_kriss_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_ump45_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_uzi_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_p90_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_mp5k_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_rpd_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_sa80_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_mg4_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_aug_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_cheytac_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m21_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_barrett_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_wa2000_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m16_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_famas_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_tavor_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_fal_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_ak47_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m4_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_masada_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_scar_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_fn2000_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_kriss_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_ump45_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_uzi_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_p90_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_mp5k_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_rpd_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_sa80_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_mg4_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_aug_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_cheytac_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m21_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_barrett_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_wa2000_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m16_gl,#,SPLASHES_UNLOCKED_SHOTGUN,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_famas_gl,#,SPLASHES_UNLOCKED_SHOTGUN,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_tavor_gl,#,SPLASHES_UNLOCKED_SHOTGUN,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_fal_gl,#,SPLASHES_UNLOCKED_SHOTGUN,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_ak47_gl,#,SPLASHES_UNLOCKED_SHOTGUN,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m4_gl,#,SPLASHES_UNLOCKED_SHOTGUN,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_masada_gl,#,SPLASHES_UNLOCKED_SHOTGUN,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_scar_gl,#,SPLASHES_UNLOCKED_SHOTGUN,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_fn2000_gl,#,SPLASHES_UNLOCKED_SHOTGUN,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m16_reflex,#,SPLASHES_UNLOCKED_EOTECH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_famas_reflex,#,SPLASHES_UNLOCKED_EOTECH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_tavor_reflex,#,SPLASHES_UNLOCKED_EOTECH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_fal_reflex,#,SPLASHES_UNLOCKED_EOTECH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_ak47_reflex,#,SPLASHES_UNLOCKED_EOTECH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m4_reflex,#,SPLASHES_UNLOCKED_EOTECH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_masada_reflex,#,SPLASHES_UNLOCKED_EOTECH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_scar_reflex,#,SPLASHES_UNLOCKED_EOTECH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_fn2000_reflex,#,SPLASHES_UNLOCKED_EOTECH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_kriss_reflex,#,SPLASHES_UNLOCKED_EOTECH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_ump45_reflex,#,SPLASHES_UNLOCKED_EOTECH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_uzi_reflex,#,SPLASHES_UNLOCKED_EOTECH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_p90_reflex,#,SPLASHES_UNLOCKED_EOTECH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_mp5k_reflex,#,SPLASHES_UNLOCKED_EOTECH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_rpd_reflex,#,SPLASHES_UNLOCKED_EOTECH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_sa80_reflex,#,SPLASHES_UNLOCKED_EOTECH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_mg4_reflex,#,SPLASHES_UNLOCKED_EOTECH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_aug_reflex,#,SPLASHES_UNLOCKED_EOTECH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m16_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_famas_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_tavor_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_fal_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_ak47_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m4_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_masada_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_scar_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_fn2000_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_kriss_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_ump45_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_uzi_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_p90_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_mp5k_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_rpd_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_sa80_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_mg4_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_aug_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_cheytac_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m21_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_barrett_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_wa2000_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_kriss_rof,#,SPLASHES_UNLOCKED_AKIMBO,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_ump45_rof,#,SPLASHES_UNLOCKED_AKIMBO,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_uzi_rof,#,SPLASHES_UNLOCKED_AKIMBO,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_p90_rof,#,SPLASHES_UNLOCKED_AKIMBO,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_mp5k_rof,#,SPLASHES_UNLOCKED_AKIMBO,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m240_silencer,#,SPLASHES_UNLOCKED_HEARTBEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m240_fmj,#,SPLASHES_UNLOCKED_EXTENDED_MAGS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m240_reflex,#,SPLASHES_UNLOCKED_EOTECH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m240_acog,#,SPLASHES_UNLOCKED_THERMAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_marathon_pro,CHALLENGE_MARATHON_PRO,CHALLENGE_RUN_N_MILES,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,perk_challenge
|
||||||
|
ch_bulletaccuracy_pro,CHALLENGE_BULLETACCURACY_PRO,CHALLENGE_GET_N_HIPFIRE_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,perk_challenge
|
||||||
|
ch_deadsilence_pro,CHALLENGE_DEADSILENCE_PRO,CHALLENGE_GET_N_CLOSE_DS_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,perk_challenge
|
||||||
|
ch_scrambler_pro,CHALLENGE_SCRAMBLER_PRO,CHALLENGE_GET_N_CLOSE_SC_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,perk_challenge
|
||||||
|
ch_sleightofhand_pro,CHALLENGE_SLEIGHTOFHAND_PRO,CHALLENGE_GET_N_SOH_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,perk_challenge
|
||||||
|
ch_bling_pro,CHALLENGE_BLING_PRO,CHALLENGE_GET_N_BLING_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,perk_challenge
|
||||||
|
ch_stoppingpower_pro,CHALLENGE_STOPPINGPOWER_PRO,CHALLENGE_GET_N_SP_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,perk_challenge
|
||||||
|
ch_hardline_pro,CHALLENGE_HARDLINE_PRO,CHALLENGE_GET_N_KILLSTREAKS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,perk_challenge
|
||||||
|
ch_onemanarmy_pro,CHALLENGE_ONEMANARMY_PRO,CHALLENGE_GET_N_KILLS_OMA,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,perk_challenge
|
||||||
|
ch_coldblooded_pro,CHALLENGE_COLDBLOODED_PRO,CHALLENGE_KILL_N_KILLSTREAKS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,perk_challenge
|
||||||
|
ch_laststand_pro,CHALLENGE_LASTSTAND_PRO,CHALLENGE_GET_N_LASTSTAND_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,perk_challenge
|
||||||
|
ch_scavenger_pro,CHALLENGE_SCAVENGER_PRO,CHALLENGE_PICKUP_N_SCAVENGER_PACKS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,perk_challenge
|
||||||
|
ch_extendedmelee_pro,CHALLENGE_EXTENDEDMELEE_PRO,CHALLENGE_GET_N_MELEE_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,perk_challenge
|
||||||
|
ch_detectexplosives_pro,CHALLENGE_DETECTEXPLOSIVES_PRO,CHALLENGE_GET_N_DE_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,perk_challenge
|
||||||
|
ch_lightweight_pro,CHALLENGE_LIGHTWEIGHT_PRO,CHALLENGE_SPRINT_N_MILES,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,perk_challenge
|
||||||
|
ch_dangerclose_pro,CHALLENGE_DANGERCLOSE_PRO,CHALLENGE_GET_N_KS_EXPLOSIVE_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,perk_challenge
|
||||||
|
ch_uav,CHALLENGE_UAV,CHALLENGE_DESC_UAV,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_airdrop,CHALLENGE_AIRDROP,CHALLENGE_DESC_AIRDROP,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_counter_uav,CHALLENGE_COUNTER_UAV,CHALLENGE_DESC_COUNTER_UAV,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_sentry,CHALLENGE_SENTRY,CHALLENGE_DESC_SENTRY,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_predator_missile,CHALLENGE_PREDATOR_MISSILE,CHALLENGE_DESC_PREDATOR_MISSILE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_precision_airstrike,CHALLENGE_PRECISION_AIRSTRIKE,CHALLENGE_DESC_PRECISION_AIRSTRIKE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_harrier_strike,CHALLENGE_HARRIER_AIRSTRIKE,CHALLENGE_DESC_HARRIER_AIRSTRIKE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_helicopter,CHALLENGE_HELICOPTER,CHALLENGE_DESC_HELICOPTER,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_airdrop_mega,CHALLENGE_AIRDROP_MEGA,CHALLENGE_DESC_AIRDROP_MEGA,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_helicopter_flares,CHALLENGE_HELICOPTER_FLARES,CHALLENGE_DESC_HELICOPTER_FLARES,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_stealth_airstrike,CHALLENGE_STEALTH_AIRSTRIKE,CHALLENGE_DESC_STEALTH_AIRSTRIKE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_helicopter_minigun,CHALLENGE_HELICOPTER_MINIGUN,CHALLENGE_DESC_HELICOPTER_MINIGUN,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_ac130,CHALLENGE_AC130,CHALLENGE_DESC_AC130,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_emp,CHALLENGE_EMP,CHALLENGE_DESC_EMP,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_nuke,CHALLENGE_NUKE,CHALLENGE_DESC_NUKE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_uavs,CHALLENGE_UAVS,CHALLENGE_DESC_UAVS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_airstrikes,CHALLENGE_AIRSTRIKES,CHALLENGE_DESC_AIRSTRIKES,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_helicopters,CHALLENGE_HELICOPTERS,CHALLENGE_DESC_HELICOPTERS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_airdrops,CHALLENGE_AIRDROPS,CHALLENGE_DESC_AIRDROPS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_grenadekill,CHALLENGE_GRENADE_KILL,CHALLENGE_KILL_N_ENEMIES_WITH_A_GRENADE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_claymoreshot,CHALLENGE_CLAYMORE_SHOT,CHALLENGE_KILL_5_ENEMIES_BY_USING,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_jackinthebox,CHALLENGE_JACKINTHEBOX,CHALLENGE_DESC_JACKINTHEBOX,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_carnie,CHALLENGE_CARNIE,CHALLENGE_DESC_CARNIE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_masterblaster,CHALLENGE_MASTERBLASTER,CHALLENGE_DESC_MASTERBLASTER,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_bullseye,CHALLENGE_BULLSEYE,CHALLENGE_DESC_BULLSEYE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_c4shot,CHALLENGE_C4SHOT,CHALLENGE_DESC_C4SHOT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_didyouseethat,CHALLENGE_DIDYOUSEETHAT,CHALLENGE_DESC_DIDYOUSEETHAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_darkbringer,CHALLENGE_DARKBRINGER,CHALLENGE_DESC_DARKBRINGER,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_tacticaldeletion,CHALLENGE_TACTICALDELETION,CHALLENGE_DESC_TACTICALDELETION,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_its_personal,CHALLENGE_ITS_PERSONAL,CHALLENGE_DESC_ITS_PERSONAL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_heads_up,CHALLENGE_HEADS_UP,CHALLENGE_DESC_HEADS_UP,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_looknohands,CHALLENGE_LOOKNOHANDS,CHALLENGE_DESC_LOOKNOHANDS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_predator,CHALLENGE_PREDATOR,CHALLENGE_DESC_PREDATOR,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_carpetbomber,CHALLENGE_CARPETBOMBER,CHALLENGE_DESC_CARPETBOMBER,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_yourefired,CHALLENGE_YOUREFIRED,CHALLENGE_DESC_YOUREFIRED,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_choppervet,CHALLENGE_CHOPPER_VETERAN,CHALLENGE_KILL_N_ENEMIES_BY_CALLING1,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_jollygreengiant,CHALLENGE_JOLLYGREENGIANT,CHALLENGE_DESC_JOLLYGREENGIANT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_thespirit,CHALLENGE_THESPIRIT,CHALLENGE_DESC_THESPIRIT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_cobracommander,CHALLENGE_COBRACOMMANDER,CHALLENGE_DESC_COBRACOMMANDER,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_spectre,CHALLENGE_SPECTRE,CHALLENGE_DESC_SPECTRE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_droppincrates,CHALLENGE_DROPPINCRATES,CHALLENGE_DESC_DROPPINCRATES,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_absentee,CHALLENGE_ABSENTEE,CHALLENGE_DESC_ABSENTEE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_dronekiller,CHALLENGE_DRONEKILLER,CHALLENGE_DESC_DRONEKILLER,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_finishingtouch,CHALLENGE_FINISHINGTOUCH,CHALLENGE_DESC_FINISHINGTOUCH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_truelies,CHALLENGE_TRUELIES,CHALLENGE_DESC_TRUELIES,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_og,CHALLENGE_OG,CHALLENGE_DESC_OG,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_transformer,CHALLENGE_TRANSFORMER,CHALLENGE_DESC_TRANSFORMER,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_technokiller,CHALLENGE_TECHNOKILLER,CHALLENGE_DESC_TECHNOKILLER,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_hidef,CHALLENGE_HIDEF,CHALLENGE_DESC_HIDEF,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_deathfromabove,CHALLENGE_DEATHFROMABOVE,CHALLENGE_DESC_DEATHFROMABOVE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_theedge,CHALLENGE_THE_EDGE,CHALLENGE_GET_THE_MATCH_WINNING_KILL_N_TIMES,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_unbelievable,CHALLENGE_UNBELIEVABLE,CHALLENGE_DESC_UNBELIEVABLE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_owned,CHALLENGE_OWNED,CHALLENGE_DESC_OWNED,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_stickman,CHALLENGE_STICKMAN,CHALLENGE_DESC_STICKMAN,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_lastresort,CHALLENGE_LASTRESORT,CHALLENGE_DESC_LASTRESORT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_ghillie,CHALLENGE_GHILLIE,CHALLENGE_DESC_GHILLIE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_hotpotato,CHALLENGE_HOT_POTATO,CHALLENGE_KILL_N_ENEMIES_WITH_THROWN,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_carbomb,CHALLENGE_CAR_BOMB,CHALLENGE_DESC_CAR_BOMB,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_backstabber,CHALLENGE_BACKSTABBER,CHALLENGE_STAB_AN_ENEMY_IN_THE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_slowbutsure,CHALLENGE_SLOW_BUT_SURE,CHALLENGE_KILL_1_ENEMY_WHILE_BEING,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_miserylovescompany,CHALLENGE_MISERY_LOVES_COMPANY,CHALLENGE_KILL_YOURSELF_AND_1_ENEMY,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_ouch,CHALLENGE_OUCH,CHALLENGE_KILL_N_ENEMIES_WITH_A_RIFLEMOUNTED,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_rival,CHALLENGE_RIVAL,CHALLENGE_KILL_THE_SAME_ENEMY_5,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_cruelty,CHALLENGE_CRUELTY,CHALLENGE_KILL_AN_ENEMY_PICK_UP,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_thinkfast,CHALLENGE_THINK_FAST,CHALLENGE_FINISH_AN_ENEMY_OFF_BY,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_thinkfastconcussion,CHALLENGE_THINK_FAST_STUN,CHALLENGE_FINISH_AN_ENEMY_OFF_BY1,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_thinkfastflash,CHALLENGE_THINK_FAST_FLASH,CHALLENGE_FINISH_AN_ENEMY_OFF_BY2,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_returntosender,CHALLENGE_RETURN_TO_SENDER,CHALLENGE_KILL_AN_ENEMY_BY_SHOOTING,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_blindfire,CHALLENGE_BLINDFIRE,CHALLENGE_KILL_AN_ENEMY_WHILE_YOU,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_hardlanding,CHALLENGE_HARD_LANDING,CHALLENGE_KILL_AN_ENEMY_THAT_IS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_extremecruelty,CHALLENGE_EXTREME_CRUELTY,CHALLENGE_KILL_EVERY_MEMBER_OF1,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_tangodown,CHALLENGE_TANGO_DOWN,CHALLENGE_KILL_EVERY_MEMBER_OF,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_countermvp,CHALLENGE_COUNTERMVP,CHALLENGE_KILL_THE_1_PLAYER_ON,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_goodbye,CHALLENGE_GOODBYE,CHALLENGE_FALL_30_FEET_OR_MORE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_basejump,CHALLENGE_BASE_JUMP,CHALLENGE_FALL_15_FEET_OR_MORE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_flyswatter,CHALLENGE_FLYSWATTER,CHALLENGE_SHOOT_DOWN_AN_ENEMY_HELICOPTER,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_vandalism,CHALLENGE_VANDALISM,CHALLENGE_KILL_1_ENEMY_BY_DESTROYING,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_crouchshot,CHALLENGE_CROUCH_SHOT,CHALLENGE_KILL_N_ENEMIES_WHILE_CROUCHING,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_proneshot,CHALLENGE_PRONE_SHOT,CHALLENGE_KILL_N_ENEMIES_WHILE_PRONE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_assists,CHALLENGE_POINT_GUARD,CHALLENGE_GET_N_ASSISTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_xrayvision,CHALLENGE_XRAY_VISION,CHALLENGE_KILL_N_ENEMY_THROUGH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_backdraft,CHALLENGE_BACKDRAFT,CHALLENGE_DESTROY_N_ENEMY_EXPLOSIVES,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_shieldvet,CHALLENGE_SHIELD_VETERAN,CHALLENGE_KILL_N_ENEMY_WITH_SHIELD,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_smasher,CHALLENGE_SMASHER,CHALLENGE_GET_A_3_SHIELD_KILL_STREAK,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_backsmasher,CHALLENGE_BACKSMASHER,CHALLENGE_CRUSH_AN_ENEMY,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_shield_damage,CHALLENGE_SHIELD_DAMAGE,CHALLENGE_DESC_SHIELD_DAMAGE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_shield_bullet,CHALLENGE_SHIELD_BULLET,CHALLENGE_DESC_SHIELD_BULLET,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_shield_explosive,CHALLENGE_SHIELD_EXPLOSIVE,CHALLENGE_DESC_SHIELD_EXPLOSIVE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_surgical_assault,CHALLENGE_SURGICAL_ASSAULT,CHALLENGE_DESC_SURGICAL_ASSAULT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_surgical_smg,CHALLENGE_SURGICAL_SMG,CHALLENGE_DESC_SURGICAL_SMG,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_surgical_lmg,CHALLENGE_SURGICAL_LMG,CHALLENGE_DESC_SURGICAL_LMG,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_surgical_sniper,CHALLENGE_SURGICAL_SNIPER,CHALLENGE_DESC_SURGICAL_SNIPER,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_assault,CHALLENGE_ASSAULT_EXPERT,CHALLENGE_KILL_N_ENEMIES_WITH_A1,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_smg,CHALLENGE_SMG_EXPERT,CHALLENGE_KILL_N_ENEMIES_WITH_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_expert_lmg,CHALLENGE_LMG_EXPERT,CHALLENGE_KILL_N_ENEMIES_WITH_HEADSHOTS1,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_multirpg,CHALLENGE_MULTIRPG,CHALLENGE_KILL_2_OR_MORE_ENEMIES,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_multiclaymore,CHALLENGE_CLAY_MORE,CHALLENGE_KILL_2_OR_MORE_ENEMIES1,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_multifrag,CHALLENGE_MULTIFRAG,CHALLENGE_KILL_2_OR_MORE_ENEMIES2,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_multic4,CHALLENGE_MULTIC4,CHALLENGE_KILL_2_OR_MORE_ENEMIES3,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_collateraldamage,CHALLENGE_COLLATERAL_DAMAGE,CHALLENGE_KILL_2_OR_MORE_ENEMIES4,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_flawless,CHALLENGE_FLAWLESS,CHALLENGE_PLAY_AN_ENTIRE_FULLLENGTH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_fearless,CHALLENGE_FEARLESS,CHALLENGE_KILL_10_ENEMIES_IN_A,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_grouphug,CHALLENGE_GROUPHUG,CHALLENGE_DESC_GROUPHUG,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_nbk,CHALLENGE_NBK,CHALLENGE_DESC_NBK,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_allpro,CHALLENGE_ALLPRO,CHALLENGE_DESC_ALLPRO,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_airborne,CHALLENGE_AIRBORNE,CHALLENGE_GET_A_2_KILL_STREAK_WHILE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_moneyshot,CHALLENGE_MONEYSHOT,CHALLENGE_DESC_MONEYSHOT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_robinhood,CHALLENGE_ROBINHOOD,CHALLENGE_DESC_ROBINHOOD,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_bangforbuck,CHALLENGE_BANGFORBUCK,CHALLENGE_DESC_BANGFORBUCK,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_overdraft,CHALLENGE_OVERDRAFT,CHALLENGE_DESC_OVERDRAFT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_identitytheft,CHALLENGE_IDENTITYTHEFT,CHALLENGE_DESC_IDENTITYTHEFT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_atm,CHALLENGE_ATM,CHALLENGE_DESC_ATM,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_timeismoney,CHALLENGE_TIMEISMONEY,CHALLENGE_DESC_TIMEISMONEY,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_iamrich,CHALLENGE_IAMRICH,CHALLENGE_DESC_IAMRICH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_breakbank,CHALLENGE_BREAKBANK,CHALLENGE_DESC_BREAKBANK,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_colorofmoney,CHALLENGE_COLOROFMONEY,CHALLENGE_DESC_COLOROFMONEY,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_neverforget,CHALLENGE_NEVERFORGET,CHALLENGE_DESC_NEVERFORGET,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_thebrink,CHALLENGE_THE_BRINK,CHALLENGE_GET_A_3_OR_MORE_KILL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_fastswap,CHALLENGE_FAST_SWAP,CHALLENGE_HURT_AN_ENEMY_WITH_A,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_starplayer,CHALLENGE_STAR_PLAYER,CHALLENGE_PLAY_AN_ENTIRE_MATCH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_howthe,CHALLENGE_HOW_THE_,CHALLENGE_KILL_AN_ENEMY_BY_USING,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_dominos,CHALLENGE_DOMINOS,CHALLENGE_KILL_AN_ENEMY_BY_SETTING,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_masterchef,CHALLENGE_MASTER_CHEF,CHALLENGE_KILL_N_ENEMIES_WITH_COOKED,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_invincible,CHALLENGE_INVINCIBLE,CHALLENGE_GET_5_HEALTH_REGENERATIONS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_survivalist,CHALLENGE_SURVIVALIST,CHALLENGE_SURVIVE_FOR_5_CONSECUTIVE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_counterclaymore,CHALLENGE_COUNTERCLAYMORE,CHALLENGE_KILL_N_ENEMIES_BY_SHOOTING,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_counterc4,CHALLENGE_COUNTERC4,CHALLENGE_KILL_N_ENEMIES_BY_SHOOTING1,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_enemyofthestate,CHALLENGE_ENEMYOFTHESTATE,CHALLENGE_DESC_ENEMYOFTHESTATE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_resourceful,CHALLENGE_RESOURCEFUL,CHALLENGE_DESC_RESOURCEFUL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_survivor,CHALLENGE_SURVIVOR,CHALLENGE_DESC_SURVIVOR,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_bothbarrels,CHALLENGE_BOTHBARRELS,CHALLENGE_DESC_BOTHBARRELS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_omnicide,CHALLENGE_OMNICIDE,CHALLENGE_DESC_OMNICIDE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_wargasm,CHALLENGE_WARGASM,CHALLENGE_DESC_WARGASM,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_thebiggertheyare,CHALLENGE_THEBIGGERTHEYARE,CHALLENGE_DESC_THEBIGGERTHEYARE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_thehardertheyfall,CHALLENGE_THEHARDERTHEYFALL,CHALLENGE_DESC_THEHARDERTHEYFALL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_crabmeat,CHALLENGE_CRABMEAT,CHALLENGE_DESC_CRABMEAT,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_wopr,CHALLENGE_WOPR,CHALLENGE_DESC_WOPR,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_thedenier,CHALLENGE_THEDENIER,CHALLENGE_DESC_THEDENIER,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_carpetbomb,CHALLENGE_CARPET_BOMB,CHALLENGE_KILL_5_ENEMIES_WITH_A3,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_redcarpet,CHALLENGE_RED_CARPET,CHALLENGE_DESC_RED_CARPET,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_reaper,CHALLENGE_REAPER,CHALLENGE_DESC_REAPER,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_nosecrets,CHALLENGE_NO_SECRETS,CHALLENGE_CALL_IN_A_UAV_3_TIMES,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_sunblock,CHALLENGE_SUNBLOCK,CHALLENGE_DESC_SUNBLOCK,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_afterburner,CHALLENGE_AFTERBURNER,CHALLENGE_CALL_IN_AN_AIRSTRIKE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_airsuperiority,CHALLENGE_AIR_SUPERIORITY,CHALLENGE_CALL_IN_A_HELICOPTER,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_mgmaster,CHALLENGE_MG_MASTER,CHALLENGE_GET_A_5_KILL_STREAK_WHILE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_slasher,CHALLENGE_SLASHER,CHALLENGE_GET_A_3_MELEE_KILL_STREAK,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_radiationsickness,CHALLENGE_RADIATIONSICKNESS,CHALLENGE_DESC_RADIATIONSICKNESS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_infected,CHALLENGE_INFECTED,CHALLENGE_DESC_INFECTED,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_plague,CHALLENGE_PLAGUE,CHALLENGE_DESC_PLAGUE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_renaissance,CHALLENGE_RENAISSANCE,CHALLENGE_DESC_RENAISSANCE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_theloner,CHALLENGE_THELONER,CHALLENGE_DESC_THELONER,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_6fears7,CHALLENGE_6FEARS7,CHALLENGE_DESC_6FEARS7,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_thenumb,CHALLENGE_THENUMB,CHALLENGE_DESC_THENUMB,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_martyr,CHALLENGE_MARTYR,CHALLENGE_DESC_MARTYR,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_livingdead,CHALLENGE_LIVINGDEAD,CHALLENGE_DESC_LIVINGDEAD,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_sidekick,CHALLENGE_SIDEKICK,CHALLENGE_DESC_SIDEKICK,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_clickclickboom,CHALLENGE_CLICKCLICKBOOM,CHALLENGE_DESC_CLICKCLICKBOOM,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_hijacker,CHALLENGE_HIJACKER,CHALLENGE_DESC_HIJACKER,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_no,CHALLENGE_NO,CHALLENGE_DESC_NO,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_avenger,CHALLENGE_AVENGER,CHALLENGE_DESC_AVENGER,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_victor_dm,CHALLENGE_FREEFORALL_VICTOR,CHALLENGE_PLACE_IN_THE_TOP_3_IN,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_teamplayer,CHALLENGE_TEAM_PLAYER,CHALLENGE_WIN_N_TEAM_DEATHMATCH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_victor_sd,CHALLENGE_SD_VICTOR,CHALLENGE_WIN_N_SEARCH_AND_DESTROY,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_mvp_tdm,CHALLENGE_MVP_TEAM_DEATHMATCH,CHALLENGE_PLAY_TEAM_DEATHMATCH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_teamplayer_hc,CHALLENGE_HARDCORE_TEAM_PLAYER,CHALLENGE_WIN_N_HARDCORE_TEAM_DEATHMATCH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_victor_sab,CHALLENGE_SABOTAGE_VICTOR,CHALLENGE_WIN_N_SABOTAGE_MATCHES,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_mvp_thc,CHALLENGE_MVP_TEAM_HARDCORE,CHALLENGE_WIN_A_TEAM_HARDCORE_MATCH,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_bombdown,CHALLENGE_BOMB_DOWN,CHALLENGE_KILL_THE_BOMB_CARRIER,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_bombdefender,CHALLENGE_BOMB_DEFENDER,CHALLENGE_KILL_A_BOMB_DEFUSER_IN,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_bombplanter,CHALLENGE_BOMB_PLANTER,CHALLENGE_KILL_A_BOMB_PLANTER_IN,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_hero,CHALLENGE_DEFUSER,CHALLENGE_DEFUSE_A_BOMB_IN_SABOTAGE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_lastmanstanding,CHALLENGE_LAST_MAN_STANDING,CHALLENGE_BE_THE_LAST_MAN_STANDING,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_saboteur,CHALLENGE_SABOTEUR,CHALLENGE_DESC_SABOTEUR,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_knifevet,CHALLENGE_KNIFE_VETERAN,CHALLENGE_KILL_N_ENEMY_WITH_THE,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_laststandvet,CHALLENGE_LAST_STAND_VETERAN,CHALLENGE_KILL_N_ENEMY_WHILE_USING,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_stealth,CHALLENGE_STEALTH,CHALLENGE_KILL_N_ENEMIES_SILENCED,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_concussionvet,CHALLENGE_STUN_VETERAN,CHALLENGE_KILL_N_ENEMIES_STILL,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_flashbangvet,CHALLENGE_FLASHBANG_VETERAN,CHALLENGE_KILL_N_ENEMIES_DAZED,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_ak47_mastery,CHALLENGE_AK47_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_fal_mastery,CHALLENGE_FAL_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_famas_mastery,CHALLENGE_FAMAS_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_fn2000_mastery,CHALLENGE_FN2000_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m4_mastery,CHALLENGE_M4_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m16_mastery,CHALLENGE_M16_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_masada_mastery,CHALLENGE_MASADA_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_scar_mastery,CHALLENGE_SCAR_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_tavor_mastery,CHALLENGE_TAVOR_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_mp5k_mastery,CHALLENGE_MP5K_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_uzi_mastery,CHALLENGE_UZI_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_kriss_mastery,CHALLENGE_KRISS_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_ump45_mastery,CHALLENGE_UMP45_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_p90_mastery,CHALLENGE_P90_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m240_mastery,CHALLENGE_M240_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_aug_mastery,CHALLENGE_AUG_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_sa80_mastery,CHALLENGE_SA80_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_rpd_mastery,CHALLENGE_RPD_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_mg4_mastery,CHALLENGE_MG4_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_cheytac_mastery,CHALLENGE_CHEYTAC_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_barrett_mastery,CHALLENGE_BARRETT_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_m21_mastery,CHALLENGE_M21_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
ch_wa2000_mastery,CHALLENGE_WA2000_MASTERY,CHALLENGE_GET_ALL_ATTACHMENTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_ak47,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_ak47,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_fal,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_fal,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_famas,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_famas,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_fn2000,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_fn2000,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_m4,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_m4,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_m16,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_m16,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_masada,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_masada,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_scar,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_scar,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_tavor,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_tavor,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_mp5k,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_mp5k,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_uzi,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_uzi,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_kriss,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_kriss,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_ump45,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_ump45,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_p90,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_p90,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_m240,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_m240,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_aug,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_aug,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_sa80,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_sa80,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_rpd,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_rpd,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_mg4,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_mg4,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_cheytac,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_cheytac,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_barrett,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_barrett,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_m21,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_m21,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_wa2000,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_wa2000,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_glock,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_glock,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_tmp,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_tmp,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_beretta393,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_beretta393,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_pp2000,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_pp2000,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_striker,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_striker,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_aa12,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_aa12,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_m1014,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_m1014,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_spas12,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_spas12,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_ranger,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_ranger,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_model1887,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_model1887,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_usp,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_usp,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_beretta,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_beretta,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_coltanaconda,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_coltanaconda,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_deserteagle,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_deserteagle,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_at4,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_at4,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_rpg,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_rpg,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_javelin,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_javelin,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_m79,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_m79,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_marksman_stinger,#,CHALLENGE_GET_N_KILLS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
||||||
|
pr_expert_stinger,#,CHALLENGE_GET_N_HEADSHOTS,,3.5,0.25,0.75,0.25,1,mp_challenge_complete,,challenge
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -570,6 +570,9 @@
|
||||||
GAMETYPE_BUTTON(10, 1, gtnw)
|
GAMETYPE_BUTTON(10, 1, gtnw)
|
||||||
GAMETYPE_BUTTON(11, 1, oneflag)
|
GAMETYPE_BUTTON(11, 1, oneflag)
|
||||||
GAMETYPE_BUTTON(12, 1, arena)
|
GAMETYPE_BUTTON(12, 1, arena)
|
||||||
|
GAMETYPE_BUTTON(13, 1, conf)
|
||||||
|
GAMETYPE_BUTTON(14, 1, gun)
|
||||||
|
GAMETYPE_BUTTON(15, 1, infect)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
GAMETYPE_BUTTON(1, dm)
|
GAMETYPE_BUTTON(1, dm)
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue