iw6-scripts/maps/mp/killstreaks/_killstreaks.gsc
2024-02-13 13:20:49 +01:00

2363 lines
70 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
initkillstreakdata()
{
var_0 = 1;
for (;;)
{
var_1 = tablelookup( level.global_tables["killstreakTable"].path, level.global_tables["killstreakTable"].index_col, var_0, level.global_tables["killstreakTable"].ref_col );
if ( !isdefined( var_1 ) || var_1 == "" )
break;
var_2 = tablelookup( level.global_tables["killstreakTable"].path, level.global_tables["killstreakTable"].index_col, var_0, level.global_tables["killstreakTable"].ref_col );
var_3 = tablelookupistring( level.global_tables["killstreakTable"].path, level.global_tables["killstreakTable"].index_col, var_0, level.global_tables["killstreakTable"].earned_hint_col );
var_4 = tablelookup( level.global_tables["killstreakTable"].path, level.global_tables["killstreakTable"].index_col, var_0, level.global_tables["killstreakTable"].earned_dialog_col );
game["dialog"][var_2] = var_4;
var_5 = tablelookup( level.global_tables["killstreakTable"].path, level.global_tables["killstreakTable"].index_col, var_0, level.global_tables["killstreakTable"].allies_dialog_col );
game["dialog"]["allies_friendly_" + var_2 + "_inbound"] = "friendly_" + var_5;
game["dialog"]["allies_enemy_" + var_2 + "_inbound"] = "enemy_" + var_5;
var_6 = tablelookup( level.global_tables["killstreakTable"].path, level.global_tables["killstreakTable"].index_col, var_0, level.global_tables["killstreakTable"].enemy_dialog_col );
game["dialog"]["axis_friendly_" + var_2 + "_inbound"] = "friendly_" + var_6;
game["dialog"]["axis_enemy_" + var_2 + "_inbound"] = "enemy_" + var_6;
var_7 = int( tablelookup( level.global_tables["killstreakTable"].path, level.global_tables["killstreakTable"].index_col, var_0, level.global_tables["killstreakTable"].score_col ) );
maps\mp\gametypes\_rank::registerscoreinfo( "killstreak_" + var_2, var_7 );
var_0++;
}
}
onplayerconnect()
{
for (;;)
{
level waittill( "connected", var_0 );
if ( !isdefined( var_0.pers["killstreaks"] ) )
var_0.pers["killstreaks"] = [];
if ( !isdefined( var_0.pers["kID"] ) )
var_0.pers["kID"] = 10;
var_0.lifeid = 0;
var_0.curdefvalue = 0;
if ( isdefined( var_0.pers["deaths"] ) )
var_0.lifeid = var_0.pers["deaths"];
var_0 visionsetmissilecamforplayer( game["thermal_vision"] );
var_0 thread onplayerspawned();
var_0 thread monitordisownkillstreaks();
var_0.spupdatetotal = 0;
}
}
onplayerspawned()
{
self endon( "disconnect" );
if ( maps\mp\_utility::is_aliens() )
return;
for (;;)
{
self waittill( "spawned_player" );
thread killstreakusewaiter();
thread waitforchangeteam();
thread streakselectuptracker();
thread streakselectdowntracker();
if ( level.console )
thread streakusetimetracker();
else
{
thread pc_watchstreakuse();
thread pc_watchgamepad();
}
thread streaknotifytracker();
if ( !isdefined( self.pers["killstreaks"][0] ) )
initplayerkillstreaks();
if ( !isdefined( self.earnedstreaklevel ) )
self.earnedstreaklevel = 0;
if ( game["roundsPlayed"] > 0 && self.adrenaline == 0 )
self.adrenaline = self getcommonplayerdata( "killstreaksState", "count" );
setstreakcounttonext();
updatestreakslots();
if ( self.streaktype == "specialist" )
{
updatespecialistkillstreaks();
continue;
}
giveownedkillstreakitem();
}
}
initplayerkillstreaks()
{
if ( !isdefined( self.streaktype ) )
return;
if ( self.streaktype == "specialist" )
self setcommonplayerdata( "killstreaksState", "isSpecialist", 1 );
else
self setcommonplayerdata( "killstreaksState", "isSpecialist", 0 );
var_0 = spawnstruct();
var_0.available = 0;
var_0.streakname = undefined;
var_0.earned = 0;
var_0.awardxp = undefined;
var_0.owner = undefined;
var_0.kid = undefined;
var_0.lifeid = undefined;
var_0.isgimme = 1;
var_0.isspecialist = 0;
var_0.nextslot = undefined;
self.pers["killstreaks"][0] = var_0;
for ( var_1 = 1; var_1 < 4; var_1++ )
{
var_2 = spawnstruct();
var_2.available = 0;
var_2.streakname = undefined;
var_2.earned = 1;
var_2.awardxp = 1;
var_2.owner = undefined;
var_2.kid = undefined;
var_2.lifeid = -1;
var_2.isgimme = 0;
var_2.isspecialist = 0;
self.pers["killstreaks"][var_1] = var_2;
}
var_3 = spawnstruct();
var_3.available = 0;
var_3.streakname = "all_perks_bonus";
var_3.earned = 1;
var_3.awardxp = 0;
var_3.owner = undefined;
var_3.kid = undefined;
var_3.lifeid = -1;
var_3.isgimme = 0;
var_3.isspecialist = 1;
self.pers["killstreaks"][4] = var_3;
for ( var_1 = 0; var_1 < 4; var_1++ )
{
self setcommonplayerdata( "killstreaksState", "icons", var_1, 0 );
self setcommonplayerdata( "killstreaksState", "hasStreak", var_1, 0 );
}
self setcommonplayerdata( "killstreaksState", "hasStreak", 0, 0 );
var_4 = 1;
foreach ( var_6 in self.killstreaks )
{
var_7 = self.pers["killstreaks"][var_4];
var_7.streakname = var_6;
var_7.isspecialist = self.streaktype == "specialist";
var_8 = var_7.streakname;
if ( self.streaktype == "specialist" )
{
var_9 = strtok( var_7.streakname, "_" );
if ( var_9[var_9.size - 1] == "ks" )
{
var_10 = undefined;
foreach ( var_12 in var_9 )
{
if ( var_12 != "ks" )
{
if ( !isdefined( var_10 ) )
{
var_10 = var_12;
continue;
}
var_10 = var_10 + ( "_" + var_12 );
}
}
if ( maps\mp\_utility::isstrstart( var_7.streakname, "_" ) )
var_10 = "_" + var_10;
if ( isdefined( var_10 ) && maps\mp\gametypes\_class::getperkupgrade( var_10 ) != "specialty_null" )
var_8 = var_7.streakname + "_pro";
}
}
self setcommonplayerdata( "killstreaksState", "icons", var_4, maps\mp\_utility::getkillstreakindex( var_8 ) );
self setcommonplayerdata( "killstreaksState", "hasStreak", var_4, 0 );
var_4++;
}
self setcommonplayerdata( "killstreaksState", "nextIndex", 1 );
self setcommonplayerdata( "killstreaksState", "selectedIndex", -1 );
self setcommonplayerdata( "killstreaksState", "numAvailable", 0 );
self setcommonplayerdata( "killstreaksState", "hasStreak", 4, 0 );
}
updatestreakcount()
{
if ( !isdefined( self.pers["killstreaks"] ) )
return;
if ( self.adrenaline == self.previousadrenaline )
return;
var_0 = self.adrenaline;
self setcommonplayerdata( "killstreaksState", "count", self.adrenaline );
if ( self.adrenaline >= self getcommonplayerdata( "killstreaksState", "countToNext" ) )
setstreakcounttonext();
}
resetstreakcount()
{
self setcommonplayerdata( "killstreaksState", "count", 0 );
setstreakcounttonext();
}
setstreakcounttonext()
{
if ( !isdefined( self.streaktype ) )
{
self setcommonplayerdata( "killstreaksState", "countToNext", 0 );
return;
}
if ( getmaxstreakcost() == 0 )
{
self setcommonplayerdata( "killstreaksState", "countToNext", 0 );
return;
}
if ( self.streaktype == "specialist" )
{
if ( self.adrenaline >= getmaxstreakcost() )
return;
}
var_0 = getnextstreakname();
if ( !isdefined( var_0 ) )
return;
var_1 = getstreakcost( var_0 );
self setcommonplayerdata( "killstreaksState", "countToNext", var_1 );
}
getnextstreakname()
{
if ( self.adrenaline == getmaxstreakcost() && self.streaktype != "specialist" )
var_0 = 0;
else
var_0 = self.adrenaline;
foreach ( var_2 in self.killstreaks )
{
var_3 = getstreakcost( var_2 );
if ( var_3 > var_0 )
return var_2;
}
return undefined;
}
getmaxstreakcost()
{
var_0 = 0;
foreach ( var_2 in self.killstreaks )
{
var_3 = getstreakcost( var_2 );
if ( var_3 > var_0 )
var_0 = var_3;
}
return var_0;
}
updatestreakslots()
{
if ( !isdefined( self.streaktype ) )
return;
if ( !maps\mp\_utility::isreallyalive( self ) )
return;
var_0 = self.pers["killstreaks"];
var_1 = 0;
for ( var_2 = 0; var_2 < 4; var_2++ )
{
if ( isdefined( var_0[var_2] ) && isdefined( var_0[var_2].streakname ) )
{
self setcommonplayerdata( "killstreaksState", "hasStreak", var_2, var_0[var_2].available );
if ( var_0[var_2].available == 1 )
var_1++;
if ( isdefined( level.removekillstreakicons ) && level.removekillstreakicons && !var_0[var_2].available )
self setcommonplayerdata( "killstreaksState", "icons", var_2, 0 );
}
}
if ( self.streaktype != "specialist" )
self setcommonplayerdata( "killstreaksState", "numAvailable", var_1 );
var_3 = self.earnedstreaklevel;
var_4 = getmaxstreakcost();
if ( self.earnedstreaklevel == var_4 && self.streaktype != "specialist" )
var_3 = 0;
var_5 = 1;
foreach ( var_7 in self.killstreaks )
{
var_8 = getstreakcost( var_7 );
if ( var_8 > var_3 )
{
var_9 = var_7;
break;
}
if ( self.streaktype == "specialist" )
{
if ( self.earnedstreaklevel == var_4 )
break;
}
var_5++;
}
self setcommonplayerdata( "killstreaksState", "nextIndex", var_5 );
if ( isdefined( self.killstreakindexweapon ) && self.streaktype != "specialist" )
self setcommonplayerdata( "killstreaksState", "selectedIndex", self.killstreakindexweapon );
else if ( self.streaktype == "specialist" && var_0[0].available )
self setcommonplayerdata( "killstreaksState", "selectedIndex", 0 );
else
self setcommonplayerdata( "killstreaksState", "selectedIndex", -1 );
}
waitforchangeteam()
{
self endon( "disconnect" );
self endon( "faux_spawn" );
self notify( "waitForChangeTeam" );
self endon( "waitForChangeTeam" );
for (;;)
{
self waittill( "joined_team" );
clearkillstreaks();
}
}
killstreakusepressed()
{
var_0 = self.pers["killstreaks"];
var_1 = var_0[self.killstreakindexweapon].streakname;
var_2 = var_0[self.killstreakindexweapon].lifeid;
var_3 = var_0[self.killstreakindexweapon].earned;
var_4 = var_0[self.killstreakindexweapon].awardxp;
var_5 = var_0[self.killstreakindexweapon].kid;
var_6 = var_0[self.killstreakindexweapon].isgimme;
if ( !maps\mp\_utility::validateusestreak() )
return 0;
if ( !self [[ level.killstreakfuncs[var_1] ]]( var_2, var_1 ) )
return 0;
thread updatekillstreaks();
usedkillstreak( var_1, var_4 );
return 1;
}
usedkillstreak( var_0, var_1 )
{
if ( var_1 )
{
self thread [[ level.onxpevent ]]( "killstreak_" + var_0 );
thread maps\mp\gametypes\_missions::usehardpoint( var_0 );
}
var_2 = maps\mp\_awards::getkillstreakawardref( var_0 );
if ( isdefined( var_2 ) )
thread maps\mp\_utility::incplayerstat( var_2, 1 );
if ( maps\mp\_utility::isassaultkillstreak( var_0 ) )
thread maps\mp\_utility::incplayerstat( "assaultkillstreaksused", 1 );
else if ( maps\mp\_utility::issupportkillstreak( var_0 ) )
thread maps\mp\_utility::incplayerstat( "supportkillstreaksused", 1 );
else if ( maps\mp\_utility::isspecialistkillstreak( var_0 ) )
{
thread maps\mp\_utility::incplayerstat( "specialistkillstreaksearned", 1 );
return;
}
var_3 = self.team;
if ( level.teambased )
{
thread maps\mp\_utility::leaderdialog( var_3 + "_friendly_" + var_0 + "_inbound", var_3 );
if ( maps\mp\_utility::getkillstreakenemyusedialog( var_0 ) )
{
if ( playenemydialog( var_0 ) )
thread maps\mp\_utility::leaderdialog( var_3 + "_enemy_" + var_0 + "_inbound", level.otherteam[var_3] );
}
}
else
{
thread maps\mp\_utility::leaderdialogonplayer( var_3 + "_friendly_" + var_0 + "_inbound" );
if ( maps\mp\_utility::getkillstreakenemyusedialog( var_0 ) )
{
var_4[0] = self;
if ( playenemydialog( var_0 ) )
thread maps\mp\_utility::leaderdialog( var_3 + "_enemy_" + var_0 + "_inbound", undefined, undefined, var_4 );
}
}
}
playenemydialog( var_0 )
{
if ( !maps\mp\_utility::is_aliens() )
{
if ( level.teambased && var_0 == "uplink" && [[ level.comexpfuncs["getRadarStrengthForTeam"] ]]( self.team ) != 1 )
return 0;
else if ( !level.teambased && var_0 == "uplink" && [[ level.comexpfuncs["getRadarStrengthForPlayer"] ]]( self ) != 2 )
return 0;
}
return 1;
}
updatekillstreaks( var_0 )
{
if ( isai( self ) && !isdefined( self.killstreakindexweapon ) )
return;
if ( !isdefined( var_0 ) )
{
self.pers["killstreaks"][self.killstreakindexweapon].available = 0;
if ( self.killstreakindexweapon == 0 )
{
self.pers["killstreaks"][self.pers["killstreaks"][0].nextslot] = undefined;
var_1 = undefined;
var_2 = undefined;
var_3 = self.pers["killstreaks"];
for ( var_4 = 5; var_4 < var_3.size; var_4++ )
{
if ( !isdefined( var_3[var_4] ) || !isdefined( var_3[var_4].streakname ) )
continue;
var_1 = var_3[var_4].streakname;
var_2 = var_3[var_4].kid;
var_3[0].nextslot = var_4;
}
if ( isdefined( var_1 ) )
{
var_3[0].available = 1;
var_3[0].streakname = var_1;
var_3[0].kid = var_2;
var_5 = maps\mp\_utility::getkillstreakindex( var_1 );
self setcommonplayerdata( "killstreaksState", "icons", 0, var_5 );
if ( !level.console && !common_scripts\utility::is_player_gamepad_enabled() )
{
var_6 = maps\mp\_utility::getkillstreakweapon( var_1 );
maps\mp\_utility::_setactionslot( 4, "weapon", var_6 );
}
}
}
}
var_7 = undefined;
if ( self.streaktype == "specialist" )
{
if ( self.pers["killstreaks"][0].available )
var_7 = 0;
}
else
{
for ( var_4 = 0; var_4 < 4; var_4++ )
{
var_8 = self.pers["killstreaks"][var_4];
if ( isdefined( var_8 ) && isdefined( var_8.streakname ) && var_8.available )
var_7 = var_4;
}
}
if ( isdefined( var_7 ) )
{
if ( level.console || common_scripts\utility::is_player_gamepad_enabled() )
{
self.killstreakindexweapon = var_7;
self.pers["lastEarnedStreak"] = self.pers["killstreaks"][var_7].streakname;
giveselectedkillstreakitem();
}
else
{
for ( var_4 = 0; var_4 < 4; var_4++ )
{
var_8 = self.pers["killstreaks"][var_4];
if ( isdefined( var_8 ) && isdefined( var_8.streakname ) && var_8.available )
{
var_6 = maps\mp\_utility::getkillstreakweapon( var_8.streakname );
var_9 = self getweaponslistitems();
var_10 = 0;
for ( var_11 = 0; var_11 < var_9.size; var_11++ )
{
if ( var_6 == var_9[var_11] )
{
var_10 = 1;
break;
}
}
if ( !var_10 )
maps\mp\_utility::_giveweapon( var_6 );
else if ( issubstr( var_6, "airdrop_" ) )
self setweaponammoclip( var_6, 1 );
maps\mp\_utility::_setactionslot( var_4 + 4, "weapon", var_6 );
}
}
self.killstreakindexweapon = undefined;
self.pers["lastEarnedStreak"] = self.pers["killstreaks"][var_7].streakname;
updatestreakslots();
}
}
else
{
self.killstreakindexweapon = undefined;
self.pers["lastEarnedStreak"] = undefined;
updatestreakslots();
}
}
clearkillstreaks()
{
var_0 = self.pers["killstreaks"];
if ( !isdefined( var_0 ) )
return;
for ( var_1 = var_0.size - 1; var_1 > -1; var_1-- )
self.pers["killstreaks"][var_1] = undefined;
initplayerkillstreaks();
resetadrenaline();
self.killstreakindexweapon = undefined;
updatestreakslots();
}
updatespecialistkillstreaks()
{
if ( self.adrenaline == 0 )
{
for ( var_0 = 1; var_0 < 4; var_0++ )
{
if ( isdefined( self.pers["killstreaks"][var_0] ) )
{
self.pers["killstreaks"][var_0].available = 0;
self setcommonplayerdata( "killstreaksState", "hasStreak", var_0, 0 );
}
}
self setcommonplayerdata( "killstreaksState", "nextIndex", 1 );
self setcommonplayerdata( "killstreaksState", "hasStreak", 4, 0 );
}
else
{
for ( var_0 = 1; var_0 < 4; var_0++ )
{
var_1 = self.pers["killstreaks"][var_0];
if ( isdefined( var_1 ) && isdefined( var_1.streakname ) && var_1.available )
{
var_2 = getstreakcost( var_1.streakname );
if ( var_2 > self.adrenaline )
{
self.pers["killstreaks"][var_0].available = 0;
self setcommonplayerdata( "killstreaksState", "hasStreak", var_0, 0 );
continue;
}
if ( self.adrenaline >= var_2 )
{
if ( self getcommonplayerdata( "killstreaksState", "hasStreak", var_0 ) )
{
self [[ level.killstreakfuncs[var_1.streakname] ]]( undefined, var_1.streakname );
continue;
}
givekillstreak( var_1.streakname, var_1.earned, 0, self );
}
}
}
var_3 = getmaxstreakcost();
if ( isai( self ) )
var_3 = self.pers["specialistStreakKills"][2];
var_4 = int( max( 8, var_3 + 2 ) );
if ( maps\mp\_utility::_hasperk( "specialty_hardline" ) )
var_4--;
if ( self.adrenaline >= var_4 )
{
self setcommonplayerdata( "killstreaksState", "hasStreak", 4, 1 );
givebonusperks();
}
else
self setcommonplayerdata( "killstreaksState", "hasStreak", 4, 0 );
}
if ( self.pers["killstreaks"][0].available )
{
var_5 = self.pers["killstreaks"][0].streakname;
var_6 = maps\mp\_utility::getkillstreakweapon( var_5 );
if ( level.console || common_scripts\utility::is_player_gamepad_enabled() )
{
givekillstreakweapon( var_6 );
self.killstreakindexweapon = 0;
}
else
{
maps\mp\_utility::_giveweapon( var_6 );
maps\mp\_utility::_setactionslot( 4, "weapon", var_6 );
self.killstreakindexweapon = undefined;
}
}
}
getfirstprimaryweapon()
{
var_0 = self getweaponslistprimaries();
return var_0[0];
}
istryingtousekillstreakingimmeslot()
{
return isdefined( self.tryingtouseks ) && self.tryingtouseks && isdefined( self.killstreakindexweapon ) && self.killstreakindexweapon == 0;
}
istryingtousekillstreakslot()
{
return isdefined( self.tryingtouseks ) && self.tryingtouseks && isdefined( self.killstreakindexweapon );
}
waitforkillstreakweaponswitchstarted()
{
self endon( "weapon_switch_invalid" );
self waittill( "weapon_switch_started", var_0 );
self notify( "killstreak_weapon_change", "switch_started", var_0 );
}
waitforkillstreakweaponswitchinvalid()
{
self endon( "weapon_switch_started" );
self waittill( "weapon_switch_invalid", var_0 );
self notify( "killstreak_weapon_change", "switch_invalid", var_0 );
}
waitforkillstreakweaponchange()
{
childthread waitforkillstreakweaponswitchstarted();
childthread waitforkillstreakweaponswitchinvalid();
self waittill( "killstreak_weapon_change", var_0, var_1 );
if ( var_0 == "switch_started" )
return var_1;
var_2 = maps\mp\_utility::getkillstreakweapon( self.pers["killstreaks"][self.killstreakindexweapon].streakname );
self switchtoweapon( var_2 );
waittillframeend;
var_3 = undefined;
if ( isdefined( self.changingweapon ) )
var_3 = self.changingweapon;
else
self waittill( "weapon_switch_started", var_3 );
if ( var_3 != var_2 )
return undefined;
return var_2;
}
killstreakusewaiter()
{
self endon( "disconnect" );
self endon( "finish_death" );
self endon( "joined_team" );
self endon( "faux_spawn" );
self endon( "spawned" );
level endon( "game_ended" );
self notify( "killstreakUseWaiter" );
self endon( "killstreakUseWaiter" );
self.lastkillstreak = 0;
if ( !isdefined( self.pers["lastEarnedStreak"] ) )
self.pers["lastEarnedStreak"] = undefined;
thread finishdeathwaiter();
var_0 = [ "streakUsed", "streakUsed1", "streakUsed2", "streakUsed3", "streakUsed4" ];
for (;;)
{
self.tryingtouseks = undefined;
var_1 = common_scripts\utility::waittill_any_in_array_return_no_endon_death( var_0 );
self.tryingtouseks = 1;
waittillframeend;
if ( !isdefined( self.killstreakindexweapon ) || !isdefined( self.pers["killstreaks"][self.killstreakindexweapon] ) || !isdefined( self.pers["killstreaks"][self.killstreakindexweapon].streakname ) )
continue;
if ( !maps\mp\_utility::cancustomjuggusekillstreak( self.pers["killstreaks"][self.killstreakindexweapon].streakname ) )
{
maps\mp\_utility::printcustomjuggkillstreakerrormsg();
if ( var_1 != "streakUsed" )
{
var_2 = self getcurrentweapon();
maps\mp\_utility::switch_to_last_weapon( var_2 );
}
continue;
}
if ( self isoffhandweaponreadytothrow() )
continue;
if ( isdefined( self.changingweapon ) )
var_3 = self.changingweapon;
else
self waittill( "weapon_switch_started", var_3 );
var_4 = maps\mp\_utility::getkillstreakweapon( self.pers["killstreaks"][self.killstreakindexweapon].streakname );
if ( var_3 != var_4 )
{
thread removeunitializedkillstreakweapon();
continue;
}
beginkillstreakweaponswitch();
if ( var_3 != self getcurrentweapon() )
{
thread killstreakwaitforweaponchange();
var_5 = common_scripts\utility::waittill_any_timeout_no_endon_death( 1.5, "ks_weapon_change", "ks_alt_weapon_change" );
if ( var_5 == "ks_alt_weapon_change" )
self waittill( "weapon_change", var_3, var_6 );
else
var_3 = self getcurrentweapon();
}
if ( !isalive( self ) )
{
endkillstreakweaponswitch();
continue;
}
if ( var_3 != var_4 )
{
var_7 = self.lastdroppableweapon;
if ( maps\mp\_utility::iskillstreakweapon( var_3 ) )
{
if ( maps\mp\_utility::isjuggernaut() && maps\mp\_utility::isjuggernautweapon( var_3 ) )
var_7 = var_3;
else if ( var_3 == "iw6_gm6helisnipe_mp_gm6scope" )
var_7 = var_3;
else
self takeweapon( var_3 );
}
self switchtoweapon( var_7 );
endkillstreakweaponswitch();
continue;
}
self.ks_abouttouse = 1;
waittillframeend;
self.ks_abouttouse = undefined;
var_8 = self.pers["killstreaks"][self.killstreakindexweapon].streakname;
var_9 = self.pers["killstreaks"][self.killstreakindexweapon].isgimme;
endkillstreakweaponswitch();
var_5 = killstreakusepressed();
beginkillstreakweaponswitch();
var_2 = common_scripts\utility::getlastweapon();
if ( !self hasweapon( var_2 ) )
{
if ( maps\mp\_utility::isreallyalive( self ) )
var_2 = getfirstprimaryweapon();
else
maps\mp\_utility::_giveweapon( var_2 );
}
if ( var_5 )
thread waittakekillstreakweapon( var_4, var_2 );
if ( shouldswitchweaponpostkillstreak( var_5, var_8 ) )
maps\mp\_utility::switch_to_last_weapon( var_2 );
var_10 = self getcurrentweapon();
while ( var_10 != var_2 )
self waittill( "weapon_change", var_10 );
endkillstreakweaponswitch();
}
}
removeunitializedkillstreakweapon()
{
self notify( "removeUnitializedKillstreakWeapon" );
self endon( "removeUnitializedKillstreakWeapon" );
self endon( "death" );
self endon( "disconnect" );
self waittill( "weapon_change", var_0 );
var_1 = isdefined( self.killstreakindexweapon ) && isdefined( self.pers["killstreaks"] ) && isdefined( self.pers["killstreaks"][self.killstreakindexweapon] ) && isdefined( self.pers["killstreaks"][self.killstreakindexweapon].streakname ) && var_0 == maps\mp\_utility::getkillstreakweapon( self.pers["killstreaks"][self.killstreakindexweapon].streakname );
if ( var_1 && !isdefined( self.ks_abouttouse ) )
{
self takeweapon( var_0 );
maps\mp\_utility::_giveweapon( var_0, 0 );
maps\mp\_utility::_setactionslot( 4, "weapon", var_0 );
var_2 = common_scripts\utility::getlastweapon();
if ( !self hasweapon( var_2 ) )
var_2 = getfirstprimaryweapon();
if ( isdefined( var_2 ) )
maps\mp\_utility::switch_to_last_weapon( var_2 );
}
}
beginkillstreakweaponswitch()
{
common_scripts\utility::_disableweaponswitch();
common_scripts\utility::_disableusability();
thread killstreakweaponswitchwatchhostmigration();
}
endkillstreakweaponswitch()
{
self notify( "endKillstreakWeaponSwitch" );
common_scripts\utility::_enableweaponswitch();
common_scripts\utility::_enableusability();
}
killstreakwaitforweaponchange()
{
self waittill( "weapon_change", var_0, var_1 );
if ( !var_1 )
self notify( "ks_weapon_change" );
else
self notify( "ks_alt_weapon_change" );
}
killstreakweaponswitchwatchhostmigration()
{
self endon( "death" );
level endon( "game_ended" );
self endon( "endKillstreakWeaponSwitch" );
level waittill( "host_migration_end" );
if ( isdefined( self ) )
self enableweaponswitch();
}
waittakekillstreakweapon( var_0, var_1 )
{
self endon( "disconnect" );
self endon( "finish_death" );
self endon( "joined_team" );
level endon( "game_ended" );
self notify( "waitTakeKillstreakWeapon" );
self endon( "waitTakeKillstreakWeapon" );
var_2 = self getcurrentweapon() == "none";
self waittill( "weapon_change", var_3 );
if ( var_3 == var_1 )
{
takekillstreakweaponifnodupe( var_0 );
if ( !level.console && !common_scripts\utility::is_player_gamepad_enabled() )
self.killstreakindexweapon = undefined;
}
else if ( var_3 != var_0 )
thread waittakekillstreakweapon( var_0, var_1 );
else if ( var_2 && self getcurrentweapon() == var_0 )
thread waittakekillstreakweapon( var_0, var_1 );
}
takekillstreakweaponifnodupe( var_0 )
{
var_1 = 0;
var_2 = self.pers["killstreaks"];
for ( var_3 = 0; var_3 < var_2.size; var_3++ )
{
if ( isdefined( var_2[var_3] ) && isdefined( var_2[var_3].streakname ) && var_2[var_3].available )
{
if ( !maps\mp\_utility::isspecialistkillstreak( var_2[var_3].streakname ) && var_0 == maps\mp\_utility::getkillstreakweapon( var_2[var_3].streakname ) )
{
var_1 = 1;
break;
}
}
}
if ( var_1 )
{
if ( level.console || common_scripts\utility::is_player_gamepad_enabled() )
{
if ( isdefined( self.killstreakindexweapon ) && var_0 != maps\mp\_utility::getkillstreakweapon( var_2[self.killstreakindexweapon].streakname ) )
self takeweapon( var_0 );
else if ( isdefined( self.killstreakindexweapon ) && var_0 == maps\mp\_utility::getkillstreakweapon( var_2[self.killstreakindexweapon].streakname ) )
{
self takeweapon( var_0 );
maps\mp\_utility::_giveweapon( var_0, 0 );
maps\mp\_utility::_setactionslot( 4, "weapon", var_0 );
}
}
else
{
self takeweapon( var_0 );
maps\mp\_utility::_giveweapon( var_0, 0 );
}
}
else
{
if ( var_0 == "" )
return;
self takeweapon( var_0 );
}
}
shouldswitchweaponpostkillstreak( var_0, var_1 )
{
if ( !var_0 )
return 1;
if ( maps\mp\_utility::isridekillstreak( var_1 ) )
return 0;
return 1;
}
finishdeathwaiter()
{
self endon( "disconnect" );
level endon( "game_ended" );
self notify( "finishDeathWaiter" );
self endon( "finishDeathWaiter" );
self waittill( "death" );
wait 0.05;
self notify( "finish_death" );
self.pers["lastEarnedStreak"] = undefined;
}
checkstreakreward()
{
foreach ( var_1 in self.killstreaks )
{
var_2 = getstreakcost( var_1 );
if ( var_2 > self.adrenaline )
break;
if ( self.previousadrenaline < var_2 && self.adrenaline >= var_2 )
{
earnkillstreak( var_1, var_2 );
break;
}
}
}
killstreakearned( var_0 )
{
var_1 = "assault";
switch ( self.streaktype )
{
case "assault":
var_1 = "assaultStreaks";
break;
case "support":
var_1 = "supportStreaks";
break;
case "specialist":
var_1 = "specialistStreaks";
break;
}
if ( isdefined( self.class_num ) )
{
if ( self getcacplayerdata( "loadouts", self.class_num, var_1, 0 ) == var_0 )
self.firstkillstreakearned = gettime();
else if ( self getcacplayerdata( "loadouts", self.class_num, var_1, 2 ) == var_0 && isdefined( self.firstkillstreakearned ) )
{
if ( gettime() - self.firstkillstreakearned < 20000 )
thread maps\mp\gametypes\_missions::genericchallenge( "wargasm" );
}
}
}
earnkillstreak( var_0, var_1 )
{
level notify( "gave_killstreak", var_0 );
self.earnedstreaklevel = var_1;
if ( !level.gameended )
{
var_2 = undefined;
if ( self.streaktype == "specialist" )
{
var_3 = getsubstr( var_0, 0, var_0.size - 3 );
if ( maps\mp\gametypes\_class::isperkupgraded( var_3 ) )
var_2 = "pro";
}
thread maps\mp\gametypes\_hud_message::killstreaksplashnotify( var_0, var_1, var_2 );
if ( maps\mp\_utility::bot_is_fireteam_mode() )
{
if ( isdefined( var_2 ) )
self notify( "bot_killstreak_earned", var_0 + "_" + var_2, var_1 );
else
self notify( "bot_killstreak_earned", var_0, var_1 );
}
}
thread killstreakearned( var_0 );
self.pers["lastEarnedStreak"] = var_0;
setstreakcounttonext();
givekillstreak( var_0, 1, 1 );
}
givekillstreak( var_0, var_1, var_2, var_3, var_4, var_5 )
{
self endon( "joined_team" );
self endon( "givingLoadout" );
self endon( "disconnect" );
if ( !isdefined( var_5 ) )
{
var_5 = self.pers["kID"];
self.pers["kID"]++;
}
if ( !isdefined( level.killstreakfuncs[var_0] ) )
return;
if ( self.team == "spectator" )
return;
var_6 = undefined;
if ( !isdefined( var_1 ) || var_1 == 0 )
{
if ( isdefined( var_4 ) )
var_7 = var_4;
else
var_7 = self.pers["killstreaks"].size;
if ( !isdefined( self.pers["killstreaks"][var_7] ) )
self.pers["killstreaks"][var_7] = spawnstruct();
var_8 = 1;
if ( var_7 > 5 && istryingtousekillstreakingimmeslot() )
{
var_8 = 0;
var_9 = var_7;
var_10 = var_7 - 1;
var_11 = self.pers["killstreaks"][var_10];
var_12 = self.pers["killstreaks"][var_9];
var_12.available = var_11.available;
var_12.streakname = var_11.streakname;
var_12.earned = var_11.earned;
var_12.awardxp = var_11.awardxp;
var_12.owner = var_11.owner;
var_12.kid = var_11.kid;
var_12.lifeid = var_11.lifeid;
var_12.isgimme = var_11.isgimme;
var_12.isspecialist = var_11.isspecialist;
var_7 = var_10;
}
var_13 = self.pers["killstreaks"][var_7];
var_13.available = 0;
var_13.streakname = var_0;
var_13.earned = 0;
var_13.awardxp = isdefined( var_2 ) && var_2;
var_13.owner = var_3;
var_13.kid = var_5;
var_13.lifeid = -1;
var_13.isgimme = 1;
var_13.isspecialist = 0;
if ( !var_8 )
{
self.pers["killstreaks"][0].nextslot = var_7 + 1;
return;
}
if ( !isdefined( var_4 ) )
var_4 = 0;
self.pers["killstreaks"][var_4].nextslot = var_7;
self.pers["killstreaks"][var_4].streakname = var_0;
var_6 = var_4;
var_14 = maps\mp\_utility::getkillstreakindex( var_0 );
self setcommonplayerdata( "killstreaksState", "icons", var_4, var_14 );
}
else
{
for ( var_15 = 1; var_15 < 4; var_15++ )
{
var_16 = self.pers["killstreaks"][var_15];
if ( isdefined( var_16 ) && isdefined( var_16.streakname ) && var_0 == var_16.streakname )
{
var_6 = var_15;
break;
}
}
if ( !isdefined( var_6 ) )
return;
}
var_17 = self.pers["killstreaks"][var_6];
var_17.available = 1;
var_17.earned = isdefined( var_1 ) && var_1;
var_17.awardxp = isdefined( var_2 ) && var_2;
var_17.owner = var_3;
var_17.kid = var_5;
if ( !var_17.earned )
var_17.lifeid = -1;
else
var_17.lifeid = self.pers["deaths"];
if ( self.streaktype == "specialist" && var_6 != 0 )
{
var_17.isspecialist = 1;
if ( isdefined( level.killstreakfuncs[var_0] ) )
self [[ level.killstreakfuncs[var_0] ]]( -1, var_0 );
usedkillstreak( var_0, var_2 );
}
else if ( level.console || common_scripts\utility::is_player_gamepad_enabled() )
{
var_18 = maps\mp\_utility::getkillstreakweapon( var_0 );
givekillstreakweapon( var_18 );
if ( isdefined( self.killstreakindexweapon ) )
{
var_0 = self.pers["killstreaks"][self.killstreakindexweapon].streakname;
var_19 = maps\mp\_utility::getkillstreakweapon( var_0 );
if ( !isholdingweapon( var_19 ) )
self.killstreakindexweapon = var_6;
}
else
self.killstreakindexweapon = var_6;
}
else
{
if ( 0 == var_6 && self.pers["killstreaks"][0].nextslot > 5 )
{
var_20 = self.pers["killstreaks"][0].nextslot - 1;
var_21 = maps\mp\_utility::getkillstreakweapon( self.pers["killstreaks"][var_20].streakname );
self takeweapon( var_21 );
}
var_19 = maps\mp\_utility::getkillstreakweapon( var_0 );
maps\mp\_utility::_giveweapon( var_19, 0 );
var_22 = 1;
if ( isdefined( self.killstreakindexweapon ) )
{
var_0 = self.pers["killstreaks"][self.killstreakindexweapon].streakname;
var_19 = maps\mp\_utility::getkillstreakweapon( var_0 );
var_22 = !isholdingweapon( var_19 ) && self getcurrentweapon() != "none";
}
if ( var_22 )
maps\mp\_utility::_setactionslot( var_6 + 4, "weapon", var_19 );
else
{
maps\mp\_utility::_setactionslot( var_6 + 4, "" );
self.actionslotenabled[var_6] = 0;
}
}
updatestreakslots();
if ( isdefined( level.killstreaksetupfuncs[var_0] ) )
self [[ level.killstreaksetupfuncs[var_0] ]]();
if ( isdefined( var_1 ) && var_1 && isdefined( var_2 ) && var_2 )
self notify( "received_earned_killstreak" );
}
givekillstreakweapon( var_0 )
{
self endon( "disconnect" );
if ( !level.console && !common_scripts\utility::is_player_gamepad_enabled() )
return;
var_1 = maps\mp\_utility::getkillstreakreferencebyweapon( var_0 );
if ( !maps\mp\_utility::cancustomjuggusekillstreak( var_1 ) )
maps\mp\_utility::_setactionslot( 4, "" );
else
{
var_2 = self getweaponslistitems();
foreach ( var_4 in var_2 )
{
if ( !maps\mp\_utility::isstrstart( var_4, "killstreak_" ) && !maps\mp\_utility::isstrstart( var_4, "airdrop_" ) && !maps\mp\_utility::isstrstart( var_4, "deployable_" ) )
continue;
if ( isholdingweapon( var_4 ) )
continue;
while ( maps\mp\_utility::ischangingweapon() )
wait 0.05;
self takeweapon( var_4 );
}
if ( isdefined( self.killstreakindexweapon ) )
{
var_1 = self.pers["killstreaks"][self.killstreakindexweapon].streakname;
var_6 = maps\mp\_utility::getkillstreakweapon( var_1 );
if ( !isholdingweapon( var_6 ) )
{
if ( var_0 != "" )
{
maps\mp\_utility::_giveweapon( var_0, 0 );
maps\mp\_utility::_setactionslot( 4, "weapon", var_0 );
return;
}
return;
}
return;
}
maps\mp\_utility::_giveweapon( var_0, 0 );
maps\mp\_utility::_setactionslot( 4, "weapon", var_0 );
}
}
isholdingweapon( var_0 )
{
return self getcurrentweapon() == var_0 || isdefined( self.changingweapon ) && self.changingweapon == var_0;
}
getstreakcost( var_0 )
{
var_1 = int( maps\mp\_utility::getkillstreakkills( var_0 ) );
if ( isdefined( self ) && isplayer( self ) )
{
if ( maps\mp\_utility::isspecialistkillstreak( var_0 ) )
{
if ( isdefined( self.pers["gamemodeLoadout"] ) )
{
if ( isdefined( self.pers["gamemodeLoadout"]["loadoutKillstreak1"] ) && self.pers["gamemodeLoadout"]["loadoutKillstreak1"] == var_0 )
var_1 = 2;
else if ( isdefined( self.pers["gamemodeLoadout"]["loadoutKillstreak2"] ) && self.pers["gamemodeLoadout"]["loadoutKillstreak2"] == var_0 )
var_1 = 4;
else if ( isdefined( self.pers["gamemodeLoadout"]["loadoutKillstreak3"] ) && self.pers["gamemodeLoadout"]["loadoutKillstreak3"] == var_0 )
var_1 = 6;
else
{
}
}
else if ( issubstr( self.curclass, "custom" ) )
{
for ( var_2 = 0; var_2 < 3; var_2++ )
{
var_3 = self getcacplayerdata( "loadouts", self.class_num, "specialistStreaks", var_2 );
if ( var_3 == var_0 )
break;
}
var_1 = self getcacplayerdata( "loadouts", self.class_num, "specialistStreakKills", var_2 );
}
else if ( issubstr( self.curclass, "callback" ) )
{
var_2 = 0;
foreach ( var_2, var_5 in self.pers["specialistStreaks"] )
{
if ( var_5 == var_0 )
break;
}
var_1 = self.pers["specialistStreakKills"][var_2];
}
else if ( issubstr( self.curclass, "axis" ) || issubstr( self.curclass, "allies" ) )
{
var_2 = 0;
var_6 = "none";
if ( issubstr( self.curclass, "axis" ) )
var_6 = "axis";
else if ( issubstr( self.curclass, "allies" ) )
var_6 = "allies";
for ( var_7 = maps\mp\_utility::getclassindex( self.curclass ); var_2 < 3; var_2++ )
{
var_3 = getmatchrulesdata( "defaultClasses", var_6, var_7, "class", "specialistStreaks", var_2 );
if ( var_3 == var_0 )
break;
}
var_1 = getmatchrulesdata( "defaultClasses", var_6, var_7, "class", "specialistStreakKills", var_2 );
}
}
if ( maps\mp\_utility::_hasperk( "specialty_hardline" ) && var_1 > 0 )
var_1--;
}
var_1 = int( clamp( var_1, 0, 30 ) );
return var_1;
}
streaktyperesetsondeath( var_0 )
{
switch ( var_0 )
{
case "assault":
case "specialist":
return 1;
case "support":
return 0;
}
}
giveownedkillstreakitem( var_0 )
{
var_1 = self.pers["killstreaks"];
if ( level.console || common_scripts\utility::is_player_gamepad_enabled() )
{
var_2 = -1;
var_3 = -1;
for ( var_4 = 0; var_4 < 4; var_4++ )
{
if ( isdefined( var_1[var_4] ) && isdefined( var_1[var_4].streakname ) && var_1[var_4].available && getstreakcost( var_1[var_4].streakname ) > var_3 )
{
var_3 = 0;
if ( !var_1[var_4].isgimme )
var_3 = getstreakcost( var_1[var_4].streakname );
var_2 = var_4;
}
}
if ( var_2 != -1 )
{
self.killstreakindexweapon = var_2;
var_5 = var_1[self.killstreakindexweapon].streakname;
var_6 = maps\mp\_utility::getkillstreakweapon( var_5 );
givekillstreakweapon( var_6 );
}
else
self.killstreakindexweapon = undefined;
}
else
{
var_2 = -1;
var_3 = -1;
for ( var_4 = 0; var_4 < 4; var_4++ )
{
if ( isdefined( var_1[var_4] ) && isdefined( var_1[var_4].streakname ) && var_1[var_4].available )
{
var_7 = maps\mp\_utility::getkillstreakweapon( var_1[var_4].streakname );
var_8 = self getweaponslistitems();
var_9 = 0;
for ( var_10 = 0; var_10 < var_8.size; var_10++ )
{
if ( var_7 == var_8[var_10] )
{
var_9 = 1;
break;
}
}
if ( !var_9 )
maps\mp\_utility::_giveweapon( var_7 );
else if ( issubstr( var_7, "airdrop_" ) )
self setweaponammoclip( var_7, 1 );
maps\mp\_utility::_setactionslot( var_4 + 4, "weapon", var_7 );
if ( getstreakcost( var_1[var_4].streakname ) > var_3 )
{
var_3 = 0;
if ( !var_1[var_4].isgimme )
var_3 = getstreakcost( var_1[var_4].streakname );
var_2 = var_4;
}
}
}
if ( var_2 != -1 )
var_5 = var_1[var_2].streakname;
self.killstreakindexweapon = undefined;
}
updatestreakslots();
}
initridekillstreak( var_0 )
{
common_scripts\utility::_disableusability();
var_1 = initridekillstreak_internal( var_0 );
if ( isdefined( self ) )
common_scripts\utility::_enableusability();
return var_1;
}
initridekillstreak_internal( var_0 )
{
if ( isdefined( var_0 ) && islaptoptimeoutkillstreak( var_0 ) )
var_1 = "timeout";
else
var_1 = common_scripts\utility::waittill_any_timeout( 1.0, "disconnect", "death", "weapon_switch_started" );
maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
if ( var_1 == "weapon_switch_started" )
return "fail";
if ( !isalive( self ) )
return "fail";
if ( var_1 == "disconnect" || var_1 == "death" )
{
if ( var_1 == "disconnect" )
return "disconnect";
if ( self.team == "spectator" )
return "fail";
return "success";
}
if ( maps\mp\_utility::iskillstreakdenied() )
return "fail";
if ( !isdefined( var_0 ) || !issubstr( var_0, "odin" ) )
{
self visionsetnakedforplayer( "black_bw", 0.75 );
thread maps\mp\_utility::set_visionset_for_watching_players( "black_bw", 0.75, 1.0, undefined, 1 );
var_2 = common_scripts\utility::waittill_any_timeout( 0.8, "disconnect", "death" );
}
else
var_2 = common_scripts\utility::waittill_any_timeout( 1.0, "disconnect", "death" );
self notify( "black_out_done" );
maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
if ( var_2 != "disconnect" )
{
if ( !isdefined( var_0 ) || !issubstr( var_0, "odin" ) )
thread clearrideintro( 1.0 );
else
self notify( "intro_cleared" );
if ( self.team == "spectator" )
return "fail";
}
if ( self isonladder() )
return "fail";
if ( !isalive( self ) )
return "fail";
if ( maps\mp\_utility::iskillstreakdenied() )
return "fail";
if ( var_2 == "disconnect" )
return "disconnect";
else
return "success";
}
islaptoptimeoutkillstreak( var_0 )
{
switch ( var_0 )
{
case "remote_tank":
case "remote_uav":
case "osprey_gunner":
case "ac130":
case "ca_a10_strafe":
case "odin_assault":
case "odin_support":
case "drone_hive":
case "heli_pilot":
case "vanguard":
return 1;
}
return 0;
}
clearrideintro( var_0, var_1 )
{
self endon( "disconnect" );
if ( isdefined( var_0 ) )
wait( var_0 );
if ( !isdefined( var_1 ) )
var_1 = 0;
self visionsetnakedforplayer( "", var_1 );
maps\mp\_utility::set_visionset_for_watching_players( "", var_1 );
self notify( "intro_cleared" );
}
allowridekillstreakplayerexit( var_0 )
{
if ( isdefined( var_0 ) )
self endon( var_0 );
if ( !isdefined( self.owner ) )
return;
var_1 = self.owner;
level endon( "game_ended" );
var_1 endon( "disconnect" );
var_1 endon( "end_remote" );
self endon( "death" );
for (;;)
{
var_2 = 0;
while ( var_1 usebuttonpressed() )
{
var_2 = var_2 + 0.05;
if ( var_2 > 0.75 )
{
self notify( "killstreakExit" );
return;
}
wait 0.05;
}
wait 0.05;
}
}
giveselectedkillstreakitem()
{
var_0 = self.pers["killstreaks"][self.killstreakindexweapon].streakname;
var_1 = maps\mp\_utility::getkillstreakweapon( var_0 );
givekillstreakweapon( var_1 );
updatestreakslots();
}
getkillstreakcount()
{
var_0 = 0;
for ( var_1 = 0; var_1 < 4; var_1++ )
{
if ( isdefined( self.pers["killstreaks"][var_1] ) && isdefined( self.pers["killstreaks"][var_1].streakname ) && self.pers["killstreaks"][var_1].available )
var_0++;
}
return var_0;
}
shufflekillstreaksup()
{
if ( getkillstreakcount() > 1 )
{
for (;;)
{
self.killstreakindexweapon++;
if ( self.killstreakindexweapon > 3 )
self.killstreakindexweapon = 0;
if ( self.pers["killstreaks"][self.killstreakindexweapon].available == 1 )
break;
}
giveselectedkillstreakitem();
}
}
shufflekillstreaksdown()
{
if ( getkillstreakcount() > 1 )
{
for (;;)
{
self.killstreakindexweapon--;
if ( self.killstreakindexweapon < 0 )
self.killstreakindexweapon = 3;
if ( self.pers["killstreaks"][self.killstreakindexweapon].available == 1 )
break;
}
giveselectedkillstreakitem();
}
}
streakselectuptracker()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "faux_spawn" );
level endon( "game_ended" );
for (;;)
{
self waittill( "toggled_up" );
if ( !level.console && !common_scripts\utility::is_player_gamepad_enabled() )
continue;
if ( isdefined( self.showingtacticalselections ) && self.showingtacticalselections )
continue;
if ( !self ismantling() && ( !isdefined( self.changingweapon ) || isdefined( self.changingweapon ) && self.changingweapon == "none" ) && ( !maps\mp\_utility::iskillstreakweapon( self getcurrentweapon() ) || isminigun( self getcurrentweapon() ) || self getcurrentweapon() == "venomxgun_mp" || maps\mp\_utility::iskillstreakweapon( self getcurrentweapon() ) && maps\mp\_utility::isjuggernaut() ) && self.streaktype != "specialist" && ( !isdefined( self.iscarrying ) || isdefined( self.iscarrying ) && self.iscarrying == 0 ) && ( !isdefined( self.laststreakused ) || isdefined( self.laststreakused ) && gettime() - self.laststreakused > 100 ) )
{
shufflekillstreaksup();
self setclientomnvar( "ui_killstreak_scroll", 1 );
}
wait 0.12;
}
}
isminigun( var_0 )
{
return var_0 == "iw6_minigunjugg_mp";
}
streakselectdowntracker()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "faux_spawn" );
level endon( "game_ended" );
for (;;)
{
self waittill( "toggled_down" );
if ( !level.console && !common_scripts\utility::is_player_gamepad_enabled() )
continue;
if ( isdefined( self.showingtacticalselections ) && self.showingtacticalselections )
continue;
if ( !self ismantling() && ( !isdefined( self.changingweapon ) || isdefined( self.changingweapon ) && self.changingweapon == "none" ) && ( !maps\mp\_utility::iskillstreakweapon( self getcurrentweapon() ) || isminigun( self getcurrentweapon() ) || self getcurrentweapon() == "venomxgun_mp" || maps\mp\_utility::iskillstreakweapon( self getcurrentweapon() ) && maps\mp\_utility::isjuggernaut() ) && self.streaktype != "specialist" && ( !isdefined( self.iscarrying ) || isdefined( self.iscarrying ) && self.iscarrying == 0 ) && ( !isdefined( self.laststreakused ) || isdefined( self.laststreakused ) && gettime() - self.laststreakused > 100 ) )
{
shufflekillstreaksdown();
self setclientomnvar( "ui_killstreak_scroll", 1 );
}
wait 0.12;
}
}
streakusetimetracker()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "faux_spawn" );
level endon( "game_ended" );
for (;;)
{
self waittill( "streakUsed" );
self.laststreakused = gettime();
}
}
streaknotifytracker()
{
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
if ( isbot( self ) )
return;
maps\mp\_utility::gameflagwait( "prematch_done" );
if ( level.console || common_scripts\utility::is_player_gamepad_enabled() )
{
self notifyonplayercommand( "toggled_up", "+actionslot 1" );
self notifyonplayercommand( "toggled_down", "+actionslot 2" );
self notifyonplayercommand( "streakUsed", "+actionslot 4" );
self notifyonplayercommand( "streakUsed", "+actionslot 5" );
self notifyonplayercommand( "streakUsed", "+actionslot 6" );
self notifyonplayercommand( "streakUsed", "+actionslot 7" );
}
if ( !level.console )
{
self notifyonplayercommand( "streakUsed1", "+actionslot 4" );
self notifyonplayercommand( "streakUsed2", "+actionslot 5" );
self notifyonplayercommand( "streakUsed3", "+actionslot 6" );
self notifyonplayercommand( "streakUsed4", "+actionslot 7" );
}
}
registeradrenalineinfo( var_0, var_1 )
{
if ( !isdefined( level.adrenalineinfo ) )
level.adrenalineinfo = [];
level.adrenalineinfo[var_0] = var_1;
}
giveadrenaline( var_0 )
{
if ( level.adrenalineinfo[var_0] == 0 )
return;
if ( maps\mp\_utility::isjuggernaut() && self.streaktype == "specialist" )
return;
var_1 = self.adrenaline + level.adrenalineinfo[var_0];
var_2 = var_1;
var_3 = getmaxstreakcost();
if ( var_2 > var_3 && self.streaktype != "specialist" )
var_2 = var_2 - var_3;
else if ( level.killstreakrewards && var_2 > var_3 && self.streaktype == "specialist" )
{
var_4 = var_3;
if ( isai( self ) )
var_4 = self.pers["specialistStreakKills"][2];
var_5 = int( max( 8, var_4 + 2 ) );
if ( maps\mp\_utility::_hasperk( "specialty_hardline" ) )
var_5--;
var_6 = var_2 >= var_5 && self getcommonplayerdata( "killstreaksState", "hasStreak", 4 ) == 0;
if ( var_6 )
{
givebonusperks();
usedkillstreak( "all_perks_bonus", 1 );
thread maps\mp\gametypes\_hud_message::killstreaksplashnotify( "all_perks_bonus", var_5 );
self setcommonplayerdata( "killstreaksState", "hasStreak", 4, 1 );
self.pers["killstreaks"][4].available = 1;
}
if ( var_3 > 0 && !( ( var_2 - var_3 ) % 2 ) )
{
thread maps\mp\gametypes\_rank::xpeventpopup( "specialist_streaking_xp" );
thread maps\mp\gametypes\_rank::giverankxp( "kill" );
}
}
setadrenaline( var_2 );
checkstreakreward();
if ( var_1 == var_3 && self.streaktype != "specialist" )
setadrenaline( 0 );
}
givebonusperks()
{
if ( isai( self ) )
{
if ( isdefined( self.pers ) && isdefined( self.pers["specialistBonusStreaks"] ) )
{
foreach ( var_1 in self.pers["specialistBonusStreaks"] )
{
if ( !maps\mp\_utility::_hasperk( var_1 ) )
maps\mp\_utility::giveperk( var_1, 0 );
}
}
}
else
{
for ( var_3 = 0; var_3 < 7; var_3++ )
{
for ( var_4 = 0; var_4 < 5; var_4++ )
{
var_5 = 0;
if ( isdefined( self.teamname ) )
var_5 = getmatchrulesdata( "defaultClasses", self.teamname, self.class_num, "class", "specialistBonusStreaks", var_3, var_4 );
else
var_5 = self getcacplayerdata( "loadouts", self.class_num, "specialistBonusStreaks", var_3, var_4 );
if ( isdefined( var_5 ) && var_5 )
{
var_1 = tablelookup( "mp/cacAbilityTable.csv", 0, var_3 + 1, 4 + var_4 );
if ( !maps\mp\_utility::_hasperk( var_1 ) )
maps\mp\_utility::giveperk( var_1, 0 );
}
}
}
}
}
resetadrenaline()
{
self.earnedstreaklevel = 0;
setadrenaline( 0 );
resetstreakcount();
self.pers["lastEarnedStreak"] = undefined;
self.pers["objectivePointStreak"] = 0;
self setclientomnvar( "ui_half_tick", 0 );
}
setadrenaline( var_0 )
{
if ( var_0 < 0 )
var_0 = 0;
if ( isdefined( self.adrenaline ) )
self.previousadrenaline = self.adrenaline;
else
self.previousadrenaline = 0;
self.adrenaline = var_0;
self setclientdvar( "ui_adrenaline", self.adrenaline );
updatestreakcount();
}
pc_watchgamepad()
{
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
var_0 = common_scripts\utility::is_player_gamepad_enabled();
for (;;)
{
if ( var_0 != common_scripts\utility::is_player_gamepad_enabled() )
{
var_0 = common_scripts\utility::is_player_gamepad_enabled();
if ( !var_0 )
{
if ( isdefined( self.actionslotenabled ) )
{
for ( var_1 = 0; var_1 < 4; var_1++ )
self.actionslotenabled[var_1] = 1;
self notifyonplayercommand( "streakUsed1", "+actionslot 4" );
self notifyonplayercommand( "streakUsed2", "+actionslot 5" );
self notifyonplayercommand( "streakUsed3", "+actionslot 6" );
self notifyonplayercommand( "streakUsed4", "+actionslot 7" );
giveownedkillstreakitem();
}
}
else
{
var_2 = self getweaponslistitems();
foreach ( var_4 in var_2 )
{
if ( maps\mp\_utility::iskillstreakweapon( var_4 ) && var_4 == self getcurrentweapon() )
{
self switchtoweapon( common_scripts\utility::getlastweapon() );
while ( maps\mp\_utility::ischangingweapon() )
wait 0.05;
}
if ( maps\mp\_utility::iskillstreakweapon( var_4 ) )
self takeweapon( var_4 );
}
for ( var_1 = 0; var_1 < 4; var_1++ )
{
maps\mp\_utility::_setactionslot( var_1 + 4, "" );
self.actionslotenabled[var_1] = 0;
}
self notifyonplayercommand( "toggled_up", "+actionslot 1" );
self notifyonplayercommand( "toggled_down", "+actionslot 2" );
self notifyonplayercommand( "streakUsed", "+actionslot 4" );
self notifyonplayercommand( "streakUsed", "+actionslot 5" );
self notifyonplayercommand( "streakUsed", "+actionslot 6" );
self notifyonplayercommand( "streakUsed", "+actionslot 7" );
giveownedkillstreakitem();
}
}
wait 0.05;
}
}
pc_watchstreakuse()
{
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
self.actionslotenabled = [];
self.actionslotenabled[0] = 1;
self.actionslotenabled[1] = 1;
self.actionslotenabled[2] = 1;
self.actionslotenabled[3] = 1;
for (;;)
{
var_0 = common_scripts\utility::waittill_any_return( "streakUsed1", "streakUsed2", "streakUsed3", "streakUsed4" );
if ( common_scripts\utility::is_player_gamepad_enabled() )
continue;
if ( !isdefined( var_0 ) )
continue;
if ( self.streaktype == "specialist" && var_0 != "streakUsed1" )
continue;
if ( isdefined( self.changingweapon ) && self.changingweapon == "none" )
continue;
if ( self isoffhandweaponreadytothrow() )
continue;
switch ( var_0 )
{
case "streakUsed1":
if ( self.pers["killstreaks"][0].available && self.actionslotenabled[0] )
self.killstreakindexweapon = 0;
break;
case "streakUsed2":
if ( self.pers["killstreaks"][1].available && self.actionslotenabled[1] )
self.killstreakindexweapon = 1;
break;
case "streakUsed3":
if ( self.pers["killstreaks"][2].available && self.actionslotenabled[2] )
self.killstreakindexweapon = 2;
break;
case "streakUsed4":
if ( self.pers["killstreaks"][3].available && self.actionslotenabled[3] )
self.killstreakindexweapon = 3;
break;
}
if ( isdefined( self.killstreakindexweapon ) && !self.pers["killstreaks"][self.killstreakindexweapon].available )
self.killstreakindexweapon = undefined;
if ( isdefined( self.killstreakindexweapon ) )
{
disablekillstreakactionslots();
for (;;)
{
self waittill( "weapon_change", var_1, var_2 );
if ( isdefined( self.killstreakindexweapon ) )
{
var_3 = maps\mp\_utility::getkillstreakweapon( self.pers["killstreaks"][self.killstreakindexweapon].streakname );
if ( var_1 == var_3 || var_1 == "none" || var_3 == "killstreak_uav_mp" && var_1 == "killstreak_remote_uav_mp" || var_3 == "killstreak_uav_mp" && var_1 == "uav_remote_mp" || var_2 )
continue;
break;
}
break;
}
enablekillstreakactionslots();
self.killstreakindexweapon = undefined;
}
}
}
disablekillstreakactionslots()
{
for ( var_0 = 0; var_0 < 4; var_0++ )
{
if ( !isdefined( self.killstreakindexweapon ) )
break;
if ( self.killstreakindexweapon == var_0 )
continue;
maps\mp\_utility::_setactionslot( var_0 + 4, "" );
self.actionslotenabled[var_0] = 0;
}
}
enablekillstreakactionslots()
{
for ( var_0 = 0; var_0 < 4; var_0++ )
{
if ( self.pers["killstreaks"][var_0].available )
{
var_1 = maps\mp\_utility::getkillstreakweapon( self.pers["killstreaks"][var_0].streakname );
maps\mp\_utility::_setactionslot( var_0 + 4, "weapon", var_1 );
}
else
maps\mp\_utility::_setactionslot( var_0 + 4, "" );
self.actionslotenabled[var_0] = 1;
}
}
killstreakhit( var_0, var_1, var_2 )
{
if ( isdefined( var_1 ) && isplayer( var_0 ) && isdefined( var_2.owner ) && isdefined( var_2.owner.team ) )
{
if ( ( level.teambased && var_2.owner.team != var_0.team || !level.teambased ) && var_0 != var_2.owner )
{
if ( maps\mp\_utility::iskillstreakweapon( var_1 ) )
return;
if ( !isdefined( var_0.lasthittime[var_1] ) )
var_0.lasthittime[var_1] = 0;
if ( var_0.lasthittime[var_1] == gettime() )
return;
var_0.lasthittime[var_1] = gettime();
var_0 thread maps\mp\gametypes\_gamelogic::threadedsetweaponstatbyname( var_1, 1, "hits" );
if ( !issquadsmode() )
{
var_3 = var_0 maps\mp\gametypes\_persistence::statgetbuffered( "totalShots" );
var_4 = var_0 maps\mp\gametypes\_persistence::statgetbuffered( "hits" ) + 1;
if ( var_4 <= var_3 )
{
var_0 maps\mp\gametypes\_persistence::statsetbuffered( "hits", var_4 );
var_0 maps\mp\gametypes\_persistence::statsetbuffered( "misses", int( var_3 - var_4 ) );
var_0 maps\mp\gametypes\_persistence::statsetbuffered( "accuracy", int( var_4 * 10000 / var_3 ) );
}
}
}
}
}
copy_killstreak_status( var_0, var_1 )
{
self.streaktype = var_0.streaktype;
self.pers["cur_kill_streak"] = var_0.pers["cur_kill_streak"];
maps\mp\gametypes\_persistence::statsetchild( "round", "killStreak", self.pers["cur_kill_streak"] );
self.pers["killstreaks"] = var_0.pers["killstreaks"];
self.killstreaks = var_0.killstreaks;
if ( !isdefined( var_1 ) || var_1 == 0 )
{
var_2 = getentarray();
foreach ( var_4 in var_2 )
{
if ( !isdefined( var_4 ) || isplayer( var_4 ) )
continue;
if ( isdefined( var_4.owner ) && var_4.owner == var_0 )
{
if ( var_4.classname == "misc_turret" )
{
var_4 maps\mp\killstreaks\_autosentry::sentry_setowner( self );
continue;
}
var_4.owner = self;
}
}
}
self.adrenaline = undefined;
setadrenaline( var_0.adrenaline );
resetstreakcount();
updatestreakcount();
if ( isdefined( var_1 ) && var_1 == 1 && isdefined( self.killstreaks ) )
{
var_6 = 1;
foreach ( var_8 in self.killstreaks )
{
var_9 = self.pers["killstreaks"][var_6].streakname;
if ( self.streaktype == "specialist" )
{
var_10 = strtok( self.pers["killstreaks"][var_6].streakname, "_" );
if ( var_10[var_10.size - 1] == "ks" )
{
var_11 = undefined;
foreach ( var_13 in var_10 )
{
if ( var_13 != "ks" )
{
if ( !isdefined( var_11 ) )
{
var_11 = var_13;
continue;
}
var_11 = var_11 + ( "_" + var_13 );
}
}
if ( maps\mp\_utility::isstrstart( self.pers["killstreaks"][var_6].streakname, "_" ) )
var_11 = "_" + var_11;
if ( isdefined( var_11 ) && maps\mp\gametypes\_class::getperkupgrade( var_11 ) != "specialty_null" )
var_9 = self.pers["killstreaks"][var_6].streakname + "_pro";
}
}
self setcommonplayerdata( "killstreaksState", "icons", var_6, maps\mp\_utility::getkillstreakindex( var_9 ) );
var_6++;
}
}
updatestreakslots();
foreach ( var_11 in var_0.perksperkname )
{
if ( !maps\mp\_utility::_hasperk( var_11 ) )
{
var_17 = 0;
if ( isdefined( self.perksuseslot[var_11] ) )
var_17 = self.perksuseslot[var_11];
maps\mp\_utility::giveperk( var_11, var_17 );
}
if ( !isdefined( var_1 ) || var_1 == 0 )
var_0 maps\mp\_utility::_unsetperk( var_11 );
}
}
copy_adrenaline( var_0 )
{
self.adrenaline = undefined;
setadrenaline( var_0.adrenaline );
resetstreakcount();
updatestreakcount();
updatestreakslots();
}
is_using_killstreak()
{
var_0 = self getcurrentweapon();
var_1 = issubstr( var_0, "killstreak" ) || isdefined( self.selectinglocation ) && self.selectinglocation == 1 || !common_scripts\utility::isweaponenabled() && !maps\mp\gametypes\_damage::attackerinremotekillstreak();
return var_1;
}
monitordisownkillstreaks()
{
while ( isdefined( self ) )
{
if ( maps\mp\_utility::bot_is_fireteam_mode() )
self waittill( "disconnect" );
else
common_scripts\utility::waittill_any( "disconnect", "joined_team", "joined_spectators" );
self notify( "killstreak_disowned" );
}
}
findunobstructedfiringpointaroundz( var_0, var_1, var_2, var_3 )
{
var_4 = rotatevector( ( 0, 0, 1 ), ( -1 * var_3, 0, 0 ) );
var_5 = vectortoangles( var_1 - var_0.origin );
for ( var_6 = 0; var_6 < 360; var_6 = var_6 + 30 )
{
var_7 = var_2 * rotatevector( var_4, ( 0, var_6 + var_5[1], 0 ) );
var_8 = var_1 + var_7;
if ( _findunobstructedfiringpointhelper( var_0, var_8, var_1 ) )
return var_8;
}
return undefined;
}
findunobstructedfiringpointaroundy( var_0, var_1, var_2, var_3, var_4, var_5 )
{
var_6 = vectortoangles( var_0.origin - var_1 );
for ( var_7 = var_3; var_7 <= var_4; var_7 = var_7 + var_5 )
{
var_8 = rotatevector( ( 1, 0, 0 ), ( var_7 - 90, 0, 0 ) );
var_9 = var_2 * rotatevector( var_8, ( 0, var_6[1], 0 ) );
var_10 = var_1 + var_9;
if ( _findunobstructedfiringpointhelper( var_0, var_10, var_1 ) )
return var_10;
}
return undefined;
}
_findunobstructedfiringpointhelper( var_0, var_1, var_2 )
{
var_3 = bullettrace( var_1, var_2, 0 );
if ( var_3["fraction"] > 0.99 )
return 1;
return 0;
}
findunobstructedfiringpoint( var_0, var_1, var_2 )
{
var_3 = findunobstructedfiringpointaroundz( var_0, var_1, var_2, 30 );
if ( !isdefined( var_3 ) )
var_3 = findunobstructedfiringpointaroundy( var_0, var_1, var_2, 15, 75, 15 );
return var_3;
}
isairdropmarker( var_0 )
{
switch ( var_0 )
{
case "airdrop_escort_marker_mp":
case "airdrop_tank_marker_mp":
case "airdrop_juggernaut_maniac_mp":
case "airdrop_juggernaut_def_mp":
case "airdrop_sentry_marker_mp":
case "airdrop_mega_marker_mp":
case "airdrop_marker_support_mp":
case "airdrop_marker_assault_mp":
case "airdrop_juggernaut_mp":
case "airdrop_marker_mp":
return 1;
default:
return 0;
}
}
isusinghelisniper()
{
return isdefined( self.onhelisniper ) && self.onhelisniper;
}
destroytargetarray( var_0, var_1, var_2, var_3 )
{
var_4 = "MOD_EXPLOSIVE";
var_5 = 5000;
var_6 = ( 0, 0, 0 );
var_7 = ( 0, 0, 0 );
var_8 = "";
var_9 = "";
var_10 = "";
var_11 = undefined;
if ( level.teambased )
{
foreach ( var_13 in var_3 )
{
if ( maps\mp\_utility::isvalidteamtarget( var_0, var_1, var_13 ) )
{
var_13 notify( "damage", var_5, var_0, var_6, var_7, var_4, var_8, var_9, var_10, var_11, var_2 );
wait 0.05;
}
}
}
else
{
foreach ( var_13 in var_3 )
{
if ( maps\mp\_utility::isvalidffatarget( var_0, var_1, var_13 ) )
{
var_13 notify( "damage", var_5, var_0, var_6, var_7, var_4, var_8, var_9, var_10, var_11, var_2 );
wait 0.05;
}
}
}
}