iw6-scripts/maps/_detonategrenades.gsc
2024-02-13 13:20:49 +01:00

610 lines
14 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level._effect["c4_light_blink"] = loadfx( "fx/misc/light_c4_blink" );
level._effect["claymore_laser"] = loadfx( "fx/misc/claymore_laser" );
for ( var_0 = 0; var_0 < level.players.size; var_0++ )
level.players[var_0] thread watchgrenadeusage();
}
watchgrenadeusage()
{
level.c4explodethisframe = 0;
self endon( "death" );
self.c4array = [];
self.throwinggrenade = 0;
thread watchc4();
thread watchc4detonation();
thread watchc4altdetonation();
thread watchclaymores();
thread begin_semtex_grenade_tracking();
thread begin_concussion_grenade_tracking();
for (;;)
{
self waittill( "grenade_pullback", var_0 );
self.throwinggrenade = 1;
if ( var_0 == "c4" )
{
beginc4tracking();
continue;
}
if ( var_0 == "smoke_grenade_american" )
{
beginsmokegrenadetracking();
continue;
}
if ( var_0 == "flash_grenade" )
{
beginflashgrenadetracking();
continue;
}
begingrenadetracking();
}
}
beginsmokegrenadetracking()
{
self waittill( "grenade_fire", var_0, var_1 );
if ( !isdefined( level.smokegrenades ) )
level.smokegrenades = 0;
var_0 thread smoke_grenade_death();
}
beginflashgrenadetracking()
{
self.throwinggrenade = 0;
var_0 = gettime();
self waittill( "grenade_fire", var_1, var_2 );
if ( isdefined( var_1 ) )
{
var_3 = gettime();
var_4 = var_3 - var_0;
if ( var_4 >= 1250 )
{
var_1 waittill( "explode", var_5 );
if ( soundexists( "grenade_explode_default" ) )
thread common_scripts\utility::play_sound_in_space( "grenade_explode_default", var_5 );
radiusdamage( var_5, 96, 300, 200, self, "MOD_UNKNOWN", "flash_grenade" );
}
}
}
begin_semtex_grenade_tracking()
{
for (;;)
{
self waittill( "grenade_fire", var_0, var_1 );
if ( var_1 == "semtex_grenade" )
{
thread track_semtex_grenade( var_0 );
var_0 thread semtex_sticky_handle( self );
}
}
}
track_semtex_grenade( var_0 )
{
self.throwinggrenade = 0;
if ( !isdefined( level.thrown_semtex_grenades ) )
level.thrown_semtex_grenades = 1;
else
level.thrown_semtex_grenades++;
var_0 waittill( "death" );
waittillframeend;
level.thrown_semtex_grenades--;
}
semtex_sticky_handle( var_0 )
{
self waittill( "missile_stuck", var_1 );
if ( !isdefined( var_1 ) )
return;
if ( var_1.code_classname != "script_vehicle" )
return;
var_1.has_semtex_on_it = 1;
self waittill( "explode" );
if ( !isdefined( var_1 ) || !isalive( var_1 ) )
return;
if ( var_1 maps\_vehicle::is_godmode() || var_1 maps\_vehicle_code::attacker_isonmyteam( var_0 ) )
{
var_1.has_semtex_on_it = undefined;
return;
}
var_1 kill( var_1.origin, var_0 );
}
begin_concussion_grenade_tracking()
{
for (;;)
{
self waittill( "grenade_fire", var_0, var_1 );
if ( var_1 == "concussion_grenade" )
thread track_concussion_grenade( var_0 );
}
}
track_concussion_grenade( var_0 )
{
self.throwinggrenade = 0;
var_0 waittill( "death" );
maps\_utility::slowmo_setlerptime_in( 0.1 );
maps\_utility::slowmo_setlerptime_out( 0.25 );
maps\_utility::slowmo_setspeed_norm( 1 );
maps\_utility::slowmo_setspeed_slow( 0.25 );
maps\_utility::slowmo_lerp_in();
setdvar( "noflash", "1" );
wait 0.05;
setdvar( "noflash", "0" );
wait 2.0;
maps\_utility::slowmo_lerp_out();
}
smoke_grenade_death()
{
level.smokegrenades++;
wait 50;
level.smokegrenades--;
}
begingrenadetracking()
{
self endon( "death" );
self waittill( "grenade_fire", var_0, var_1 );
if ( var_1 == "fraggrenade" )
var_0 thread maps\_utility::grenade_earthquake();
else if ( var_1 == "ninebang_grenade" )
self.threw_ninebang = 1;
self.throwinggrenade = 0;
}
beginc4tracking()
{
self endon( "death" );
common_scripts\utility::waittill_any( "grenade_fire", "weapon_change" );
self.throwinggrenade = 0;
}
watchc4()
{
for (;;)
{
self waittill( "grenade_fire", var_0, var_1 );
if ( var_1 == "c4" )
{
if ( !self.c4array.size )
thread watchc4altdetonate();
self.c4array[self.c4array.size] = var_0;
var_0.owner = self;
var_0 thread c4damage();
thread c4death( var_0 );
var_0 thread playc4effects();
}
}
}
c4death( var_0 )
{
var_0 waittill( "death" );
self.c4array = maps\_utility::array_remove_nokeys( self.c4array, var_0 );
}
watchclaymores()
{
self endon( "spawned_player" );
self endon( "disconnect" );
for (;;)
{
self waittill( "grenade_fire", var_0, var_1 );
if ( var_1 == "claymore" || var_1 == "claymore_mp" )
{
var_0.owner = self;
var_0 thread c4damage();
var_0 thread claymoredetonation();
var_0 thread playclaymoreeffects();
var_0 thread claymoremakesentient( self.team );
}
}
}
claymoremakesentient( var_0 )
{
self endon( "death" );
wait 1;
if ( isdefined( level.claymoresentientfunc ) )
{
self thread [[ level.claymoresentientfunc ]]( var_0 );
return;
}
self makeentitysentient( var_0, 1 );
self.attackeraccuracy = 2;
self.maxvisibledist = 750;
self.threatbias = -1000;
}
claymoredetonation()
{
self endon( "death" );
self waittill( "missile_stuck" );
var_0 = 192;
if ( isdefined( self.detonateradius ) )
var_0 = self.detonateradius;
var_1 = spawn( "trigger_radius", self.origin + ( 0, 0, 0 - var_0 ), 9, var_0, var_0 * 2 );
thread deleteondeath( var_1 );
if ( !isdefined( level.claymores ) )
level.claymores = [];
level.claymores = common_scripts\utility::array_add( level.claymores, self );
if ( !maps\_utility::is_specialop() && level.claymores.size > 15 )
level.claymores[0] delete();
for (;;)
{
var_1 waittill( "trigger", var_2 );
if ( isdefined( self.owner ) && var_2 == self.owner )
continue;
if ( isplayer( var_2 ) )
continue;
if ( var_2 damageconetrace( self.origin, self ) > 0 )
{
self playsound( "claymore_activated_SP" );
wait 0.4;
if ( isdefined( self.owner ) )
self detonate( self.owner );
else
self detonate( undefined );
return;
}
}
}
deleteondeath( var_0 )
{
self waittill( "death" );
level.claymores = maps\_utility::array_remove_nokeys( level.claymores, self );
wait 0.05;
if ( isdefined( var_0 ) )
var_0 delete();
}
watchc4detonation()
{
self endon( "death" );
for (;;)
{
self waittill( "detonate" );
var_0 = self getcurrentweapon();
if ( var_0 == "c4" )
{
for ( var_1 = 0; var_1 < self.c4array.size; var_1++ )
{
if ( isdefined( self.c4array[var_1] ) )
self.c4array[var_1] thread waitanddetonate( 0.1 );
}
self.c4array = [];
}
}
}
watchc4altdetonation()
{
self endon( "death" );
self endon( "disconnect" );
for (;;)
{
self waittill( "alt_detonate" );
var_0 = self getcurrentweapon();
if ( var_0 != "c4" )
{
var_1 = [];
for ( var_2 = 0; var_2 < self.c4array.size; var_2++ )
{
var_3 = self.c4array[var_2];
if ( isdefined( self.c4array[var_2] ) )
var_3 thread waitanddetonate( 0.1 );
}
self.c4array = var_1;
self notify( "detonated" );
}
}
}
waitanddetonate( var_0 )
{
self endon( "death" );
wait( var_0 );
self detonate();
}
c4damage()
{
self.health = 100;
self setcandamage( 1 );
self.maxhealth = 100000;
self.health = self.maxhealth;
var_0 = undefined;
for (;;)
{
self waittill( "damage", var_1, var_0 );
break;
}
self playsound( "claymore_activated_SP" );
if ( level.c4explodethisframe )
wait( 0.1 + randomfloat( 0.4 ) );
else
wait 0.05;
if ( !isdefined( self ) )
return;
level.c4explodethisframe = 1;
thread resetc4explodethisframe();
if ( isplayer( var_0 ) )
self detonate( var_0 );
else
self detonate();
}
resetc4explodethisframe()
{
wait 0.05;
level.c4explodethisframe = 0;
}
saydamaged( var_0, var_1 )
{
for ( var_2 = 0; var_2 < 60; var_2++ )
wait 0.05;
}
playc4effects()
{
self endon( "death" );
self waittill( "missile_stuck" );
playfxontag( common_scripts\utility::getfx( "c4_light_blink" ), self, "tag_fx" );
}
playclaymoreeffects()
{
self endon( "death" );
self waittill( "missile_stuck" );
playfxontag( common_scripts\utility::getfx( "claymore_laser" ), self, "tag_fx" );
}
clearfxondeath( var_0 )
{
self waittill( "death" );
var_0 delete();
}
getdamageableents( var_0, var_1, var_2, var_3 )
{
var_4 = [];
if ( !isdefined( var_2 ) )
var_2 = 0;
if ( !isdefined( var_3 ) )
var_3 = 0;
for ( var_5 = 0; var_5 < level.players.size; var_5++ )
{
if ( !isalive( level.players[var_5] ) || level.players[var_5].sessionstate != "playing" )
continue;
var_6 = level.players[var_5].origin + ( 0, 0, 32 );
var_7 = distance( var_0, var_6 );
if ( var_7 < var_1 && ( !var_2 || weapondamagetracepassed( var_0, var_6, var_3, undefined ) ) )
{
var_8 = spawnstruct();
var_8.isplayer = 1;
var_8.isadestructable = 0;
var_8.entity = level.players[var_5];
var_8.damagecenter = var_6;
var_4[var_4.size] = var_8;
}
}
var_9 = getentarray( "grenade", "classname" );
for ( var_5 = 0; var_5 < var_9.size; var_5++ )
{
var_10 = var_9[var_5].origin;
var_7 = distance( var_0, var_10 );
if ( var_7 < var_1 && ( !var_2 || weapondamagetracepassed( var_0, var_10, var_3, var_9[var_5] ) ) )
{
var_8 = spawnstruct();
var_8.isplayer = 0;
var_8.isadestructable = 0;
var_8.entity = var_9[var_5];
var_8.damagecenter = var_10;
var_4[var_4.size] = var_8;
}
}
var_11 = getentarray( "destructable", "targetname" );
for ( var_5 = 0; var_5 < var_11.size; var_5++ )
{
var_10 = var_11[var_5].origin;
var_7 = distance( var_0, var_10 );
if ( var_7 < var_1 && ( !var_2 || weapondamagetracepassed( var_0, var_10, var_3, var_11[var_5] ) ) )
{
var_8 = spawnstruct();
var_8.isplayer = 0;
var_8.isadestructable = 1;
var_8.entity = var_11[var_5];
var_8.damagecenter = var_10;
var_4[var_4.size] = var_8;
}
}
return var_4;
}
weapondamagetracepassed( var_0, var_1, var_2, var_3 )
{
var_4 = undefined;
var_5 = var_1 - var_0;
if ( lengthsquared( var_5 ) < var_2 * var_2 )
var_4 = var_1;
var_6 = vectornormalize( var_5 );
var_4 = var_0 + ( var_6[0] * var_2, var_6[1] * var_2, var_6[2] * var_2 );
var_7 = bullettrace( var_4, var_1, 0, var_3 );
if ( getdvarint( "scr_damage_debug" ) != 0 )
{
if ( var_7["fraction"] == 1 )
thread debugline( var_4, var_1, ( 1, 1, 1 ) );
else
{
thread debugline( var_4, var_7["position"], ( 1, 0.9, 0.8 ) );
thread debugline( var_7["position"], var_1, ( 1, 0.4, 0.3 ) );
}
}
return var_7["fraction"] == 1;
}
damageent( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
if ( self.isplayer )
{
self.damageorigin = var_5;
self.entity thread [[ level.callbackplayerdamage ]]( var_0, var_1, var_2, 0, var_3, var_4, var_5, var_6, "none", 0 );
}
else
{
if ( self.isadestructable && ( var_4 == "artillery_mp" || var_4 == "claymore_mp" ) )
return;
self.entity notify( "damage", var_2, var_1 );
}
}
debugline( var_0, var_1, var_2 )
{
for ( var_3 = 0; var_3 < 600; var_3++ )
wait 0.05;
}
onweapondamage( var_0, var_1, var_2, var_3 )
{
self endon( "death" );
switch ( var_1 )
{
case "concussion_grenade_mp":
var_4 = 512;
var_5 = 1 - distance( self.origin, var_0.origin ) / var_4;
var_6 = 1 + 4 * var_5;
wait 0.05;
self shellshock( "concussion_grenade_mp", var_6 );
break;
default:
break;
}
}
watchc4altdetonate()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "detonated" );
level endon( "game_ended" );
var_0 = 0;
for (;;)
{
if ( self usebuttonpressed() )
{
var_0 = 0;
while ( self usebuttonpressed() )
{
var_0 = var_0 + 0.05;
wait 0.05;
}
if ( var_0 >= 0.5 )
continue;
var_0 = 0;
while ( !self usebuttonpressed() && var_0 < 0.5 )
{
var_0 = var_0 + 0.05;
wait 0.05;
}
if ( var_0 >= 0.5 )
continue;
if ( !self.c4array.size )
return;
self notify( "alt_detonate" );
}
wait 0.05;
}
}