341 lines
7.7 KiB
Plaintext
341 lines
7.7 KiB
Plaintext
|
#include maps\_utility;
|
||
|
#include maps\_hud_util;
|
||
|
#include common_scripts\utility;
|
||
|
|
||
|
KILLSTREAK_STRING_TABLE = "sp/killstreakTable.csv";
|
||
|
|
||
|
init()
|
||
|
{
|
||
|
// &&1 Kill Streak!
|
||
|
precacheString( &"MP_KILLSTREAK_N" );
|
||
|
|
||
|
initKillstreakData();
|
||
|
|
||
|
level.killstreakFuncs = [];
|
||
|
level.killstreakSetupFuncs = [];
|
||
|
|
||
|
thread maps\_killstreak_ac130::init();
|
||
|
//thread maps\mp\_remotemissile::init();
|
||
|
//thread maps\mp\_uav::init();
|
||
|
//thread maps\mp\_airstrike::init();
|
||
|
//thread maps\mp\_helicopter::init();
|
||
|
//thread maps\mp\_autoshotgun::init();
|
||
|
thread maps\_killstreak_autosentry::init();
|
||
|
}
|
||
|
|
||
|
|
||
|
initKillstreakData()
|
||
|
{
|
||
|
for ( i = 1; true; i++ )
|
||
|
{
|
||
|
retVal = tableLookup( KILLSTREAK_STRING_TABLE, 0, i, 1 );
|
||
|
if ( !isDefined( retVal ) || retVal == "" )
|
||
|
break;
|
||
|
|
||
|
streakRef = tableLookup( KILLSTREAK_STRING_TABLE, 0, i, 1 );
|
||
|
assert( streakRef != "" );
|
||
|
|
||
|
streakUseHint = tableLookupIString( KILLSTREAK_STRING_TABLE, 0, i, 6 );
|
||
|
// string not found for
|
||
|
assert( streakUseHint != &"" );
|
||
|
precacheString( streakUseHint );
|
||
|
|
||
|
streakFailHint = tableLookupIString( KILLSTREAK_STRING_TABLE, 0, i, 11 );
|
||
|
// string not found for
|
||
|
assert( streakFailHint != &"" );
|
||
|
precacheString( streakFailHint );
|
||
|
|
||
|
//chad - no earn dialog yet
|
||
|
//streakEarnDialog = tableLookup( KILLSTREAK_STRING_TABLE, 0, i, 8 );
|
||
|
//assert( streakEarnDialog != "" );
|
||
|
//game["dialog"][streakRef] = streakEarnDialog;
|
||
|
|
||
|
streakFriendlyUseDialog = tableLookup( KILLSTREAK_STRING_TABLE, 0, i, 9 );
|
||
|
assert( streakFriendlyUseDialog != "" );
|
||
|
game[ "dialog" ][ streakRef + "_inbound" ] = streakFriendlyUseDialog;
|
||
|
|
||
|
/*
|
||
|
Chad:
|
||
|
enemies will never use killstreak rewards because they are just stupid AI haha
|
||
|
maybe someday I can make them use killstreaks to make things interesting
|
||
|
|
||
|
streakEnemyUseDialog = tableLookup( KILLSTREAK_STRING_TABLE, 0, i, 9 );
|
||
|
assert( streakEnemyUseDialog != "" );
|
||
|
game["dialog"]["enemy_"+streakRef+"_inbound"] = streakEnemyUseDialog;
|
||
|
*/
|
||
|
|
||
|
streakWeapon = tableLookup( KILLSTREAK_STRING_TABLE, 0, i, 12 );
|
||
|
if ( streakWeapon != "" )
|
||
|
precacheItem( streakWeapon );
|
||
|
|
||
|
streakPoints = int( tableLookup( KILLSTREAK_STRING_TABLE, 0, i, 13 ) );
|
||
|
assert( streakPoints != 0 );
|
||
|
maps\_rank::registerScoreInfo( "killstreak_" + streakRef, streakPoints );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
onPlayerSpawned()
|
||
|
{
|
||
|
self giveOwnedKillstreakItem();
|
||
|
self thread killstreakUseWaiter();
|
||
|
}
|
||
|
|
||
|
|
||
|
isRideKillstreak( streakName )
|
||
|
{
|
||
|
switch( streakName )
|
||
|
{
|
||
|
case "helicopter_minigun":
|
||
|
case "helicopter_mk19":
|
||
|
return true;
|
||
|
|
||
|
default:
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
killstreakUsePressed()
|
||
|
{
|
||
|
streakName = self.pers[ "killstreak" ];
|
||
|
|
||
|
assert( isDefined( streakName ) );
|
||
|
assert( isDefined( level.killstreakFuncs[ streakName ] ) );
|
||
|
|
||
|
if ( isDefined( self.carryObject ) && isRideKillstreak( streakName ) )
|
||
|
{
|
||
|
iprintlnbold( "Killstreak unavailable while holding bomb." );
|
||
|
}
|
||
|
else if ( self [[ level.killstreakFuncs[ streakName ] ]]() )
|
||
|
{
|
||
|
team = self.team;
|
||
|
|
||
|
/* Chad - leader dialog doesn't exist but we can probably just do a playlocalsoundwrapper on all
|
||
|
players instead since there isn't anyone on the other team
|
||
|
|
||
|
//array_thread( level.players, ::playLocalSoundWrapper, level.pmc.sound[ "juggernaut_attack" ] );
|
||
|
|
||
|
if ( level.teamBased )
|
||
|
thread leaderDialog( streakName + "_inbound", team );
|
||
|
else
|
||
|
self thread leaderDialogOnPlayer( streakName + "_inbound" );
|
||
|
*/
|
||
|
|
||
|
self playLocalSound( "weap_c4detpack_trigger_plr" );
|
||
|
|
||
|
//self setClientDvar( "ui_killstreak", "" );
|
||
|
self.pers[ "killstreak" ] = undefined;
|
||
|
}
|
||
|
else if ( isDefined( level.killstreakFuncs[ streakName + "_failed" ] ) )
|
||
|
{
|
||
|
self [[ level.killstreakFuncs[ streakName + "_failed" ] ]]();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
iprintlnbold( getKillstreakFailHint( streakName ) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
killstreakUseWaiter()
|
||
|
{
|
||
|
self endon( "death" );
|
||
|
|
||
|
self notifyOnPlayerCommand( "use killstreak", "+actionslot 4" );
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
self waittill( "use killstreak" );
|
||
|
|
||
|
if ( !isAlive( self ) )
|
||
|
continue;
|
||
|
|
||
|
if ( isDefined( self.canUseKillstreaks ) && !self.canUseKillstreaks )
|
||
|
continue;
|
||
|
|
||
|
if ( isdefined( self.placingSentry ) )
|
||
|
continue;
|
||
|
|
||
|
if ( !isDefined( self.pers[ "killstreak" ] ) )
|
||
|
continue;
|
||
|
|
||
|
self killstreakUsePressed();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
checkKillstreakReward( streakCount )
|
||
|
{
|
||
|
streak = streakCount;
|
||
|
|
||
|
if ( streak < 3 )
|
||
|
return;
|
||
|
|
||
|
if ( !isDefined( self.killStreaks[ streak ] ) )
|
||
|
{
|
||
|
if ( streak >= 10 && ( streak % 5 == 0 ) )
|
||
|
self streakNotify( streak );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
self tryGiveKillstreak( self.killStreaks[ streak ], streak );
|
||
|
}
|
||
|
|
||
|
|
||
|
streakNotify( streakVal )
|
||
|
{
|
||
|
self endon( "disconnect" );
|
||
|
|
||
|
wait .05;
|
||
|
|
||
|
notifyData = spawnStruct();
|
||
|
// &&1 Kill Streak!
|
||
|
notifyData.titleLabel = &"MP_KILLSTREAK_N";
|
||
|
notifyData.titleText = streakVal;
|
||
|
|
||
|
self maps\_rank::notifyMessage( notifyData );
|
||
|
}
|
||
|
|
||
|
|
||
|
rewardNotify( streakName, streakVal )
|
||
|
{
|
||
|
self endon( "disconnect" );
|
||
|
|
||
|
wait .05;
|
||
|
|
||
|
notifyData = spawnStruct();
|
||
|
// &&1 Kill Streak!
|
||
|
notifyData.titleLabel = &"MP_KILLSTREAK_N";
|
||
|
notifyData.titleText = streakVal;
|
||
|
notifyData.notifyText = getKillstreakHint( streakName );
|
||
|
notifyData.textIsString = true;
|
||
|
// chad - earn dialog not hooked up yet
|
||
|
//notifyData.sound = getKillstreakSound( streakName );
|
||
|
notifyData.leaderSound = streakName;
|
||
|
|
||
|
self maps\_rank::notifyMessage( notifyData );
|
||
|
}
|
||
|
|
||
|
|
||
|
tryGiveKillstreak( streakName, streakVal )
|
||
|
{
|
||
|
if ( !isDefined( level.killstreakFuncs[ streakName ] ) )
|
||
|
return false;
|
||
|
|
||
|
if ( isDefined( self.selectingLocation ) )
|
||
|
return false;
|
||
|
|
||
|
if ( isDefined( self.pers[ "killstreak" ] ) )
|
||
|
{
|
||
|
if ( getStreakCost( streakName ) < getStreakCost( self.pers[ "killstreak" ] ) )
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
self thread rewardNotify( streakName, streakVal );
|
||
|
self giveKillstreak( streakName );
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
giveKillstreak( streakName )
|
||
|
{
|
||
|
self notify( "got_killstreak", streakName );
|
||
|
|
||
|
weapon = getKillstreakWeapon( streakName );
|
||
|
|
||
|
if ( weapon != "" )
|
||
|
{
|
||
|
self giveKillstreakWeapon( weapon );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
self setActionSlot( 4, "" );
|
||
|
//self setClientDvar( "ui_killstreak", streakName );
|
||
|
}
|
||
|
|
||
|
self.pers[ "killstreak" ] = streakName;
|
||
|
|
||
|
if ( isdefined( level.killstreakSetupFuncs[ streakName ] ) )
|
||
|
self [[ level.killstreakSetupFuncs[ streakName ] ]]();
|
||
|
}
|
||
|
|
||
|
|
||
|
giveKillstreakWeapon( weapon )
|
||
|
{
|
||
|
self giveWeapon( weapon );
|
||
|
self setActionSlot( 4, "weapon", weapon );
|
||
|
//self setClientDvar( "ui_killstreak", "" );
|
||
|
}
|
||
|
|
||
|
|
||
|
getStreakCost( streakName )
|
||
|
{
|
||
|
if ( is_coop() )
|
||
|
return int( tableLookup( KILLSTREAK_STRING_TABLE, 1, streakName, 5 ) );
|
||
|
else
|
||
|
return int( tableLookup( KILLSTREAK_STRING_TABLE, 1, streakName, 4 ) );
|
||
|
}
|
||
|
|
||
|
|
||
|
getKillstreakHint( streakName )
|
||
|
{
|
||
|
return tableLookupIString( KILLSTREAK_STRING_TABLE, 1, streakName, 6 );
|
||
|
}
|
||
|
|
||
|
|
||
|
getKillstreakFailHint( streakName )
|
||
|
{
|
||
|
return tableLookupIString( KILLSTREAK_STRING_TABLE, 1, streakName, 11 );
|
||
|
}
|
||
|
|
||
|
|
||
|
getKillstreakSound( streakName )
|
||
|
{
|
||
|
return tableLookup( KILLSTREAK_STRING_TABLE, 1, streakName, 7 );
|
||
|
}
|
||
|
|
||
|
|
||
|
getKillstreakDialog( streakName )
|
||
|
{
|
||
|
return tableLookup( KILLSTREAK_STRING_TABLE, 1, streakName, 8 );
|
||
|
}
|
||
|
|
||
|
|
||
|
getKillstreakWeapon( streakName )
|
||
|
{
|
||
|
return tableLookup( KILLSTREAK_STRING_TABLE, 1, streakName, 12 );
|
||
|
}
|
||
|
|
||
|
|
||
|
giveOwnedKillstreakItem()
|
||
|
{
|
||
|
if ( isdefined( self.pers[ "killstreak" ] ) )
|
||
|
self giveKillstreak( self.pers[ "killstreak" ] );
|
||
|
}
|
||
|
|
||
|
|
||
|
setKillstreaks( streak1, streak2, streak3 )
|
||
|
{
|
||
|
self.killStreaks = [];
|
||
|
|
||
|
if ( streak1 != "none" )
|
||
|
{
|
||
|
streakVal = maps\_killstreaks::getStreakCost( streak1 );
|
||
|
assertEx( isDefined( streakVal ) && streakVal != 0, "ERROR: invalid killstreak " + streak1 );
|
||
|
self.killStreaks[ streakVal ] = streak1;
|
||
|
}
|
||
|
|
||
|
if ( streak2 != "none" )
|
||
|
{
|
||
|
streakVal = maps\_killstreaks::getStreakCost( streak2 );
|
||
|
assertEx( isDefined( streakVal ) && streakVal != 0, "ERROR: invalid killstreak " + streak2 );
|
||
|
self.killStreaks[ streakVal ] = streak2;
|
||
|
}
|
||
|
|
||
|
if ( streak3 != "none" )
|
||
|
{
|
||
|
streakVal = maps\_killstreaks::getStreakCost( streak3 );
|
||
|
assertEx( isDefined( streakVal ) && streakVal != 0, "ERROR: invalid killstreak " + streak3 );
|
||
|
self.killStreaks[ streakVal ] = streak3;
|
||
|
}
|
||
|
}
|