iw6-scripts-dev/maps/mp/killstreaks/_designator_grenade.gsc
2024-12-11 11:28:08 +01:00

132 lines
3.5 KiB
Plaintext

#include maps\mp\_utility;
#include common_scripts\utility;
// 2013-03-12 wsh
// shared utility for grenade-style designators
// init in your own ks script
// callbackFunc( killstreakName, designatorGrenadeEnt );
// We assume designator weapon can only be used once
designator_Start( killstreakName, designatorName, onTargetAcquiredCallback )
{
AssertEx( IsDefined( onTargetAcquiredCallback ), "designator onTargetAcquiredCallback must be specified for " + designatorName );
self endon ( "death" );
self.marker = undefined;
if ( self GetCurrentWeapon() == designatorName )
{
self thread designator_DisableUsabilityDuringGrenadePullback( designatorName );
self thread designator_WaitForGrenadeFire( killstreakName, designatorName, onTargetAcquiredCallback );
self designator_WaitForWeaponChange( designatorName );
return ( !(self GetAmmoCount( designatorName ) && self HasWeapon( designatorName ) ) );
}
return false;
}
designator_DisableUsabilityDuringGrenadePullback( designatorName ) // self == player
{
self endon( "death" );
self endon( "disconnect" );
usedWeaponName = "";
while ( usedWeaponName != designatorName )
{
self waittill( "grenade_pullback", usedWeaponName );
}
self _disableUsability();
self designator_EnableUsabilityWhenDesignatorFinishes();
}
designator_EnableUsabilityWhenDesignatorFinishes() // self == player
{
self endon( "death" );
self endon( "disconnect" );
// self notify( "beginMarkerTracking" );
// self endon( "beginMarkerTracking" );
self waittill_any( "grenade_fire", "weapon_change" );
self _enableUsability();
}
designator_WaitForGrenadeFire( killstreakName, designatorName, callbackFunc ) // self == player
{
self endon( "designator_finished" );
self endon( "spawned_player" );
self endon( "disconnect" );
designatorGrenade = undefined;
usedWeaponName = "";
while ( usedWeaponName != designatorName )
{
self waittill( "grenade_fire", designatorGrenade, usedWeaponName );
}
if ( IsAlive( self ) )
{
designatorGrenade.owner = self;
designatorGrenade.weaponName = designatorName;
self.marker = designatorGrenade;
// maybe this should be in the callback?
// marker PlaySoundToPlayer( "", self );
self thread designator_OnTargetAcquired( killstreakName, designatorGrenade, callbackFunc );
}
else
{
designatorGrenade Delete();
}
self notify( "designator_finished" );
}
designator_WaitForWeaponChange( designatorName ) // self == player
{
self endon( "spawned_player" );
self endon( "disconnect" );
currentWeapon = self getCurrentWeapon();
while ( currentWeapon == designatorName )
{
self waittill( "weapon_change", currentWeapon );
}
// this could have ended because we switched weapons normally
// or because we used the killstreak
if ( self GetAmmoCount( designatorName ) == 0 )
{
self designator_RemoveDesignatorAndRestorePreviousWeapon( designatorName );
}
self notify( "designator_finished" );
}
designator_RemoveDesignatorAndRestorePreviousWeapon( designatorName )
{
if ( self HasWeapon( designatorName ) )
{
self TakeWeapon( designatorName );
// self SwitchToWeapon( self getLastWeapon() );
}
}
designator_OnTargetAcquired( killstreakName, designatorGrenade, onTargetAcquiredCallback ) // self == player
{
designatorGrenade waittill( "missile_stuck", stuckTo );
if ( IsDefined( designatorGrenade.owner ) )
{
self thread [[ onTargetAcquiredCallback ]]( killstreakName, designatorGrenade );
}
if ( IsDefined( designatorGrenade ) )
{
designatorGrenade Delete();
}
}