572 lines
16 KiB
Plaintext
572 lines
16 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
initteargas()
|
|
{
|
|
level.teargas_loaded = 1;
|
|
precache_teargas();
|
|
level.teargassed_ai = [];
|
|
level.teargas_scripted_guys = [];
|
|
level.teargas_cough_count = 0;
|
|
level.teargas_last_cough_sound = 0;
|
|
level.teargas_reaction_anim = [];
|
|
level.teargas_reaction_anim[0] = "teargas_react1";
|
|
level.teargas_reaction_anim[1] = "teargas_react2";
|
|
level.teargas_reaction_anim[2] = "teargas_react3";
|
|
level.teargas_recover_anim = [];
|
|
level.teargas_recover_anim[0] = "teargas_recover1";
|
|
level.teargas_recover_anim[1] = "teargas_recover2";
|
|
level.teargas_recover_anim[2] = "teargas_recover3";
|
|
level.teargas_recover_anim[3] = "teargas_recover4";
|
|
level.teargas_recover_anim[4] = "teargas_recover5";
|
|
level.teargas_recover_anim[5] = "teargas_recover6";
|
|
level.teargas_recover_anim[6] = "teargas_react_inplace";
|
|
level.teargas_cough_vo = [];
|
|
level.teargas_cough_vo[0] = "enemyhq_fs1_coughinggaggingandhacking";
|
|
level.teargas_cough_vo[1] = "enemyhq_fs2_coughinggaggingandhacking";
|
|
level.teargas_cough_vo[2] = "enemyhq_fs3_coughinggaggingandhacking";
|
|
level.teargas_cough_vo[3] = "enemyhq_fs1_coughinggaggingandhacking_2";
|
|
level.teargas_cough_vo[4] = "enemyhq_fs2_coughinggaggingandhacking_2";
|
|
level.teargas_cough_vo[5] = "enemyhq_fs3_coughinggaggingandhacking_2";
|
|
level.teargas_cough_vo[6] = "enemyhq_fs1_coughinggaggingandhacking_3";
|
|
level.teargas_cough_vo[7] = "enemyhq_fs2_coughinggaggingandhacking_3";
|
|
level.teargas_cough_vo[8] = "enemyhq_fs3_coughinggaggingandhacking_3";
|
|
level.teargas_cough_vo[9] = "enemyhq_fs1_coughinggaggingandhacking_4";
|
|
level.teargas_cough_vo[10] = "enemyhq_fs2_coughinggaggingandhacking_4";
|
|
level.teargas_cough_vo[11] = "enemyhq_fs3_coughinggaggingandhacking_4";
|
|
level.coughing_active = 0;
|
|
level.fake_teargas_coughing = 0;
|
|
level.teargas_flush_volumes = getentarray( "teargas_flush_volume", "targetname" );
|
|
level.active_teargas = [];
|
|
level._effect["default_teargas_smoke"] = loadfx( "fx/smoke/teargas_grenade" );
|
|
thread handle_teargas_grenades();
|
|
thread handle_teargas_launcher();
|
|
}
|
|
|
|
handle_teargas_grenades()
|
|
{
|
|
level.teargas_count = 0;
|
|
level endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
level.player waittill( "grenade_fire", var_0, var_1 );
|
|
|
|
if ( var_1 == "teargas_grenade" )
|
|
{
|
|
level.player notify( "teargas_thrown" );
|
|
var_0 thread track_teargas();
|
|
}
|
|
}
|
|
}
|
|
|
|
handle_teargas_launcher()
|
|
{
|
|
level endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
level.player waittill( "missile_fire", var_0, var_1 );
|
|
|
|
if ( var_1 == "m203_teargas_m4_acog" )
|
|
{
|
|
level.player notify( "teargas_launched" );
|
|
var_0 thread track_teargas();
|
|
}
|
|
}
|
|
}
|
|
|
|
track_teargas()
|
|
{
|
|
self endon( "death" );
|
|
level endon( "death" );
|
|
var_0 = spawn( "script_origin", ( 0, 0, 0 ) );
|
|
var_0 endon( "death" );
|
|
self.exploded = 0;
|
|
thread handle_teargas_explode( var_0 );
|
|
|
|
while ( isdefined( self ) && !self.exploded )
|
|
{
|
|
var_0.origin = self.origin;
|
|
|
|
foreach ( var_2 in level.teargas_flush_volumes )
|
|
{
|
|
if ( var_0 istouching( var_2 ) )
|
|
var_2 notify( "teargas_touched" );
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
handle_teargas_explode( var_0 )
|
|
{
|
|
self waittill( "explode", var_1 );
|
|
var_2 = 0;
|
|
var_0.origin = var_1;
|
|
var_3 = 0;
|
|
|
|
foreach ( var_5 in level.teargas_flush_volumes )
|
|
{
|
|
if ( var_0 istouching( var_5 ) )
|
|
{
|
|
var_5 thread handle_teargas_volume( var_1 );
|
|
var_5 notify( "teargas_exploded" );
|
|
var_2++;
|
|
|
|
if ( isdefined( var_5.script_parameters ) )
|
|
{
|
|
var_3 = 1;
|
|
var_5.finished = 0;
|
|
|
|
if ( !isdefined( var_5.playing_fx ) )
|
|
{
|
|
var_5.playing_fx = 1;
|
|
common_scripts\utility::exploder( int( var_5.script_parameters ) );
|
|
}
|
|
}
|
|
|
|
var_5 thread handle_coughing();
|
|
}
|
|
}
|
|
|
|
if ( !var_3 )
|
|
playfx( level._effect["default_teargas_smoke"], var_1 );
|
|
|
|
if ( var_2 == 0 )
|
|
thread add_teargas_cloud_radius( 300, var_1 );
|
|
|
|
var_0 delete();
|
|
}
|
|
|
|
turn_off_gas()
|
|
{
|
|
wait 15;
|
|
|
|
if ( isdefined( self.playing_fx ) && self.playing_fx )
|
|
{
|
|
maps\_utility::stop_exploder( int( self.script_parameters ) );
|
|
self.playing_fx = undefined;
|
|
}
|
|
|
|
self.finished = 1;
|
|
var_0 = common_scripts\utility::array_find( level.active_teargas, self );
|
|
level.active_teargas = maps\_utility::array_remove_index( level.active_teargas, var_0 );
|
|
}
|
|
|
|
handle_teargas_volume( var_0 )
|
|
{
|
|
if ( !isdefined( self.target ) )
|
|
{
|
|
thread add_teargas_cloud_radius( 300, var_0, self );
|
|
return;
|
|
}
|
|
|
|
var_1 = maps\_utility::get_ai_touching_volume( "axis" );
|
|
|
|
foreach ( var_3 in var_1 )
|
|
{
|
|
wait( randomintrange( 1, 3 ) );
|
|
|
|
if ( isdefined( var_3 ) && isalive( var_3 ) && !var_3 maps\_utility::doinglongdeath() )
|
|
{
|
|
var_3.fixednode = 0;
|
|
var_3.pathrandompercent = randomintrange( 75, 100 );
|
|
var_4 = undefined;
|
|
var_5 = undefined;
|
|
var_6 = getnodearray( self.target, "targetname" );
|
|
|
|
if ( isdefined( var_6 ) && var_6.size > 0 )
|
|
var_4 = var_6[randomint( var_6.size )];
|
|
|
|
if ( isdefined( var_4 ) )
|
|
var_3 thread ai_flee_from_teargas( var_4 );
|
|
else
|
|
{
|
|
var_5 = getent( self.target, "targetname" );
|
|
|
|
if ( isdefined( var_5 ) )
|
|
{
|
|
var_3 thread ai_flee_from_teargas( undefined, var_5 );
|
|
common_scripts\utility::waitframe();
|
|
var_3 setgoalvolume( var_5 );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
add_teargas_cloud_radius( var_0, var_1, var_2 )
|
|
{
|
|
level.teargas_count++;
|
|
var_3 = level.teargas_count;
|
|
level endon( "death" );
|
|
var_4 = getaiarray( "axis" );
|
|
var_5 = var_0 * var_0;
|
|
|
|
foreach ( var_7 in var_4 )
|
|
{
|
|
var_8 = distancesquared( var_7.origin, var_1 );
|
|
|
|
if ( var_5 > var_8 )
|
|
{
|
|
if ( isdefined( var_7 ) && isalive( var_7 ) && !var_7 maps\_utility::doinglongdeath() )
|
|
var_7 thread ai_react_to_teargas( var_1, var_0 );
|
|
}
|
|
}
|
|
|
|
var_10 = getnodesinradius( var_1, var_0, 0, 100, "Path" );
|
|
var_11 = spawn( "trigger_radius", var_1, 1, var_0 - 100, 100 );
|
|
var_11 thread handle_people_in_teargas();
|
|
var_12 = var_11;
|
|
var_12.nodes = var_10;
|
|
var_12.origin = var_1;
|
|
var_12.time = gettime();
|
|
var_12.bp_id = var_3;
|
|
var_11 thread handle_coughing();
|
|
var_13 = undefined;
|
|
|
|
if ( !isdefined( level.disable_teargas_ally_badplaces ) || level.disable_teargas_ally_badplaces == 0 )
|
|
{
|
|
var_13 = "ally_teargas_bp" + maps\_utility::string( var_3 );
|
|
|
|
if ( isdefined( var_2 ) )
|
|
badplace_brush( var_13, 15, var_2, "allies" );
|
|
else
|
|
badplace_cylinder( var_13, 15, var_1, var_0, 100, "allies" );
|
|
}
|
|
|
|
wait 3;
|
|
var_14 = "axis_teargas_bp" + maps\_utility::string( var_3 );
|
|
|
|
if ( isdefined( var_2 ) )
|
|
badplace_brush( var_14, 15, var_2, "axis" );
|
|
else
|
|
badplace_cylinder( var_14, 15, var_1, var_0, 100, "axis" );
|
|
|
|
wait 12;
|
|
|
|
if ( isdefined( var_13 ) )
|
|
badplace_delete( var_13 );
|
|
|
|
badplace_delete( var_14 );
|
|
level.teargas_scripted_guys = [];
|
|
var_11.finished = 1;
|
|
var_11 notify( "finished" );
|
|
common_scripts\utility::waitframe();
|
|
var_11 delete();
|
|
}
|
|
|
|
handle_coughing()
|
|
{
|
|
var_0 = common_scripts\utility::array_find( level.active_teargas, self );
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
{
|
|
level.active_teargas[level.active_teargas.size] = self;
|
|
thread turn_off_gas();
|
|
}
|
|
|
|
if ( level.coughing_active )
|
|
return;
|
|
|
|
level.coughing_active = 1;
|
|
|
|
while ( level.active_teargas.size > 0 || level.fake_teargas_coughing )
|
|
{
|
|
if ( level.teargas_cough_count < 3 )
|
|
{
|
|
var_1 = common_scripts\utility::array_combine( level.teargas_scripted_guys, level.teargassed_ai );
|
|
var_1 = maps\_utility::array_removedead_or_dying( var_1 );
|
|
var_1 = sortbydistance( var_1, level.player.origin );
|
|
|
|
for ( var_2 = 0; var_2 < 3 && var_2 < var_1.size && level.teargas_cough_count < 3; var_2++ )
|
|
{
|
|
var_1[var_2] thread ai_cough();
|
|
wait 0.1;
|
|
}
|
|
}
|
|
|
|
wait 0.25;
|
|
}
|
|
|
|
level.coughing_active = 0;
|
|
}
|
|
|
|
ai_cough()
|
|
{
|
|
if ( isalive( self ) && !isdefined( self.teargas_coughing ) )
|
|
{
|
|
self.teargas_coughing = 1;
|
|
level.teargas_cough_count++;
|
|
level.teargas_last_cough_sound = level.teargas_last_cough_sound + randomintrange( 1, 4 );
|
|
|
|
if ( level.teargas_last_cough_sound >= level.teargas_cough_vo.size )
|
|
level.teargas_last_cough_sound = level.teargas_last_cough_sound - level.teargas_cough_vo.size;
|
|
|
|
self playsound( level.teargas_cough_vo[level.teargas_last_cough_sound], "done_coughing" );
|
|
common_scripts\utility::waittill_any( "done_coughing", "death", "pain_death" );
|
|
|
|
if ( isdefined( self ) )
|
|
{
|
|
if ( isalive( self ) )
|
|
self.teargas_coughing = undefined;
|
|
else
|
|
self stopsounds();
|
|
}
|
|
|
|
level.teargas_cough_count--;
|
|
}
|
|
}
|
|
|
|
handle_people_in_teargas()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "finished" );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "trigger", var_0 );
|
|
|
|
if ( isdefined( self.finished ) )
|
|
return;
|
|
|
|
if ( var_0 != level.player )
|
|
{
|
|
var_0 ai_react_to_teargas( self.origin, 300 );
|
|
continue;
|
|
}
|
|
|
|
if ( !isdefined( level.player.gasmask_on ) || level.player.gasmask_on == 0 )
|
|
{
|
|
level.player setwatersheeting( 1, 7 );
|
|
level.player shellshock( "default", 7 );
|
|
wait 6;
|
|
}
|
|
}
|
|
}
|
|
|
|
remove_other_gassed_nodes( var_0, var_1 )
|
|
{
|
|
var_2 = [];
|
|
|
|
foreach ( var_4 in level.active_teargas )
|
|
{
|
|
if ( isdefined( var_4 ) && isdefined( var_4.origin ) && var_4.origin != var_1 && isdefined( var_4.nodes ) )
|
|
var_0 = common_scripts\utility::array_remove_array( var_0, var_4.nodes );
|
|
}
|
|
|
|
return var_0;
|
|
}
|
|
|
|
find_scripted_teargas_flee_node( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = var_2 * var_2;
|
|
var_4 = var_1 * var_1;
|
|
var_5 = distancesquared( var_0, level.player.origin );
|
|
var_6 = getnodearray( "teargas_flee_node", "targetname" );
|
|
var_7 = [];
|
|
var_8 = undefined;
|
|
|
|
foreach ( var_10 in var_6 )
|
|
{
|
|
var_11 = distancesquared( var_0, var_10.origin );
|
|
|
|
if ( var_11 <= var_3 && var_11 < var_4 )
|
|
{
|
|
var_12 = distancesquared( var_10.origin, level.player.origin );
|
|
|
|
if ( var_12 < var_5 )
|
|
var_7[var_7.size] = var_10;
|
|
}
|
|
}
|
|
|
|
if ( var_7.size > 0 )
|
|
var_8 = var_7[randomint( var_7.size )];
|
|
|
|
return var_8;
|
|
}
|
|
|
|
find_teargas_free_node( var_0, var_1, var_2 )
|
|
{
|
|
if ( !isdefined( var_2 ) )
|
|
var_2 = 0;
|
|
|
|
var_3 = getnodesinradius( var_0, var_1, var_2, 100, "Path" );
|
|
var_3 = remove_other_gassed_nodes( var_3, var_0 );
|
|
|
|
if ( !isdefined( var_3 ) || var_3.size == 0 )
|
|
return;
|
|
|
|
var_4 = var_3[randomint( var_3.size )];
|
|
|
|
for ( var_3 = common_scripts\utility::array_remove( var_3, var_4 ); isdefined( var_4.owner ); var_3 = common_scripts\utility::array_remove( var_3, var_4 ) )
|
|
{
|
|
if ( var_3.size == 0 )
|
|
return;
|
|
|
|
var_4 = var_3[randomint( var_3.size )];
|
|
}
|
|
|
|
return var_4;
|
|
}
|
|
|
|
ai_react_to_teargas( var_0, var_1 )
|
|
{
|
|
self endon( "death" );
|
|
|
|
if ( isdefined( self.syncedmeleetarget ) || isdefined( self.melee ) && isdefined( self.melee.target ) || isdefined( self.gasmask_on ) && self.gasmask_on == 1 )
|
|
return;
|
|
|
|
var_2 = distance2d( self.origin, var_0 );
|
|
|
|
if ( var_2 > 100 )
|
|
{
|
|
var_3 = var_2 / var_1 * 3;
|
|
wait( var_3 );
|
|
var_2 = distance2d( self.origin, var_0 );
|
|
|
|
if ( var_2 > var_1 )
|
|
return;
|
|
}
|
|
|
|
var_4 = find_scripted_teargas_flee_node( var_0, var_1, 2000 );
|
|
|
|
if ( !isdefined( var_4 ) )
|
|
var_4 = find_teargas_free_node( var_0, var_1 + 200, var_1 );
|
|
|
|
if ( isdefined( var_4 ) )
|
|
ai_flee_from_teargas( var_4 );
|
|
}
|
|
|
|
ai_flee_from_teargas( var_0, var_1 )
|
|
{
|
|
self endon( "death" );
|
|
|
|
if ( isdefined( self ) == 0 || isalive( self ) == 0 || maps\_utility::doinglongdeath() )
|
|
return;
|
|
|
|
maps\_utility::set_ignoresuppression( 1 );
|
|
self.tg_old_animname = self.animname;
|
|
self.animname = "generic";
|
|
self clearenemy();
|
|
self.tg_old_badplace_awareness = self.badplaceawareness;
|
|
self.badplaceawareness = 0;
|
|
self.ignoreall = 1;
|
|
self.allowdeath = 1;
|
|
self.disablearrivals = 1;
|
|
self.disableexits = 1;
|
|
self.script_forcegoal = 0;
|
|
|
|
if ( !isdefined( self.teargassed ) )
|
|
{
|
|
self.teargassed = 1;
|
|
thread handle_gassed_ai( self );
|
|
var_2 = level.teargas_reaction_anim[randomint( level.teargas_reaction_anim.size )];
|
|
|
|
if ( check_melee_interaction_active() )
|
|
{
|
|
cleanup_teargas_on_exit();
|
|
return;
|
|
}
|
|
|
|
childthread maps\_anim::anim_custom_animmode_solo( self, "gravity", var_2 );
|
|
}
|
|
|
|
if ( check_melee_interaction_active() )
|
|
{
|
|
cleanup_teargas_on_exit();
|
|
return;
|
|
}
|
|
|
|
var_3 = self.goalradius;
|
|
var_4 = "teargas_run" + ( 1 + randomint( 5 ) );
|
|
maps\_utility::set_run_anim( var_4 );
|
|
|
|
if ( isdefined( var_1 ) )
|
|
{
|
|
self setgoalvolumeauto( var_1 );
|
|
self waittill( "goal" );
|
|
wait( randomfloatrange( 2, 5 ) );
|
|
}
|
|
else if ( isdefined( var_0 ) )
|
|
{
|
|
maps\_utility::set_goalradius( 20 );
|
|
self setgoalnode( var_0 );
|
|
self waittill( "goal" );
|
|
}
|
|
else
|
|
{
|
|
maps\_utility::set_goalradius( 50 );
|
|
self setgoalentity( level.player );
|
|
self waittill( "goal" );
|
|
}
|
|
|
|
maps\_utility::set_goalradius( var_3 );
|
|
var_5 = level.teargas_recover_anim[randomint( level.teargas_recover_anim.size )];
|
|
|
|
if ( !isdefined( self.animname ) )
|
|
self.animname = "generic";
|
|
|
|
if ( check_melee_interaction_active() )
|
|
{
|
|
cleanup_teargas_on_exit();
|
|
return;
|
|
}
|
|
|
|
maps\_anim::anim_custom_animmode_solo( self, "gravity", var_5 );
|
|
cleanup_teargas_on_exit();
|
|
}
|
|
|
|
cleanup_teargas_on_exit()
|
|
{
|
|
maps\_utility::clear_run_anim();
|
|
self.ignoreall = 0;
|
|
self.disablearrivals = 0;
|
|
self.disableexits = 0;
|
|
self.badplaceawareness = self.tg_old_badplace_awareness;
|
|
maps\_utility::set_ignoresuppression( 0 );
|
|
|
|
if ( isdefined( self.animname ) && self.animname == "generic" )
|
|
self.animname = self.tg_old_animname;
|
|
|
|
self.teargassed = undefined;
|
|
}
|
|
|
|
check_melee_interaction_active()
|
|
{
|
|
if ( isdefined( self.dog_attacking_me ) || isdefined( self.syncedmeleetarget ) || isdefined( self.melee ) && isdefined( self.melee.target ) )
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
handle_gassed_ai( var_0 )
|
|
{
|
|
level.teargassed_ai[level.teargassed_ai.size] = var_0;
|
|
var_0 waittill( "death" );
|
|
common_scripts\utility::array_remove( level.teargassed_ai, var_0 );
|
|
}
|
|
|
|
#using_animtree("generic_human");
|
|
|
|
precache_teargas()
|
|
{
|
|
precacheitem( "teargas_grenade" );
|
|
level.scr_anim["generic"]["teargas_react1"] = %teargas_react_1;
|
|
level.scr_anim["generic"]["teargas_react2"] = %teargas_react_2;
|
|
level.scr_anim["generic"]["teargas_react3"] = %teargas_react_3;
|
|
level.scr_anim["generic"]["teargas_react_inplace"] = %teargas_react_in_place_1;
|
|
level.scr_anim["generic"]["teargas_run1"][0] = %teargas_run_1;
|
|
level.scr_anim["generic"]["teargas_run2"][0] = %teargas_run_2;
|
|
level.scr_anim["generic"]["teargas_run3"][0] = %teargas_run_3;
|
|
level.scr_anim["generic"]["teargas_run4"][0] = %teargas_run_4;
|
|
level.scr_anim["generic"]["teargas_run5"][0] = %teargas_run_5;
|
|
level.scr_anim["generic"]["teargas_recover1"] = %teargas_recover_1;
|
|
level.scr_anim["generic"]["teargas_recover2"] = %teargas_recover_2;
|
|
level.scr_anim["generic"]["teargas_recover3"] = %teargas_recover_3;
|
|
level.scr_anim["generic"]["teargas_recover4"] = %teargas_recover_4;
|
|
level.scr_anim["generic"]["teargas_recover5"] = %teargas_recover_5;
|
|
level.scr_anim["generic"]["teargas_recover6"] = %teargas_recover_6;
|
|
}
|