2024-12-11 11:28:08 +01:00

201 lines
5.4 KiB
Plaintext

#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include common_scripts\utility;
//============================================
// constants
//============================================
CONST_AA_LAUNCHER_WEAPON = "iw6_maaws_mp";
CONST_AA_LAUNCHER_WEAPON_CHILD = "iw6_maawschild_mp";
CONST_AA_LAUNCHER_WEAPON_HOMING = "iw6_maawshoming_mp";
CONST_AA_LAUNCHER_WEAPON_AMMO = 2;
//============================================
// init
//============================================
init()
{
level.killstreakFuncs["aa_launcher"] = ::tryUseAALauncher;
maps\mp\_laserGuidedLauncher::LGM_init( "vfx/gameplay/mp/killstreaks/vfx_maaws_split", "vfx/gameplay/mp/killstreaks/vfx_maaws_homing" );
}
//============================================
// Getters and Setters
//============================================
getAALauncherName()
{
return CONST_AA_LAUNCHER_WEAPON;
}
getAALauncherChildName()
{
return CONST_AA_LAUNCHER_WEAPON_CHILD;
}
getAALauncherHomingName()
{
return CONST_AA_LAUNCHER_WEAPON_HOMING;
}
getAALauncherAmmo( player )
{
AssertEx( IsDefined( player.pers[ "aaLauncherAmmo" ] ), "getAALauncherAmmo() called on player with no \"aaLauncherAmmo\" array key." );
ksUniqueID = getAALauncherUniqueIndex( player );
ammo = 0;
if ( IsDefined( player.pers[ "aaLauncherAmmo" ][ ksUniqueID ] ) )
{
ammo = player.pers[ "aaLauncherAmmo" ][ ksUniqueID ];
}
return ammo;
}
clearAALauncherAmmo( player )
{
ksUniqueID = getAALauncherUniqueIndex( player );
player.pers[ "aaLauncherAmmo" ][ ksUniqueID ] = undefined;
}
setAALauncherAmmo( player, ammo, setAmmo )
{
AssertEx( IsDefined( player.pers[ "aaLauncherAmmo" ] ), "setAALauncherAmmo() called on player with no \"aaLauncherAmmo\" array key." );
// The player could also have two of the AA Launcher
// so ammo needs to be stored on a per killstreak instance
ksUniqueID = getAALauncherUniqueIndex( player );
player.pers[ "aaLauncherAmmo" ][ ksUniqueID ] = ammo;
if ( !IsDefined( setAmmo ) || setAmmo )
{
if ( player HasWeapon( getAALauncherName() ) )
{
player SetWeaponAmmoClip( getAALauncherName(), ammo );
}
}
}
getAALauncherUniqueIndex( player )
{
AssertEx( IsDefined( player.killstreakIndexWeapon ), "getAALauncherAmmo() called on player with no killstreakIndexWeapon field" );
return player.pers["killstreaks"][ player.killstreakIndexWeapon ].kID;
}
//============================================
// tryUseAALauncher
//============================================
tryUseAALauncher( lifeId, streakName )
{
return useAALauncher( self, lifeId );
}
//============================================
// useAALauncher - Returns true if the killstreak was used up
//============================================
useAALauncher( player, lifeId )
{
// Ammo is persistent to handle round switching. If this is
// the first use init the self.per[ "aaLauncherAmmo" ] array
if ( !IsDefined( self.pers[ "aaLauncherAmmo" ] ) )
{
self.pers[ "aaLauncherAmmo" ] = [];
}
// The launcher persistent ammo count will only be empty in the
// use function when the persistent ammo has yet to be set
// so set it to the starting ammo
if ( getAALauncherAmmo( player ) == 0 )
{
setAALauncherAmmo( self, CONST_AA_LAUNCHER_WEAPON_AMMO, false );
}
level thread monitorWeaponSwitch( player );
level thread monitorLauncherAmmo( player );
self thread maps\mp\_laserGuidedLauncher::LGM_firing_monitorMissileFire( getAALauncherName(), getAALauncherChildName(), getAALauncherHomingName() );
result = false;
msg = player waittill_any_return( "aa_launcher_switch", "aa_launcher_empty", "death", "disconnect" );
if ( msg == "aa_launcher_empty" )
{
// The player is potentially still guiding the missiles at this point
// so wait until the player switches out or the missiles are destroyed
player waittill_any( "weapon_change", "LGM_player_allMissilesDestroyed", "death", "disconnect" );
result = true;
}
else
{
// In case death and aa_launcher_empty came on the same frame verify ammo
if ( player HasWeapon( getAALauncherName() ) && player GetAmmoCount( getAALauncherName() ) == 0 )
{
clearAALauncherAmmo( player );
}
if ( getAALauncherAmmo( player ) == 0 )
{
result = true;
}
}
player notify( "aa_launcher_end" );
self maps\mp\_laserGuidedLauncher::LGM_firing_endMissileFire();
return result;
}
//============================================
// monitorWeaponSwitch
//============================================
monitorWeaponSwitch( player )
{
player endon( "death" );
player endon( "disconnect" );
player endon( "aa_launcher_empty" );
player endon( "aa_launcher_end" );
currentWeapon = player GetCurrentWeapon();
while( currentWeapon == getAALauncherName() )
{
player waittill( "weapon_change", currentWeapon );
}
player notify( "aa_launcher_switch" );
}
//============================================
// monitorLauncherAmmo
//============================================
monitorLauncherAmmo( player )
{
player endon( "death" );
player endon( "disconnect" );
player endon( "aa_launcher_switch" );
player endon( "aa_launcher_end" );
setAALauncherAmmo( player, getAALauncherAmmo( player ), true );
while( true )
{
player waittill( "weapon_fired", weaponName );
if ( weaponName != getAALauncherName() )
continue;
ammo = player GetAmmoCount( getAALauncherName() );
setAALauncherAmmo( player, ammo, false );
if( getAALauncherAmmo( player ) == 0 )
{
clearAALauncherAmmo( player );
player notify( "aa_launcher_empty" );
break;
}
}
}