545 lines
15 KiB
Plaintext
545 lines
15 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
stealth_init()
|
|
{
|
|
common_scripts\utility::flag_init( "stealth_spawn" );
|
|
common_scripts\utility::flag_init( "_stealth_spotted" );
|
|
common_scripts\utility::flag_init( "_stealth_spotted_punishment" );
|
|
common_scripts\utility::flag_init( "_stealth_enabled" );
|
|
level.stealth_ally_accu = 5;
|
|
level.global_callbacks["_autosave_stealthcheck"] = ::_autosave_stealthcheck;
|
|
level.underwater_visible_dist["hidden"] = 600;
|
|
level.underwater_visible_dist["spotted"] = 2000;
|
|
level.underwater_visible_dist["trigger"] = undefined;
|
|
common_scripts\utility::flag_set( "stealth_spawn" );
|
|
common_scripts\utility::array_thread( getentarray( "sight_adjust_trigger", "targetname" ), ::sight_trigger_think );
|
|
thread stealth_logic_loop();
|
|
}
|
|
|
|
stealth_disable()
|
|
{
|
|
common_scripts\utility::flag_clear( "stealth_spawn" );
|
|
common_scripts\utility::flag_set( "_stealth_spotted" );
|
|
var_0 = getaiarray( "axis" );
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
if ( var_2 maps\_utility::ent_flag_exist( "_stealth_spotted" ) )
|
|
var_2 maps\_utility::ent_flag_set( "_stealth_spotted" );
|
|
}
|
|
|
|
common_scripts\utility::waitframe();
|
|
level notify( "disable_stealth" );
|
|
common_scripts\utility::flag_set( "_stealth_spotted" );
|
|
common_scripts\utility::flag_clear( "_stealth_enabled" );
|
|
}
|
|
|
|
ai_stealth_init()
|
|
{
|
|
if ( !isai( self ) )
|
|
return;
|
|
|
|
if ( self.type == "dog" )
|
|
return;
|
|
|
|
self.baseaccuracy = 0.85;
|
|
maps\_utility::set_battlechatter( 0 );
|
|
|
|
if ( !common_scripts\utility::flag( "stealth_spawn" ) )
|
|
{
|
|
self.moveplaybackrate = 1.25;
|
|
self.movetransitionrate = self.moveplaybackrate;
|
|
return;
|
|
}
|
|
|
|
self clearenemy();
|
|
|
|
switch ( self.team )
|
|
{
|
|
case "axis":
|
|
thread enemy_stealth();
|
|
break;
|
|
case "allies":
|
|
thread friendly_stealth();
|
|
break;
|
|
}
|
|
}
|
|
|
|
stealth_logic_loop()
|
|
{
|
|
level endon( "disable_stealth" );
|
|
|
|
for (;;)
|
|
{
|
|
common_scripts\utility::flag_wait( "_stealth_spotted" );
|
|
|
|
for (;;)
|
|
{
|
|
if ( enemies_alerted() || common_scripts\utility::flag( "_stealth_spotted_punishment" ) )
|
|
{
|
|
wait 0.2;
|
|
continue;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
wait 0.5;
|
|
common_scripts\utility::flag_waitopen( "_stealth_spotted_punishment" );
|
|
common_scripts\utility::flag_clear( "_stealth_spotted" );
|
|
}
|
|
}
|
|
|
|
enemies_alerted()
|
|
{
|
|
var_0 = getaiarray( "axis" );
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
if ( var_2 maps\_utility::ent_flag_exist( "_stealth_spotted" ) && var_2 maps\_utility::ent_flag( "_stealth_spotted" ) )
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
enemy_stealth()
|
|
{
|
|
level endon( "disable_stealth" );
|
|
self endon( "death" );
|
|
self endon( "disable_stealth" );
|
|
|
|
if ( isdefined( self.script_stealthgroup ) )
|
|
self.script_stealthgroup = 0;
|
|
|
|
childthread ai_alert_loop();
|
|
maps\_utility::ent_flag_init( "_stealth_spotted" );
|
|
self.dontattackme = 1;
|
|
self.combatmode = "no_cover";
|
|
self.diequietly = 1;
|
|
self.fovcosine = 0.5;
|
|
self.fovcosinebusy = 0.1;
|
|
self stopanimscripted();
|
|
|
|
if ( !common_scripts\utility::flag( "_stealth_spotted" ) )
|
|
{
|
|
maps\_utility::ent_flag_wait( "_stealth_spotted" );
|
|
wait( randomfloatrange( 1.5, 2.5 ) );
|
|
}
|
|
else
|
|
maps\_utility::ent_flag_set( "_stealth_spotted" );
|
|
|
|
self notify( "stop_path" );
|
|
self.dontattackme = undefined;
|
|
self.combatmode = "cover";
|
|
self.fovcosine = 0.01;
|
|
self.diequietly = 0;
|
|
self.goalradius = 800;
|
|
self.goalheight = 256;
|
|
self.moveplaybackrate = 1.25;
|
|
self.movetransitionrate = self.moveplaybackrate;
|
|
self notify( "stealth_change_values" );
|
|
var_0 = self findbestcovernode();
|
|
|
|
if ( isdefined( var_0 ) )
|
|
{
|
|
self.goalradius = 32;
|
|
self.goalheight = 96;
|
|
self setgoalnode( var_0 );
|
|
self waittill( "goal" );
|
|
self.goalradius = 800;
|
|
}
|
|
}
|
|
|
|
ai_alert_loop()
|
|
{
|
|
self endon( "_stealth_spotted" );
|
|
self addaieventlistener( "gunshot" );
|
|
self addaieventlistener( "gunshot_teammate" );
|
|
self addaieventlistener( "silenced_shot" );
|
|
self addaieventlistener( "bulletwhizby" );
|
|
self addaieventlistener( "projectile_impact" );
|
|
self clearenemy();
|
|
var_0 = common_scripts\utility::waittill_any_return( "ai_event", "damage", "corpse", "enemy" );
|
|
wait 1;
|
|
thread alert_team();
|
|
}
|
|
|
|
alert_team()
|
|
{
|
|
maps\_utility::ent_flag_set( "_stealth_spotted" );
|
|
common_scripts\utility::flag_set( "_stealth_spotted" );
|
|
var_0 = getaiarray( "axis" );
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
if ( isalive( var_2 ) && var_2.script_stealthgroup == self.script_stealthgroup && !var_2 maps\_utility::ent_flag( "_stealth_spotted" ) )
|
|
{
|
|
var_2 maps\_utility::ent_flag_set( "_stealth_spotted" );
|
|
|
|
if ( common_scripts\utility::cointoss() )
|
|
wait( randomfloatrange( 0.1, 0.3 ) );
|
|
}
|
|
}
|
|
}
|
|
|
|
friendly_stealth()
|
|
{
|
|
level endon( "disable_stealth" );
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
maps\_utility::set_battlechatter( 0 );
|
|
self.ignoreme = 1;
|
|
self.alertlevel = "noncombat";
|
|
self.moveplaybackrate = 1;
|
|
self.movetransitionrate = self.moveplaybackrate;
|
|
common_scripts\utility::flag_wait( "_stealth_spotted" );
|
|
self.baseaccuracy = level.stealth_ally_accu;
|
|
self.ignoreme = 0;
|
|
self.ignoreall = 0;
|
|
self.moveplaybackrate = 1.25;
|
|
self.movetransitionrate = self.moveplaybackrate;
|
|
common_scripts\utility::flag_waitopen( "_stealth_spotted" );
|
|
}
|
|
}
|
|
|
|
player_stealth()
|
|
{
|
|
level endon( "disable_stealth" );
|
|
self endon( "death" );
|
|
common_scripts\utility::flag_set( "_stealth_enabled" );
|
|
childthread player_flashlight_toggle();
|
|
|
|
for (;;)
|
|
{
|
|
self.maxvisibledist = level.underwater_visible_dist["hidden"];
|
|
common_scripts\utility::flag_wait( "_stealth_spotted" );
|
|
self.maxvisibledist = level.underwater_visible_dist["spotted"];
|
|
common_scripts\utility::flag_waitopen( "_stealth_spotted" );
|
|
}
|
|
}
|
|
|
|
player_flashlight_toggle()
|
|
{
|
|
while ( !maps\_utility::ent_flag_exist( "flashlight_on" ) )
|
|
wait 0.05;
|
|
|
|
for (;;)
|
|
{
|
|
maps\_utility::ent_flag_wait( "flashlight_on" );
|
|
self.maxvisibledist = level.underwater_visible_dist["spotted"];
|
|
maps\_utility::ent_flag_waitopen( "flashlight_on" );
|
|
|
|
if ( common_scripts\utility::flag( "_stealth_spotted" ) )
|
|
{
|
|
self.maxvisibledist = level.underwater_visible_dist["spotted"];
|
|
continue;
|
|
}
|
|
|
|
if ( isdefined( level.underwater_visible_dist["trigger"] ) )
|
|
{
|
|
self.maxvisibledist = level.underwater_visible_dist["trigger"];
|
|
continue;
|
|
}
|
|
|
|
self.maxvisibledist = level.underwater_visible_dist["hidden"];
|
|
}
|
|
}
|
|
|
|
sight_trigger_think()
|
|
{
|
|
level endon( "disable_stealth" );
|
|
self endon( "death " );
|
|
|
|
while ( !level.player maps\_utility::ent_flag_exist( "flashlight_on" ) )
|
|
wait 0.05;
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "trigger" );
|
|
|
|
if ( common_scripts\utility::flag( "_stealth_spotted" ) || level.player maps\_utility::ent_flag( "flashlight_on" ) )
|
|
continue;
|
|
|
|
level.player.maxvisibledist = self.script_faceenemydist;
|
|
level.underwater_visible_dist["trigger"] = self.script_faceenemydist;
|
|
|
|
while ( level.player istouching( self ) && !common_scripts\utility::flag( "_stealth_spotted" ) && !level.player maps\_utility::ent_flag( "flashlight_on" ) )
|
|
wait 0.05;
|
|
|
|
if ( common_scripts\utility::flag( "_stealth_spotted" ) || level.player maps\_utility::ent_flag( "flashlight_on" ) )
|
|
level.player.maxvisibledist = level.underwater_visible_dist["spotted"];
|
|
else
|
|
level.player.maxvisibledist = level.underwater_visible_dist["hidden"];
|
|
|
|
if ( isdefined( level.underwater_visible_dist["trigger"] ) && level.underwater_visible_dist["trigger"] == self.script_faceenemydist )
|
|
level.underwater_visible_dist["trigger"] = undefined;
|
|
}
|
|
}
|
|
|
|
_autosave_stealthcheck()
|
|
{
|
|
if ( common_scripts\utility::flag( "_stealth_spotted" ) && common_scripts\utility::flag( "stealth_spawn" ) )
|
|
return 0;
|
|
|
|
if ( common_scripts\utility::flag( "shark_eating_player" ) )
|
|
return 0;
|
|
|
|
var_0 = getentarray( "destructible", "classname" );
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
if ( isdefined( var_2.healthdrain ) )
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
stealth_idle( var_0, var_1 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "damage" );
|
|
self endon( "_stealth_spotted" );
|
|
|
|
if ( common_scripts\utility::flag( "_stealth_spotted" ) )
|
|
return;
|
|
|
|
var_2["weld"] = "torch";
|
|
var_2["bangstick"] = "bangstick";
|
|
var_3 = isdefined( var_2[var_1] );
|
|
self.animname = "generic";
|
|
var_4 = var_0 common_scripts\utility::spawn_tag_origin();
|
|
var_4 maps\_anim::anim_reach_and_approach_solo( self, var_1, undefined, "Exposed 3D" );
|
|
var_4 delete();
|
|
var_5 = [ self ];
|
|
|
|
if ( var_3 )
|
|
{
|
|
var_6 = var_2[var_1];
|
|
self.prop = maps\_utility::spawn_anim_model( var_6, self.origin );
|
|
|
|
if ( isdefined( level.scr_anim[var_6] ) && isdefined( level.scr_anim[var_6][var_1 + "_idle"] ) )
|
|
var_5 = common_scripts\utility::array_add( var_5, self.prop );
|
|
else
|
|
self.prop linkto( self, "tag_inhand", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
}
|
|
|
|
thread stealth_idle_ender( var_0, var_1, self.prop );
|
|
self.allowdeath = 1;
|
|
self.allowpain = 1;
|
|
self.anim_blend_time_override = 1;
|
|
|
|
foreach ( var_8 in var_5 )
|
|
var_0 thread maps\_anim::anim_loop_solo( var_8, var_1 + "_idle" );
|
|
}
|
|
|
|
stealth_idle_ender( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = common_scripts\utility::waittill_any_return( "_stealth_stop_idle", "_stealth_spotted", "death", "damage" );
|
|
|
|
if ( isdefined( var_2 ) )
|
|
thread prop_drop( var_2 );
|
|
|
|
var_0 notify( "stop_loop" );
|
|
self stopanimscripted();
|
|
var_2 stopanimscripted();
|
|
}
|
|
|
|
prop_drop( var_0 )
|
|
{
|
|
var_0 unlink();
|
|
var_1 = 1;
|
|
var_0 moveto( var_0.origin - ( 0, 0, 1000 ), 60, 0, 60 );
|
|
|
|
if ( var_0.animname == "bangstick" )
|
|
var_0 thread bang_stick_rotate();
|
|
else if ( var_0.animname == "torch" )
|
|
{
|
|
var_0 thread torch_rotate();
|
|
|
|
if ( var_0.welding )
|
|
thread maps\ship_graveyard_anim::weld_fx_off( var_0 );
|
|
}
|
|
|
|
while ( var_1 )
|
|
{
|
|
var_1 = bullettracepassed( var_0.origin, var_0.origin - ( 0, 0, 10 ), 1, self );
|
|
wait 0.05;
|
|
}
|
|
|
|
var_0 notify( "stopped_dropping" );
|
|
var_0 moveto( var_0.origin - ( 0, 0, 1 ), 1, 0, 1 );
|
|
wait 100;
|
|
|
|
while ( level.player maps\_utility::can_see_origin( var_0.origin ) )
|
|
wait 1;
|
|
|
|
var_0 delete();
|
|
}
|
|
|
|
bang_stick_rotate()
|
|
{
|
|
self waittill( "stopped_dropping" );
|
|
var_0 = 7;
|
|
var_1 = 7;
|
|
|
|
if ( self.animname == "bangstick" )
|
|
{
|
|
self moveto( ( 342, -63295, -53 ), var_1, var_1 / 2, var_1 / 2 );
|
|
self rotateto( ( 354.461, 26.61, 160.045 ), var_0, var_0 - 0.1, 0.1 );
|
|
}
|
|
}
|
|
|
|
torch_rotate()
|
|
{
|
|
var_0 = 10;
|
|
self rotateby( ( randomintrange( 1, 180 ), randomintrange( 1, 180 ), randomintrange( 1, 180 ) ), var_0, 0, var_0 );
|
|
self waittill( "stopped_dropping" );
|
|
self rotateto( self.angles, 0.1 );
|
|
}
|
|
|
|
stealth_melee()
|
|
{
|
|
self.melee_trigger = spawn( "trigger_radius", self.origin - ( 0, 0, 32 ), 0, 96, 64 );
|
|
self.melee_trigger enablelinkto();
|
|
self.melee_trigger linkto( self );
|
|
thread common_scripts\utility::delete_on_death( self.melee_trigger );
|
|
self.melee_trigger endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
self.melee_trigger waittill( "trigger" );
|
|
self notify( "player_too_far" );
|
|
|
|
if ( maps\ship_graveyard_util::player_is_behind_me( -0.6 ) && maps\_utility::player_looking_at( self.origin, 0.9, 1 ) )
|
|
{
|
|
thread waittill_player_out_of_trigger();
|
|
thread waittill_player_not_behind_me();
|
|
thread waittill_player_not_lookat_me();
|
|
thread waittill_my_death();
|
|
player_wait_for_melee_command();
|
|
level.player allowmelee( 1 );
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
player_wait_for_melee_command()
|
|
{
|
|
self endon( "player_too_far" );
|
|
self endon( "death" );
|
|
level.player waittill( "melee_button_pressed" );
|
|
|
|
if ( maps\ship_graveyard_util::player_is_behind_me( -0.6 ) && maps\_utility::player_looking_at( self.origin, 0.9, 1 ) )
|
|
{
|
|
self.ignoreall = 1;
|
|
self notify( "started_player_melee" );
|
|
self notify( "disable_stealth" );
|
|
self unlink();
|
|
self notify( "stop_loop" );
|
|
|
|
if ( isdefined( self.anim_node ) )
|
|
self.anim_node notify( "stop_loop" );
|
|
|
|
var_0 = spawnstruct();
|
|
var_0.origin = self.origin;
|
|
var_0.angles = self.angles;
|
|
var_1 = level.player.origin;
|
|
var_2 = anglestoforward( level.player.angles );
|
|
var_3 = anglestoright( level.player.angles );
|
|
var_4 = ( 0, 0, 48 );
|
|
var_5 = maps\_player_rig::get_player_rig();
|
|
var_5.origin = level.player.origin - var_4;
|
|
var_5.angles = level.player.angles;
|
|
var_5 hide();
|
|
var_5 attach( "viewmodel_knife", "TAG_WEAPON_RIGHT", 0 );
|
|
var_6 = common_scripts\utility::spawn_tag_origin();
|
|
var_6.origin = var_5.origin;
|
|
var_6.angles = var_5.angles;
|
|
var_6 linkto( var_5, "tag_player", var_4, ( 0, 0, 0 ) );
|
|
thread melee_death_fx();
|
|
var_0 thread maps\_anim::anim_generic( self, "stealth_kill" );
|
|
level.player disableweapons();
|
|
var_7 = 0.3;
|
|
level.player playerlinktoblend( var_6, "tag_origin", var_7, var_7, 0 );
|
|
var_5 common_scripts\utility::delaycall( var_7, ::show );
|
|
var_0 maps\_anim::anim_single_solo( var_5, "stealth_kill" );
|
|
level.player unlink();
|
|
level.player enableweapons();
|
|
level.player allowmelee( 1 );
|
|
var_5 delete();
|
|
var_6 delete();
|
|
wait 0.3;
|
|
self.health = 1;
|
|
self.allowdeath = 1;
|
|
self kill();
|
|
}
|
|
|
|
level.player allowmelee( 1 );
|
|
}
|
|
|
|
waittill_player_out_of_trigger()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "player_too_far" );
|
|
self endon( "started_player_melee" );
|
|
|
|
while ( level.player istouching( self.melee_trigger ) )
|
|
{
|
|
level.player allowmelee( 0 );
|
|
wait 0.05;
|
|
}
|
|
|
|
self notify( "player_too_far" );
|
|
}
|
|
|
|
waittill_player_not_behind_me()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "player_too_far" );
|
|
self endon( "started_player_melee" );
|
|
|
|
while ( maps\ship_graveyard_util::player_is_behind_me( -0.6 ) )
|
|
{
|
|
level.player allowmelee( 0 );
|
|
wait 0.05;
|
|
}
|
|
|
|
self notify( "player_too_far" );
|
|
}
|
|
|
|
waittill_player_not_lookat_me()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "player_too_far" );
|
|
self endon( "started_player_melee" );
|
|
|
|
while ( maps\_utility::player_looking_at( self.origin, 0.9, 1 ) )
|
|
{
|
|
level.player allowmelee( 0 );
|
|
wait 0.05;
|
|
}
|
|
|
|
self notify( "player_too_far" );
|
|
}
|
|
|
|
waittill_my_death()
|
|
{
|
|
self endon( "player_too_far" );
|
|
self endon( "started_player_melee" );
|
|
self waittill( "death" );
|
|
level.player allowmelee( 1 );
|
|
}
|
|
|
|
melee_death_fx()
|
|
{
|
|
wait 1.4;
|
|
playfxontag( common_scripts\utility::getfx( "shpg_enm_death_bubbles_a" ), self, "tag_eye" );
|
|
thread maps\_utility::play_sound_on_entity( "generic_death_enemy_3" );
|
|
}
|