Files
Recompilable-gscs-for-BO2-z…/patch_mp/maps/mp/_empgrenade.gsc

185 lines
3.6 KiB
Plaintext

#include maps/mp/killstreaks/_emp;
#include common_scripts/utility;
#include maps/mp/_utility;
init()
{
precacheshellshock( "flashbang" );
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( "disconnect" );
self endon( "death" );
self.empendtime = 0;
for ( ;; )
{
while ( 1 )
{
self waittill( "emp_grenaded", attacker );
if ( !isalive( self ) || self hasperk( "specialty_immuneemp" ) )
{
continue;
}
hurtvictim = 1;
hurtattacker = 0;
/#
assert( isDefined( self.team ) );
#/
if ( level.teambased && isDefined( attacker ) && isDefined( attacker.team ) && attacker.team == self.team && attacker != self )
{
if ( level.friendlyfire == 0 )
{
}
}
else if ( level.friendlyfire == 1 )
{
hurtattacker = 0;
hurtvictim = 1;
break;
}
else if ( level.friendlyfire == 2 )
{
hurtvictim = 0;
hurtattacker = 1;
break;
}
else
{
if ( level.friendlyfire == 3 )
{
hurtattacker = 1;
hurtvictim = 1;
}
}
}
if ( hurtvictim && isDefined( self ) )
{
self thread applyemp( attacker );
}
if ( hurtattacker && isDefined( attacker ) )
{
attacker thread applyemp( attacker );
}
}
}
applyemp( attacker )
{
self notify( "applyEmp" );
self endon( "applyEmp" );
self endon( "disconnect" );
self endon( "death" );
wait 0,05;
if ( self == attacker )
{
if ( isDefined( self.empendtime ) )
{
emp_time_left_ms = self.empendtime - getTime();
if ( emp_time_left_ms > 1000 )
{
self.empduration = emp_time_left_ms / 1000;
}
else
{
self.empduration = 1;
}
}
else
{
self.empduration = 1;
}
}
else
{
self.empduration = 12;
}
self.empgrenaded = 1;
self shellshock( "flashbang", 1 );
self.empendtime = getTime() + ( self.empduration * 1000 );
self thread emprumbleloop( 0,75 );
self setempjammed( 1 );
self thread empgrenadedeathwaiter();
wait self.empduration;
self notify( "empGrenadeTimedOut" );
self checktoturnoffemp();
}
empgrenadedeathwaiter()
{
self notify( "empGrenadeDeathWaiter" );
self endon( "empGrenadeDeathWaiter" );
self endon( "empGrenadeTimedOut" );
self waittill( "death" );
self checktoturnoffemp();
}
checktoturnoffemp()
{
self.empgrenaded = 0;
if ( level.teambased || maps/mp/killstreaks/_emp::emp_isteamemped( self.team ) && !level.teambased && isDefined( level.empplayer ) && level.empplayer != self )
{
return;
}
self setempjammed( 0 );
}
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;
}
}
watchempexplosion( owner, weaponname )
{
owner endon( "disconnect" );
owner endon( "team_changed" );
self endon( "shutdown_empgrenade" );
self thread watchempgrenadeshutdown();
owner addweaponstat( weaponname, "used", 1 );
self waittill( "explode", origin, surface );
ents = getdamageableentarray( origin, 512 );
_a223 = ents;
_k223 = getFirstArrayKey( _a223 );
while ( isDefined( _k223 ) )
{
ent = _a223[ _k223 ];
ent dodamage( 1, origin, owner, owner, "none", "MOD_GRENADE_SPLASH", 0, weaponname );
_k223 = getNextArrayKey( _a223, _k223 );
}
}
watchempgrenadeshutdown()
{
self endon( "explode" );
self waittill( "death" );
wait 0,05;
self notify( "shutdown_empgrenade" );
}