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

172 lines
3.0 KiB
Plaintext

#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\killstreaks\_emp_common;
init()
{
thread onPlayerConnect();
}
onPlayerConnect()
{
for(;;)
{
level waittill("connected", player);
player thread onPlayerSpawned();
}
}
onPlayerSpawned()
{
self endon("disconnect");
for(;;)
{
self waittill( "spawned_player" );
self thread monitorEMPGrenade();
}
}
monitorEMPGrenade()
{
self endon("death");
self endon("disconnect");
self endon("faux_spawn");
self.empEndTime = 0;
while(1)
{
// self waittill( "emp_grenaded", attacker );
self waittill( "emp_damage", attacker, duration );
if ( !IsAlive( self )
|| IsDefined( self.usingRemote )
|| ( self _hasPerk( "specialty_empimmune" ) ) //MW3 emp resistance perk
|| !IsDefined( attacker )
)
{
continue;
}
hurtVictim = true;
hurtAttacker = false;
assert( IsDefined(self.pers["team"]) );
if ( level.teamBased
&& attacker != self
&& IsDefined(attacker.pers["team"])
&& attacker.pers["team"] == self.pers["team"]
)
{
if(level.friendlyfire == 0) // no FF
{
continue;
}
else if(level.friendlyfire == 1) // FF
{
hurtattacker = false;
hurtvictim = true;
}
else if(level.friendlyfire == 2) // reflect
{
hurtvictim = false;
hurtattacker = true;
}
else if(level.friendlyfire == 3) // share
{
hurtattacker = true;
hurtvictim = true;
}
}
else
{
attacker notify( "emp_hit" );
if( attacker != self )
{
attacker maps\mp\gametypes\_missions::processChallenge( "ch_onthepulse" );
}
}
if ( hurtvictim && IsDefined(self) )
{
self thread applyEMP( duration );
}
if ( hurtattacker )
{
attacker thread applyEMP( duration );
}
}
}
applyEMP( duration )
{
self notify( "applyEmp" );
self endon( "applyEmp" );
self endon( "disconnect" );
self endon( "death" );
wait .05;
self.empGrenaded = true;
self shellshock( "flashbang_mp", 1 );
self.empEndTime = GetTime() + (duration * 1000);
self applyPerPlayerEMPEffects_OnDetonate();
self applyPerPlayerEMPEffects();
self thread empRumbleLoop( .75 );
self thread empGrenadeDeathWaiter();
wait ( duration );
self notify( "empGrenadeTimedOut" );
self checkToTurnOffEmp();
}
empGrenadeDeathWaiter()
{
self notify( "empGrenadeDeathWaiter" );
self endon( "empGrenadeDeathWaiter" );
self endon( "empGrenadeTimedOut" );
self waittill( "death" );
self checkToTurnOffEmp();
}
checkToTurnOffEmp()
{
self.empGrenaded = false;
if ( !(self shouldPlayerBeAffectedByEMP()) )
{
self removePerPlayerEMPEffects();
}
}
empRumbleLoop( duration )
{
self endon("emp_rumble_loop");
self notify("emp_rumble_loop");
goalTime = GetTime() + duration * 1000;
while ( GetTime() < goalTime )
{
self PlayRumbleOnEntity( "damage_heavy" );
wait( 0.05 );
}
}
// 2013-06-30 wallace: is isEMPGrenaded being used any more? Not sure if we even need the timestamp
isEMPGrenaded()
{
return isDefined( self.empEndTime ) && gettime() < self.empEndTime;
}