385 lines
11 KiB
Plaintext
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;
|
|
}
|