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

385 lines
11 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
createmortar( var_0 )
{
level.mortarconfig = var_0;
var_0 thread update_mortars();
level.air_raid_active = 0;
level.mapcustomcratefunc = ::mortarcustomcratefunc;
level.mapcustomkillstreakfunc = ::mortarcustomkillstreakfunc;
level.mapcustombotkillstreakfunc = ::mortarcustombotkillstreakfunc;
}
mortarcustomcratefunc()
{
if ( !isdefined( game["player_holding_level_killstrek"] ) )
game["player_holding_level_killstrek"] = 0;
if ( !maps\mp\_utility::allowlevelkillstreaks() || game["player_holding_level_killstrek"] )
return;
maps\mp\killstreaks\_airdrop::addcratetype( "airdrop_assault", level.mortarconfig.id, level.mortarconfig.crateweight, maps\mp\killstreaks\_airdrop::killstreakcratethink, maps\mp\killstreaks\_airdrop::get_friendly_crate_model(), maps\mp\killstreaks\_airdrop::get_enemy_crate_model(), level.mortarconfig.cratehint );
level thread watch_for_mortars_crate();
}
watch_for_mortars_crate()
{
for (;;)
{
level waittill( "createAirDropCrate", var_0 );
if ( isdefined( var_0 ) && isdefined( var_0.cratetype ) && var_0.cratetype == level.mortarconfig.id )
{
maps\mp\killstreaks\_airdrop::changecrateweight( "airdrop_assault", level.mortarconfig.id, 0 );
var_1 = wait_for_capture( var_0 );
if ( !var_1 )
{
maps\mp\killstreaks\_airdrop::changecrateweight( "airdrop_assault", level.mortarconfig.id, level.mortarconfig.crateweight );
continue;
}
game["player_holding_level_killstrek"] = 1;
break;
}
}
}
wait_for_capture( var_0 )
{
var_1 = watch_for_air_drop_death( var_0 );
return !isdefined( var_1 );
}
watch_for_air_drop_death( var_0 )
{
var_0 endon( "captured" );
var_0 waittill( "death" );
waittillframeend;
return 1;
}
mortarcustomkillstreakfunc()
{
level.killstreakfuncs[level.mortarconfig.id] = ::tryusemortars;
level.killstreakweildweapons[level.mortarconfig.weaponname] = level.mortarconfig.id;
}
mortarcustombotkillstreakfunc()
{
maps\mp\bots\_bots_ks::bot_register_killstreak_func( level.mortarconfig.id, maps\mp\bots\_bots_ks::bot_killstreak_simple_use );
}
tryusemortars( var_0, var_1 )
{
if ( level.air_raid_active )
{
self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
return 0;
}
game["player_holding_level_killstrek"] = 0;
level notify( "mortar_killstreak_used", self );
if ( isdefined( level.mortarconfig.splashname ) )
thread maps\mp\_utility::teamplayercardsplash( level.mortarconfig.splashname, self );
return 1;
}
mortars_activate_at_end_of_match()
{
level endon( "mortar_killstreak_used" );
level waittill( "spawning_intermission" );
level.ending_flourish = 1;
mortar_fire( 0.1, 0.3, 2.5, 2.5, 6, level.players[0] );
}
update_mortars()
{
level endon( "stop_dynamic_events" );
common_scripts\utility::waitframe();
if ( isdefined( self.sourcestructs ) )
self.mortar_sources = common_scripts\utility::getstructarray( self.sourcestructs, "targetname" );
else if ( isdefined( self.sourceents ) )
self.mortar_sources = getentarray( self.sourceents, "targetname" );
foreach ( var_1 in self.mortar_sources )
{
if ( !isdefined( var_1.radius ) )
var_1.radius = 300;
}
self.mortar_targets = common_scripts\utility::getstructarray( self.targetstructs, "targetname" );
foreach ( var_4 in self.mortar_targets )
{
if ( !isdefined( var_4.radius ) )
var_4.radius = 100;
}
for (;;)
{
level.air_raid_active = 0;
level.air_raid_team_called = "none";
thread mortars_activate_at_end_of_match();
level waittill( "mortar_killstreak_used", var_6 );
level.air_raid_active = 1;
level.air_raid_team_called = var_6.team;
thread warning_audio();
wait( self.launchdelay );
mortar_fire( self.launchdelaymin, self.launchdelaymax, self.launchairtimemin, self.launchairtimemax, self.strikeduration, var_6 );
level notify( "mortar_killstreak_end" );
}
}
warning_audio()
{
if ( !isdefined( self.warningsfxentname ) || !isdefined( self.warningsfx ) )
return;
if ( !isdefined( self.warning_sfx_ent ) )
self.warning_sfx_ent = getent( self.warningsfxentname, "targetname" );
if ( isdefined( self.warning_sfx_ent ) )
{
self.warning_sfx_ent playsound( self.warningsfx );
wait( self.warningsfxduration );
self.warning_sfx_ent stopsounds();
}
}
mortar_fire( var_0, var_1, var_2, var_3, var_4, var_5 )
{
var_6 = gettime() + var_4 * 1000;
var_7 = random_mortars_get_source_structs( level.air_raid_team_called );
if ( var_7.size <= 0 )
return;
level notify( "mortar_killstreak_start" );
var_8 = 0;
while ( var_6 > gettime() )
{
var_9 = self.projectileperloop;
var_10 = 0;
foreach ( var_12 in level.players )
{
if ( !maps\mp\_utility::isreallyalive( var_12 ) )
continue;
if ( level.teambased )
{
if ( var_12.team == level.air_raid_team_called )
continue;
}
else if ( isdefined( var_5 ) && var_12 == var_5 )
continue;
if ( var_12.spawntime + 8000 > gettime() )
continue;
var_13 = var_12 getvelocity();
var_14 = var_2;
if ( var_3 > var_2 )
var_14 = randomfloatrange( var_2, var_3 );
var_15 = var_12.origin + var_13 * var_14;
var_16 = getnodesinradiussorted( var_15, 100, 0, 60 );
foreach ( var_18 in var_16 )
{
if ( nodeexposedtosky( var_18 ) )
{
var_19 = common_scripts\utility::random( var_7 );
if ( random_mortars_fire( var_19.origin, var_18.origin, var_14, var_5, 1, 1, var_19 ) )
{
wait( randomfloatrange( var_0, var_1 ) );
var_10++;
break;
}
}
}
}
if ( self.mortar_targets.size > 0 )
{
for ( var_7 = common_scripts\utility::array_randomize( var_7 ); var_10 < var_9; var_10++ )
{
var_19 = var_7[var_8];
var_8++;
if ( var_8 >= var_7.size )
var_8 = 0;
var_22 = common_scripts\utility::random( self.mortar_targets );
var_14 = var_2;
if ( var_3 > var_2 )
var_14 = randomfloatrange( var_2, var_3 );
var_23 = random_point_in_circle( var_19.origin, var_19.radius );
var_24 = random_point_in_circle( var_22.origin, var_22.radius );
thread random_mortars_fire( var_23, var_24, var_14, var_5, 0, 1, var_19 );
wait( randomfloatrange( var_0, var_1 ) );
}
}
else
break;
if ( isdefined( self.delaybetweenvolleys ) )
{
level notify( "mortar_volleyFinished" );
wait( self.delaybetweenvolleys );
}
}
}
random_point_in_circle( var_0, var_1 )
{
if ( var_1 > 0 )
{
var_2 = anglestoforward( ( 0, randomfloatrange( 0, 360 ), 0 ) );
var_3 = randomfloatrange( 0, var_1 );
var_0 = var_0 + var_2 * var_3;
}
return var_0;
}
random_mortars_fire( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
if ( isdefined( self.launchsfx ) )
playsoundatpos( var_0, self.launchsfx );
else if ( isdefined( self.launchsfxarray ) && self.launchsfxarray.size > 0 && isdefined( self.launchsfxstartid ) )
{
if ( self.launchsfxstartid >= self.launchsfxarray.size )
self.launchsfxstartid = 0;
playsoundatpos( var_0, self.launchsfxarray[self.launchsfxstartid] );
self.launchsfxstartid++;
}
var_7 = ( 0, 0, -800 );
var_8 = trajectorycalculateinitialvelocity( var_0, var_1, var_7, var_2 );
if ( isdefined( self.launchvfx ) )
{
if ( isdefined( var_6 ) && var_6.classname != "struct" )
playfxontag( common_scripts\utility::getfx( self.launchvfx ), var_6, "tag_origin" );
else
playfx( common_scripts\utility::getfx( self.launchvfx ), var_0, var_8 );
}
if ( isdefined( var_4 ) && var_4 )
{
var_9 = trajectorycomputedeltaheightattime( var_8[2], -1 * var_7[2], var_2 / 2 );
var_10 = ( var_1 - var_0 ) / 2 + var_0 + ( 0, 0, var_9 );
if ( bullettracepassed( var_10, var_1, 0, undefined ) )
{
thread random_mortars_fire_run( var_0, var_1, var_2, var_3, var_8, var_5 );
return 1;
}
else
return 0;
}
random_mortars_fire_run( var_0, var_1, var_2, var_3, var_8, var_5 );
}
random_mortars_fire_run( var_0, var_1, var_2, var_3, var_4, var_5 )
{
var_6 = 350;
var_7 = createprojectileentity( var_0, self.model );
var_7.in_use = 1;
common_scripts\utility::waitframe();
if ( isdefined( self.trailvfx ) )
playfxontag( common_scripts\utility::getfx( self.trailvfx ), var_7, "tag_fx" );
var_7.angles = vectortoangles( var_4 ) * ( -1, 1, 1 );
if ( isdefined( self.incomingsfx ) )
thread playsoundatposintime( self.incomingsfx, var_1, var_2 - 2.0 );
var_7 movegravity( var_4, var_2 - 0.05 );
if ( isdefined( self.rotateprojectiles ) && self.rotateprojectiles )
var_7 rotatevelocity( common_scripts\utility::randomvectorrange( self.minrotatation, self.maxrotation ), var_2, 2, 0 );
var_7 waittill( "movedone" );
if ( level.createfx_enabled && !isdefined( level.players ) )
level.players = [];
if ( isdefined( var_3 ) )
var_7 radiusdamage( var_1, 250, 750, 500, var_3, "MOD_EXPLOSIVE", self.weaponname );
else
var_7 radiusdamage( var_1, 140, 5, 5, undefined, "MOD_EXPLOSIVE", self.weaponname );
playrumbleonposition( "artillery_rumble", var_1 );
var_8 = var_6 * var_6;
foreach ( var_10 in level.players )
{
if ( var_10 maps\mp\_utility::isusingremote() )
continue;
if ( distancesquared( var_1, var_10.origin ) > var_8 )
continue;
if ( var_10 damageconetrace( var_1 ) )
var_10 thread maps\mp\gametypes\_shellshock::dirteffect( var_1 );
}
if ( var_5 )
{
if ( isdefined( self.impactvfx ) )
playfx( common_scripts\utility::getfx( self.impactvfx ), var_1 );
if ( isdefined( self.impactsfx ) )
playsoundatpos( var_1, self.impactsfx );
}
var_7 delete();
}
playsoundatposintime( var_0, var_1, var_2 )
{
wait( var_2 );
playsoundatpos( var_1, var_0 );
}
createprojectileentity( var_0, var_1 )
{
var_2 = spawn( "script_model", var_0 );
var_2 setmodel( var_1 );
return var_2;
}
random_mortars_get_source_structs( var_0 )
{
var_1 = [];
if ( level.teambased )
{
foreach ( var_3 in self.mortar_sources )
{
if ( isdefined( var_3.script_team ) && var_3.script_team == var_0 )
var_1[var_1.size] = var_3;
}
}
if ( var_1.size == 0 )
var_1 = self.mortar_sources;
return var_1;
}